Last active
December 15, 2015 14:29
-
-
Save springmeyer/5274942 to your computer and use it in GitHub Desktop.
sqlite source diff between http://www.sqlite.org/sqlite-autoconf-3070900.tar.gz and http://www.sqlite.org/sqlite-autoconf-3071000.tar.gz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff -u -r sqlite-autoconf-3070900/.deps/sqlite3.Plo sqlite-autoconf-3071000/.deps/sqlite3.Plo | |
--- sqlite-autoconf-3070900/.deps/sqlite3.Plo 2013-03-29 16:53:58.000000000 -0700 | |
+++ sqlite-autoconf-3071000/.deps/sqlite3.Plo 2013-03-29 18:34:25.000000000 -0700 | |
@@ -21,27 +21,58 @@ | |
/usr/include/secure/_string.h /usr/include/assert.h \ | |
/opt/llvm2/bin/../lib/clang/3.3/include/stddef.h /usr/include/ctype.h \ | |
/usr/include/runetype.h /usr/include/time.h /usr/include/_structs.h \ | |
- /usr/include/pthread.h /usr/include/pthread_impl.h \ | |
- /usr/include/sched.h /usr/include/sys/types.h /usr/include/sys/stat.h \ | |
- /usr/include/fcntl.h /usr/include/sys/fcntl.h /usr/include/unistd.h \ | |
- /usr/include/sys/unistd.h /usr/include/sys/select.h \ | |
- /usr/include/sys/_select.h /usr/include/sys/time.h \ | |
- /usr/include/errno.h /usr/include/sys/errno.h /usr/include/sys/mman.h \ | |
- /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h \ | |
- /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ | |
- /usr/include/sys/sockio.h /usr/include/sys/file.h \ | |
- /usr/include/sys/queue.h /usr/include/sys/param.h \ | |
+ /usr/include/sys/sysctl.h /usr/include/sys/time.h \ | |
+ /usr/include/sys/_select.h /usr/include/sys/ucred.h \ | |
+ /usr/include/sys/param.h /usr/include/sys/types.h \ | |
/usr/include/sys/syslimits.h /usr/include/machine/param.h \ | |
/usr/include/i386/param.h /usr/include/i386/_param.h \ | |
/opt/llvm2/bin/../lib/clang/3.3/include/limits.h /usr/include/limits.h \ | |
/usr/include/machine/limits.h /usr/include/i386/limits.h \ | |
- /usr/include/i386/_limits.h /usr/include/sys/mount.h \ | |
- /usr/include/sys/attr.h /usr/include/sys/ucred.h \ | |
- /usr/include/bsm/audit.h /usr/include/mach/port.h \ | |
- /usr/include/mach/boolean.h /usr/include/mach/machine/boolean.h \ | |
- /usr/include/mach/i386/boolean.h /usr/include/mach/machine/vm_types.h \ | |
- /usr/include/mach/i386/vm_types.h /usr/include/mach/i386/vm_param.h \ | |
- /usr/include/dlfcn.h /opt/llvm2/bin/../lib/clang/3.3/include/stdbool.h \ | |
+ /usr/include/i386/_limits.h /usr/include/bsm/audit.h \ | |
+ /usr/include/mach/port.h /usr/include/mach/boolean.h \ | |
+ /usr/include/mach/machine/boolean.h /usr/include/mach/i386/boolean.h \ | |
+ /usr/include/mach/machine/vm_types.h /usr/include/mach/i386/vm_types.h \ | |
+ /usr/include/mach/i386/vm_param.h /usr/include/sys/queue.h \ | |
+ /usr/include/sys/proc.h /usr/include/sys/select.h \ | |
+ /usr/include/sys/lock.h /usr/include/sys/event.h /usr/include/sys/vm.h \ | |
+ /usr/include/malloc/malloc.h /usr/include/mach/mach_types.h \ | |
+ /usr/include/mach/host_info.h /usr/include/mach/message.h \ | |
+ /usr/include/mach/kern_return.h \ | |
+ /usr/include/mach/machine/kern_return.h \ | |
+ /usr/include/mach/i386/kern_return.h /usr/include/mach/vm_statistics.h \ | |
+ /usr/include/mach/machine.h /usr/include/mach/time_value.h \ | |
+ /usr/include/mach/host_notify.h /usr/include/mach/host_special_ports.h \ | |
+ /usr/include/mach/memory_object_types.h /usr/include/mach/vm_prot.h \ | |
+ /usr/include/mach/vm_sync.h /usr/include/mach/vm_types.h \ | |
+ /usr/include/mach/exception_types.h \ | |
+ /usr/include/mach/machine/exception.h \ | |
+ /usr/include/mach/i386/exception.h /usr/include/mach/thread_status.h \ | |
+ /usr/include/mach/machine/thread_status.h \ | |
+ /usr/include/mach/i386/thread_status.h /usr/include/mach/i386/fp_reg.h \ | |
+ /usr/include/mach/i386/thread_state.h /usr/include/i386/eflags.h \ | |
+ /usr/include/mach/machine/thread_state.h \ | |
+ /usr/include/mach/processor_info.h \ | |
+ /usr/include/mach/machine/processor_info.h \ | |
+ /usr/include/mach/i386/processor_info.h /usr/include/mach/task_info.h \ | |
+ /usr/include/mach/policy.h /usr/include/mach/task_policy.h \ | |
+ /usr/include/mach/task_special_ports.h /usr/include/mach/thread_info.h \ | |
+ /usr/include/mach/thread_policy.h \ | |
+ /usr/include/mach/thread_special_ports.h \ | |
+ /usr/include/mach/clock_types.h /usr/include/mach/vm_attributes.h \ | |
+ /usr/include/mach/vm_inherit.h /usr/include/mach/vm_purgable.h \ | |
+ /usr/include/mach/vm_behavior.h /usr/include/mach/vm_region.h \ | |
+ /usr/include/mach/machine/vm_param.h /usr/include/mach/kmod.h \ | |
+ /usr/include/mach/std_types.h /usr/include/libkern/OSAtomic.h \ | |
+ /opt/llvm2/bin/../lib/clang/3.3/include/stdbool.h \ | |
+ /usr/include/pthread.h /usr/include/pthread_impl.h \ | |
+ /usr/include/sched.h /usr/include/sys/stat.h /usr/include/fcntl.h \ | |
+ /usr/include/sys/fcntl.h /usr/include/unistd.h \ | |
+ /usr/include/sys/unistd.h /usr/include/errno.h \ | |
+ /usr/include/sys/errno.h /usr/include/sys/mman.h \ | |
+ /usr/include/sys/ioctl.h /usr/include/sys/ttycom.h \ | |
+ /usr/include/sys/ioccom.h /usr/include/sys/filio.h \ | |
+ /usr/include/sys/sockio.h /usr/include/sys/file.h \ | |
+ /usr/include/sys/mount.h /usr/include/sys/attr.h /usr/include/dlfcn.h \ | |
/usr/include/AvailabilityMacros.h | |
/opt/llvm2/bin/../lib/clang/3.3/include/stdint.h: | |
@@ -132,94 +163,196 @@ | |
/usr/include/_structs.h: | |
-/usr/include/pthread.h: | |
+/usr/include/sys/sysctl.h: | |
-/usr/include/pthread_impl.h: | |
+/usr/include/sys/time.h: | |
-/usr/include/sched.h: | |
+/usr/include/sys/_select.h: | |
+ | |
+/usr/include/sys/ucred.h: | |
+ | |
+/usr/include/sys/param.h: | |
/usr/include/sys/types.h: | |
-/usr/include/sys/stat.h: | |
+/usr/include/sys/syslimits.h: | |
-/usr/include/fcntl.h: | |
+/usr/include/machine/param.h: | |
-/usr/include/sys/fcntl.h: | |
+/usr/include/i386/param.h: | |
-/usr/include/unistd.h: | |
+/usr/include/i386/_param.h: | |
-/usr/include/sys/unistd.h: | |
+/opt/llvm2/bin/../lib/clang/3.3/include/limits.h: | |
-/usr/include/sys/select.h: | |
+/usr/include/limits.h: | |
-/usr/include/sys/_select.h: | |
+/usr/include/machine/limits.h: | |
-/usr/include/sys/time.h: | |
+/usr/include/i386/limits.h: | |
-/usr/include/errno.h: | |
+/usr/include/i386/_limits.h: | |
-/usr/include/sys/errno.h: | |
+/usr/include/bsm/audit.h: | |
-/usr/include/sys/mman.h: | |
+/usr/include/mach/port.h: | |
-/usr/include/sys/ioctl.h: | |
+/usr/include/mach/boolean.h: | |
-/usr/include/sys/ttycom.h: | |
+/usr/include/mach/machine/boolean.h: | |
-/usr/include/sys/ioccom.h: | |
+/usr/include/mach/i386/boolean.h: | |
-/usr/include/sys/filio.h: | |
+/usr/include/mach/machine/vm_types.h: | |
-/usr/include/sys/sockio.h: | |
+/usr/include/mach/i386/vm_types.h: | |
-/usr/include/sys/file.h: | |
+/usr/include/mach/i386/vm_param.h: | |
/usr/include/sys/queue.h: | |
-/usr/include/sys/param.h: | |
+/usr/include/sys/proc.h: | |
-/usr/include/sys/syslimits.h: | |
+/usr/include/sys/select.h: | |
-/usr/include/machine/param.h: | |
+/usr/include/sys/lock.h: | |
-/usr/include/i386/param.h: | |
+/usr/include/sys/event.h: | |
-/usr/include/i386/_param.h: | |
+/usr/include/sys/vm.h: | |
-/opt/llvm2/bin/../lib/clang/3.3/include/limits.h: | |
+/usr/include/malloc/malloc.h: | |
-/usr/include/limits.h: | |
+/usr/include/mach/mach_types.h: | |
-/usr/include/machine/limits.h: | |
+/usr/include/mach/host_info.h: | |
-/usr/include/i386/limits.h: | |
+/usr/include/mach/message.h: | |
-/usr/include/i386/_limits.h: | |
+/usr/include/mach/kern_return.h: | |
-/usr/include/sys/mount.h: | |
+/usr/include/mach/machine/kern_return.h: | |
-/usr/include/sys/attr.h: | |
+/usr/include/mach/i386/kern_return.h: | |
-/usr/include/sys/ucred.h: | |
+/usr/include/mach/vm_statistics.h: | |
-/usr/include/bsm/audit.h: | |
+/usr/include/mach/machine.h: | |
-/usr/include/mach/port.h: | |
+/usr/include/mach/time_value.h: | |
-/usr/include/mach/boolean.h: | |
+/usr/include/mach/host_notify.h: | |
-/usr/include/mach/machine/boolean.h: | |
+/usr/include/mach/host_special_ports.h: | |
-/usr/include/mach/i386/boolean.h: | |
+/usr/include/mach/memory_object_types.h: | |
-/usr/include/mach/machine/vm_types.h: | |
+/usr/include/mach/vm_prot.h: | |
-/usr/include/mach/i386/vm_types.h: | |
+/usr/include/mach/vm_sync.h: | |
-/usr/include/mach/i386/vm_param.h: | |
+/usr/include/mach/vm_types.h: | |
-/usr/include/dlfcn.h: | |
+/usr/include/mach/exception_types.h: | |
+ | |
+/usr/include/mach/machine/exception.h: | |
+ | |
+/usr/include/mach/i386/exception.h: | |
+ | |
+/usr/include/mach/thread_status.h: | |
+ | |
+/usr/include/mach/machine/thread_status.h: | |
+ | |
+/usr/include/mach/i386/thread_status.h: | |
+ | |
+/usr/include/mach/i386/fp_reg.h: | |
+ | |
+/usr/include/mach/i386/thread_state.h: | |
+ | |
+/usr/include/i386/eflags.h: | |
+ | |
+/usr/include/mach/machine/thread_state.h: | |
+ | |
+/usr/include/mach/processor_info.h: | |
+ | |
+/usr/include/mach/machine/processor_info.h: | |
+ | |
+/usr/include/mach/i386/processor_info.h: | |
+ | |
+/usr/include/mach/task_info.h: | |
+ | |
+/usr/include/mach/policy.h: | |
+ | |
+/usr/include/mach/task_policy.h: | |
+ | |
+/usr/include/mach/task_special_ports.h: | |
+ | |
+/usr/include/mach/thread_info.h: | |
+ | |
+/usr/include/mach/thread_policy.h: | |
+ | |
+/usr/include/mach/thread_special_ports.h: | |
+ | |
+/usr/include/mach/clock_types.h: | |
+ | |
+/usr/include/mach/vm_attributes.h: | |
+ | |
+/usr/include/mach/vm_inherit.h: | |
+ | |
+/usr/include/mach/vm_purgable.h: | |
+ | |
+/usr/include/mach/vm_behavior.h: | |
+ | |
+/usr/include/mach/vm_region.h: | |
+ | |
+/usr/include/mach/machine/vm_param.h: | |
+ | |
+/usr/include/mach/kmod.h: | |
+ | |
+/usr/include/mach/std_types.h: | |
+ | |
+/usr/include/libkern/OSAtomic.h: | |
/opt/llvm2/bin/../lib/clang/3.3/include/stdbool.h: | |
+/usr/include/pthread.h: | |
+ | |
+/usr/include/pthread_impl.h: | |
+ | |
+/usr/include/sched.h: | |
+ | |
+/usr/include/sys/stat.h: | |
+ | |
+/usr/include/fcntl.h: | |
+ | |
+/usr/include/sys/fcntl.h: | |
+ | |
+/usr/include/unistd.h: | |
+ | |
+/usr/include/sys/unistd.h: | |
+ | |
+/usr/include/errno.h: | |
+ | |
+/usr/include/sys/errno.h: | |
+ | |
+/usr/include/sys/mman.h: | |
+ | |
+/usr/include/sys/ioctl.h: | |
+ | |
+/usr/include/sys/ttycom.h: | |
+ | |
+/usr/include/sys/ioccom.h: | |
+ | |
+/usr/include/sys/filio.h: | |
+ | |
+/usr/include/sys/sockio.h: | |
+ | |
+/usr/include/sys/file.h: | |
+ | |
+/usr/include/sys/mount.h: | |
+ | |
+/usr/include/sys/attr.h: | |
+ | |
+/usr/include/dlfcn.h: | |
+ | |
/usr/include/AvailabilityMacros.h: | |
Binary files sqlite-autoconf-3070900/.libs/libsqlite3.0.8.6.dylib and sqlite-autoconf-3071000/.libs/libsqlite3.0.8.6.dylib differ | |
Binary files sqlite-autoconf-3070900/.libs/libsqlite3.0.dylib and sqlite-autoconf-3071000/.libs/libsqlite3.0.dylib differ | |
Binary files sqlite-autoconf-3070900/.libs/libsqlite3.a and sqlite-autoconf-3071000/.libs/libsqlite3.a differ | |
Binary files sqlite-autoconf-3070900/.libs/libsqlite3.dylib and sqlite-autoconf-3071000/.libs/libsqlite3.dylib differ | |
diff -u -r sqlite-autoconf-3070900/.libs/libsqlite3.la sqlite-autoconf-3071000/.libs/libsqlite3.la | |
--- sqlite-autoconf-3070900/.libs/libsqlite3.la 2013-03-29 16:53:59.000000000 -0700 | |
+++ sqlite-autoconf-3071000/.libs/libsqlite3.la 2013-03-29 18:34:26.000000000 -0700 | |
@@ -32,4 +32,4 @@ | |
dlpreopen='' | |
# Directory that this library needs to be installed in: | |
-libdir='/opt/sqlite-3070900/lib' | |
+libdir='/opt/sqlite-3071000/lib' | |
diff -u -r sqlite-autoconf-3070900/.libs/libsqlite3.lai sqlite-autoconf-3071000/.libs/libsqlite3.lai | |
--- sqlite-autoconf-3070900/.libs/libsqlite3.lai 2013-03-29 16:53:59.000000000 -0700 | |
+++ sqlite-autoconf-3071000/.libs/libsqlite3.lai 2013-03-29 18:34:26.000000000 -0700 | |
@@ -32,4 +32,4 @@ | |
dlpreopen='' | |
# Directory that this library needs to be installed in: | |
-libdir='/opt/sqlite-3070900/lib' | |
+libdir='/opt/sqlite-3071000/lib' | |
Binary files sqlite-autoconf-3070900/.libs/sqlite3 and sqlite-autoconf-3071000/.libs/sqlite3 differ | |
Binary files sqlite-autoconf-3070900/.libs/sqlite3.o and sqlite-autoconf-3071000/.libs/sqlite3.o differ | |
diff -u -r sqlite-autoconf-3070900/Makefile sqlite-autoconf-3071000/Makefile | |
--- sqlite-autoconf-3070900/Makefile 2013-03-29 16:45:44.000000000 -0700 | |
+++ sqlite-autoconf-3071000/Makefile 2013-03-29 18:33:45.000000000 -0700 | |
@@ -119,12 +119,12 @@ | |
GZIP_ENV = --best | |
distuninstallcheck_listfiles = find . -type f -print | |
distcleancheck_listfiles = find . -type f -print | |
-ACLOCAL = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run aclocal-1.9 | |
-AMTAR = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run tar | |
+ACLOCAL = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run aclocal-1.9 | |
+AMTAR = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run tar | |
AR = ar | |
-AUTOCONF = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoconf | |
-AUTOHEADER = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoheader | |
-AUTOMAKE = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run automake-1.9 | |
+AUTOCONF = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoconf | |
+AUTOHEADER = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoheader | |
+AUTOMAKE = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run automake-1.9 | |
AWK = awk | |
BUILD_CFLAGS = | |
CC = clang | |
@@ -133,7 +133,7 @@ | |
CPP = clang -E | |
CPPFLAGS = | |
CYGPATH_W = echo | |
-DEFS = -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" -DPACKAGE_STRING=\"sqlite\ 3.7.9\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1 | |
+DEFS = -DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.10\" -DPACKAGE_STRING=\"sqlite\ 3.7.10\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.10\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1 | |
DEPDIR = .deps | |
DSYMUTIL = @DSYMUTIL@ | |
DUMPBIN = @DUMPBIN@ | |
@@ -158,7 +158,7 @@ | |
LIPO = @LIPO@ | |
LN_S = ln -s | |
LTLIBOBJS = | |
-MAKEINFO = ${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run makeinfo | |
+MAKEINFO = ${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run makeinfo | |
MKDIR_P = /usr/local/bin/gmkdir -p | |
NM = @NM@ | |
NMEDIT = @NMEDIT@ | |
@@ -169,10 +169,10 @@ | |
PACKAGE = sqlite | |
PACKAGE_BUGREPORT = http://www.sqlite.org | |
PACKAGE_NAME = sqlite | |
-PACKAGE_STRING = sqlite 3.7.9 | |
+PACKAGE_STRING = sqlite 3.7.10 | |
PACKAGE_TARNAME = sqlite | |
PACKAGE_URL = | |
-PACKAGE_VERSION = 3.7.9 | |
+PACKAGE_VERSION = 3.7.10 | |
PATH_SEPARATOR = : | |
RANLIB = ranlib | |
READLINE_LIBS = -lreadline -lcurses | |
@@ -181,11 +181,11 @@ | |
SHELL = /bin/sh | |
STRIP = strip | |
THREADSAFE_FLAGS = -D_REENTRANT=1 -DSQLITE_THREADSAFE=1 | |
-VERSION = 3.7.9 | |
-abs_builddir = /Users/dane/src/sqlite-autoconf-3070900 | |
-abs_srcdir = /Users/dane/src/sqlite-autoconf-3070900 | |
-abs_top_builddir = /Users/dane/src/sqlite-autoconf-3070900 | |
-abs_top_srcdir = /Users/dane/src/sqlite-autoconf-3070900 | |
+VERSION = 3.7.10 | |
+abs_builddir = /Users/dane/src/sqlite-autoconf-3071000 | |
+abs_srcdir = /Users/dane/src/sqlite-autoconf-3071000 | |
+abs_top_builddir = /Users/dane/src/sqlite-autoconf-3071000 | |
+abs_top_srcdir = /Users/dane/src/sqlite-autoconf-3071000 | |
ac_ct_CC = clang | |
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ | |
am__include = include | |
@@ -213,7 +213,7 @@ | |
htmldir = ${docdir} | |
includedir = ${prefix}/include | |
infodir = ${datarootdir}/info | |
-install_sh = /Users/dane/src/sqlite-autoconf-3070900/install-sh | |
+install_sh = /Users/dane/src/sqlite-autoconf-3071000/install-sh | |
libdir = ${exec_prefix}/lib | |
libexecdir = ${exec_prefix}/libexec | |
localedir = ${datarootdir}/locale | |
@@ -223,7 +223,7 @@ | |
mkdir_p = mkdir -p -- | |
oldincludedir = /usr/include | |
pdfdir = ${docdir} | |
-prefix = /opt/sqlite-3070900 | |
+prefix = /opt/sqlite-3071000 | |
program_transform_name = s,x,x, | |
psdir = ${docdir} | |
sbindir = ${exec_prefix}/sbin | |
diff -u -r sqlite-autoconf-3070900/config.log sqlite-autoconf-3071000/config.log | |
--- sqlite-autoconf-3070900/config.log 2013-03-29 16:45:44.000000000 -0700 | |
+++ sqlite-autoconf-3071000/config.log 2013-03-29 18:33:46.000000000 -0700 | |
@@ -1,10 +1,10 @@ | |
This file contains any messages produced by compilers while | |
running configure, to aid debugging if configure makes a mistake. | |
-It was created by sqlite configure 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+It was created by sqlite configure 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
- $ ./configure --prefix=/opt/sqlite-3070900 | |
+ $ ./configure --prefix=/opt/sqlite-3071000 | |
## --------- ## | |
## Platform. ## | |
@@ -30,8 +30,8 @@ | |
Processor type: i486 (Intel 80486) | |
Processors active: 0 1 2 3 4 5 6 7 | |
Primary memory available: 8.00 gigabytes | |
-Default processor set: 107 tasks, 603 threads, 8 processors | |
-Load average: 1.35, Mach factor: 6.64 | |
+Default processor set: 91 tasks, 467 threads, 8 processors | |
+Load average: 0.63, Mach factor: 7.36 | |
/bin/machine = unknown | |
/usr/bin/oslevel = unknown | |
/bin/universe = unknown | |
@@ -64,279 +64,279 @@ | |
## Core tests. ## | |
## ----------- ## | |
-configure:2614: checking for a BSD-compatible install | |
-configure:2682: result: /usr/local/bin/ginstall -c | |
-configure:2693: checking whether build environment is sane | |
-configure:2730: result: yes | |
-configure:2792: checking for gawk | |
-configure:2822: result: no | |
-configure:2792: checking for mawk | |
-configure:2822: result: no | |
-configure:2792: checking for nawk | |
-configure:2822: result: no | |
-configure:2792: checking for awk | |
-configure:2808: found /usr/bin/awk | |
-configure:2819: result: awk | |
-configure:2830: checking whether make sets $(MAKE) | |
-configure:2852: result: yes | |
-configure:3043: checking for style of include used by make | |
-configure:3071: result: GNU | |
-configure:3144: checking for gcc | |
-configure:3171: result: clang | |
-configure:3400: checking for C compiler version | |
-configure:3409: clang --version >&5 | |
+configure:2635: checking for a BSD-compatible install | |
+configure:2703: result: /usr/local/bin/ginstall -c | |
+configure:2714: checking whether build environment is sane | |
+configure:2751: result: yes | |
+configure:2813: checking for gawk | |
+configure:2843: result: no | |
+configure:2813: checking for mawk | |
+configure:2843: result: no | |
+configure:2813: checking for nawk | |
+configure:2843: result: no | |
+configure:2813: checking for awk | |
+configure:2829: found /usr/bin/awk | |
+configure:2840: result: awk | |
+configure:2851: checking whether make sets $(MAKE) | |
+configure:2873: result: yes | |
+configure:3064: checking for style of include used by make | |
+configure:3092: result: GNU | |
+configure:3165: checking for gcc | |
+configure:3192: result: clang | |
+configure:3421: checking for C compiler version | |
+configure:3430: clang --version >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:3420: $? = 0 | |
-configure:3409: clang -v >&5 | |
+configure:3441: $? = 0 | |
+configure:3430: clang -v >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:3420: $? = 0 | |
-configure:3409: clang -V >&5 | |
+configure:3441: $? = 0 | |
+configure:3430: clang -V >&5 | |
clang-3.3: error: argument to '-V' is missing (expected 1 value) | |
clang-3.3: error: no input files | |
-configure:3420: $? = 1 | |
-configure:3409: clang -qversion >&5 | |
+configure:3441: $? = 1 | |
+configure:3430: clang -qversion >&5 | |
clang-3.3: error: no input files | |
-configure:3420: $? = 1 | |
-configure:3440: checking whether the C compiler works | |
-configure:3462: clang conftest.c >&5 | |
-configure:3466: $? = 0 | |
-configure:3515: result: yes | |
-configure:3518: checking for C compiler default output file name | |
-configure:3520: result: a.out | |
-configure:3526: checking for suffix of executables | |
-configure:3533: clang -o conftest conftest.c >&5 | |
-configure:3537: $? = 0 | |
-configure:3559: result: | |
-configure:3581: checking whether we are cross compiling | |
-configure:3589: clang -o conftest conftest.c >&5 | |
-configure:3593: $? = 0 | |
-configure:3600: ./conftest | |
-configure:3604: $? = 0 | |
-configure:3619: result: no | |
-configure:3624: checking for suffix of object files | |
-configure:3646: clang -c conftest.c >&5 | |
-configure:3650: $? = 0 | |
-configure:3671: result: o | |
-configure:3675: checking whether we are using the GNU C compiler | |
-configure:3694: clang -c conftest.c >&5 | |
-configure:3694: $? = 0 | |
-configure:3703: result: yes | |
-configure:3712: checking whether clang accepts -g | |
-configure:3732: clang -c -g conftest.c >&5 | |
-configure:3732: $? = 0 | |
-configure:3773: result: yes | |
-configure:3790: checking for clang option to accept ISO C89 | |
-configure:3854: clang -c -g -O2 conftest.c >&5 | |
-configure:3854: $? = 0 | |
-configure:3867: result: none needed | |
-configure:3889: checking dependency style of clang | |
-configure:3979: result: gcc3 | |
-configure:4004: checking for special C compiler options needed for large files | |
-configure:4049: result: no | |
-configure:4055: checking for _FILE_OFFSET_BITS value needed for large files | |
-configure:4080: clang -c -g -O2 conftest.c >&5 | |
-configure:4080: $? = 0 | |
-configure:4112: result: no | |
-configure:4245: checking for gcc | |
-configure:4272: result: clang | |
-configure:4501: checking for C compiler version | |
-configure:4510: clang --version >&5 | |
+configure:3441: $? = 1 | |
+configure:3461: checking whether the C compiler works | |
+configure:3483: clang conftest.c >&5 | |
+configure:3487: $? = 0 | |
+configure:3535: result: yes | |
+configure:3538: checking for C compiler default output file name | |
+configure:3540: result: a.out | |
+configure:3546: checking for suffix of executables | |
+configure:3553: clang -o conftest conftest.c >&5 | |
+configure:3557: $? = 0 | |
+configure:3579: result: | |
+configure:3601: checking whether we are cross compiling | |
+configure:3609: clang -o conftest conftest.c >&5 | |
+configure:3613: $? = 0 | |
+configure:3620: ./conftest | |
+configure:3624: $? = 0 | |
+configure:3639: result: no | |
+configure:3644: checking for suffix of object files | |
+configure:3666: clang -c conftest.c >&5 | |
+configure:3670: $? = 0 | |
+configure:3691: result: o | |
+configure:3695: checking whether we are using the GNU C compiler | |
+configure:3714: clang -c conftest.c >&5 | |
+configure:3714: $? = 0 | |
+configure:3723: result: yes | |
+configure:3732: checking whether clang accepts -g | |
+configure:3752: clang -c -g conftest.c >&5 | |
+configure:3752: $? = 0 | |
+configure:3793: result: yes | |
+configure:3810: checking for clang option to accept ISO C89 | |
+configure:3874: clang -c -g -O2 conftest.c >&5 | |
+configure:3874: $? = 0 | |
+configure:3887: result: none needed | |
+configure:3909: checking dependency style of clang | |
+configure:3999: result: gcc3 | |
+configure:4024: checking for special C compiler options needed for large files | |
+configure:4069: result: no | |
+configure:4075: checking for _FILE_OFFSET_BITS value needed for large files | |
+configure:4100: clang -c -g -O2 conftest.c >&5 | |
+configure:4100: $? = 0 | |
+configure:4132: result: no | |
+configure:4265: checking for gcc | |
+configure:4292: result: clang | |
+configure:4521: checking for C compiler version | |
+configure:4530: clang --version >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:4521: $? = 0 | |
-configure:4510: clang -v >&5 | |
+configure:4541: $? = 0 | |
+configure:4530: clang -v >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:4521: $? = 0 | |
-configure:4510: clang -V >&5 | |
+configure:4541: $? = 0 | |
+configure:4530: clang -V >&5 | |
clang-3.3: error: argument to '-V' is missing (expected 1 value) | |
clang-3.3: error: no input files | |
-configure:4521: $? = 1 | |
-configure:4510: clang -qversion >&5 | |
+configure:4541: $? = 1 | |
+configure:4530: clang -qversion >&5 | |
clang-3.3: error: no input files | |
-configure:4521: $? = 1 | |
-configure:4525: checking whether we are using the GNU C compiler | |
-configure:4553: result: yes | |
-configure:4562: checking whether clang accepts -g | |
-configure:4623: result: yes | |
-configure:4640: checking for clang option to accept ISO C89 | |
-configure:4717: result: none needed | |
-configure:4739: checking dependency style of clang | |
-configure:4829: result: gcc3 | |
-configure:4889: checking for ranlib | |
-configure:4905: found /Applications/Xcode.app/Contents/Developer/usr/bin/ranlib | |
-configure:4916: result: ranlib | |
-configure:5014: checking build system type | |
-configure:5028: result: i686-apple-darwin11.4.2 | |
-configure:5048: checking host system type | |
-configure:5061: result: i686-apple-darwin11.4.2 | |
-configure:5081: checking for a sed that does not truncate output | |
-configure:5135: result: /usr/local/bin/gsed | |
-configure:5138: checking for grep that handles long lines and -e | |
-configure:5196: result: /usr/bin/grep | |
-configure:5201: checking for egrep | |
-configure:5263: result: /usr/bin/grep -E | |
-configure:5279: checking for ld used by clang | |
-configure:5346: result: /Applications/Xcode.app/Contents/Developer/usr/bin/ld | |
-configure:5353: checking if the linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) is GNU ld | |
-configure:5368: result: no | |
-configure:5373: checking for /Applications/Xcode.app/Contents/Developer/usr/bin/ld option to reload object files | |
-configure:5380: result: -r | |
-configure:5398: checking for BSD-compatible nm | |
-configure:5447: result: /Applications/Xcode.app/Contents/Developer/usr/bin/nm | |
-configure:5451: checking whether ln -s works | |
-configure:5455: result: yes | |
-configure:5462: checking how to recognise dependent libraries | |
-configure:5638: result: pass_all | |
-configure:5846: checking how to run the C preprocessor | |
-configure:5877: clang -E conftest.c | |
-configure:5877: $? = 0 | |
-configure:5891: clang -E conftest.c | |
+configure:4541: $? = 1 | |
+configure:4545: checking whether we are using the GNU C compiler | |
+configure:4573: result: yes | |
+configure:4582: checking whether clang accepts -g | |
+configure:4643: result: yes | |
+configure:4660: checking for clang option to accept ISO C89 | |
+configure:4737: result: none needed | |
+configure:4759: checking dependency style of clang | |
+configure:4849: result: gcc3 | |
+configure:4909: checking for ranlib | |
+configure:4925: found /Applications/Xcode.app/Contents/Developer/usr/bin/ranlib | |
+configure:4936: result: ranlib | |
+configure:5034: checking build system type | |
+configure:5048: result: i686-apple-darwin11.4.2 | |
+configure:5068: checking host system type | |
+configure:5081: result: i686-apple-darwin11.4.2 | |
+configure:5101: checking for a sed that does not truncate output | |
+configure:5155: result: /usr/local/bin/gsed | |
+configure:5158: checking for grep that handles long lines and -e | |
+configure:5216: result: /usr/bin/grep | |
+configure:5221: checking for egrep | |
+configure:5283: result: /usr/bin/grep -E | |
+configure:5299: checking for ld used by clang | |
+configure:5366: result: /Applications/Xcode.app/Contents/Developer/usr/bin/ld | |
+configure:5373: checking if the linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) is GNU ld | |
+configure:5388: result: no | |
+configure:5393: checking for /Applications/Xcode.app/Contents/Developer/usr/bin/ld option to reload object files | |
+configure:5400: result: -r | |
+configure:5418: checking for BSD-compatible nm | |
+configure:5467: result: /Applications/Xcode.app/Contents/Developer/usr/bin/nm | |
+configure:5471: checking whether ln -s works | |
+configure:5475: result: yes | |
+configure:5482: checking how to recognise dependent libraries | |
+configure:5658: result: pass_all | |
+configure:5866: checking how to run the C preprocessor | |
+configure:5897: clang -E conftest.c | |
+configure:5897: $? = 0 | |
+configure:5911: clang -E conftest.c | |
conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found | |
#include <ac_nonexistent.h> | |
^ | |
1 error generated. | |
-configure:5891: $? = 1 | |
+configure:5911: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| /* end confdefs.h. */ | |
| #include <ac_nonexistent.h> | |
-configure:5916: result: clang -E | |
-configure:5936: clang -E conftest.c | |
-configure:5936: $? = 0 | |
-configure:5950: clang -E conftest.c | |
+configure:5936: result: clang -E | |
+configure:5956: clang -E conftest.c | |
+configure:5956: $? = 0 | |
+configure:5970: clang -E conftest.c | |
conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found | |
#include <ac_nonexistent.h> | |
^ | |
1 error generated. | |
-configure:5950: $? = 1 | |
+configure:5970: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| /* end confdefs.h. */ | |
| #include <ac_nonexistent.h> | |
-configure:5979: checking for ANSI C header files | |
-configure:5999: clang -c -g -O2 conftest.c >&5 | |
-configure:5999: $? = 0 | |
-configure:6072: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:6072: $? = 0 | |
-configure:6072: ./conftest | |
-configure:6072: $? = 0 | |
-configure:6083: result: yes | |
-configure:6096: checking for sys/types.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for sys/stat.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for stdlib.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for string.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for memory.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for strings.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for inttypes.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for stdint.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6096: checking for unistd.h | |
-configure:6096: clang -c -g -O2 conftest.c >&5 | |
-configure:6096: $? = 0 | |
-configure:6096: result: yes | |
-configure:6111: checking dlfcn.h usability | |
-configure:6111: clang -c -g -O2 conftest.c >&5 | |
-configure:6111: $? = 0 | |
-configure:6111: result: yes | |
-configure:6111: checking dlfcn.h presence | |
-configure:6111: clang -E conftest.c | |
-configure:6111: $? = 0 | |
-configure:6111: result: yes | |
-configure:6111: checking for dlfcn.h | |
-configure:6111: result: yes | |
-configure:6233: checking for C++ compiler version | |
-configure:6242: clang++ --version >&5 | |
+configure:5999: checking for ANSI C header files | |
+configure:6019: clang -c -g -O2 conftest.c >&5 | |
+configure:6019: $? = 0 | |
+configure:6092: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:6092: $? = 0 | |
+configure:6092: ./conftest | |
+configure:6092: $? = 0 | |
+configure:6103: result: yes | |
+configure:6116: checking for sys/types.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for sys/stat.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for stdlib.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for string.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for memory.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for strings.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for inttypes.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for stdint.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6116: checking for unistd.h | |
+configure:6116: clang -c -g -O2 conftest.c >&5 | |
+configure:6116: $? = 0 | |
+configure:6116: result: yes | |
+configure:6130: checking dlfcn.h usability | |
+configure:6130: clang -c -g -O2 conftest.c >&5 | |
+configure:6130: $? = 0 | |
+configure:6130: result: yes | |
+configure:6130: checking dlfcn.h presence | |
+configure:6130: clang -E conftest.c | |
+configure:6130: $? = 0 | |
+configure:6130: result: yes | |
+configure:6130: checking for dlfcn.h | |
+configure:6130: result: yes | |
+configure:6252: checking for C++ compiler version | |
+configure:6261: clang++ --version >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:6253: $? = 0 | |
-configure:6242: clang++ -v >&5 | |
+configure:6272: $? = 0 | |
+configure:6261: clang++ -v >&5 | |
clang version 3.3 (trunk 177655) | |
Target: x86_64-apple-darwin11.4.2 | |
Thread model: posix | |
-configure:6253: $? = 0 | |
-configure:6242: clang++ -V >&5 | |
+configure:6272: $? = 0 | |
+configure:6261: clang++ -V >&5 | |
clang-3.3: error: argument to '-V' is missing (expected 1 value) | |
clang-3.3: error: no input files | |
-configure:6253: $? = 1 | |
-configure:6242: clang++ -qversion >&5 | |
+configure:6272: $? = 1 | |
+configure:6261: clang++ -qversion >&5 | |
clang-3.3: error: no input files | |
-configure:6253: $? = 1 | |
-configure:6257: checking whether we are using the GNU C++ compiler | |
-configure:6276: clang++ -c conftest.cpp >&5 | |
-configure:6276: $? = 0 | |
-configure:6285: result: yes | |
-configure:6294: checking whether clang++ accepts -g | |
-configure:6314: clang++ -c -g conftest.cpp >&5 | |
-configure:6314: $? = 0 | |
-configure:6355: result: yes | |
-configure:6380: checking dependency style of clang++ | |
-configure:6470: result: gcc3 | |
-configure:6497: checking how to run the C++ preprocessor | |
-configure:6524: clang++ -E conftest.cpp | |
-configure:6524: $? = 0 | |
-configure:6538: clang++ -E conftest.cpp | |
+configure:6272: $? = 1 | |
+configure:6276: checking whether we are using the GNU C++ compiler | |
+configure:6295: clang++ -c conftest.cpp >&5 | |
+configure:6295: $? = 0 | |
+configure:6304: result: yes | |
+configure:6313: checking whether clang++ accepts -g | |
+configure:6333: clang++ -c -g conftest.cpp >&5 | |
+configure:6333: $? = 0 | |
+configure:6374: result: yes | |
+configure:6399: checking dependency style of clang++ | |
+configure:6489: result: gcc3 | |
+configure:6516: checking how to run the C++ preprocessor | |
+configure:6543: clang++ -E conftest.cpp | |
+configure:6543: $? = 0 | |
+configure:6557: clang++ -E conftest.cpp | |
conftest.cpp:22:10: fatal error: 'ac_nonexistent.h' file not found | |
#include <ac_nonexistent.h> | |
^ | |
1 error generated. | |
-configure:6538: $? = 1 | |
+configure:6557: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -350,25 +350,25 @@ | |
| #define HAVE_DLFCN_H 1 | |
| /* end confdefs.h. */ | |
| #include <ac_nonexistent.h> | |
-configure:6563: result: clang++ -E | |
-configure:6583: clang++ -E conftest.cpp | |
-configure:6583: $? = 0 | |
-configure:6597: clang++ -E conftest.cpp | |
+configure:6582: result: clang++ -E | |
+configure:6602: clang++ -E conftest.cpp | |
+configure:6602: $? = 0 | |
+configure:6616: clang++ -E conftest.cpp | |
conftest.cpp:22:10: fatal error: 'ac_nonexistent.h' file not found | |
#include <ac_nonexistent.h> | |
^ | |
1 error generated. | |
-configure:6597: $? = 1 | |
+configure:6616: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -382,73 +382,75 @@ | |
| #define HAVE_DLFCN_H 1 | |
| /* end confdefs.h. */ | |
| #include <ac_nonexistent.h> | |
-configure:6681: checking for g77 | |
-configure:6711: result: no | |
-configure:6681: checking for xlf | |
-configure:6711: result: no | |
-configure:6681: checking for f77 | |
-configure:6711: result: no | |
-configure:6681: checking for frt | |
-configure:6711: result: no | |
-configure:6681: checking for pgf77 | |
-configure:6711: result: no | |
-configure:6681: checking for cf77 | |
-configure:6711: result: no | |
-configure:6681: checking for fort77 | |
-configure:6711: result: no | |
-configure:6681: checking for fl32 | |
-configure:6711: result: no | |
-configure:6681: checking for af77 | |
-configure:6711: result: no | |
-configure:6681: checking for xlf90 | |
-configure:6711: result: no | |
-configure:6681: checking for f90 | |
-configure:6711: result: no | |
-configure:6681: checking for pgf90 | |
-configure:6711: result: no | |
-configure:6681: checking for pghpf | |
-configure:6711: result: no | |
-configure:6681: checking for epcf90 | |
-configure:6711: result: no | |
-configure:6681: checking for gfortran | |
-configure:6711: result: no | |
-configure:6681: checking for g95 | |
-configure:6711: result: no | |
-configure:6681: checking for xlf95 | |
-configure:6711: result: no | |
-configure:6681: checking for f95 | |
-configure:6711: result: no | |
-configure:6681: checking for fort | |
-configure:6711: result: no | |
-configure:6681: checking for ifort | |
-configure:6711: result: no | |
-configure:6681: checking for ifc | |
-configure:6711: result: no | |
-configure:6681: checking for efc | |
-configure:6711: result: no | |
-configure:6681: checking for pgf95 | |
-configure:6711: result: no | |
-configure:6681: checking for lf95 | |
-configure:6711: result: no | |
-configure:6681: checking for ftn | |
-configure:6711: result: no | |
-configure:6734: checking for Fortran 77 compiler version | |
-configure:6743: --version >&5 | |
-./configure: line 6745: --version: command not found | |
-configure:6754: $? = 127 | |
-configure:6743: -v >&5 | |
-./configure: line 6745: -v: command not found | |
-configure:6754: $? = 127 | |
-configure:6743: -V >&5 | |
-./configure: line 6745: -V: command not found | |
-configure:6754: $? = 127 | |
-configure:6743: -qversion >&5 | |
-./configure: line 6745: -qversion: command not found | |
-configure:6754: $? = 127 | |
-configure:6763: checking whether we are using the GNU Fortran 77 compiler | |
-configure:6776: -c conftest.F >&5 | |
-./configure: line 2114: -c: command not found | |
-configure:6776: $? = 127 | |
+configure:6700: checking for g77 | |
+configure:6730: result: no | |
+configure:6700: checking for xlf | |
+configure:6730: result: no | |
+configure:6700: checking for f77 | |
+configure:6730: result: no | |
+configure:6700: checking for frt | |
+configure:6730: result: no | |
+configure:6700: checking for pgf77 | |
+configure:6730: result: no | |
+configure:6700: checking for cf77 | |
+configure:6730: result: no | |
+configure:6700: checking for fort77 | |
+configure:6730: result: no | |
+configure:6700: checking for fl32 | |
+configure:6730: result: no | |
+configure:6700: checking for af77 | |
+configure:6730: result: no | |
+configure:6700: checking for xlf90 | |
+configure:6730: result: no | |
+configure:6700: checking for f90 | |
+configure:6730: result: no | |
+configure:6700: checking for pgf90 | |
+configure:6730: result: no | |
+configure:6700: checking for pghpf | |
+configure:6730: result: no | |
+configure:6700: checking for epcf90 | |
+configure:6730: result: no | |
+configure:6700: checking for gfortran | |
+configure:6730: result: no | |
+configure:6700: checking for g95 | |
+configure:6730: result: no | |
+configure:6700: checking for xlf95 | |
+configure:6730: result: no | |
+configure:6700: checking for f95 | |
+configure:6730: result: no | |
+configure:6700: checking for fort | |
+configure:6730: result: no | |
+configure:6700: checking for ifort | |
+configure:6730: result: no | |
+configure:6700: checking for ifc | |
+configure:6730: result: no | |
+configure:6700: checking for efc | |
+configure:6730: result: no | |
+configure:6700: checking for pgfortran | |
+configure:6730: result: no | |
+configure:6700: checking for pgf95 | |
+configure:6730: result: no | |
+configure:6700: checking for lf95 | |
+configure:6730: result: no | |
+configure:6700: checking for ftn | |
+configure:6730: result: no | |
+configure:6753: checking for Fortran 77 compiler version | |
+configure:6762: --version >&5 | |
+./configure: line 6764: --version: command not found | |
+configure:6773: $? = 127 | |
+configure:6762: -v >&5 | |
+./configure: line 6764: -v: command not found | |
+configure:6773: $? = 127 | |
+configure:6762: -V >&5 | |
+./configure: line 6764: -V: command not found | |
+configure:6773: $? = 127 | |
+configure:6762: -qversion >&5 | |
+./configure: line 6764: -qversion: command not found | |
+configure:6773: $? = 127 | |
+configure:6782: checking whether we are using the GNU Fortran 77 compiler | |
+configure:6795: -c conftest.F >&5 | |
+./configure: line 2121: -c: command not found | |
+configure:6795: $? = 127 | |
configure: failed program was: | |
| program main | |
| #ifndef __GNUC__ | |
@@ -456,126 +458,126 @@ | |
| #endif | |
| | |
| end | |
-configure:6785: result: no | |
-configure:6791: checking whether accepts -g | |
-configure:6802: -c -g conftest.f >&5 | |
-./configure: line 2114: -c: command not found | |
-configure:6802: $? = 127 | |
+configure:6804: result: no | |
+configure:6810: checking whether accepts -g | |
+configure:6821: -c -g conftest.f >&5 | |
+./configure: line 2121: -c: command not found | |
+configure:6821: $? = 127 | |
configure: failed program was: | |
| program main | |
| | |
| end | |
-configure:6810: result: no | |
-configure:6844: checking the maximum length of command line arguments | |
-configure:6953: result: 196608 | |
-configure:6964: checking command to parse /Applications/Xcode.app/Contents/Developer/usr/bin/nm output from clang object | |
-configure:7069: clang -c -g -O2 conftest.c >&5 | |
-configure:7072: $? = 0 | |
-configure:7076: /Applications/Xcode.app/Contents/Developer/usr/bin/nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' \> conftest.nm | |
-configure:7079: $? = 0 | |
+configure:6829: result: no | |
+configure:6863: checking the maximum length of command line arguments | |
+configure:6972: result: 196608 | |
+configure:6983: checking command to parse /Applications/Xcode.app/Contents/Developer/usr/bin/nm output from clang object | |
+configure:7088: clang -c -g -O2 conftest.c >&5 | |
+configure:7091: $? = 0 | |
+configure:7095: /Applications/Xcode.app/Contents/Developer/usr/bin/nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' \> conftest.nm | |
+configure:7098: $? = 0 | |
cannot find nm_test_var in conftest.nm | |
-configure:7069: clang -c -g -O2 conftest.c >&5 | |
-configure:7072: $? = 0 | |
-configure:7076: /Applications/Xcode.app/Contents/Developer/usr/bin/nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p' \> conftest.nm | |
-configure:7079: $? = 0 | |
-configure:7131: clang -o conftest -g -O2 conftest.c conftstm.o >&5 | |
-configure:7134: $? = 0 | |
-configure:7172: result: ok | |
-configure:7176: checking for objdir | |
-configure:7191: result: .libs | |
-configure:7283: checking for ar | |
-configure:7299: found /Applications/Xcode.app/Contents/Developer/usr/bin/ar | |
-configure:7310: result: ar | |
-configure:7375: checking for ranlib | |
-configure:7402: result: ranlib | |
-configure:7467: checking for strip | |
-configure:7483: found /Applications/Xcode.app/Contents/Developer/usr/bin/strip | |
-configure:7494: result: strip | |
-configure:7776: checking if clang supports -fno-rtti -fno-exceptions | |
-configure:7794: clang -c -g -O2 -fno-rtti -fno-exceptions conftest.c >&5 | |
-configure:7798: $? = 0 | |
-configure:7811: result: yes | |
-configure:7826: checking for clang option to produce PIC | |
-configure:8036: result: -fno-common | |
-configure:8044: checking if clang PIC flag -fno-common works | |
-configure:8062: clang -c -g -O2 -fno-common -DPIC conftest.c >&5 | |
-configure:8066: $? = 0 | |
-configure:8079: result: yes | |
-configure:8107: checking if clang static flag -static works | |
-configure:8135: result: no | |
-configure:8145: checking if clang supports -c -o file.o | |
-configure:8166: clang -c -g -O2 -o out/conftest2.o conftest.c >&5 | |
-configure:8170: $? = 0 | |
-configure:8192: result: yes | |
-configure:8218: checking whether the clang linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
-configure:9118: result: yes | |
-configure:9185: checking dynamic linker characteristics | |
-configure:9773: result: darwin11.4.2 dyld | |
-configure:9782: checking how to hardcode library paths into programs | |
-configure:9807: result: immediate | |
-configure:9821: checking whether stripping libraries is possible | |
-configure:9834: result: yes | |
-configure:10342: checking if libtool supports shared libraries | |
-configure:10344: result: yes | |
-configure:10347: checking whether to build shared libraries | |
-configure:10368: result: yes | |
-configure:10371: checking whether to build static libraries | |
-configure:10375: result: yes | |
-configure:10467: creating libtool | |
-configure:11051: checking for ld used by clang++ | |
-configure:11118: result: /Applications/Xcode.app/Contents/Developer/usr/bin/ld | |
-configure:11125: checking if the linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) is GNU ld | |
-configure:11140: result: no | |
-configure:11191: checking whether the clang++ linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
-configure:12071: result: yes | |
-configure:12089: clang++ -c -g -O2 conftest.cpp >&5 | |
-configure:12092: $? = 0 | |
-configure:12211: checking for clang++ option to produce PIC | |
-configure:12485: result: -fno-common | |
-configure:12493: checking if clang++ PIC flag -fno-common works | |
-configure:12511: clang++ -c -g -O2 -fno-common -DPIC conftest.cpp >&5 | |
-configure:12515: $? = 0 | |
-configure:12528: result: yes | |
-configure:12556: checking if clang++ static flag -static works | |
-configure:12584: result: no | |
-configure:12594: checking if clang++ supports -c -o file.o | |
-configure:12615: clang++ -c -g -O2 -o out/conftest2.o conftest.cpp >&5 | |
-configure:12619: $? = 0 | |
-configure:12641: result: yes | |
-configure:12667: checking whether the clang++ linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
-configure:12692: result: yes | |
-configure:12759: checking dynamic linker characteristics | |
-configure:13347: result: darwin11.4.2 dyld | |
-configure:13356: checking how to hardcode library paths into programs | |
-configure:13381: result: immediate | |
-configure:19417: checking for a thread-safe mkdir -p | |
-configure:19456: result: /usr/local/bin/gmkdir -p | |
-configure:19464: checking for fdatasync | |
-configure:19464: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19464: $? = 0 | |
-configure:19464: result: yes | |
-configure:19464: checking for usleep | |
-configure:19464: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19464: $? = 0 | |
-configure:19464: result: yes | |
-configure:19464: checking for fullfsync | |
-configure:19464: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:7088: clang -c -g -O2 conftest.c >&5 | |
+configure:7091: $? = 0 | |
+configure:7095: /Applications/Xcode.app/Contents/Developer/usr/bin/nm conftest.o \| sed -n -e 's/^.*[ ]\([BCDEGRST][BCDEGRST]*\)[ ][ ]*_\([_A-Za-z][_A-Za-z0-9]*\)$/\1 _\2 \2/p' \> conftest.nm | |
+configure:7098: $? = 0 | |
+configure:7150: clang -o conftest -g -O2 conftest.c conftstm.o >&5 | |
+configure:7153: $? = 0 | |
+configure:7191: result: ok | |
+configure:7195: checking for objdir | |
+configure:7210: result: .libs | |
+configure:7302: checking for ar | |
+configure:7318: found /Applications/Xcode.app/Contents/Developer/usr/bin/ar | |
+configure:7329: result: ar | |
+configure:7394: checking for ranlib | |
+configure:7421: result: ranlib | |
+configure:7486: checking for strip | |
+configure:7502: found /Applications/Xcode.app/Contents/Developer/usr/bin/strip | |
+configure:7513: result: strip | |
+configure:7795: checking if clang supports -fno-rtti -fno-exceptions | |
+configure:7813: clang -c -g -O2 -fno-rtti -fno-exceptions conftest.c >&5 | |
+configure:7817: $? = 0 | |
+configure:7830: result: yes | |
+configure:7845: checking for clang option to produce PIC | |
+configure:8055: result: -fno-common | |
+configure:8063: checking if clang PIC flag -fno-common works | |
+configure:8081: clang -c -g -O2 -fno-common -DPIC conftest.c >&5 | |
+configure:8085: $? = 0 | |
+configure:8098: result: yes | |
+configure:8126: checking if clang static flag -static works | |
+configure:8154: result: no | |
+configure:8164: checking if clang supports -c -o file.o | |
+configure:8185: clang -c -g -O2 -o out/conftest2.o conftest.c >&5 | |
+configure:8189: $? = 0 | |
+configure:8211: result: yes | |
+configure:8237: checking whether the clang linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
+configure:9137: result: yes | |
+configure:9204: checking dynamic linker characteristics | |
+configure:9792: result: darwin11.4.2 dyld | |
+configure:9801: checking how to hardcode library paths into programs | |
+configure:9826: result: immediate | |
+configure:9840: checking whether stripping libraries is possible | |
+configure:9853: result: yes | |
+configure:10361: checking if libtool supports shared libraries | |
+configure:10363: result: yes | |
+configure:10366: checking whether to build shared libraries | |
+configure:10387: result: yes | |
+configure:10390: checking whether to build static libraries | |
+configure:10394: result: yes | |
+configure:10486: creating libtool | |
+configure:11070: checking for ld used by clang++ | |
+configure:11137: result: /Applications/Xcode.app/Contents/Developer/usr/bin/ld | |
+configure:11144: checking if the linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) is GNU ld | |
+configure:11159: result: no | |
+configure:11210: checking whether the clang++ linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
+configure:12090: result: yes | |
+configure:12108: clang++ -c -g -O2 conftest.cpp >&5 | |
+configure:12111: $? = 0 | |
+configure:12230: checking for clang++ option to produce PIC | |
+configure:12504: result: -fno-common | |
+configure:12512: checking if clang++ PIC flag -fno-common works | |
+configure:12530: clang++ -c -g -O2 -fno-common -DPIC conftest.cpp >&5 | |
+configure:12534: $? = 0 | |
+configure:12547: result: yes | |
+configure:12575: checking if clang++ static flag -static works | |
+configure:12603: result: no | |
+configure:12613: checking if clang++ supports -c -o file.o | |
+configure:12634: clang++ -c -g -O2 -o out/conftest2.o conftest.cpp >&5 | |
+configure:12638: $? = 0 | |
+configure:12660: result: yes | |
+configure:12686: checking whether the clang++ linker (/Applications/Xcode.app/Contents/Developer/usr/bin/ld) supports shared libraries | |
+configure:12711: result: yes | |
+configure:12778: checking dynamic linker characteristics | |
+configure:13366: result: darwin11.4.2 dyld | |
+configure:13375: checking how to hardcode library paths into programs | |
+configure:13400: result: immediate | |
+configure:19436: checking for a thread-safe mkdir -p | |
+configure:19475: result: /usr/local/bin/gmkdir -p | |
+configure:19483: checking for fdatasync | |
+configure:19483: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19483: $? = 0 | |
+configure:19483: result: yes | |
+configure:19483: checking for usleep | |
+configure:19483: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19483: $? = 0 | |
+configure:19483: result: yes | |
+configure:19483: checking for fullfsync | |
+configure:19483: clang -o conftest -g -O2 conftest.c >&5 | |
Undefined symbols for architecture x86_64: | |
"_fullfsync", referenced from: | |
- _main in conftest-tkEfNi.o | |
+ _main in conftest-8uTd3M.o | |
ld: symbol(s) not found for architecture x86_64 | |
clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation) | |
-configure:19464: $? = 1 | |
+configure:19483: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -628,25 +630,25 @@ | |
| ; | |
| return 0; | |
| } | |
-configure:19464: result: no | |
-configure:19464: checking for localtime_r | |
-configure:19464: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19464: $? = 0 | |
-configure:19464: result: yes | |
-configure:19464: checking for gmtime_r | |
-configure:19464: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19464: $? = 0 | |
-configure:19464: result: yes | |
-configure:19474: checking whether strerror_r is declared | |
-configure:19474: clang -c -g -O2 conftest.c >&5 | |
-configure:19474: $? = 0 | |
-configure:19474: result: yes | |
-configure:19487: checking for strerror_r | |
-configure:19487: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19487: $? = 0 | |
-configure:19487: result: yes | |
-configure:19496: checking whether strerror_r returns char * | |
-configure:19520: clang -c -g -O2 conftest.c >&5 | |
+configure:19483: result: no | |
+configure:19483: checking for localtime_r | |
+configure:19483: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19483: $? = 0 | |
+configure:19483: result: yes | |
+configure:19483: checking for gmtime_r | |
+configure:19483: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19483: $? = 0 | |
+configure:19483: result: yes | |
+configure:19492: checking whether strerror_r is declared | |
+configure:19492: clang -c -g -O2 conftest.c >&5 | |
+configure:19492: $? = 0 | |
+configure:19492: result: yes | |
+configure:19505: checking for strerror_r | |
+configure:19505: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19505: $? = 0 | |
+configure:19505: result: yes | |
+configure:19514: checking whether strerror_r returns char * | |
+configure:19538: clang -c -g -O2 conftest.c >&5 | |
conftest.c:66:13: error: indirection requires pointer operand ('int' invalid) | |
char x = *strerror_r (0, buf, sizeof buf); | |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
@@ -654,17 +656,17 @@ | |
char *p = strerror_r (0, buf, sizeof buf); | |
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
1 warning and 1 error generated. | |
-configure:19520: $? = 1 | |
+configure:19538: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -728,25 +730,25 @@ | |
| ; | |
| return 0; | |
| } | |
-configure:19558: result: no | |
-configure:19584: checking for library containing tgetent | |
-configure:19615: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19576: result: no | |
+configure:19602: checking for library containing tgetent | |
+configure:19633: clang -o conftest -g -O2 conftest.c >&5 | |
Undefined symbols for architecture x86_64: | |
"_tgetent", referenced from: | |
- _main in conftest-inpZQN.o | |
+ _main in conftest-fUAvCJ.o | |
ld: symbol(s) not found for architecture x86_64 | |
clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation) | |
-configure:19615: $? = 1 | |
+configure:19633: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -780,27 +782,27 @@ | |
| ; | |
| return 0; | |
| } | |
-configure:19615: clang -o conftest -g -O2 conftest.c -lcurses >&5 | |
-configure:19615: $? = 0 | |
-configure:19632: result: -lcurses | |
-configure:19640: checking for library containing readline | |
-configure:19671: clang -o conftest -g -O2 conftest.c -lcurses >&5 | |
+configure:19633: clang -o conftest -g -O2 conftest.c -lcurses >&5 | |
+configure:19633: $? = 0 | |
+configure:19650: result: -lcurses | |
+configure:19658: checking for library containing readline | |
+configure:19689: clang -o conftest -g -O2 conftest.c -lcurses >&5 | |
Undefined symbols for architecture x86_64: | |
"_readline", referenced from: | |
- _main in conftest-AYJfYk.o | |
+ _main in conftest-buWDeg.o | |
ld: symbol(s) not found for architecture x86_64 | |
clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation) | |
-configure:19671: $? = 1 | |
+configure:19689: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -834,41 +836,41 @@ | |
| ; | |
| return 0; | |
| } | |
-configure:19671: clang -o conftest -g -O2 conftest.c -lreadline -lcurses >&5 | |
-configure:19671: $? = 0 | |
-configure:19688: result: -lreadline | |
-configure:19700: checking for readline | |
-configure:19700: clang -o conftest -g -O2 conftest.c -lreadline -lcurses >&5 | |
-configure:19700: $? = 0 | |
-configure:19700: result: yes | |
-configure:19728: checking for library containing pthread_create | |
-configure:19759: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19759: $? = 0 | |
-configure:19776: result: none required | |
-configure:19799: checking for library containing dlopen | |
-configure:19830: clang -o conftest -g -O2 conftest.c >&5 | |
-configure:19830: $? = 0 | |
-configure:19847: result: none required | |
-configure:19858: checking for whether to support dynamic extensions | |
-configure:19860: result: yes | |
-configure:19867: checking for posix_fallocate | |
-configure:19867: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19689: clang -o conftest -g -O2 conftest.c -lreadline -lcurses >&5 | |
+configure:19689: $? = 0 | |
+configure:19706: result: -lreadline | |
+configure:19718: checking for readline | |
+configure:19718: clang -o conftest -g -O2 conftest.c -lreadline -lcurses >&5 | |
+configure:19718: $? = 0 | |
+configure:19718: result: yes | |
+configure:19746: checking for library containing pthread_create | |
+configure:19777: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19777: $? = 0 | |
+configure:19794: result: none required | |
+configure:19817: checking for library containing dlopen | |
+configure:19848: clang -o conftest -g -O2 conftest.c >&5 | |
+configure:19848: $? = 0 | |
+configure:19865: result: none required | |
+configure:19876: checking for whether to support dynamic extensions | |
+configure:19878: result: yes | |
+configure:19885: checking for posix_fallocate | |
+configure:19885: clang -o conftest -g -O2 conftest.c >&5 | |
Undefined symbols for architecture x86_64: | |
"_posix_fallocate", referenced from: | |
- _main in conftest-FexDHu.o | |
+ _main in conftest-N0Fm0u.o | |
ld: symbol(s) not found for architecture x86_64 | |
clang-3.3: error: linker command failed with exit code 1 (use -v to see invocation) | |
-configure:19867: $? = 1 | |
+configure:19885: $? = 1 | |
configure: failed program was: | |
| /* confdefs.h */ | |
| #define PACKAGE_NAME "sqlite" | |
| #define PACKAGE_TARNAME "sqlite" | |
-| #define PACKAGE_VERSION "3.7.9" | |
-| #define PACKAGE_STRING "sqlite 3.7.9" | |
+| #define PACKAGE_VERSION "3.7.10" | |
+| #define PACKAGE_STRING "sqlite 3.7.10" | |
| #define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
| #define PACKAGE_URL "" | |
| #define PACKAGE "sqlite" | |
-| #define VERSION "3.7.9" | |
+| #define VERSION "3.7.10" | |
| #define STDC_HEADERS 1 | |
| #define HAVE_SYS_TYPES_H 1 | |
| #define HAVE_SYS_STAT_H 1 | |
@@ -926,15 +928,15 @@ | |
| ; | |
| return 0; | |
| } | |
-configure:19867: result: no | |
-configure:20056: creating ./config.status | |
+configure:19885: result: no | |
+configure:20086: creating ./config.status | |
## ---------------------- ## | |
## Running config.status. ## | |
## ---------------------- ## | |
-This file was extended by sqlite config.status 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+This file was extended by sqlite config.status 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
CONFIG_FILES = | |
CONFIG_HEADERS = | |
@@ -944,9 +946,9 @@ | |
on dane | |
-config.status:800: creating Makefile | |
-config.status:800: creating sqlite3.pc | |
-config.status:963: executing depfiles commands | |
+config.status:809: creating Makefile | |
+config.status:809: creating sqlite3.pc | |
+config.status:981: executing depfiles commands | |
## ---------------- ## | |
## Cache variables. ## | |
@@ -1061,15 +1063,15 @@ | |
## Output variables. ## | |
## ----------------- ## | |
-ACLOCAL='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run aclocal-1.9' | |
+ACLOCAL='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run aclocal-1.9' | |
AMDEPBACKSLASH='\' | |
AMDEP_FALSE='#' | |
AMDEP_TRUE='' | |
-AMTAR='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run tar' | |
+AMTAR='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run tar' | |
AR='ar' | |
-AUTOCONF='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoconf' | |
-AUTOHEADER='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoheader' | |
-AUTOMAKE='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run automake-1.9' | |
+AUTOCONF='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoconf' | |
+AUTOHEADER='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoheader' | |
+AUTOMAKE='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run automake-1.9' | |
AWK='awk' | |
BUILD_CFLAGS='' | |
CC='clang' | |
@@ -1082,7 +1084,7 @@ | |
CXXDEPMODE='depmode=gcc3' | |
CXXFLAGS='-g -O2' | |
CYGPATH_W='echo' | |
-DEFS='-DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.9\" -DPACKAGE_STRING=\"sqlite\ 3.7.9\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.9\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1' | |
+DEFS='-DPACKAGE_NAME=\"sqlite\" -DPACKAGE_TARNAME=\"sqlite\" -DPACKAGE_VERSION=\"3.7.10\" -DPACKAGE_STRING=\"sqlite\ 3.7.10\" -DPACKAGE_BUGREPORT=\"http://www.sqlite.org\" -DPACKAGE_URL=\"\" -DPACKAGE=\"sqlite\" -DVERSION=\"3.7.10\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1' | |
DEPDIR='.deps' | |
DYNAMIC_EXTENSION_FLAGS='' | |
ECHO='/usr/local/Cellar/coreutils/8.17/libexec/gnubin//echo' | |
@@ -1104,16 +1106,16 @@ | |
LIBTOOL='$(SHELL) $(top_builddir)/libtool' | |
LN_S='ln -s' | |
LTLIBOBJS='' | |
-MAKEINFO='${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run makeinfo' | |
+MAKEINFO='${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run makeinfo' | |
MKDIR_P='/usr/local/bin/gmkdir -p' | |
OBJEXT='o' | |
PACKAGE='sqlite' | |
PACKAGE_BUGREPORT='http://www.sqlite.org' | |
PACKAGE_NAME='sqlite' | |
-PACKAGE_STRING='sqlite 3.7.9' | |
+PACKAGE_STRING='sqlite 3.7.10' | |
PACKAGE_TARNAME='sqlite' | |
PACKAGE_URL='' | |
-PACKAGE_VERSION='3.7.9' | |
+PACKAGE_VERSION='3.7.10' | |
PATH_SEPARATOR=':' | |
RANLIB='ranlib' | |
READLINE_LIBS='-lreadline -lcurses ' | |
@@ -1121,7 +1123,7 @@ | |
SHELL='/bin/sh' | |
STRIP='strip' | |
THREADSAFE_FLAGS='-D_REENTRANT=1 -DSQLITE_THREADSAFE=1' | |
-VERSION='3.7.9' | |
+VERSION='3.7.10' | |
ac_ct_CC='clang' | |
ac_ct_CXX='' | |
ac_ct_F77='' | |
@@ -1153,7 +1155,7 @@ | |
htmldir='${docdir}' | |
includedir='${prefix}/include' | |
infodir='${datarootdir}/info' | |
-install_sh='/Users/dane/src/sqlite-autoconf-3070900/install-sh' | |
+install_sh='/Users/dane/src/sqlite-autoconf-3071000/install-sh' | |
libdir='${exec_prefix}/lib' | |
libexecdir='${exec_prefix}/libexec' | |
localedir='${datarootdir}/locale' | |
@@ -1162,7 +1164,7 @@ | |
mkdir_p='mkdir -p --' | |
oldincludedir='/usr/include' | |
pdfdir='${docdir}' | |
-prefix='/opt/sqlite-3070900' | |
+prefix='/opt/sqlite-3071000' | |
program_transform_name='s,x,x,' | |
psdir='${docdir}' | |
sbindir='${exec_prefix}/sbin' | |
@@ -1177,12 +1179,12 @@ | |
/* confdefs.h */ | |
#define PACKAGE_NAME "sqlite" | |
#define PACKAGE_TARNAME "sqlite" | |
-#define PACKAGE_VERSION "3.7.9" | |
-#define PACKAGE_STRING "sqlite 3.7.9" | |
+#define PACKAGE_VERSION "3.7.10" | |
+#define PACKAGE_STRING "sqlite 3.7.10" | |
#define PACKAGE_BUGREPORT "http://www.sqlite.org" | |
#define PACKAGE_URL "" | |
#define PACKAGE "sqlite" | |
-#define VERSION "3.7.9" | |
+#define VERSION "3.7.10" | |
#define STDC_HEADERS 1 | |
#define HAVE_SYS_TYPES_H 1 | |
#define HAVE_SYS_STAT_H 1 | |
diff -u -r sqlite-autoconf-3070900/config.status sqlite-autoconf-3071000/config.status | |
--- sqlite-autoconf-3070900/config.status 2013-03-29 16:45:43.000000000 -0700 | |
+++ sqlite-autoconf-3071000/config.status 2013-03-29 18:33:45.000000000 -0700 | |
@@ -89,6 +89,7 @@ | |
IFS=" "" $as_nl" | |
# Find who we are. Look in the path if we contain no directory separator. | |
+as_myself= | |
case $0 in #(( | |
*[\\/]* ) as_myself=$0 ;; | |
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -134,19 +135,19 @@ | |
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH | |
-# as_fn_error ERROR [LINENO LOG_FD] | |
-# --------------------------------- | |
+# as_fn_error STATUS ERROR [LINENO LOG_FD] | |
+# ---------------------------------------- | |
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are | |
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the | |
-# script with status $?, using 1 if that was 0. | |
+# script with STATUS, using 1 if that was 0. | |
as_fn_error () | |
{ | |
- as_status=$?; test $as_status -eq 0 && as_status=1 | |
- if test "$3"; then | |
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 | |
+ as_status=$1; test $as_status -eq 0 && as_status=1 | |
+ if test "$4"; then | |
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 | |
fi | |
- $as_echo "$as_me: error: $1" >&2 | |
+ $as_echo "$as_me: error: $2" >&2 | |
as_fn_exit $as_status | |
} # as_fn_error | |
@@ -342,7 +343,7 @@ | |
test -d "$as_dir" && break | |
done | |
test -z "$as_dirs" || eval "mkdir $as_dirs" | |
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" | |
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" | |
} # as_fn_mkdir_p | |
@@ -391,8 +392,8 @@ | |
# report actual input values of CONFIG_FILES etc. instead of their | |
# values after options handling. | |
ac_log=" | |
-This file was extended by sqlite $as_me 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+This file was extended by sqlite $as_me 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
CONFIG_FILES = $CONFIG_FILES | |
CONFIG_HEADERS = $CONFIG_HEADERS | |
@@ -432,17 +433,17 @@ | |
Report bugs to <http://www.sqlite.org>." | |
-ac_cs_config="'--prefix=/opt/sqlite-3070900' 'CC=clang' 'CXX=clang++'" | |
+ac_cs_config="'--prefix=/opt/sqlite-3071000' 'CC=clang' 'CXX=clang++'" | |
ac_cs_version="\ | |
-sqlite config.status 3.7.9 | |
-configured by ./configure, generated by GNU Autoconf 2.65, | |
+sqlite config.status 3.7.10 | |
+configured by ./configure, generated by GNU Autoconf 2.68, | |
with options \"$ac_cs_config\" | |
-Copyright (C) 2009 Free Software Foundation, Inc. | |
+Copyright (C) 2010 Free Software Foundation, Inc. | |
This config.status script is free software; the Free Software Foundation | |
gives unlimited permission to copy, distribute and modify it." | |
-ac_pwd='/Users/dane/src/sqlite-autoconf-3070900' | |
+ac_pwd='/Users/dane/src/sqlite-autoconf-3071000' | |
srcdir='.' | |
INSTALL='/usr/local/bin/ginstall -c' | |
MKDIR_P='/usr/local/bin/gmkdir -p' | |
@@ -453,11 +454,16 @@ | |
while test $# != 0 | |
do | |
case $1 in | |
- --*=*) | |
+ --*=?*) | |
ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` | |
ac_shift=: | |
;; | |
+ --*=) | |
+ ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
+ ac_optarg= | |
+ ac_shift=: | |
+ ;; | |
*) | |
ac_option=$1 | |
ac_optarg=$2 | |
@@ -479,6 +485,7 @@ | |
$ac_shift | |
case $ac_optarg in | |
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; | |
+ '') as_fn_error $? "missing file argument" ;; | |
esac | |
as_fn_append CONFIG_FILES " '$ac_optarg'" | |
ac_need_defaults=false;; | |
@@ -489,7 +496,7 @@ | |
ac_cs_silent=: ;; | |
# This is an error. | |
- -*) as_fn_error "unrecognized option: \`$1' | |
+ -*) as_fn_error $? "unrecognized option: \`$1' | |
Try \`$0 --help' for more information." ;; | |
*) as_fn_append ac_config_targets " $1" | |
@@ -507,7 +514,7 @@ | |
fi | |
if $ac_cs_recheck; then | |
- set X '/bin/sh' './configure' '--prefix=/opt/sqlite-3070900' 'CC=clang' 'CXX=clang++' $ac_configure_extra_args --no-create --no-recursion | |
+ set X '/bin/sh' './configure' '--prefix=/opt/sqlite-3071000' 'CC=clang' 'CXX=clang++' $ac_configure_extra_args --no-create --no-recursion | |
shift | |
$as_echo "running CONFIG_SHELL=/bin/sh $*" >&6 | |
CONFIG_SHELL='/bin/sh' | |
@@ -538,7 +545,7 @@ | |
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; | |
"sqlite3.pc") CONFIG_FILES="$CONFIG_FILES sqlite3.pc" ;; | |
- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
esac | |
done | |
@@ -560,9 +567,10 @@ | |
# after its creation but before its name has been assigned to `$tmp'. | |
$debug || | |
{ | |
- tmp= | |
+ tmp= ac_tmp= | |
trap 'exit_status=$? | |
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status | |
+ : "${ac_tmp:=$tmp}" | |
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status | |
' 0 | |
trap 'as_fn_exit 1' 1 2 13 15 | |
} | |
@@ -570,12 +578,13 @@ | |
{ | |
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && | |
- test -n "$tmp" && test -d "$tmp" | |
+ test -d "$tmp" | |
} || | |
{ | |
tmp=./conf$$-$RANDOM | |
(umask 077 && mkdir "$tmp") | |
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 | |
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 | |
+ac_tmp=$tmp | |
# Set up the scripts for CONFIG_FILES section. | |
# No need to generate them if there are no CONFIG_FILES. | |
@@ -592,13 +601,13 @@ | |
fi | |
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` | |
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then | |
- ac_cs_awk_cr='\r' | |
+ ac_cs_awk_cr='\\r' | |
else | |
ac_cs_awk_cr=$ac_cr | |
fi | |
-echo 'BEGIN {' >"$tmp/subs1.awk" && | |
-cat >>"$tmp/subs1.awk" <<\_ACAWK && | |
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" && | |
+cat >>"$ac_tmp/subs1.awk" <<\_ACAWK && | |
S["LTLIBOBJS"]="" | |
S["LIBOBJS"]="" | |
S["DYNAMIC_EXTENSION_FLAGS"]="" | |
@@ -650,20 +659,20 @@ | |
S["CC"]="clang" | |
S["am__untar"]="${AMTAR} xf -" | |
S["am__tar"]="${AMTAR} chof - \"$$tardir\"" | |
-S["AMTAR"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run tar" | |
+S["AMTAR"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run tar" | |
S["am__leading_dot"]="." | |
S["SET_MAKE"]="" | |
S["AWK"]="awk" | |
S["mkdir_p"]="mkdir -p --" | |
S["INSTALL_STRIP_PROGRAM"]="${SHELL} $(install_sh) -c -s" | |
S["STRIP"]="strip" | |
-S["install_sh"]="/Users/dane/src/sqlite-autoconf-3070900/install-sh" | |
-S["MAKEINFO"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run makeinfo" | |
-S["AUTOHEADER"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoheader" | |
-S["AUTOMAKE"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run automake-1.9" | |
-S["AUTOCONF"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run autoconf" | |
-S["ACLOCAL"]="${SHELL} /Users/dane/src/sqlite-autoconf-3070900/missing --run aclocal-1.9" | |
-S["VERSION"]="3.7.9" | |
+S["install_sh"]="/Users/dane/src/sqlite-autoconf-3071000/install-sh" | |
+S["MAKEINFO"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run makeinfo" | |
+S["AUTOHEADER"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoheader" | |
+S["AUTOMAKE"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run automake-1.9" | |
+S["AUTOCONF"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run autoconf" | |
+S["ACLOCAL"]="${SHELL} /Users/dane/src/sqlite-autoconf-3071000/missing --run aclocal-1.9" | |
+S["VERSION"]="3.7.10" | |
S["PACKAGE"]="sqlite" | |
S["CYGPATH_W"]="echo" | |
S["INSTALL_DATA"]="${INSTALL} -m 644" | |
@@ -676,10 +685,10 @@ | |
S["ECHO_T"]="" | |
S["ECHO_N"]="" | |
S["ECHO_C"]="\\c" | |
-S["DEFS"]="-DPACKAGE_NAME=\\\"sqlite\\\" -DPACKAGE_TARNAME=\\\"sqlite\\\" -DPACKAGE_VERSION=\\\"3.7.9\\\" -DPACKAGE_STRING=\\\"sqlite\\ 3.7.9\\\" -DPACKAGE_BUGREPORT=\\\"http://w"\ | |
-"ww.sqlite.org\\\" -DPACKAGE_URL=\\\"\\\" -DPACKAGE=\\\"sqlite\\\" -DVERSION=\\\"3.7.9\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_"\ | |
-"H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATASYNC"\ | |
-"=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1" | |
+S["DEFS"]="-DPACKAGE_NAME=\\\"sqlite\\\" -DPACKAGE_TARNAME=\\\"sqlite\\\" -DPACKAGE_VERSION=\\\"3.7.10\\\" -DPACKAGE_STRING=\\\"sqlite\\ 3.7.10\\\" -DPACKAGE_BUGREPORT=\\\"http:/"\ | |
+"/www.sqlite.org\\\" -DPACKAGE_URL=\\\"\\\" -DPACKAGE=\\\"sqlite\\\" -DVERSION=\\\"3.7.10\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDL"\ | |
+"IB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DHAVE_FDATAS"\ | |
+"YNC=1 -DHAVE_USLEEP=1 -DHAVE_LOCALTIME_R=1 -DHAVE_GMTIME_R=1 -DHAVE_DECL_STRERROR_R=1 -DHAVE_STRERROR_R=1 -DHAVE_READLINE=1" | |
S["mandir"]="${datarootdir}/man" | |
S["localedir"]="${datarootdir}/locale" | |
S["libdir"]="${exec_prefix}/lib" | |
@@ -700,18 +709,18 @@ | |
S["sbindir"]="${exec_prefix}/sbin" | |
S["bindir"]="${exec_prefix}/bin" | |
S["program_transform_name"]="s,x,x," | |
-S["prefix"]="/opt/sqlite-3070900" | |
+S["prefix"]="/opt/sqlite-3071000" | |
S["exec_prefix"]="${prefix}" | |
S["PACKAGE_URL"]="" | |
S["PACKAGE_BUGREPORT"]="http://www.sqlite.org" | |
-S["PACKAGE_STRING"]="sqlite 3.7.9" | |
-S["PACKAGE_VERSION"]="3.7.9" | |
+S["PACKAGE_STRING"]="sqlite 3.7.10" | |
+S["PACKAGE_VERSION"]="3.7.10" | |
S["PACKAGE_TARNAME"]="sqlite" | |
S["PACKAGE_NAME"]="sqlite" | |
S["PATH_SEPARATOR"]=":" | |
S["SHELL"]="/bin/sh" | |
_ACAWK | |
-cat >>"$tmp/subs1.awk" <<_ACAWK && | |
+cat >>"$ac_tmp/subs1.awk" <<_ACAWK && | |
for (key in S) S_is_set[key] = 1 | |
FS = "" | |
@@ -741,8 +750,8 @@ | |
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" | |
else | |
cat | |
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ | |
- || as_fn_error "could not setup config files machinery" "$LINENO" 5 | |
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ | |
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 | |
fi # test -n "$CONFIG_FILES" | |
@@ -755,7 +764,7 @@ | |
esac | |
case $ac_mode$ac_tag in | |
:[FHL]*:*);; | |
- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
:[FH]-) ac_tag=-:-;; | |
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;; | |
esac | |
@@ -774,7 +783,7 @@ | |
for ac_f | |
do | |
case $ac_f in | |
- -) ac_f="$tmp/stdin";; | |
+ -) ac_f="$ac_tmp/stdin";; | |
*) # Look for the file first in the build tree, then in the source tree | |
# (if the path is not absolute). The absolute path cannot be DOS-style, | |
# because $ac_f cannot contain `:'. | |
@@ -783,7 +792,7 @@ | |
[\\/$]*) false;; | |
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; | |
esac || | |
- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
esac | |
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac | |
as_fn_append ac_file_inputs " '$ac_f'" | |
@@ -809,8 +818,8 @@ | |
esac | |
case $ac_tag in | |
- *:-:* | *:-) cat >"$tmp/stdin" \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; | |
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \ | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; | |
esac | |
;; | |
esac | |
@@ -915,12 +924,20 @@ | |
s&@mandir@&${datarootdir}/man&g | |
s&\${datarootdir}&${prefix}/share&g' ;; | |
esac | |
-ac_sed_extra="/^[ ]*VPATH[ ]*=/{ | |
-s/:*\$(srcdir):*/:/ | |
-s/:*\${srcdir}:*/:/ | |
-s/:*@srcdir@:*/:/ | |
-s/^\([^=]*=[ ]*\):*/\1/ | |
+ac_sed_extra="/^[ ]*VPATH[ ]*=[ ]*/{ | |
+h | |
+s/// | |
+s/^/:/ | |
+s/[ ]*$/:/ | |
+s/:\$(srcdir):/:/g | |
+s/:\${srcdir}:/:/g | |
+s/:@srcdir@:/:/g | |
+s/^:*// | |
s/:*$// | |
+x | |
+s/\(=[ ]*\).*/\1/ | |
+G | |
+s/\n// | |
s/^[^=]*=[ ]*$// | |
} | |
@@ -940,23 +957,24 @@ | |
s&@MKDIR_P@&$ac_MKDIR_P&;t t | |
$ac_datarootdir_hack | |
" | |
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ | |
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && | |
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && | |
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && | |
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && | |
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ | |
+ "$ac_tmp/out"`; test -z "$ac_out"; } && | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&5 | |
+which seems to be undefined. Please make sure it is defined" >&5 | |
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&2;} | |
+which seems to be undefined. Please make sure it is defined" >&2;} | |
- rm -f "$tmp/stdin" | |
+ rm -f "$ac_tmp/stdin" | |
case $ac_file in | |
- -) cat "$tmp/out" && rm -f "$tmp/out";; | |
- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; | |
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; | |
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; | |
esac \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
;; | |
diff -u -r sqlite-autoconf-3070900/configure sqlite-autoconf-3071000/configure | |
--- sqlite-autoconf-3070900/configure 2011-11-01 05:31:32.000000000 -0700 | |
+++ sqlite-autoconf-3071000/configure 2012-01-16 06:05:06.000000000 -0800 | |
@@ -1,13 +1,13 @@ | |
#! /bin/sh | |
# Guess values for system-dependent variables and create Makefiles. | |
-# Generated by GNU Autoconf 2.65 for sqlite 3.7.9. | |
+# Generated by GNU Autoconf 2.68 for sqlite 3.7.10. | |
# | |
# Report bugs to <http://www.sqlite.org>. | |
# | |
# | |
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, | |
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, | |
-# Inc. | |
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software | |
+# Foundation, Inc. | |
# | |
# | |
# This configure script is free software; the Free Software Foundation | |
@@ -91,6 +91,7 @@ | |
IFS=" "" $as_nl" | |
# Find who we are. Look in the path if we contain no directory separator. | |
+as_myself= | |
case $0 in #(( | |
*[\\/]* ) as_myself=$0 ;; | |
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -216,11 +217,18 @@ | |
# We cannot yet assume a decent shell, so we have to provide a | |
# neutralization value for shells without unset; and this also | |
# works around shells that cannot unset nonexistent variables. | |
+ # Preserve -v and -x to the replacement shell. | |
BASH_ENV=/dev/null | |
ENV=/dev/null | |
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV | |
export CONFIG_SHELL | |
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} | |
+ case $- in # (((( | |
+ *v*x* | *x*v* ) as_opts=-vx ;; | |
+ *v* ) as_opts=-v ;; | |
+ *x* ) as_opts=-x ;; | |
+ * ) as_opts= ;; | |
+ esac | |
+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} | |
fi | |
if test x$as_have_required = xno; then : | |
@@ -319,7 +327,7 @@ | |
test -d "$as_dir" && break | |
done | |
test -z "$as_dirs" || eval "mkdir $as_dirs" | |
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" | |
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" | |
} # as_fn_mkdir_p | |
@@ -359,19 +367,19 @@ | |
fi # as_fn_arith | |
-# as_fn_error ERROR [LINENO LOG_FD] | |
-# --------------------------------- | |
+# as_fn_error STATUS ERROR [LINENO LOG_FD] | |
+# ---------------------------------------- | |
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are | |
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the | |
-# script with status $?, using 1 if that was 0. | |
+# script with STATUS, using 1 if that was 0. | |
as_fn_error () | |
{ | |
- as_status=$?; test $as_status -eq 0 && as_status=1 | |
- if test "$3"; then | |
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 | |
+ as_status=$1; test $as_status -eq 0 && as_status=1 | |
+ if test "$4"; then | |
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 | |
fi | |
- $as_echo "$as_me: error: $1" >&2 | |
+ $as_echo "$as_me: error: $2" >&2 | |
as_fn_exit $as_status | |
} # as_fn_error | |
@@ -687,7 +695,7 @@ | |
exec 6>&1 | |
# Name of the host. | |
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, | |
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, | |
# so uname gets run too. | |
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` | |
@@ -706,8 +714,8 @@ | |
# Identity of this package. | |
PACKAGE_NAME='sqlite' | |
PACKAGE_TARNAME='sqlite' | |
-PACKAGE_VERSION='3.7.9' | |
-PACKAGE_STRING='sqlite 3.7.9' | |
+PACKAGE_VERSION='3.7.10' | |
+PACKAGE_STRING='sqlite 3.7.10' | |
PACKAGE_BUGREPORT='http://www.sqlite.org' | |
PACKAGE_URL='' | |
@@ -949,8 +957,9 @@ | |
fi | |
case $ac_option in | |
- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; | |
- *) ac_optarg=yes ;; | |
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; | |
+ *=) ac_optarg= ;; | |
+ *) ac_optarg=yes ;; | |
esac | |
# Accept the important Cygnus configure options, so we can diagnose typos. | |
@@ -995,7 +1004,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid feature name: $ac_useropt" | |
+ as_fn_error $? "invalid feature name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1021,7 +1030,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid feature name: $ac_useropt" | |
+ as_fn_error $? "invalid feature name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1225,7 +1234,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid package name: $ac_useropt" | |
+ as_fn_error $? "invalid package name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1241,7 +1250,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid package name: $ac_useropt" | |
+ as_fn_error $? "invalid package name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1271,8 +1280,8 @@ | |
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) | |
x_libraries=$ac_optarg ;; | |
- -*) as_fn_error "unrecognized option: \`$ac_option' | |
-Try \`$0 --help' for more information." | |
+ -*) as_fn_error $? "unrecognized option: \`$ac_option' | |
+Try \`$0 --help' for more information" | |
;; | |
*=*) | |
@@ -1280,7 +1289,7 @@ | |
# Reject names that are not valid shell variable names. | |
case $ac_envvar in #( | |
'' | [0-9]* | *[!_$as_cr_alnum]* ) | |
- as_fn_error "invalid variable name: \`$ac_envvar'" ;; | |
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; | |
esac | |
eval $ac_envvar=\$ac_optarg | |
export $ac_envvar ;; | |
@@ -1290,7 +1299,7 @@ | |
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 | |
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && | |
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 | |
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} | |
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" | |
;; | |
esac | |
@@ -1298,13 +1307,13 @@ | |
if test -n "$ac_prev"; then | |
ac_option=--`echo $ac_prev | sed 's/_/-/g'` | |
- as_fn_error "missing argument to $ac_option" | |
+ as_fn_error $? "missing argument to $ac_option" | |
fi | |
if test -n "$ac_unrecognized_opts"; then | |
case $enable_option_checking in | |
no) ;; | |
- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; | |
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; | |
*) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; | |
esac | |
fi | |
@@ -1327,7 +1336,7 @@ | |
[\\/$]* | ?:[\\/]* ) continue;; | |
NONE | '' ) case $ac_var in *prefix ) continue;; esac;; | |
esac | |
- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" | |
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" | |
done | |
# There might be people who depend on the old broken behavior: `$host' | |
@@ -1341,8 +1350,8 @@ | |
if test "x$host_alias" != x; then | |
if test "x$build_alias" = x; then | |
cross_compiling=maybe | |
- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. | |
- If a cross compiler is detected then cross compile mode will be used." >&2 | |
+ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. | |
+ If a cross compiler is detected then cross compile mode will be used" >&2 | |
elif test "x$build_alias" != "x$host_alias"; then | |
cross_compiling=yes | |
fi | |
@@ -1357,9 +1366,9 @@ | |
ac_pwd=`pwd` && test -n "$ac_pwd" && | |
ac_ls_di=`ls -di .` && | |
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || | |
- as_fn_error "working directory cannot be determined" | |
+ as_fn_error $? "working directory cannot be determined" | |
test "X$ac_ls_di" = "X$ac_pwd_ls_di" || | |
- as_fn_error "pwd does not report name of working directory" | |
+ as_fn_error $? "pwd does not report name of working directory" | |
# Find the source files, if location was not specified. | |
@@ -1398,11 +1407,11 @@ | |
fi | |
if test ! -r "$srcdir/$ac_unique_file"; then | |
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." | |
- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" | |
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" | |
fi | |
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" | |
ac_abs_confdir=`( | |
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" | |
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" | |
pwd)` | |
# When building in place, set srcdir=. | |
if test "$ac_abs_confdir" = "$ac_pwd"; then | |
@@ -1428,7 +1437,7 @@ | |
# Omit some internal or obsolete options to make the list less imposing. | |
# This message is too long to be a string in the A/UX 3.1 sh. | |
cat <<_ACEOF | |
-\`configure' configures sqlite 3.7.9 to adapt to many kinds of systems. | |
+\`configure' configures sqlite 3.7.10 to adapt to many kinds of systems. | |
Usage: $0 [OPTION]... [VAR=VALUE]... | |
@@ -1442,7 +1451,7 @@ | |
--help=short display options specific to this package | |
--help=recursive display the short help of all the included packages | |
-V, --version display version information and exit | |
- -q, --quiet, --silent do not print \`checking...' messages | |
+ -q, --quiet, --silent do not print \`checking ...' messages | |
--cache-file=FILE cache test results in FILE [disabled] | |
-C, --config-cache alias for \`--cache-file=config.cache' | |
-n, --no-create do not create output files | |
@@ -1498,7 +1507,7 @@ | |
if test -n "$ac_init_help"; then | |
case $ac_init_help in | |
- short | recursive ) echo "Configuration of sqlite 3.7.9:";; | |
+ short | recursive ) echo "Configuration of sqlite 3.7.10:";; | |
esac | |
cat <<\_ACEOF | |
@@ -1608,10 +1617,10 @@ | |
test -n "$ac_init_help" && exit $ac_status | |
if $ac_init_version; then | |
cat <<\_ACEOF | |
-sqlite configure 3.7.9 | |
-generated by GNU Autoconf 2.65 | |
+sqlite configure 3.7.10 | |
+generated by GNU Autoconf 2.68 | |
-Copyright (C) 2009 Free Software Foundation, Inc. | |
+Copyright (C) 2010 Free Software Foundation, Inc. | |
This configure script is free software; the Free Software Foundation | |
gives unlimited permission to copy, distribute and modify it. | |
_ACEOF | |
@@ -1655,7 +1664,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_compile | |
@@ -1701,7 +1710,7 @@ | |
# interfere with the next link command; also delete a directory that is | |
# left behind by Apple's compiler. We do this before executing the actions. | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_link | |
@@ -1727,7 +1736,7 @@ | |
mv -f conftest.er1 conftest.err | |
fi | |
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |
- test $ac_status = 0; } >/dev/null && { | |
+ test $ac_status = 0; } > conftest.i && { | |
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || | |
test ! -s conftest.err | |
}; then : | |
@@ -1738,7 +1747,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_cpp | |
@@ -1751,10 +1760,10 @@ | |
ac_fn_c_check_header_mongrel () | |
{ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+ if eval \${$3+:} false; then : | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
fi | |
eval ac_res=\$$3 | |
@@ -1790,7 +1799,7 @@ | |
else | |
ac_header_preproc=no | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 | |
$as_echo "$ac_header_preproc" >&6; } | |
@@ -1813,17 +1822,15 @@ | |
$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 | |
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} | |
-( cat <<\_ASBOX | |
-## ------------------------------------ ## | |
+( $as_echo "## ------------------------------------ ## | |
## Report this to http://www.sqlite.org ## | |
-## ------------------------------------ ## | |
-_ASBOX | |
+## ------------------------------------ ##" | |
) | sed "s/^/$as_me: WARNING: /" >&2 | |
;; | |
esac | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
eval "$3=\$ac_header_compiler" | |
@@ -1832,7 +1839,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_header_mongrel | |
@@ -1873,7 +1880,7 @@ | |
ac_retval=$ac_status | |
fi | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_run | |
@@ -1887,7 +1894,7 @@ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -1905,7 +1912,7 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_header_compile | |
@@ -1917,7 +1924,7 @@ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -1972,7 +1979,7 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_func | |
@@ -2009,7 +2016,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_cxx_try_compile | |
@@ -2035,7 +2042,7 @@ | |
mv -f conftest.er1 conftest.err | |
fi | |
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |
- test $ac_status = 0; } >/dev/null && { | |
+ test $ac_status = 0; } > conftest.i && { | |
test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || | |
test ! -s conftest.err | |
}; then : | |
@@ -2046,7 +2053,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_cxx_try_cpp | |
@@ -2092,7 +2099,7 @@ | |
# interfere with the next link command; also delete a directory that is | |
# left behind by Apple's compiler. We do this before executing the actions. | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_cxx_try_link | |
@@ -2130,7 +2137,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_f77_try_compile | |
@@ -2176,20 +2183,23 @@ | |
# interfere with the next link command; also delete a directory that is | |
# left behind by Apple's compiler. We do this before executing the actions. | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_f77_try_link | |
-# ac_fn_c_check_decl LINENO SYMBOL VAR | |
-# ------------------------------------ | |
-# Tests whether SYMBOL is declared, setting cache variable VAR accordingly. | |
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES | |
+# --------------------------------------------- | |
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR | |
+# accordingly. | |
ac_fn_c_check_decl () | |
{ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 | |
-$as_echo_n "checking whether $2 is declared... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+ as_decl_name=`echo $2|sed 's/ *(.*//'` | |
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` | |
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 | |
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; } | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -2198,8 +2208,12 @@ | |
int | |
main () | |
{ | |
-#ifndef $2 | |
- (void) $2; | |
+#ifndef $as_decl_name | |
+#ifdef __cplusplus | |
+ (void) $as_decl_use; | |
+#else | |
+ (void) $as_decl_name; | |
+#endif | |
#endif | |
; | |
@@ -2216,15 +2230,15 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_decl | |
cat >config.log <<_ACEOF | |
This file contains any messages produced by compilers while | |
running configure, to aid debugging if configure makes a mistake. | |
-It was created by sqlite $as_me 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+It was created by sqlite $as_me 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
$ $0 $@ | |
@@ -2334,11 +2348,9 @@ | |
{ | |
echo | |
- cat <<\_ASBOX | |
-## ---------------- ## | |
+ $as_echo "## ---------------- ## | |
## Cache variables. ## | |
-## ---------------- ## | |
-_ASBOX | |
+## ---------------- ##" | |
echo | |
# The following way of writing the cache mishandles newlines in values, | |
( | |
@@ -2372,11 +2384,9 @@ | |
) | |
echo | |
- cat <<\_ASBOX | |
-## ----------------- ## | |
+ $as_echo "## ----------------- ## | |
## Output variables. ## | |
-## ----------------- ## | |
-_ASBOX | |
+## ----------------- ##" | |
echo | |
for ac_var in $ac_subst_vars | |
do | |
@@ -2389,11 +2399,9 @@ | |
echo | |
if test -n "$ac_subst_files"; then | |
- cat <<\_ASBOX | |
-## ------------------- ## | |
+ $as_echo "## ------------------- ## | |
## File substitutions. ## | |
-## ------------------- ## | |
-_ASBOX | |
+## ------------------- ##" | |
echo | |
for ac_var in $ac_subst_files | |
do | |
@@ -2407,11 +2415,9 @@ | |
fi | |
if test -s confdefs.h; then | |
- cat <<\_ASBOX | |
-## ----------- ## | |
+ $as_echo "## ----------- ## | |
## confdefs.h. ## | |
-## ----------- ## | |
-_ASBOX | |
+## ----------- ##" | |
echo | |
cat confdefs.h | |
echo | |
@@ -2466,7 +2472,12 @@ | |
ac_site_file1=NONE | |
ac_site_file2=NONE | |
if test -n "$CONFIG_SITE"; then | |
- ac_site_file1=$CONFIG_SITE | |
+ # We do not want a PATH search for config.site. | |
+ case $CONFIG_SITE in #(( | |
+ -*) ac_site_file1=./$CONFIG_SITE;; | |
+ */*) ac_site_file1=$CONFIG_SITE;; | |
+ *) ac_site_file1=./$CONFIG_SITE;; | |
+ esac | |
elif test "x$prefix" != xNONE; then | |
ac_site_file1=$prefix/share/config.site | |
ac_site_file2=$prefix/etc/config.site | |
@@ -2481,7 +2492,11 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 | |
$as_echo "$as_me: loading site script $ac_site_file" >&6;} | |
sed 's/^/| /' "$ac_site_file" >&5 | |
- . "$ac_site_file" | |
+ . "$ac_site_file" \ | |
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
+as_fn_error $? "failed to load site script $ac_site_file | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
done | |
@@ -2557,7 +2572,7 @@ | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 | |
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} | |
- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 | |
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 | |
fi | |
## -------------------- ## | |
## Main body of script. ## | |
@@ -2576,16 +2591,22 @@ | |
am__api_version="1.9" | |
ac_aux_dir= | |
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do | |
- for ac_t in install-sh install.sh shtool; do | |
- if test -f "$ac_dir/$ac_t"; then | |
- ac_aux_dir=$ac_dir | |
- ac_install_sh="$ac_aux_dir/$ac_t -c" | |
- break 2 | |
- fi | |
- done | |
+ if test -f "$ac_dir/install-sh"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/install-sh -c" | |
+ break | |
+ elif test -f "$ac_dir/install.sh"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/install.sh -c" | |
+ break | |
+ elif test -f "$ac_dir/shtool"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/shtool install -c" | |
+ break | |
+ fi | |
done | |
if test -z "$ac_aux_dir"; then | |
- as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 | |
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 | |
fi | |
# These three variables are undocumented and unsupported, | |
@@ -2614,7 +2635,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 | |
$as_echo_n "checking for a BSD-compatible install... " >&6; } | |
if test -z "$INSTALL"; then | |
-if test "${ac_cv_path_install+set}" = set; then : | |
+if ${ac_cv_path_install+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -2714,7 +2735,7 @@ | |
# if, for instance, CONFIG_SHELL is bash and it inherits a | |
# broken ls alias from the environment. This has actually | |
# happened. Such a system could not be considered "sane". | |
- as_fn_error "ls -t appears to fail. Make sure there is not a broken | |
+ as_fn_error $? "ls -t appears to fail. Make sure there is not a broken | |
alias in your environment" "$LINENO" 5 | |
fi | |
@@ -2724,7 +2745,7 @@ | |
# Ok. | |
: | |
else | |
- as_fn_error "newly created file is older than distributed files! | |
+ as_fn_error $? "newly created file is older than distributed files! | |
Check your system clock" "$LINENO" 5 | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 | |
@@ -2791,7 +2812,7 @@ | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_AWK+set}" = set; then : | |
+if ${ac_cv_prog_AWK+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$AWK"; then | |
@@ -2831,7 +2852,7 @@ | |
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } | |
set x ${MAKE-make} | |
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` | |
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat >conftest.make <<\_ACEOF | |
@@ -2839,7 +2860,7 @@ | |
all: | |
@echo '@@@%%%=$(MAKE)=@@@%%%' | |
_ACEOF | |
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us. | |
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. | |
case `${MAKE-make} -f conftest.make 2>/dev/null` in | |
*@@@%%%=?*=@@@%%%*) | |
eval ac_cv_prog_make_${ac_make}_set=yes;; | |
@@ -2870,7 +2891,7 @@ | |
# test to see if srcdir already configured | |
if test "`cd $srcdir && pwd`" != "`pwd`" && | |
test -f $srcdir/config.status; then | |
- as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 | |
+ as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 | |
fi | |
# test whether we have cygpath | |
@@ -2885,7 +2906,7 @@ | |
# Define the identity of the package. | |
PACKAGE='sqlite' | |
- VERSION='3.7.9' | |
+ VERSION='3.7.10' | |
cat >>confdefs.h <<_ACEOF | |
@@ -2925,7 +2946,7 @@ | |
set dummy ${ac_tool_prefix}strip; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_STRIP+set}" = set; then : | |
+if ${ac_cv_prog_STRIP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$STRIP"; then | |
@@ -2965,7 +2986,7 @@ | |
set dummy strip; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_STRIP"; then | |
@@ -3103,7 +3124,7 @@ | |
set dummy ${ac_tool_prefix}gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -3143,7 +3164,7 @@ | |
set dummy gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -3196,7 +3217,7 @@ | |
set dummy ${ac_tool_prefix}cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -3236,7 +3257,7 @@ | |
set dummy cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -3295,7 +3316,7 @@ | |
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -3339,7 +3360,7 @@ | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -3393,8 +3414,8 @@ | |
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "no acceptable C compiler found in \$PATH | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "no acceptable C compiler found in \$PATH | |
+See \`config.log' for more details" "$LINENO" 5; } | |
# Provide some information about the compiler. | |
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 | |
@@ -3508,9 +3529,8 @@ | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-{ as_fn_set_status 77 | |
-as_fn_error "C compiler cannot create executables | |
-See \`config.log' for more details." "$LINENO" 5; }; } | |
+as_fn_error 77 "C compiler cannot create executables | |
+See \`config.log' for more details" "$LINENO" 5; } | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 | |
$as_echo "yes" >&6; } | |
@@ -3552,8 +3572,8 @@ | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot compute suffix of executables: cannot compile and link | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
rm -f conftest conftest$ac_cv_exeext | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 | |
@@ -3610,9 +3630,9 @@ | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot run C compiled programs. | |
+as_fn_error $? "cannot run C compiled programs. | |
If you meant to cross compile, use \`--host'. | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
fi | |
fi | |
@@ -3623,7 +3643,7 @@ | |
ac_clean_files=$ac_clean_files_save | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 | |
$as_echo_n "checking for suffix of object files... " >&6; } | |
-if test "${ac_cv_objext+set}" = set; then : | |
+if ${ac_cv_objext+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -3663,8 +3683,8 @@ | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot compute suffix of object files: cannot compile | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "cannot compute suffix of object files: cannot compile | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
rm -f conftest.$ac_cv_objext conftest.$ac_ext | |
fi | |
@@ -3674,7 +3694,7 @@ | |
ac_objext=$OBJEXT | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 | |
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } | |
-if test "${ac_cv_c_compiler_gnu+set}" = set; then : | |
+if ${ac_cv_c_compiler_gnu+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -3711,7 +3731,7 @@ | |
ac_save_CFLAGS=$CFLAGS | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 | |
$as_echo_n "checking whether $CC accepts -g... " >&6; } | |
-if test "${ac_cv_prog_cc_g+set}" = set; then : | |
+if ${ac_cv_prog_cc_g+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_save_c_werror_flag=$ac_c_werror_flag | |
@@ -3789,7 +3809,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 | |
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } | |
-if test "${ac_cv_prog_cc_c89+set}" = set; then : | |
+if ${ac_cv_prog_cc_c89+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_cv_prog_cc_c89=no | |
@@ -3888,7 +3908,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 | |
$as_echo_n "checking dependency style of $depcc... " >&6; } | |
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : | |
+if ${am_cv_CC_dependencies_compiler_type+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then | |
@@ -4003,7 +4023,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 | |
$as_echo_n "checking for special C compiler options needed for large files... " >&6; } | |
-if test "${ac_cv_sys_largefile_CC+set}" = set; then : | |
+if ${ac_cv_sys_largefile_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_cv_sys_largefile_CC=no | |
@@ -4054,7 +4074,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 | |
$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } | |
-if test "${ac_cv_sys_file_offset_bits+set}" = set; then : | |
+if ${ac_cv_sys_file_offset_bits+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
while :; do | |
@@ -4123,7 +4143,7 @@ | |
if test $ac_cv_sys_file_offset_bits = unknown; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 | |
$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } | |
-if test "${ac_cv_sys_large_files+set}" = set; then : | |
+if ${ac_cv_sys_large_files+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
while :; do | |
@@ -4204,7 +4224,7 @@ | |
set dummy ${ac_tool_prefix}gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -4244,7 +4264,7 @@ | |
set dummy gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -4297,7 +4317,7 @@ | |
set dummy ${ac_tool_prefix}cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -4337,7 +4357,7 @@ | |
set dummy cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -4396,7 +4416,7 @@ | |
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -4440,7 +4460,7 @@ | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -4494,8 +4514,8 @@ | |
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "no acceptable C compiler found in \$PATH | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "no acceptable C compiler found in \$PATH | |
+See \`config.log' for more details" "$LINENO" 5; } | |
# Provide some information about the compiler. | |
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 | |
@@ -4524,7 +4544,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 | |
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } | |
-if test "${ac_cv_c_compiler_gnu+set}" = set; then : | |
+if ${ac_cv_c_compiler_gnu+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -4561,7 +4581,7 @@ | |
ac_save_CFLAGS=$CFLAGS | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 | |
$as_echo_n "checking whether $CC accepts -g... " >&6; } | |
-if test "${ac_cv_prog_cc_g+set}" = set; then : | |
+if ${ac_cv_prog_cc_g+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_save_c_werror_flag=$ac_c_werror_flag | |
@@ -4639,7 +4659,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 | |
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } | |
-if test "${ac_cv_prog_cc_c89+set}" = set; then : | |
+if ${ac_cv_prog_cc_c89+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_cv_prog_cc_c89=no | |
@@ -4738,7 +4758,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 | |
$as_echo_n "checking dependency style of $depcc... " >&6; } | |
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : | |
+if ${am_cv_CC_dependencies_compiler_type+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then | |
@@ -4848,7 +4868,7 @@ | |
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$RANLIB"; then | |
@@ -4888,7 +4908,7 @@ | |
set dummy ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_RANLIB"; then | |
@@ -5009,27 +5029,27 @@ | |
# Make sure we can run config.sub. | |
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || | |
- as_fn_error "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 | |
+ as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 | |
$as_echo_n "checking build system type... " >&6; } | |
-if test "${ac_cv_build+set}" = set; then : | |
+if ${ac_cv_build+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_build_alias=$build_alias | |
test "x$ac_build_alias" = x && | |
ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` | |
test "x$ac_build_alias" = x && | |
- as_fn_error "cannot guess build type; you must specify one" "$LINENO" 5 | |
+ as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 | |
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || | |
- as_fn_error "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 | |
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 | |
$as_echo "$ac_cv_build" >&6; } | |
case $ac_cv_build in | |
*-*-*) ;; | |
-*) as_fn_error "invalid value of canonical build" "$LINENO" 5;; | |
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; | |
esac | |
build=$ac_cv_build | |
ac_save_IFS=$IFS; IFS='-' | |
@@ -5047,14 +5067,14 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 | |
$as_echo_n "checking host system type... " >&6; } | |
-if test "${ac_cv_host+set}" = set; then : | |
+if ${ac_cv_host+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test "x$host_alias" = x; then | |
ac_cv_host=$ac_cv_build | |
else | |
ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || | |
- as_fn_error "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 | |
+ as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 | |
fi | |
fi | |
@@ -5062,7 +5082,7 @@ | |
$as_echo "$ac_cv_host" >&6; } | |
case $ac_cv_host in | |
*-*-*) ;; | |
-*) as_fn_error "invalid value of canonical host" "$LINENO" 5;; | |
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; | |
esac | |
host=$ac_cv_host | |
ac_save_IFS=$IFS; IFS='-' | |
@@ -5080,7 +5100,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 | |
$as_echo_n "checking for a sed that does not truncate output... " >&6; } | |
-if test "${lt_cv_path_SED+set}" = set; then : | |
+if ${lt_cv_path_SED+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# Loop through the user's path and test for sed and gsed. | |
@@ -5137,7 +5157,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 | |
$as_echo_n "checking for grep that handles long lines and -e... " >&6; } | |
-if test "${ac_cv_path_GREP+set}" = set; then : | |
+if ${ac_cv_path_GREP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$GREP"; then | |
@@ -5186,7 +5206,7 @@ | |
done | |
IFS=$as_save_IFS | |
if test -z "$ac_cv_path_GREP"; then | |
- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
fi | |
else | |
ac_cv_path_GREP=$GREP | |
@@ -5200,7 +5220,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 | |
$as_echo_n "checking for egrep... " >&6; } | |
-if test "${ac_cv_path_EGREP+set}" = set; then : | |
+if ${ac_cv_path_EGREP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 | |
@@ -5252,7 +5272,7 @@ | |
done | |
IFS=$as_save_IFS | |
if test -z "$ac_cv_path_EGREP"; then | |
- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
fi | |
else | |
ac_cv_path_EGREP=$EGREP | |
@@ -5312,7 +5332,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 | |
$as_echo_n "checking for non-GNU ld... " >&6; } | |
fi | |
-if test "${lt_cv_path_LD+set}" = set; then : | |
+if ${lt_cv_path_LD+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$LD"; then | |
@@ -5349,10 +5369,10 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 | |
$as_echo "no" >&6; } | |
fi | |
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 | |
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 | |
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } | |
-if test "${lt_cv_prog_gnu_ld+set}" = set; then : | |
+if ${lt_cv_prog_gnu_ld+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# I'd rather use --version here, but apparently some GNU lds only accept -v. | |
@@ -5372,7 +5392,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 | |
$as_echo_n "checking for $LD option to reload object files... " >&6; } | |
-if test "${lt_cv_ld_reload_flag+set}" = set; then : | |
+if ${lt_cv_ld_reload_flag+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_ld_reload_flag='-r' | |
@@ -5397,7 +5417,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD-compatible nm" >&5 | |
$as_echo_n "checking for BSD-compatible nm... " >&6; } | |
-if test "${lt_cv_path_NM+set}" = set; then : | |
+if ${lt_cv_path_NM+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$NM"; then | |
@@ -5461,7 +5481,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognise dependent libraries" >&5 | |
$as_echo_n "checking how to recognise dependent libraries... " >&6; } | |
-if test "${lt_cv_deplibs_check_method+set}" = set; then : | |
+if ${lt_cv_deplibs_check_method+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_file_magic_cmd='$MAGIC_CMD' | |
@@ -5684,7 +5704,7 @@ | |
;; | |
*-*-irix6*) | |
# Find out which ABI we are using. | |
- echo '#line 5687 "configure"' > conftest.$ac_ext | |
+ echo '#line 5707 "configure"' > conftest.$ac_ext | |
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 | |
(eval $ac_compile) 2>&5 | |
ac_status=$? | |
@@ -5771,7 +5791,7 @@ | |
CFLAGS="$CFLAGS -belf" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 | |
$as_echo_n "checking whether the C compiler needs -belf... " >&6; } | |
-if test "${lt_cv_cc_needs_belf+set}" = set; then : | |
+if ${lt_cv_cc_needs_belf+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_ext=c | |
@@ -5850,7 +5870,7 @@ | |
CPP= | |
fi | |
if test -z "$CPP"; then | |
- if test "${ac_cv_prog_CPP+set}" = set; then : | |
+ if ${ac_cv_prog_CPP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# Double quotes because CPP needs to be expanded | |
@@ -5880,7 +5900,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -5896,11 +5916,11 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
break | |
fi | |
@@ -5939,7 +5959,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -5955,18 +5975,18 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "C preprocessor \"$CPP\" fails sanity check | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
ac_ext=c | |
@@ -5978,7 +5998,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 | |
$as_echo_n "checking for ANSI C header files... " >&6; } | |
-if test "${ac_cv_header_stdc+set}" = set; then : | |
+if ${ac_cv_header_stdc+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -6095,8 +6115,7 @@ | |
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` | |
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default | |
" | |
-eval as_val=\$$as_ac_Header | |
- if test "x$as_val" = x""yes; then : | |
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : | |
cat >>confdefs.h <<_ACEOF | |
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 | |
_ACEOF | |
@@ -6109,7 +6128,7 @@ | |
for ac_header in dlfcn.h | |
do : | |
ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then : | |
+if test "x$ac_cv_header_dlfcn_h" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_DLFCN_H 1 | |
_ACEOF | |
@@ -6134,7 +6153,7 @@ | |
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CXX+set}" = set; then : | |
+if ${ac_cv_prog_CXX+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CXX"; then | |
@@ -6178,7 +6197,7 @@ | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CXX+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CXX"; then | |
@@ -6256,7 +6275,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 | |
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } | |
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : | |
+if ${ac_cv_cxx_compiler_gnu+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -6293,7 +6312,7 @@ | |
ac_save_CXXFLAGS=$CXXFLAGS | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 | |
$as_echo_n "checking whether $CXX accepts -g... " >&6; } | |
-if test "${ac_cv_prog_cxx_g+set}" = set; then : | |
+if ${ac_cv_prog_cxx_g+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_save_cxx_werror_flag=$ac_cxx_werror_flag | |
@@ -6379,7 +6398,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 | |
$as_echo_n "checking dependency style of $depcc... " >&6; } | |
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : | |
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then | |
@@ -6497,7 +6516,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 | |
$as_echo_n "checking how to run the C++ preprocessor... " >&6; } | |
if test -z "$CXXCPP"; then | |
- if test "${ac_cv_prog_CXXCPP+set}" = set; then : | |
+ if ${ac_cv_prog_CXXCPP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# Double quotes because CXXCPP needs to be expanded | |
@@ -6527,7 +6546,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -6543,11 +6562,11 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
break | |
fi | |
@@ -6586,7 +6605,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -6602,18 +6621,18 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "C++ preprocessor \"$CXXCPP\" fails sanity check | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
ac_ext=cpp | |
@@ -6630,13 +6649,13 @@ | |
ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' | |
ac_compiler_gnu=$ac_cv_f77_compiler_gnu | |
if test -n "$ac_tool_prefix"; then | |
- for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn | |
+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn | |
do | |
# Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. | |
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_F77+set}" = set; then : | |
+if ${ac_cv_prog_F77+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$F77"; then | |
@@ -6674,13 +6693,13 @@ | |
fi | |
if test -z "$F77"; then | |
ac_ct_F77=$F77 | |
- for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn | |
+ for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgfortran pgf95 lf95 ftn | |
do | |
# Extract the first word of "$ac_prog", so it can be a program name with args. | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_F77+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_F77+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_F77"; then | |
@@ -6762,7 +6781,7 @@ | |
ac_ext=F | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Fortran 77 compiler" >&5 | |
$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } | |
-if test "${ac_cv_f77_compiler_gnu+set}" = set; then : | |
+if ${ac_cv_f77_compiler_gnu+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat > conftest.$ac_ext <<_ACEOF | |
@@ -6790,7 +6809,7 @@ | |
FFLAGS= | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 | |
$as_echo_n "checking whether $F77 accepts -g... " >&6; } | |
-if test "${ac_cv_prog_f77_g+set}" = set; then : | |
+if ${ac_cv_prog_f77_g+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
FFLAGS=-g | |
@@ -6843,7 +6862,7 @@ | |
# find the maximum length of command line arguments | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 | |
$as_echo_n "checking the maximum length of command line arguments... " >&6; } | |
-if test "${lt_cv_sys_max_cmd_len+set}" = set; then : | |
+if ${lt_cv_sys_max_cmd_len+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
i=0 | |
@@ -6963,7 +6982,7 @@ | |
# Check for command to grab the raw symbol name followed by C symbol from nm. | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 | |
$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } | |
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then : | |
+if ${lt_cv_sys_global_symbol_pipe+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7175,7 +7194,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 | |
$as_echo_n "checking for objdir... " >&6; } | |
-if test "${lt_cv_objdir+set}" = set; then : | |
+if ${lt_cv_objdir+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
rm -f .libs 2>/dev/null | |
@@ -7242,7 +7261,7 @@ | |
set dummy ${ac_tool_prefix}ar; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_AR+set}" = set; then : | |
+if ${ac_cv_prog_AR+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$AR"; then | |
@@ -7282,7 +7301,7 @@ | |
set dummy ar; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_AR+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_AR+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_AR"; then | |
@@ -7334,7 +7353,7 @@ | |
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$RANLIB"; then | |
@@ -7374,7 +7393,7 @@ | |
set dummy ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_RANLIB"; then | |
@@ -7426,7 +7445,7 @@ | |
set dummy ${ac_tool_prefix}strip; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_STRIP+set}" = set; then : | |
+if ${ac_cv_prog_STRIP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$STRIP"; then | |
@@ -7466,7 +7485,7 @@ | |
set dummy strip; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_STRIP"; then | |
@@ -7569,7 +7588,7 @@ | |
if test "$file_magic_cmd" = '$MAGIC_CMD'; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 | |
$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } | |
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : | |
+if ${lt_cv_path_MAGIC_CMD+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
case $MAGIC_CMD in | |
@@ -7631,7 +7650,7 @@ | |
if test -n "$ac_tool_prefix"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 | |
$as_echo_n "checking for file... " >&6; } | |
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then : | |
+if ${lt_cv_path_MAGIC_CMD+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
case $MAGIC_CMD in | |
@@ -7775,7 +7794,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 | |
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } | |
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : | |
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_rtti_exceptions=no | |
@@ -7791,11 +7810,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:7794: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:7813: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:7798: \$? = $ac_status" >&5 | |
+ echo "$as_me:7817: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -8043,7 +8062,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 | |
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } | |
-if test "${lt_prog_compiler_pic_works+set}" = set; then : | |
+if ${lt_prog_compiler_pic_works+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_pic_works=no | |
@@ -8059,11 +8078,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:8062: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:8081: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:8066: \$? = $ac_status" >&5 | |
+ echo "$as_me:8085: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -8106,7 +8125,7 @@ | |
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 | |
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } | |
-if test "${lt_prog_compiler_static_works+set}" = set; then : | |
+if ${lt_prog_compiler_static_works+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_static_works=no | |
@@ -8144,7 +8163,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 | |
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } | |
-if test "${lt_cv_prog_compiler_c_o+set}" = set; then : | |
+if ${lt_cv_prog_compiler_c_o+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_c_o=no | |
@@ -8163,11 +8182,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:8166: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:8185: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>out/conftest.err) | |
ac_status=$? | |
cat out/conftest.err >&5 | |
- echo "$as_me:8170: \$? = $ac_status" >&5 | |
+ echo "$as_me:8189: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s out/conftest2.$ac_objext | |
then | |
# The compiler can only warn and ignore the option if not recognized | |
@@ -9874,7 +9893,7 @@ | |
# if libdl is installed we need to link against it | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 | |
$as_echo_n "checking for dlopen in -ldl... " >&6; } | |
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : | |
+if ${ac_cv_lib_dl_dlopen+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -9908,7 +9927,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 | |
$as_echo "$ac_cv_lib_dl_dlopen" >&6; } | |
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : | |
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then : | |
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" | |
else | |
@@ -9922,12 +9941,12 @@ | |
*) | |
ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" | |
-if test "x$ac_cv_func_shl_load" = x""yes; then : | |
+if test "x$ac_cv_func_shl_load" = xyes; then : | |
lt_cv_dlopen="shl_load" | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 | |
$as_echo_n "checking for shl_load in -ldld... " >&6; } | |
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then : | |
+if ${ac_cv_lib_dld_shl_load+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -9961,16 +9980,16 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 | |
$as_echo "$ac_cv_lib_dld_shl_load" >&6; } | |
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : | |
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then : | |
lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld" | |
else | |
ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" | |
-if test "x$ac_cv_func_dlopen" = x""yes; then : | |
+if test "x$ac_cv_func_dlopen" = xyes; then : | |
lt_cv_dlopen="dlopen" | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 | |
$as_echo_n "checking for dlopen in -ldl... " >&6; } | |
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then : | |
+if ${ac_cv_lib_dl_dlopen+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -10004,12 +10023,12 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 | |
$as_echo "$ac_cv_lib_dl_dlopen" >&6; } | |
-if test "x$ac_cv_lib_dl_dlopen" = x""yes; then : | |
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then : | |
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 | |
$as_echo_n "checking for dlopen in -lsvld... " >&6; } | |
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then : | |
+if ${ac_cv_lib_svld_dlopen+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -10043,12 +10062,12 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 | |
$as_echo "$ac_cv_lib_svld_dlopen" >&6; } | |
-if test "x$ac_cv_lib_svld_dlopen" = x""yes; then : | |
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then : | |
lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 | |
$as_echo_n "checking for dld_link in -ldld... " >&6; } | |
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then : | |
+if ${ac_cv_lib_dld_dld_link+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -10082,7 +10101,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 | |
$as_echo "$ac_cv_lib_dld_dld_link" >&6; } | |
-if test "x$ac_cv_lib_dld_dld_link" = x""yes; then : | |
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then : | |
lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld" | |
fi | |
@@ -10123,7 +10142,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 | |
$as_echo_n "checking whether a program can dlopen itself... " >&6; } | |
-if test "${lt_cv_dlopen_self+set}" = set; then : | |
+if ${lt_cv_dlopen_self+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test "$cross_compiling" = yes; then : | |
@@ -10132,7 +10151,7 @@ | |
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 | |
lt_status=$lt_dlunknown | |
cat > conftest.$ac_ext <<EOF | |
-#line 10135 "configure" | |
+#line 10154 "configure" | |
#include "confdefs.h" | |
#if HAVE_DLFCN_H | |
@@ -10223,7 +10242,7 @@ | |
wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 | |
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } | |
-if test "${lt_cv_dlopen_self_static+set}" = set; then : | |
+if ${lt_cv_dlopen_self_static+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test "$cross_compiling" = yes; then : | |
@@ -10232,7 +10251,7 @@ | |
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 | |
lt_status=$lt_dlunknown | |
cat > conftest.$ac_ext <<EOF | |
-#line 10235 "configure" | |
+#line 10254 "configure" | |
#include "confdefs.h" | |
#if HAVE_DLFCN_H | |
@@ -10901,13 +10920,13 @@ | |
# Check whether tagname contains only valid characters | |
case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in | |
"") ;; | |
- *) as_fn_error "invalid tag name: $tagname" "$LINENO" 5 | |
+ *) as_fn_error $? "invalid tag name: $tagname" "$LINENO" 5 | |
;; | |
esac | |
if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null | |
then | |
- as_fn_error "tag name \"$tagname\" already exists" "$LINENO" 5 | |
+ as_fn_error $? "tag name \"$tagname\" already exists" "$LINENO" 5 | |
fi | |
# Update the list of available tags. | |
@@ -11084,7 +11103,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 | |
$as_echo_n "checking for non-GNU ld... " >&6; } | |
fi | |
-if test "${lt_cv_path_LD+set}" = set; then : | |
+if ${lt_cv_path_LD+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$LD"; then | |
@@ -11121,10 +11140,10 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 | |
$as_echo "no" >&6; } | |
fi | |
-test -z "$LD" && as_fn_error "no acceptable ld found in \$PATH" "$LINENO" 5 | |
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 | |
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } | |
-if test "${lt_cv_prog_gnu_ld+set}" = set; then : | |
+if ${lt_cv_prog_gnu_ld+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# I'd rather use --version here, but apparently some GNU lds only accept -v. | |
@@ -12492,7 +12511,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 | |
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } | |
-if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then : | |
+if ${lt_prog_compiler_pic_works_CXX+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_pic_works_CXX=no | |
@@ -12508,11 +12527,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:12511: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:12530: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:12515: \$? = $ac_status" >&5 | |
+ echo "$as_me:12534: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -12555,7 +12574,7 @@ | |
wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 | |
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } | |
-if test "${lt_prog_compiler_static_works_CXX+set}" = set; then : | |
+if ${lt_prog_compiler_static_works_CXX+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_static_works_CXX=no | |
@@ -12593,7 +12612,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 | |
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } | |
-if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then : | |
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_c_o_CXX=no | |
@@ -12612,11 +12631,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:12615: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:12634: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>out/conftest.err) | |
ac_status=$? | |
cat out/conftest.err >&5 | |
- echo "$as_me:12619: \$? = $ac_status" >&5 | |
+ echo "$as_me:12638: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s out/conftest2.$ac_objext | |
then | |
# The compiler can only warn and ignore the option if not recognized | |
@@ -14166,7 +14185,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 | |
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } | |
-if test "${lt_prog_compiler_pic_works_F77+set}" = set; then : | |
+if ${lt_prog_compiler_pic_works_F77+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_pic_works_F77=no | |
@@ -14182,11 +14201,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:14185: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:14204: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:14189: \$? = $ac_status" >&5 | |
+ echo "$as_me:14208: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -14229,7 +14248,7 @@ | |
wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 | |
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } | |
-if test "${lt_prog_compiler_static_works_F77+set}" = set; then : | |
+if ${lt_prog_compiler_static_works_F77+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_static_works_F77=no | |
@@ -14267,7 +14286,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 | |
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } | |
-if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then : | |
+if ${lt_cv_prog_compiler_c_o_F77+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_c_o_F77=no | |
@@ -14286,11 +14305,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:14289: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:14308: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>out/conftest.err) | |
ac_status=$? | |
cat out/conftest.err >&5 | |
- echo "$as_me:14293: \$? = $ac_status" >&5 | |
+ echo "$as_me:14312: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s out/conftest2.$ac_objext | |
then | |
# The compiler can only warn and ignore the option if not recognized | |
@@ -16422,7 +16441,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 | |
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } | |
-if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then : | |
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_rtti_exceptions=no | |
@@ -16438,11 +16457,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:16441: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:16460: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:16445: \$? = $ac_status" >&5 | |
+ echo "$as_me:16464: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -16690,7 +16709,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 | |
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } | |
-if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then : | |
+if ${lt_prog_compiler_pic_works_GCJ+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_pic_works_GCJ=no | |
@@ -16706,11 +16725,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:16709: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:16728: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>conftest.err) | |
ac_status=$? | |
cat conftest.err >&5 | |
- echo "$as_me:16713: \$? = $ac_status" >&5 | |
+ echo "$as_me:16732: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s "$ac_outfile"; then | |
# The compiler can only warn and ignore the option if not recognized | |
# So say no if there are warnings other than the usual output. | |
@@ -16753,7 +16772,7 @@ | |
wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 | |
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } | |
-if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then : | |
+if ${lt_prog_compiler_static_works_GCJ+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_prog_compiler_static_works_GCJ=no | |
@@ -16791,7 +16810,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 | |
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } | |
-if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then : | |
+if ${lt_cv_prog_compiler_c_o_GCJ+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
lt_cv_prog_compiler_c_o_GCJ=no | |
@@ -16810,11 +16829,11 @@ | |
-e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ | |
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ | |
-e 's:$: $lt_compiler_flag:'` | |
- (eval echo "\"\$as_me:16813: $lt_compile\"" >&5) | |
+ (eval echo "\"\$as_me:16832: $lt_compile\"" >&5) | |
(eval "$lt_compile" 2>out/conftest.err) | |
ac_status=$? | |
cat out/conftest.err >&5 | |
- echo "$as_me:16817: \$? = $ac_status" >&5 | |
+ echo "$as_me:16836: \$? = $ac_status" >&5 | |
if (exit $ac_status) && test -s out/conftest2.$ac_objext | |
then | |
# The compiler can only warn and ignore the option if not recognized | |
@@ -19363,7 +19382,7 @@ | |
;; | |
*) | |
- as_fn_error "Unsupported tag name: $tagname" "$LINENO" 5 | |
+ as_fn_error $? "Unsupported tag name: $tagname" "$LINENO" 5 | |
;; | |
esac | |
@@ -19381,7 +19400,7 @@ | |
chmod +x "$ofile" | |
else | |
rm -f "${ofile}T" | |
- as_fn_error "unable to update list of available tagged configurations." "$LINENO" 5 | |
+ as_fn_error $? "unable to update list of available tagged configurations." "$LINENO" 5 | |
fi | |
fi | |
@@ -19417,7 +19436,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 | |
$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } | |
if test -z "$MKDIR_P"; then | |
- if test "${ac_cv_path_mkdir+set}" = set; then : | |
+ if ${ac_cv_path_mkdir+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -19462,8 +19481,7 @@ | |
do : | |
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | |
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" | |
-eval as_val=\$$as_ac_var | |
- if test "x$as_val" = x""yes; then : | |
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then : | |
cat >>confdefs.h <<_ACEOF | |
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 | |
_ACEOF | |
@@ -19472,7 +19490,7 @@ | |
done | |
ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" | |
-if test "x$ac_cv_have_decl_strerror_r" = x""yes; then : | |
+if test "x$ac_cv_have_decl_strerror_r" = xyes; then : | |
ac_have_decl=1 | |
else | |
ac_have_decl=0 | |
@@ -19485,7 +19503,7 @@ | |
for ac_func in strerror_r | |
do : | |
ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" | |
-if test "x$ac_cv_func_strerror_r" = x""yes; then : | |
+if test "x$ac_cv_func_strerror_r" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_STRERROR_R 1 | |
_ACEOF | |
@@ -19495,7 +19513,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 | |
$as_echo_n "checking whether strerror_r returns char *... " >&6; } | |
-if test "${ac_cv_func_strerror_r_char_p+set}" = set; then : | |
+if ${ac_cv_func_strerror_r_char_p+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -19583,7 +19601,7 @@ | |
LIBS="" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 | |
$as_echo_n "checking for library containing tgetent... " >&6; } | |
-if test "${ac_cv_search_tgetent+set}" = set; then : | |
+if ${ac_cv_search_tgetent+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_func_search_save_LIBS=$LIBS | |
@@ -19617,11 +19635,11 @@ | |
fi | |
rm -f core conftest.err conftest.$ac_objext \ | |
conftest$ac_exeext | |
- if test "${ac_cv_search_tgetent+set}" = set; then : | |
+ if ${ac_cv_search_tgetent+:} false; then : | |
break | |
fi | |
done | |
-if test "${ac_cv_search_tgetent+set}" = set; then : | |
+if ${ac_cv_search_tgetent+:} false; then : | |
else | |
ac_cv_search_tgetent=no | |
@@ -19639,7 +19657,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing readline" >&5 | |
$as_echo_n "checking for library containing readline... " >&6; } | |
-if test "${ac_cv_search_readline+set}" = set; then : | |
+if ${ac_cv_search_readline+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_func_search_save_LIBS=$LIBS | |
@@ -19673,11 +19691,11 @@ | |
fi | |
rm -f core conftest.err conftest.$ac_objext \ | |
conftest$ac_exeext | |
- if test "${ac_cv_search_readline+set}" = set; then : | |
+ if ${ac_cv_search_readline+:} false; then : | |
break | |
fi | |
done | |
-if test "${ac_cv_search_readline+set}" = set; then : | |
+if ${ac_cv_search_readline+:} false; then : | |
else | |
ac_cv_search_readline=no | |
@@ -19698,7 +19716,7 @@ | |
for ac_func in readline | |
do : | |
ac_fn_c_check_func "$LINENO" "readline" "ac_cv_func_readline" | |
-if test "x$ac_cv_func_readline" = x""yes; then : | |
+if test "x$ac_cv_func_readline" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_READLINE 1 | |
_ACEOF | |
@@ -19727,7 +19745,7 @@ | |
THREADSAFE_FLAGS="-D_REENTRANT=1 -DSQLITE_THREADSAFE=1" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing pthread_create" >&5 | |
$as_echo_n "checking for library containing pthread_create... " >&6; } | |
-if test "${ac_cv_search_pthread_create+set}" = set; then : | |
+if ${ac_cv_search_pthread_create+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_func_search_save_LIBS=$LIBS | |
@@ -19761,11 +19779,11 @@ | |
fi | |
rm -f core conftest.err conftest.$ac_objext \ | |
conftest$ac_exeext | |
- if test "${ac_cv_search_pthread_create+set}" = set; then : | |
+ if ${ac_cv_search_pthread_create+:} false; then : | |
break | |
fi | |
done | |
-if test "${ac_cv_search_pthread_create+set}" = set; then : | |
+if ${ac_cv_search_pthread_create+:} false; then : | |
else | |
ac_cv_search_pthread_create=no | |
@@ -19798,7 +19816,7 @@ | |
if test x"$enable_dynamic_extensions" != "xno"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5 | |
$as_echo_n "checking for library containing dlopen... " >&6; } | |
-if test "${ac_cv_search_dlopen+set}" = set; then : | |
+if ${ac_cv_search_dlopen+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_func_search_save_LIBS=$LIBS | |
@@ -19832,11 +19850,11 @@ | |
fi | |
rm -f core conftest.err conftest.$ac_objext \ | |
conftest$ac_exeext | |
- if test "${ac_cv_search_dlopen+set}" = set; then : | |
+ if ${ac_cv_search_dlopen+:} false; then : | |
break | |
fi | |
done | |
-if test "${ac_cv_search_dlopen+set}" = set; then : | |
+if ${ac_cv_search_dlopen+:} false; then : | |
else | |
ac_cv_search_dlopen=no | |
@@ -19865,7 +19883,7 @@ | |
for ac_func in posix_fallocate | |
do : | |
ac_fn_c_check_func "$LINENO" "posix_fallocate" "ac_cv_func_posix_fallocate" | |
-if test "x$ac_cv_func_posix_fallocate" = x""yes; then : | |
+if test "x$ac_cv_func_posix_fallocate" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_POSIX_FALLOCATE 1 | |
_ACEOF | |
@@ -19963,10 +19981,21 @@ | |
:end' >>confcache | |
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else | |
if test -w "$cache_file"; then | |
- test "x$cache_file" != "x/dev/null" && | |
+ if test "x$cache_file" != "x/dev/null"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 | |
$as_echo "$as_me: updating cache $cache_file" >&6;} | |
- cat confcache >$cache_file | |
+ if test ! -f "$cache_file" || test -h "$cache_file"; then | |
+ cat confcache >"$cache_file" | |
+ else | |
+ case $cache_file in #( | |
+ */* | ?:*) | |
+ mv -f confcache "$cache_file"$$ && | |
+ mv -f "$cache_file"$$ "$cache_file" ;; #( | |
+ *) | |
+ mv -f confcache "$cache_file" ;; | |
+ esac | |
+ fi | |
+ fi | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 | |
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} | |
@@ -20018,6 +20047,7 @@ | |
ac_libobjs= | |
ac_ltlibobjs= | |
+U= | |
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue | |
# 1. Remove the extension, and $U if already installed. | |
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' | |
@@ -20033,23 +20063,23 @@ | |
if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then | |
- as_fn_error "conditional \"AMDEP\" was never defined. | |
+ as_fn_error $? "conditional \"AMDEP\" was never defined. | |
Usually this means the macro was only invoked conditionally." "$LINENO" 5 | |
fi | |
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then | |
- as_fn_error "conditional \"am__fastdepCC\" was never defined. | |
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined. | |
Usually this means the macro was only invoked conditionally." "$LINENO" 5 | |
fi | |
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then | |
- as_fn_error "conditional \"am__fastdepCC\" was never defined. | |
+ as_fn_error $? "conditional \"am__fastdepCC\" was never defined. | |
Usually this means the macro was only invoked conditionally." "$LINENO" 5 | |
fi | |
if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then | |
- as_fn_error "conditional \"am__fastdepCXX\" was never defined. | |
+ as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. | |
Usually this means the macro was only invoked conditionally." "$LINENO" 5 | |
fi | |
-: ${CONFIG_STATUS=./config.status} | |
+: "${CONFIG_STATUS=./config.status}" | |
ac_write_fail=0 | |
ac_clean_files_save=$ac_clean_files | |
ac_clean_files="$ac_clean_files $CONFIG_STATUS" | |
@@ -20150,6 +20180,7 @@ | |
IFS=" "" $as_nl" | |
# Find who we are. Look in the path if we contain no directory separator. | |
+as_myself= | |
case $0 in #(( | |
*[\\/]* ) as_myself=$0 ;; | |
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -20195,19 +20226,19 @@ | |
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH | |
-# as_fn_error ERROR [LINENO LOG_FD] | |
-# --------------------------------- | |
+# as_fn_error STATUS ERROR [LINENO LOG_FD] | |
+# ---------------------------------------- | |
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are | |
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the | |
-# script with status $?, using 1 if that was 0. | |
+# script with STATUS, using 1 if that was 0. | |
as_fn_error () | |
{ | |
- as_status=$?; test $as_status -eq 0 && as_status=1 | |
- if test "$3"; then | |
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 | |
+ as_status=$1; test $as_status -eq 0 && as_status=1 | |
+ if test "$4"; then | |
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 | |
fi | |
- $as_echo "$as_me: error: $1" >&2 | |
+ $as_echo "$as_me: error: $2" >&2 | |
as_fn_exit $as_status | |
} # as_fn_error | |
@@ -20403,7 +20434,7 @@ | |
test -d "$as_dir" && break | |
done | |
test -z "$as_dirs" || eval "mkdir $as_dirs" | |
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" | |
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" | |
} # as_fn_mkdir_p | |
@@ -20456,8 +20487,8 @@ | |
# report actual input values of CONFIG_FILES etc. instead of their | |
# values after options handling. | |
ac_log=" | |
-This file was extended by sqlite $as_me 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+This file was extended by sqlite $as_me 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
CONFIG_FILES = $CONFIG_FILES | |
CONFIG_HEADERS = $CONFIG_HEADERS | |
@@ -20513,11 +20544,11 @@ | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" | |
ac_cs_version="\\ | |
-sqlite config.status 3.7.9 | |
-configured by $0, generated by GNU Autoconf 2.65, | |
+sqlite config.status 3.7.10 | |
+configured by $0, generated by GNU Autoconf 2.68, | |
with options \\"\$ac_cs_config\\" | |
-Copyright (C) 2009 Free Software Foundation, Inc. | |
+Copyright (C) 2010 Free Software Foundation, Inc. | |
This config.status script is free software; the Free Software Foundation | |
gives unlimited permission to copy, distribute and modify it." | |
@@ -20535,11 +20566,16 @@ | |
while test $# != 0 | |
do | |
case $1 in | |
- --*=*) | |
+ --*=?*) | |
ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` | |
ac_shift=: | |
;; | |
+ --*=) | |
+ ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
+ ac_optarg= | |
+ ac_shift=: | |
+ ;; | |
*) | |
ac_option=$1 | |
ac_optarg=$2 | |
@@ -20561,6 +20597,7 @@ | |
$ac_shift | |
case $ac_optarg in | |
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; | |
+ '') as_fn_error $? "missing file argument" ;; | |
esac | |
as_fn_append CONFIG_FILES " '$ac_optarg'" | |
ac_need_defaults=false;; | |
@@ -20571,7 +20608,7 @@ | |
ac_cs_silent=: ;; | |
# This is an error. | |
- -*) as_fn_error "unrecognized option: \`$1' | |
+ -*) as_fn_error $? "unrecognized option: \`$1' | |
Try \`$0 --help' for more information." ;; | |
*) as_fn_append ac_config_targets " $1" | |
@@ -20629,7 +20666,7 @@ | |
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; | |
"sqlite3.pc") CONFIG_FILES="$CONFIG_FILES sqlite3.pc" ;; | |
- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
esac | |
done | |
@@ -20651,9 +20688,10 @@ | |
# after its creation but before its name has been assigned to `$tmp'. | |
$debug || | |
{ | |
- tmp= | |
+ tmp= ac_tmp= | |
trap 'exit_status=$? | |
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status | |
+ : "${ac_tmp:=$tmp}" | |
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status | |
' 0 | |
trap 'as_fn_exit 1' 1 2 13 15 | |
} | |
@@ -20661,12 +20699,13 @@ | |
{ | |
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && | |
- test -n "$tmp" && test -d "$tmp" | |
+ test -d "$tmp" | |
} || | |
{ | |
tmp=./conf$$-$RANDOM | |
(umask 077 && mkdir "$tmp") | |
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 | |
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 | |
+ac_tmp=$tmp | |
# Set up the scripts for CONFIG_FILES section. | |
# No need to generate them if there are no CONFIG_FILES. | |
@@ -20683,12 +20722,12 @@ | |
fi | |
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` | |
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then | |
- ac_cs_awk_cr='\r' | |
+ ac_cs_awk_cr='\\r' | |
else | |
ac_cs_awk_cr=$ac_cr | |
fi | |
-echo 'BEGIN {' >"$tmp/subs1.awk" && | |
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" && | |
_ACEOF | |
@@ -20697,18 +20736,18 @@ | |
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && | |
echo "_ACEOF" | |
} >conf$$subs.sh || | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` | |
ac_delim='%!_!# ' | |
for ac_last_try in false false false false false :; do | |
. ./conf$$subs.sh || | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` | |
if test $ac_delim_n = $ac_delim_num; then | |
break | |
elif $ac_last_try; then | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
else | |
ac_delim="$ac_delim!$ac_delim _$ac_delim!! " | |
fi | |
@@ -20716,7 +20755,7 @@ | |
rm -f conf$$subs.sh | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && | |
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && | |
_ACEOF | |
sed -n ' | |
h | |
@@ -20764,7 +20803,7 @@ | |
rm -f conf$$subs.awk | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
_ACAWK | |
-cat >>"\$tmp/subs1.awk" <<_ACAWK && | |
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && | |
for (key in S) S_is_set[key] = 1 | |
FS = "" | |
@@ -20796,21 +20835,29 @@ | |
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" | |
else | |
cat | |
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ | |
- || as_fn_error "could not setup config files machinery" "$LINENO" 5 | |
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ | |
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 | |
_ACEOF | |
-# VPATH may cause trouble with some makes, so we remove $(srcdir), | |
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and | |
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir), | |
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and | |
# trailing colons and then remove the whole line if VPATH becomes empty | |
# (actually we leave an empty line to preserve line numbers). | |
if test "x$srcdir" = x.; then | |
- ac_vpsub='/^[ ]*VPATH[ ]*=/{ | |
-s/:*\$(srcdir):*/:/ | |
-s/:*\${srcdir}:*/:/ | |
-s/:*@srcdir@:*/:/ | |
-s/^\([^=]*=[ ]*\):*/\1/ | |
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ | |
+h | |
+s/// | |
+s/^/:/ | |
+s/[ ]*$/:/ | |
+s/:\$(srcdir):/:/g | |
+s/:\${srcdir}:/:/g | |
+s/:@srcdir@:/:/g | |
+s/^:*// | |
s/:*$// | |
+x | |
+s/\(=[ ]*\).*/\1/ | |
+G | |
+s/\n// | |
s/^[^=]*=[ ]*$// | |
}' | |
fi | |
@@ -20828,7 +20875,7 @@ | |
esac | |
case $ac_mode$ac_tag in | |
:[FHL]*:*);; | |
- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
:[FH]-) ac_tag=-:-;; | |
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;; | |
esac | |
@@ -20847,7 +20894,7 @@ | |
for ac_f | |
do | |
case $ac_f in | |
- -) ac_f="$tmp/stdin";; | |
+ -) ac_f="$ac_tmp/stdin";; | |
*) # Look for the file first in the build tree, then in the source tree | |
# (if the path is not absolute). The absolute path cannot be DOS-style, | |
# because $ac_f cannot contain `:'. | |
@@ -20856,7 +20903,7 @@ | |
[\\/$]*) false;; | |
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; | |
esac || | |
- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
esac | |
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac | |
as_fn_append ac_file_inputs " '$ac_f'" | |
@@ -20882,8 +20929,8 @@ | |
esac | |
case $ac_tag in | |
- *:-:* | *:-) cat >"$tmp/stdin" \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; | |
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \ | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; | |
esac | |
;; | |
esac | |
@@ -21019,23 +21066,24 @@ | |
s&@MKDIR_P@&$ac_MKDIR_P&;t t | |
$ac_datarootdir_hack | |
" | |
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ | |
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && | |
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && | |
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && | |
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && | |
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ | |
+ "$ac_tmp/out"`; test -z "$ac_out"; } && | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&5 | |
+which seems to be undefined. Please make sure it is defined" >&5 | |
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&2;} | |
+which seems to be undefined. Please make sure it is defined" >&2;} | |
- rm -f "$tmp/stdin" | |
+ rm -f "$ac_tmp/stdin" | |
case $ac_file in | |
- -) cat "$tmp/out" && rm -f "$tmp/out";; | |
- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; | |
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; | |
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; | |
esac \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
;; | |
@@ -21139,7 +21187,7 @@ | |
ac_clean_files=$ac_clean_files_save | |
test $ac_write_fail = 0 || | |
- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 | |
# configure is writing to config.log, and then calls config.status. | |
@@ -21160,7 +21208,7 @@ | |
exec 5>>config.log | |
# Use ||, not &&, to avoid exiting from the if with $? = 1, which | |
# would make configure fail if this is the last instruction. | |
- $ac_cs_success || as_fn_exit $? | |
+ $ac_cs_success || as_fn_exit 1 | |
fi | |
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 | |
diff -u -r sqlite-autoconf-3070900/configure.ac sqlite-autoconf-3071000/configure.ac | |
--- sqlite-autoconf-3070900/configure.ac 2011-11-01 05:31:24.000000000 -0700 | |
+++ sqlite-autoconf-3071000/configure.ac 2012-01-16 06:04:57.000000000 -0800 | |
@@ -8,7 +8,7 @@ | |
# | |
AC_PREREQ(2.61) | |
-AC_INIT(sqlite, 3.7.9, http://www.sqlite.org) | |
+AC_INIT(sqlite, 3.7.10, http://www.sqlite.org) | |
AC_CONFIG_SRCDIR([sqlite3.c]) | |
# Use automake. | |
diff -u -r sqlite-autoconf-3070900/libsqlite3.la sqlite-autoconf-3071000/libsqlite3.la | |
--- sqlite-autoconf-3070900/libsqlite3.la 2013-03-29 16:53:59.000000000 -0700 | |
+++ sqlite-autoconf-3071000/libsqlite3.la 2013-03-29 18:34:26.000000000 -0700 | |
@@ -32,4 +32,4 @@ | |
dlpreopen='' | |
# Directory that this library needs to be installed in: | |
-libdir='/opt/sqlite-3070900/lib' | |
+libdir='/opt/sqlite-3071000/lib' | |
diff -u -r sqlite-autoconf-3070900/libtool sqlite-autoconf-3071000/libtool | |
--- sqlite-autoconf-3070900/libtool 2013-03-29 16:45:42.000000000 -0700 | |
+++ sqlite-autoconf-3071000/libtool 2013-03-29 18:33:44.000000000 -0700 | |
@@ -1,7 +1,7 @@ | |
#! /bin/sh | |
# libtoolT - Provide generalized library-building support services. | |
-# Generated automatically by (GNU sqlite 3.7.9) | |
+# Generated automatically by (GNU sqlite 3.7.10) | |
# NOTE: Changes made to this file will be lost: look at ltmain.sh. | |
# | |
# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 | |
diff -u -r sqlite-autoconf-3070900/shell.c sqlite-autoconf-3071000/shell.c | |
--- sqlite-autoconf-3070900/shell.c 2011-11-01 05:31:24.000000000 -0700 | |
+++ sqlite-autoconf-3071000/shell.c 2012-01-16 06:04:57.000000000 -0800 | |
@@ -1127,6 +1127,15 @@ | |
fprintf(pArg->out, "%s\n", zStmtSql ? zStmtSql : zSql); | |
} | |
+ /* Output TESTCTRL_EXPLAIN text of requested */ | |
+ if( pArg && pArg->mode==MODE_Explain ){ | |
+ const char *zExplain = 0; | |
+ sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, pStmt, &zExplain); | |
+ if( zExplain && zExplain[0] ){ | |
+ fprintf(pArg->out, "%s", zExplain); | |
+ } | |
+ } | |
+ | |
/* perform the first step. this will tell us if we | |
** have a result set or not and how wide it is. | |
*/ | |
@@ -1396,6 +1405,7 @@ | |
" If TABLE specified, only list tables matching\n" | |
" LIKE pattern TABLE.\n" | |
".timeout MS Try opening locked tables for MS milliseconds\n" | |
+ ".vfsname ?AUX? Print the name of the VFS stack\n" | |
".width NUM1 NUM2 ... Set column widths for \"column\" mode\n" | |
; | |
@@ -2085,7 +2095,8 @@ | |
" (SELECT sql sql, type type, tbl_name tbl_name, name name" | |
" FROM sqlite_master UNION ALL" | |
" SELECT sql, type, tbl_name, name FROM sqlite_temp_master) " | |
- "WHERE tbl_name LIKE shellstatic() AND type!='meta' AND sql NOTNULL " | |
+ "WHERE lower(tbl_name) LIKE shellstatic()" | |
+ " AND type!='meta' AND sql NOTNULL " | |
"ORDER BY substr(type,2,1), name", | |
callback, &data, &zErrMsg); | |
zShellStatic = 0; | |
@@ -2219,7 +2230,6 @@ | |
{ "reserve", SQLITE_TESTCTRL_RESERVE }, | |
{ "optimizations", SQLITE_TESTCTRL_OPTIMIZATIONS }, | |
{ "iskeyword", SQLITE_TESTCTRL_ISKEYWORD }, | |
- { "pghdrsz", SQLITE_TESTCTRL_PGHDRSZ }, | |
{ "scratchmalloc", SQLITE_TESTCTRL_SCRATCHMALLOC }, | |
}; | |
int testctrl = -1; | |
@@ -2264,7 +2274,6 @@ | |
case SQLITE_TESTCTRL_PRNG_SAVE: | |
case SQLITE_TESTCTRL_PRNG_RESTORE: | |
case SQLITE_TESTCTRL_PRNG_RESET: | |
- case SQLITE_TESTCTRL_PGHDRSZ: | |
if( nArg==2 ){ | |
rc = sqlite3_test_control(testctrl); | |
printf("%d (0x%08x)\n", rc, rc); | |
@@ -2336,10 +2345,22 @@ | |
}else | |
if( c=='v' && strncmp(azArg[0], "version", n)==0 ){ | |
- printf("SQLite %s %s\n", | |
+ printf("SQLite %s %s\n" /*extra-version-info*/, | |
sqlite3_libversion(), sqlite3_sourceid()); | |
}else | |
+ if( c=='v' && strncmp(azArg[0], "vfsname", n)==0 ){ | |
+ const char *zDbName = nArg==2 ? azArg[1] : "main"; | |
+ char *zVfsName = 0; | |
+ if( p->db ){ | |
+ sqlite3_file_control(p->db, zDbName, SQLITE_FCNTL_VFSNAME, &zVfsName); | |
+ if( zVfsName ){ | |
+ printf("%s\n", zVfsName); | |
+ sqlite3_free(zVfsName); | |
+ } | |
+ } | |
+ }else | |
+ | |
if( c=='w' && strncmp(azArg[0], "width", n)==0 && nArg>1 ){ | |
int j; | |
assert( nArg<=ArraySize(azArg) ); | |
@@ -2933,7 +2954,7 @@ | |
char *zHistory = 0; | |
int nHistory; | |
printf( | |
- "SQLite version %s %.19s\n" | |
+ "SQLite version %s %.19s\n" /*extra-version-info*/ | |
"Enter \".help\" for instructions\n" | |
"Enter SQL statements terminated with a \";\"\n", | |
sqlite3_libversion(), sqlite3_sourceid() | |
Binary files sqlite-autoconf-3070900/shell.o and sqlite-autoconf-3071000/shell.o differ | |
Only in sqlite-autoconf-3070900/: sqlite-autoconf-3071000.tar.gz | |
Only in sqlite-autoconf-3070900/: sqlite-autoconf-3071200 | |
Only in sqlite-autoconf-3070900/: sqlite-autoconf-3071200.tar.gz | |
diff -u -r sqlite-autoconf-3070900/sqlite3 sqlite-autoconf-3071000/sqlite3 | |
--- sqlite-autoconf-3070900/sqlite3 2013-03-29 16:54:00.000000000 -0700 | |
+++ sqlite-autoconf-3071000/sqlite3 2013-03-29 18:34:27.000000000 -0700 | |
@@ -87,7 +87,7 @@ | |
if test -f "$progdir/$program"; then | |
# Add our own library path to DYLD_LIBRARY_PATH | |
- DYLD_LIBRARY_PATH="/Users/dane/src/sqlite-autoconf-3070900/.libs:$DYLD_LIBRARY_PATH" | |
+ DYLD_LIBRARY_PATH="/Users/dane/src/sqlite-autoconf-3071000/.libs:$DYLD_LIBRARY_PATH" | |
# Some systems cannot cope with colon-terminated DYLD_LIBRARY_PATH | |
# The second colon is a workaround for a bug in BeOS R4 sed | |
diff -u -r sqlite-autoconf-3070900/sqlite3.c sqlite-autoconf-3071000/sqlite3.c | |
--- sqlite-autoconf-3070900/sqlite3.c 2011-11-01 05:31:24.000000000 -0700 | |
+++ sqlite-autoconf-3071000/sqlite3.c 2012-01-16 06:04:57.000000000 -0800 | |
@@ -1,6 +1,6 @@ | |
/****************************************************************************** | |
** This file is an amalgamation of many separate C source files from SQLite | |
-** version 3.7.9. By combining all the individual C code files into this | |
+** version 3.7.10. By combining all the individual C code files into this | |
** single large file, the entire code can be compiled as a single translation | |
** unit. This allows many compilers to do optimizations that would not be | |
** possible if the files were compiled separately. Performance improvements | |
@@ -366,6 +366,14 @@ | |
#endif | |
/* | |
+** Powersafe overwrite is on by default. But can be turned off using | |
+** the -DSQLITE_POWERSAFE_OVERWRITE=0 command-line option. | |
+*/ | |
+#ifndef SQLITE_POWERSAFE_OVERWRITE | |
+# define SQLITE_POWERSAFE_OVERWRITE 1 | |
+#endif | |
+ | |
+/* | |
** The SQLITE_DEFAULT_MEMSTATUS macro must be defined as either 0 or 1. | |
** It determines whether or not the features related to | |
** SQLITE_CONFIG_MEMSTATUS are available by default or not. This value can | |
@@ -649,9 +657,9 @@ | |
** [sqlite3_libversion_number()], [sqlite3_sourceid()], | |
** [sqlite_version()] and [sqlite_source_id()]. | |
*/ | |
-#define SQLITE_VERSION "3.7.9" | |
-#define SQLITE_VERSION_NUMBER 3007009 | |
-#define SQLITE_SOURCE_ID "2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e" | |
+#define SQLITE_VERSION "3.7.10" | |
+#define SQLITE_VERSION_NUMBER 3007010 | |
+#define SQLITE_SOURCE_ID "2012-01-16 13:28:40 ebd01a8deffb5024a5d7494eef800d2366d97204" | |
/* | |
** CAPI3REF: Run-Time Library Version Numbers | |
@@ -719,7 +727,7 @@ | |
** CAPI3REF: Test To See If The Library Is Threadsafe | |
** | |
** ^The sqlite3_threadsafe() function returns zero if and only if | |
-** SQLite was compiled mutexing code omitted due to the | |
+** SQLite was compiled with mutexing code omitted due to the | |
** [SQLITE_THREADSAFE] compile-time option being set to 0. | |
** | |
** SQLite can be compiled with or without mutexes. When | |
@@ -913,7 +921,7 @@ | |
** KEYWORDS: {result code} {result codes} | |
** | |
** Many SQLite functions return an integer result code from the set shown | |
-** here in order to indicates success or failure. | |
+** here in order to indicate success or failure. | |
** | |
** New error codes may be added in future versions of SQLite. | |
** | |
@@ -1051,7 +1059,11 @@ | |
** first then the size of the file is extended, never the other | |
** way around. The SQLITE_IOCAP_SEQUENTIAL property means that | |
** information is written to disk in the same order as calls | |
-** to xWrite(). | |
+** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that | |
+** after reboot following a crash or power loss, the only bytes in a | |
+** file that were written at the application level might have changed | |
+** and that adjacent bytes, even bytes within the same sector are | |
+** guaranteed to be unchanged. | |
*/ | |
#define SQLITE_IOCAP_ATOMIC 0x00000001 | |
#define SQLITE_IOCAP_ATOMIC512 0x00000002 | |
@@ -1065,6 +1077,7 @@ | |
#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 | |
#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 | |
#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 | |
+#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 | |
/* | |
** CAPI3REF: File Locking Levels | |
@@ -1286,12 +1299,12 @@ | |
** | |
** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic | |
** retry counts and intervals for certain disk I/O operations for the | |
-** windows [VFS] in order to work to provide robustness against | |
+** windows [VFS] in order to provide robustness in the presence of | |
** anti-virus programs. By default, the windows VFS will retry file read, | |
** file write, and file delete operations up to 10 times, with a delay | |
** of 25 milliseconds before the first retry and with the delay increasing | |
** by an additional 25 milliseconds with each subsequent retry. This | |
-** opcode allows those to values (10 retries and 25 milliseconds of delay) | |
+** opcode allows these two values (10 retries and 25 milliseconds of delay) | |
** to be adjusted. The values are changed for all database connections | |
** within the same process. The argument is a pointer to an array of two | |
** integers where the first integer i the new retry count and the second | |
@@ -1314,22 +1327,44 @@ | |
** WAL mode. If the integer is -1, then it is overwritten with the current | |
** WAL persistence setting. | |
** | |
+** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the | |
+** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting | |
+** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the | |
+** xDeviceCharacteristics methods. The fourth parameter to | |
+** [sqlite3_file_control()] for this opcode should be a pointer to an integer. | |
+** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage | |
+** mode. If the integer is -1, then it is overwritten with the current | |
+** zero-damage mode setting. | |
+** | |
** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening | |
** a write transaction to indicate that, unless it is rolled back for some | |
** reason, the entire database file will be overwritten by the current | |
** transaction. This is used by VACUUM operations. | |
-*/ | |
-#define SQLITE_FCNTL_LOCKSTATE 1 | |
-#define SQLITE_GET_LOCKPROXYFILE 2 | |
-#define SQLITE_SET_LOCKPROXYFILE 3 | |
-#define SQLITE_LAST_ERRNO 4 | |
-#define SQLITE_FCNTL_SIZE_HINT 5 | |
-#define SQLITE_FCNTL_CHUNK_SIZE 6 | |
-#define SQLITE_FCNTL_FILE_POINTER 7 | |
-#define SQLITE_FCNTL_SYNC_OMITTED 8 | |
-#define SQLITE_FCNTL_WIN32_AV_RETRY 9 | |
-#define SQLITE_FCNTL_PERSIST_WAL 10 | |
-#define SQLITE_FCNTL_OVERWRITE 11 | |
+** | |
+** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of | |
+** all [VFSes] in the VFS stack. The names are of all VFS shims and the | |
+** final bottom-level VFS are written into memory obtained from | |
+** [sqlite3_malloc()] and the result is stored in the char* variable | |
+** that the fourth parameter of [sqlite3_file_control()] points to. | |
+** The caller is responsible for freeing the memory when done. As with | |
+** all file-control actions, there is no guarantee that this will actually | |
+** do anything. Callers should initialize the char* variable to a NULL | |
+** pointer in case this file-control is not implemented. This file-control | |
+** is intended for diagnostic use only. | |
+*/ | |
+#define SQLITE_FCNTL_LOCKSTATE 1 | |
+#define SQLITE_GET_LOCKPROXYFILE 2 | |
+#define SQLITE_SET_LOCKPROXYFILE 3 | |
+#define SQLITE_LAST_ERRNO 4 | |
+#define SQLITE_FCNTL_SIZE_HINT 5 | |
+#define SQLITE_FCNTL_CHUNK_SIZE 6 | |
+#define SQLITE_FCNTL_FILE_POINTER 7 | |
+#define SQLITE_FCNTL_SYNC_OMITTED 8 | |
+#define SQLITE_FCNTL_WIN32_AV_RETRY 9 | |
+#define SQLITE_FCNTL_PERSIST_WAL 10 | |
+#define SQLITE_FCNTL_OVERWRITE 11 | |
+#define SQLITE_FCNTL_VFSNAME 12 | |
+#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 | |
/* | |
** CAPI3REF: Mutex Handle | |
@@ -1384,7 +1419,7 @@ | |
** from xFullPathname() with an optional suffix added. | |
** ^If a suffix is added to the zFilename parameter, it will | |
** consist of a single "-" character followed by no more than | |
-** 10 alphanumeric and/or "-" characters. | |
+** 11 alphanumeric and/or "-" characters. | |
** ^SQLite further guarantees that | |
** the string will be valid and unchanged until xClose() is | |
** called. Because of the previous sentence, | |
@@ -1915,7 +1950,7 @@ | |
** <dd> ^This option specifies a static memory buffer that SQLite can use for | |
** the database page cache with the default page cache implementation. | |
** This configuration should not be used if an application-define page | |
-** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. | |
+** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option. | |
** There are three arguments to this option: A pointer to 8-byte aligned | |
** memory, the size of each page buffer (sz), and the number of pages (N). | |
** The sz argument should be the size of the largest database page | |
@@ -1984,15 +2019,15 @@ | |
** verb to [sqlite3_db_config()] can be used to change the lookaside | |
** configuration on individual connections.)^ </dd> | |
** | |
-** [[SQLITE_CONFIG_PCACHE]] <dt>SQLITE_CONFIG_PCACHE</dt> | |
+** [[SQLITE_CONFIG_PCACHE2]] <dt>SQLITE_CONFIG_PCACHE2</dt> | |
** <dd> ^(This option takes a single argument which is a pointer to | |
-** an [sqlite3_pcache_methods] object. This object specifies the interface | |
+** an [sqlite3_pcache_methods2] object. This object specifies the interface | |
** to a custom page cache implementation.)^ ^SQLite makes a copy of the | |
** object and uses it for page cache memory allocations.</dd> | |
** | |
-** [[SQLITE_CONFIG_GETPCACHE]] <dt>SQLITE_CONFIG_GETPCACHE</dt> | |
+** [[SQLITE_CONFIG_GETPCACHE2]] <dt>SQLITE_CONFIG_GETPCACHE2</dt> | |
** <dd> ^(This option takes a single argument which is a pointer to an | |
-** [sqlite3_pcache_methods] object. SQLite copies of the current | |
+** [sqlite3_pcache_methods2] object. SQLite copies of the current | |
** page cache implementation into that object.)^ </dd> | |
** | |
** [[SQLITE_CONFIG_LOG]] <dt>SQLITE_CONFIG_LOG</dt> | |
@@ -2025,6 +2060,11 @@ | |
** database connection is opened. By default, URI handling is globally | |
** disabled. The default value may be changed by compiling with the | |
** [SQLITE_USE_URI] symbol defined. | |
+** | |
+** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] | |
+** <dt>SQLITE_CONFIG_PCACHE and SQLITE_CONFNIG_GETPCACHE | |
+** <dd> These options are obsolete and should not be used by new code. | |
+** They are retained for backwards compatibility but are now no-ops. | |
** </dl> | |
*/ | |
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ | |
@@ -2040,10 +2080,12 @@ | |
#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ | |
/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ | |
#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ | |
-#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */ | |
-#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ | |
+#define SQLITE_CONFIG_PCACHE 14 /* no-op */ | |
+#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ | |
#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ | |
#define SQLITE_CONFIG_URI 17 /* int */ | |
+#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ | |
+#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ | |
/* | |
** CAPI3REF: Database Connection Configuration Options | |
@@ -2528,7 +2570,7 @@ | |
** All of the usual printf() formatting options apply. In addition, there | |
** is are "%q", "%Q", and "%z" options. | |
** | |
-** ^(The %q option works like %s in that it substitutes a null-terminated | |
+** ^(The %q option works like %s in that it substitutes a nul-terminated | |
** string from the argument list. But %q also doubles every '\'' character. | |
** %q is designed for use inside a string literal.)^ By doubling each '\'' | |
** character it escapes that character and allows it to be inserted into | |
@@ -3136,21 +3178,40 @@ | |
/* | |
** CAPI3REF: Obtain Values For URI Parameters | |
** | |
-** This is a utility routine, useful to VFS implementations, that checks | |
+** These are utility routines, useful to VFS implementations, that check | |
** to see if a database file was a URI that contained a specific query | |
-** parameter, and if so obtains the value of the query parameter. | |
-** | |
-** The zFilename argument is the filename pointer passed into the xOpen() | |
-** method of a VFS implementation. The zParam argument is the name of the | |
-** query parameter we seek. This routine returns the value of the zParam | |
-** parameter if it exists. If the parameter does not exist, this routine | |
-** returns a NULL pointer. | |
+** parameter, and if so obtains the value of that query parameter. | |
** | |
-** If the zFilename argument to this function is not a pointer that SQLite | |
-** passed into the xOpen VFS method, then the behavior of this routine | |
-** is undefined and probably undesirable. | |
+** If F is the database filename pointer passed into the xOpen() method of | |
+** a VFS implementation when the flags parameter to xOpen() has one or | |
+** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and | |
+** P is the name of the query parameter, then | |
+** sqlite3_uri_parameter(F,P) returns the value of the P | |
+** parameter if it exists or a NULL pointer if P does not appear as a | |
+** query parameter on F. If P is a query parameter of F | |
+** has no explicit value, then sqlite3_uri_parameter(F,P) returns | |
+** a pointer to an empty string. | |
+** | |
+** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean | |
+** parameter and returns true (1) or false (0) according to the value | |
+** of P. The value of P is true if it is "yes" or "true" or "on" or | |
+** a non-zero number and is false otherwise. If P is not a query parameter | |
+** on F then sqlite3_uri_boolean(F,P,B) returns (B!=0). | |
+** | |
+** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a | |
+** 64-bit signed integer and returns that integer, or D if P does not | |
+** exist. If the value of P is something other than an integer, then | |
+** zero is returned. | |
+** | |
+** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and | |
+** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and | |
+** is not a database file pathname pointer that SQLite passed into the xOpen | |
+** VFS method, then the behavior of this routine is undefined and probably | |
+** undesirable. | |
*/ | |
SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); | |
+SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); | |
+SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); | |
/* | |
@@ -3473,6 +3534,25 @@ | |
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); | |
/* | |
+** CAPI3REF: Determine If A Prepared Statement Has Been Reset | |
+** | |
+** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the | |
+** [prepared statement] S has been stepped at least once using | |
+** [sqlite3_step(S)] but has not run to completion and/or has not | |
+** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) | |
+** interface returns false if S is a NULL pointer. If S is not a | |
+** NULL pointer and is not a pointer to a valid [prepared statement] | |
+** object, then the behavior is undefined and probably undesirable. | |
+** | |
+** This interface can be used in combination [sqlite3_next_stmt()] | |
+** to locate all prepared statements associated with a database | |
+** connection that are in need of being reset. This can be used, | |
+** for example, in diagnostic routines to search for prepared | |
+** statements that are holding a transaction open. | |
+*/ | |
+SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); | |
+ | |
+/* | |
** CAPI3REF: Dynamically Typed Value Object | |
** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} | |
** | |
@@ -4013,7 +4093,7 @@ | |
** bytes in the string, not the number of characters. | |
** | |
** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), | |
-** even empty strings, are always zero terminated. ^The return | |
+** even empty strings, are always zero-terminated. ^The return | |
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. | |
** | |
** ^The object returned by [sqlite3_column_value()] is an | |
@@ -4914,6 +4994,22 @@ | |
SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); | |
/* | |
+** CAPI3REF: Return The Filename For A Database Connection | |
+** | |
+** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename | |
+** associated with database N of connection D. ^The main database file | |
+** has the name "main". If there is no attached database N on the database | |
+** connection D, or if database N is a temporary or in-memory database, then | |
+** a NULL pointer is returned. | |
+** | |
+** ^The filename returned by this function is the output of the | |
+** xFullPathname method of the [VFS]. ^In other words, the filename | |
+** will be an absolute pathname, even if the filename used | |
+** to open the database originally was a URI or relative pathname. | |
+*/ | |
+SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); | |
+ | |
+/* | |
** CAPI3REF: Find the next prepared statement | |
** | |
** ^This interface returns a pointer to the next [prepared statement] after | |
@@ -4948,13 +5044,15 @@ | |
** on the same [database connection] D, or NULL for | |
** the first call for each function on D. | |
** | |
+** The commit and rollback hook callbacks are not reentrant. | |
** The callback implementation must not do anything that will modify | |
** the database connection that invoked the callback. Any actions | |
** to modify the database connection must be deferred until after the | |
** completion of the [sqlite3_step()] call that triggered the commit | |
** or rollback hook in the first place. | |
-** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their | |
-** database connections for the meaning of "modify" in this paragraph. | |
+** Note that running any other SQL statements, including SELECT statements, | |
+** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify | |
+** the database connections for the meaning of "modify" in this paragraph. | |
** | |
** ^Registering a NULL function disables the callback. | |
** | |
@@ -5067,10 +5165,25 @@ | |
** which might be more or less than the amount requested. | |
** ^The sqlite3_release_memory() routine is a no-op returning zero | |
** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. | |
+** | |
+** See also: [sqlite3_db_release_memory()] | |
*/ | |
SQLITE_API int sqlite3_release_memory(int); | |
/* | |
+** CAPI3REF: Free Memory Used By A Database Connection | |
+** | |
+** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap | |
+** memory as possible from database connection D. Unlike the | |
+** [sqlite3_release_memory()] interface, this interface is effect even | |
+** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is | |
+** omitted. | |
+** | |
+** See also: [sqlite3_release_memory()] | |
+*/ | |
+SQLITE_API int sqlite3_db_release_memory(sqlite3*); | |
+ | |
+/* | |
** CAPI3REF: Impose A Limit On Heap Size | |
** | |
** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the | |
@@ -5084,7 +5197,8 @@ | |
** is advisory only. | |
** | |
** ^The return value from sqlite3_soft_heap_limit64() is the size of | |
-** the soft heap limit prior to the call. ^If the argument N is negative | |
+** the soft heap limit prior to the call, or negative in the case of an | |
+** error. ^If the argument N is negative | |
** then no change is made to the soft heap limit. Hence, the current | |
** size of the soft heap limit can be determined by invoking | |
** sqlite3_soft_heap_limit64() with a negative argument. | |
@@ -5100,7 +5214,7 @@ | |
** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and | |
** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. | |
** <li> An alternative page cache implementation is specified using | |
-** [sqlite3_config]([SQLITE_CONFIG_PCACHE],...). | |
+** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). | |
** <li> The page cache allocates from its own memory pool supplied | |
** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than | |
** from the heap. | |
@@ -5842,7 +5956,7 @@ | |
** | |
** <ul> | |
** <li> SQLITE_MUTEX_OS2 | |
-** <li> SQLITE_MUTEX_PTHREAD | |
+** <li> SQLITE_MUTEX_PTHREADS | |
** <li> SQLITE_MUTEX_W32 | |
** <li> SQLITE_MUTEX_NOOP | |
** </ul>)^ | |
@@ -5850,7 +5964,7 @@ | |
** ^The SQLITE_MUTEX_NOOP implementation is a set of routines | |
** that does no real locking and is appropriate for use in | |
** a single-threaded application. ^The SQLITE_MUTEX_OS2, | |
-** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations | |
+** SQLITE_MUTEX_PTHREADS, and SQLITE_MUTEX_W32 implementations | |
** are appropriate for use on OS/2, Unix, and Windows. | |
** | |
** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor | |
@@ -6040,7 +6154,7 @@ | |
** ^These routines should return true if the mutex in their argument | |
** is held or not held, respectively, by the calling thread. | |
** | |
-** ^The implementation is not required to provided versions of these | |
+** ^The implementation is not required to provide versions of these | |
** routines that actually work. If the implementation does not provide working | |
** versions of these routines, it should at least provide stubs that always | |
** return true so that one does not get spurious assertion failures. | |
@@ -6168,9 +6282,9 @@ | |
#define SQLITE_TESTCTRL_RESERVE 14 | |
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 | |
#define SQLITE_TESTCTRL_ISKEYWORD 16 | |
-#define SQLITE_TESTCTRL_PGHDRSZ 17 | |
-#define SQLITE_TESTCTRL_SCRATCHMALLOC 18 | |
-#define SQLITE_TESTCTRL_LOCALTIME_FAULT 19 | |
+#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 | |
+#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 | |
+#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 | |
#define SQLITE_TESTCTRL_LAST 19 | |
/* | |
@@ -6473,17 +6587,33 @@ | |
** sqlite3_pcache object except by holding and passing pointers | |
** to the object. | |
** | |
-** See [sqlite3_pcache_methods] for additional information. | |
+** See [sqlite3_pcache_methods2] for additional information. | |
*/ | |
typedef struct sqlite3_pcache sqlite3_pcache; | |
/* | |
+** CAPI3REF: Custom Page Cache Object | |
+** | |
+** The sqlite3_pcache_page object represents a single page in the | |
+** page cache. The page cache will allocate instances of this | |
+** object. Various methods of the page cache use pointers to instances | |
+** of this object as parameters or as their return value. | |
+** | |
+** See [sqlite3_pcache_methods2] for additional information. | |
+*/ | |
+typedef struct sqlite3_pcache_page sqlite3_pcache_page; | |
+struct sqlite3_pcache_page { | |
+ void *pBuf; /* The content of the page */ | |
+ void *pExtra; /* Extra information associated with the page */ | |
+}; | |
+ | |
+/* | |
** CAPI3REF: Application Defined Page Cache. | |
** KEYWORDS: {page cache} | |
** | |
-** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can | |
+** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can | |
** register an alternative page cache implementation by passing in an | |
-** instance of the sqlite3_pcache_methods structure.)^ | |
+** instance of the sqlite3_pcache_methods2 structure.)^ | |
** In many applications, most of the heap memory allocated by | |
** SQLite is used for the page cache. | |
** By implementing a | |
@@ -6497,7 +6627,7 @@ | |
** extreme measure that is only needed by the most demanding applications. | |
** The built-in page cache is recommended for most uses. | |
** | |
-** ^(The contents of the sqlite3_pcache_methods structure are copied to an | |
+** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an | |
** internal buffer by SQLite within the call to [sqlite3_config]. Hence | |
** the application may discard the parameter after the call to | |
** [sqlite3_config()] returns.)^ | |
@@ -6506,7 +6636,7 @@ | |
** ^(The xInit() method is called once for each effective | |
** call to [sqlite3_initialize()])^ | |
** (usually only once during the lifetime of the process). ^(The xInit() | |
-** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ | |
+** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ | |
** The intent of the xInit() method is to set up global data structures | |
** required by the custom page cache implementation. | |
** ^(If the xInit() method is NULL, then the | |
@@ -6533,17 +6663,15 @@ | |
** SQLite will typically create one cache instance for each open database file, | |
** though this is not guaranteed. ^The | |
** first parameter, szPage, is the size in bytes of the pages that must | |
-** be allocated by the cache. ^szPage will not be a power of two. ^szPage | |
-** will the page size of the database file that is to be cached plus an | |
-** increment (here called "R") of less than 250. SQLite will use the | |
-** extra R bytes on each page to store metadata about the underlying | |
-** database page on disk. The value of R depends | |
+** be allocated by the cache. ^szPage will always a power of two. ^The | |
+** second parameter szExtra is a number of bytes of extra storage | |
+** associated with each page cache entry. ^The szExtra parameter will | |
+** a number less than 250. SQLite will use the | |
+** extra szExtra bytes on each page to store metadata about the underlying | |
+** database page on disk. The value passed into szExtra depends | |
** on the SQLite version, the target platform, and how SQLite was compiled. | |
-** ^(R is constant for a particular build of SQLite. Except, there are two | |
-** distinct values of R when SQLite is compiled with the proprietary | |
-** ZIPVFS extension.)^ ^The second argument to | |
-** xCreate(), bPurgeable, is true if the cache being created will | |
-** be used to cache database pages of a file stored on disk, or | |
+** ^The third argument to xCreate(), bPurgeable, is true if the cache being | |
+** created will be used to cache database pages of a file stored on disk, or | |
** false if it is used for an in-memory database. The cache implementation | |
** does not have to do anything special based with the value of bPurgeable; | |
** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will | |
@@ -6567,11 +6695,16 @@ | |
** | |
** [[the xFetch() page cache methods]] | |
** The xFetch() method locates a page in the cache and returns a pointer to | |
-** the page, or a NULL pointer. | |
-** A "page", in this context, means a buffer of szPage bytes aligned at an | |
-** 8-byte boundary. The page to be fetched is determined by the key. ^The | |
-** minimum key value is 1. After it has been retrieved using xFetch, the page | |
-** is considered to be "pinned". | |
+** an sqlite3_pcache_page object associated with that page, or a NULL pointer. | |
+** The pBuf element of the returned sqlite3_pcache_page object will be a | |
+** pointer to a buffer of szPage bytes used to store the content of a | |
+** single database page. The pExtra element of sqlite3_pcache_page will be | |
+** a pointer to the szExtra bytes of extra storage that SQLite has requested | |
+** for each entry in the page cache. | |
+** | |
+** The page to be fetched is determined by the key. ^The minimum key value | |
+** is 1. After it has been retrieved using xFetch, the page is considered | |
+** to be "pinned". | |
** | |
** If the requested page is already in the page cache, then the page cache | |
** implementation must return a pointer to the page buffer with its content | |
@@ -6624,8 +6757,37 @@ | |
** ^The xDestroy() method is used to delete a cache allocated by xCreate(). | |
** All resources associated with the specified cache should be freed. ^After | |
** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] | |
-** handle invalid, and will not use it with any other sqlite3_pcache_methods | |
+** handle invalid, and will not use it with any other sqlite3_pcache_methods2 | |
** functions. | |
+** | |
+** [[the xShrink() page cache method]] | |
+** ^SQLite invokes the xShrink() method when it wants the page cache to | |
+** free up as much of heap memory as possible. The page cache implementation | |
+** is not obligated to free any memory, but well-behaved implementations should | |
+** do their best. | |
+*/ | |
+typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; | |
+struct sqlite3_pcache_methods2 { | |
+ int iVersion; | |
+ void *pArg; | |
+ int (*xInit)(void*); | |
+ void (*xShutdown)(void*); | |
+ sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); | |
+ void (*xCachesize)(sqlite3_pcache*, int nCachesize); | |
+ int (*xPagecount)(sqlite3_pcache*); | |
+ sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); | |
+ void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); | |
+ void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, | |
+ unsigned oldKey, unsigned newKey); | |
+ void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); | |
+ void (*xDestroy)(sqlite3_pcache*); | |
+ void (*xShrink)(sqlite3_pcache*); | |
+}; | |
+ | |
+/* | |
+** This is the obsolete pcache_methods object that has now been replaced | |
+** by sqlite3_pcache_methods2. This object is not used by SQLite. It is | |
+** retained in the header file for backwards compatibility only. | |
*/ | |
typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; | |
struct sqlite3_pcache_methods { | |
@@ -6642,6 +6804,7 @@ | |
void (*xDestroy)(sqlite3_pcache*); | |
}; | |
+ | |
/* | |
** CAPI3REF: Online Backup Object | |
** | |
@@ -7645,7 +7808,7 @@ | |
*/ | |
#define SQLITE_MAX_FILE_FORMAT 4 | |
#ifndef SQLITE_DEFAULT_FILE_FORMAT | |
-# define SQLITE_DEFAULT_FILE_FORMAT 1 | |
+# define SQLITE_DEFAULT_FILE_FORMAT 4 | |
#endif | |
/* | |
@@ -8285,6 +8448,7 @@ | |
int nOp; /* Elements in aOp[] */ | |
int nMem; /* Number of memory cells required */ | |
int nCsr; /* Number of cursors required */ | |
+ int nOnce; /* Number of OP_Once instructions */ | |
void *token; /* id that may be used to recursive triggers */ | |
SubProgram *pNext; /* Next sub-program already visited */ | |
}; | |
@@ -8531,10 +8695,10 @@ | |
#define OPFLG_OUT2 0x0020 /* out2: P2 is an output */ | |
#define OPFLG_OUT3 0x0040 /* out3: P3 is an output */ | |
#define OPFLG_INITIALIZER {\ | |
-/* 0 */ 0x00, 0x01, 0x05, 0x04, 0x04, 0x10, 0x00, 0x02,\ | |
+/* 0 */ 0x00, 0x01, 0x01, 0x04, 0x04, 0x10, 0x00, 0x02,\ | |
/* 8 */ 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x24, 0x24,\ | |
/* 16 */ 0x00, 0x00, 0x00, 0x24, 0x04, 0x05, 0x04, 0x00,\ | |
-/* 24 */ 0x00, 0x01, 0x05, 0x05, 0x05, 0x00, 0x00, 0x00,\ | |
+/* 24 */ 0x00, 0x01, 0x01, 0x05, 0x05, 0x00, 0x00, 0x00,\ | |
/* 32 */ 0x02, 0x00, 0x00, 0x00, 0x02, 0x10, 0x00, 0x00,\ | |
/* 40 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11,\ | |
/* 48 */ 0x11, 0x11, 0x08, 0x11, 0x11, 0x11, 0x11, 0x02,\ | |
@@ -8734,6 +8898,7 @@ | |
SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager*, u32*, int); | |
SQLITE_PRIVATE int sqlite3PagerMaxPageCount(Pager*, int); | |
SQLITE_PRIVATE void sqlite3PagerSetCachesize(Pager*, int); | |
+SQLITE_PRIVATE void sqlite3PagerShrink(Pager*); | |
SQLITE_PRIVATE void sqlite3PagerSetSafetyLevel(Pager*,int,int,int); | |
SQLITE_PRIVATE int sqlite3PagerLockingMode(Pager *, int); | |
SQLITE_PRIVATE int sqlite3PagerSetJournalMode(Pager *, int); | |
@@ -8842,7 +9007,8 @@ | |
** structure. | |
*/ | |
struct PgHdr { | |
- void *pData; /* Content of this page */ | |
+ sqlite3_pcache_page *pPage; /* Pcache object page handle */ | |
+ void *pData; /* Page data */ | |
void *pExtra; /* Extra content */ | |
PgHdr *pDirty; /* Transient list of dirty pages */ | |
Pgno pgno; /* Page number for this page */ | |
@@ -8960,6 +9126,9 @@ | |
SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *); | |
#endif | |
+/* Free up as much memory as possible from the page cache */ | |
+SQLITE_PRIVATE void sqlite3PcacheShrink(PCache*); | |
+ | |
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT | |
/* Try to return memory used by the pcache module to the main memory heap */ | |
SQLITE_PRIVATE int sqlite3PcacheReleaseMemory(int); | |
@@ -9046,17 +9215,6 @@ | |
#endif | |
/* | |
-** Determine if we are dealing with WindowsCE - which has a much | |
-** reduced API. | |
-*/ | |
-#if defined(_WIN32_WCE) | |
-# define SQLITE_OS_WINCE 1 | |
-#else | |
-# define SQLITE_OS_WINCE 0 | |
-#endif | |
- | |
- | |
-/* | |
** Define the maximum size of a temporary filename | |
*/ | |
#if SQLITE_OS_WIN | |
@@ -9080,6 +9238,25 @@ | |
# define SQLITE_TEMPNAME_SIZE 200 | |
#endif | |
+/* | |
+** Determine if we are dealing with Windows NT. | |
+*/ | |
+#if defined(_WIN32_WINNT) | |
+# define SQLITE_OS_WINNT 1 | |
+#else | |
+# define SQLITE_OS_WINNT 0 | |
+#endif | |
+ | |
+/* | |
+** Determine if we are dealing with WindowsCE - which has a much | |
+** reduced API. | |
+*/ | |
+#if defined(_WIN32_WCE) | |
+# define SQLITE_OS_WINCE 1 | |
+#else | |
+# define SQLITE_OS_WINCE 0 | |
+#endif | |
+ | |
/* If the SET_FULLSYNC macro is not defined above, then make it | |
** a no-op | |
*/ | |
@@ -9091,7 +9268,7 @@ | |
** The default size of a disk sector | |
*/ | |
#ifndef SQLITE_DEFAULT_SECTOR_SIZE | |
-# define SQLITE_DEFAULT_SECTOR_SIZE 512 | |
+# define SQLITE_DEFAULT_SECTOR_SIZE 4096 | |
#endif | |
/* | |
@@ -9224,6 +9401,7 @@ | |
SQLITE_PRIVATE int sqlite3OsUnlock(sqlite3_file*, int); | |
SQLITE_PRIVATE int sqlite3OsCheckReservedLock(sqlite3_file *id, int *pResOut); | |
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file*,int,void*); | |
+SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file*,int,void*); | |
#define SQLITE_FCNTL_DB_UNCHANGED 0xca093fa0 | |
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id); | |
SQLITE_PRIVATE int sqlite3OsDeviceCharacteristics(sqlite3_file *id); | |
@@ -9232,6 +9410,7 @@ | |
SQLITE_PRIVATE void sqlite3OsShmBarrier(sqlite3_file *id); | |
SQLITE_PRIVATE int sqlite3OsShmUnmap(sqlite3_file *id, int); | |
+ | |
/* | |
** Functions for accessing sqlite3_vfs methods | |
*/ | |
@@ -9822,21 +10001,12 @@ | |
struct CollSeq { | |
char *zName; /* Name of the collating sequence, UTF-8 encoded */ | |
u8 enc; /* Text encoding handled by xCmp() */ | |
- u8 type; /* One of the SQLITE_COLL_... values below */ | |
void *pUser; /* First argument to xCmp() */ | |
int (*xCmp)(void*,int, const void*, int, const void*); | |
void (*xDel)(void*); /* Destructor for pUser */ | |
}; | |
/* | |
-** Allowed values of CollSeq.type: | |
-*/ | |
-#define SQLITE_COLL_BINARY 1 /* The default memcmp() collating sequence */ | |
-#define SQLITE_COLL_NOCASE 2 /* The built-in NOCASE collating sequence */ | |
-#define SQLITE_COLL_REVERSE 3 /* The built-in REVERSE collating sequence */ | |
-#define SQLITE_COLL_USER 0 /* Any other user-defined collating sequence */ | |
- | |
-/* | |
** A sort order can be either ASC or DESC. | |
*/ | |
#define SQLITE_SO_ASC 0 /* Sort in ascending order */ | |
@@ -10121,7 +10291,7 @@ | |
struct UnpackedRecord { | |
KeyInfo *pKeyInfo; /* Collation and sort-order information */ | |
u16 nField; /* Number of entries in apMem[] */ | |
- u16 flags; /* Boolean settings. UNPACKED_... below */ | |
+ u8 flags; /* Boolean settings. UNPACKED_... below */ | |
i64 rowid; /* Used by UNPACKED_PREFIX_SEARCH */ | |
Mem *aMem; /* Values */ | |
}; | |
@@ -10129,12 +10299,9 @@ | |
/* | |
** Allowed values of UnpackedRecord.flags | |
*/ | |
-#define UNPACKED_NEED_FREE 0x0001 /* Memory is from sqlite3Malloc() */ | |
-#define UNPACKED_NEED_DESTROY 0x0002 /* apMem[]s should all be destroyed */ | |
-#define UNPACKED_IGNORE_ROWID 0x0004 /* Ignore trailing rowid on key1 */ | |
-#define UNPACKED_INCRKEY 0x0008 /* Make this key an epsilon larger */ | |
-#define UNPACKED_PREFIX_MATCH 0x0010 /* A prefix match is considered OK */ | |
-#define UNPACKED_PREFIX_SEARCH 0x0020 /* A prefix match is considered OK */ | |
+#define UNPACKED_INCRKEY 0x01 /* Make this key an epsilon larger */ | |
+#define UNPACKED_PREFIX_MATCH 0x02 /* A prefix match is considered OK */ | |
+#define UNPACKED_PREFIX_SEARCH 0x04 /* Ignore final (rowid) field */ | |
/* | |
** Each SQL index is represented in memory by an | |
@@ -10397,10 +10564,10 @@ | |
#define EP_FixedDest 0x0200 /* Result needed in a specific register */ | |
#define EP_IntValue 0x0400 /* Integer value contained in u.iValue */ | |
#define EP_xIsSelect 0x0800 /* x.pSelect is valid (otherwise x.pList is) */ | |
- | |
-#define EP_Reduced 0x1000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */ | |
-#define EP_TokenOnly 0x2000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */ | |
-#define EP_Static 0x4000 /* Held in memory not obtained from malloc() */ | |
+#define EP_Hint 0x1000 /* Optimizer hint. Not required for correctness */ | |
+#define EP_Reduced 0x2000 /* Expr struct is EXPR_REDUCEDSIZE bytes only */ | |
+#define EP_TokenOnly 0x4000 /* Expr struct is EXPR_TOKENONLYSIZE bytes only */ | |
+#define EP_Static 0x8000 /* Held in memory not obtained from malloc() */ | |
/* | |
** The following are the meanings of bits in the Expr.flags2 field. | |
@@ -10462,7 +10629,7 @@ | |
char *zSpan; /* Original text of the expression */ | |
u8 sortOrder; /* 1 for DESC or 0 for ASC */ | |
u8 done; /* A flag to indicate when processing is finished */ | |
- u16 iCol; /* For ORDER BY, column number in result set */ | |
+ u16 iOrderByCol; /* For ORDER BY, column number in result set */ | |
u16 iAlias; /* Index into Parse.aAlias[] for zName */ | |
} *a; /* One entry for each expression */ | |
}; | |
@@ -10762,13 +10929,13 @@ | |
** Allowed values for Select.selFlags. The "SF" prefix stands for | |
** "Select Flag". | |
*/ | |
-#define SF_Distinct 0x0001 /* Output should be DISTINCT */ | |
-#define SF_Resolved 0x0002 /* Identifiers have been resolved */ | |
-#define SF_Aggregate 0x0004 /* Contains aggregate functions */ | |
-#define SF_UsesEphemeral 0x0008 /* Uses the OpenEphemeral opcode */ | |
-#define SF_Expanded 0x0010 /* sqlite3SelectExpand() called on this */ | |
-#define SF_HasTypeInfo 0x0020 /* FROM subqueries have Table metadata */ | |
-#define SF_UseSorter 0x0040 /* Sort using a sorter */ | |
+#define SF_Distinct 0x01 /* Output should be DISTINCT */ | |
+#define SF_Resolved 0x02 /* Identifiers have been resolved */ | |
+#define SF_Aggregate 0x04 /* Contains aggregate functions */ | |
+#define SF_UsesEphemeral 0x08 /* Uses the OpenEphemeral opcode */ | |
+#define SF_Expanded 0x10 /* sqlite3SelectExpand() called on this */ | |
+#define SF_HasTypeInfo 0x20 /* FROM subqueries have Table metadata */ | |
+#define SF_UseSorter 0x40 /* Sort using a sorter */ | |
/* | |
@@ -10883,10 +11050,8 @@ | |
char *zErrMsg; /* An error message */ | |
Vdbe *pVdbe; /* An engine for executing database bytecode */ | |
u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ | |
- u8 nameClash; /* A permanent table name clashes with temp table name */ | |
u8 checkSchema; /* Causes schema cookie check after an error */ | |
u8 nested; /* Number of nested calls to the parser/code generator */ | |
- u8 parseError; /* True after a parsing error. Ticket #1794 */ | |
u8 nTempReg; /* Number of temporary registers in aTempReg[] */ | |
u8 nTempInUse; /* Number of aTempReg[] currently checked out */ | |
int aTempReg[8]; /* Holding area for temporary registers */ | |
@@ -10896,11 +11061,12 @@ | |
int nTab; /* Number of previously allocated VDBE cursors */ | |
int nMem; /* Number of memory cells used so far */ | |
int nSet; /* Number of sets used so far */ | |
+ int nOnce; /* Number of OP_Once instructions so far */ | |
int ckBase; /* Base register of data during check constraints */ | |
int iCacheLevel; /* ColCache valid when aColCache[].iLevel<=iCacheLevel */ | |
int iCacheCnt; /* Counter used to generate aColCache[].lru values */ | |
- u8 nColCache; /* Number of entries in the column cache */ | |
- u8 iColCache; /* Next entry of the cache to replace */ | |
+ u8 nColCache; /* Number of entries in aColCache[] */ | |
+ u8 iColCache; /* Next entry in aColCache[] to replace */ | |
struct yColCache { | |
int iTable; /* Table cursor number */ | |
int iColumn; /* Table column number */ | |
@@ -10942,7 +11108,6 @@ | |
char **azVar; /* Pointers to names of parameters */ | |
Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ | |
int nAlias; /* Number of aliased result set columns */ | |
- int nAliasAlloc; /* Number of allocated slots for aAlias[] */ | |
int *aAlias; /* Register used to hold aliased result */ | |
u8 explain; /* True if the EXPLAIN flag is found on the query */ | |
Token sNameToken; /* Token with unqualified schema object name */ | |
@@ -11137,7 +11302,7 @@ | |
int nLookaside; /* Default lookaside buffer count */ | |
sqlite3_mem_methods m; /* Low-level memory allocation interface */ | |
sqlite3_mutex_methods mutex; /* Low-level mutex interface */ | |
- sqlite3_pcache_methods pcache; /* Low-level page-cache interface */ | |
+ sqlite3_pcache_methods2 pcache2; /* Low-level page-cache interface */ | |
void *pHeap; /* Heap storage space */ | |
int nHeap; /* Size of pHeap[] */ | |
int mnReq, mxReq; /* Min and max heap requests sizes */ | |
@@ -11343,6 +11508,29 @@ | |
#if defined(SQLITE_TEST) | |
SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); | |
#endif | |
+ | |
+/* Output formatting for SQLITE_TESTCTRL_EXPLAIN */ | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe*); | |
+SQLITE_PRIVATE void sqlite3ExplainPrintf(Vdbe*, const char*, ...); | |
+SQLITE_PRIVATE void sqlite3ExplainNL(Vdbe*); | |
+SQLITE_PRIVATE void sqlite3ExplainPush(Vdbe*); | |
+SQLITE_PRIVATE void sqlite3ExplainPop(Vdbe*); | |
+SQLITE_PRIVATE void sqlite3ExplainFinish(Vdbe*); | |
+SQLITE_PRIVATE void sqlite3ExplainSelect(Vdbe*, Select*); | |
+SQLITE_PRIVATE void sqlite3ExplainExpr(Vdbe*, Expr*); | |
+SQLITE_PRIVATE void sqlite3ExplainExprList(Vdbe*, ExprList*); | |
+SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe*); | |
+#else | |
+# define sqlite3ExplainBegin(X) | |
+# define sqlite3ExplainSelect(A,B) | |
+# define sqlite3ExplainExpr(A,B) | |
+# define sqlite3ExplainExprList(A,B) | |
+# define sqlite3ExplainFinish(X) | |
+# define sqlite3VdbeExplanation(X) 0 | |
+#endif | |
+ | |
+ | |
SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*, ...); | |
SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); | |
SQLITE_PRIVATE int sqlite3Dequote(char*); | |
@@ -11353,6 +11541,7 @@ | |
SQLITE_PRIVATE void sqlite3ReleaseTempReg(Parse*,int); | |
SQLITE_PRIVATE int sqlite3GetTempRange(Parse*,int); | |
SQLITE_PRIVATE void sqlite3ReleaseTempRange(Parse*,int,int); | |
+SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse*); | |
SQLITE_PRIVATE Expr *sqlite3ExprAlloc(sqlite3*,int,const Token*,int); | |
SQLITE_PRIVATE Expr *sqlite3Expr(sqlite3*,int,const char*); | |
SQLITE_PRIVATE void sqlite3ExprAttachSubtrees(sqlite3*,Expr*,Expr*,Expr*); | |
@@ -11384,6 +11573,7 @@ | |
SQLITE_PRIVATE void sqlite3EndTable(Parse*,Token*,Token*,Select*); | |
SQLITE_PRIVATE int sqlite3ParseUri(const char*,const char*,unsigned int*, | |
sqlite3_vfs**,char**,char **); | |
+SQLITE_PRIVATE int sqlite3CodeOnce(Parse *); | |
SQLITE_PRIVATE Bitvec *sqlite3BitvecCreate(u32); | |
SQLITE_PRIVATE int sqlite3BitvecTest(Bitvec*, u32); | |
@@ -11722,6 +11912,7 @@ | |
SQLITE_PRIVATE void sqlite3StrAccumInit(StrAccum*, char*, int, int); | |
SQLITE_PRIVATE void sqlite3StrAccumAppend(StrAccum*,const char*,int); | |
+SQLITE_PRIVATE void sqlite3AppendSpace(StrAccum*,int); | |
SQLITE_PRIVATE char *sqlite3StrAccumFinish(StrAccum*); | |
SQLITE_PRIVATE void sqlite3StrAccumReset(StrAccum*); | |
SQLITE_PRIVATE void sqlite3SelectDestInit(SelectDest*,int,int); | |
@@ -12101,7 +12292,7 @@ | |
500, /* nLookaside */ | |
{0,0,0,0,0,0,0,0}, /* m */ | |
{0,0,0,0,0,0,0,0,0}, /* mutex */ | |
- {0,0,0,0,0,0,0,0,0,0,0}, /* pcache */ | |
+ {0,0,0,0,0,0,0,0,0,0,0,0,0},/* pcache2 */ | |
(void*)0, /* pHeap */ | |
0, /* nHeap */ | |
0, 0, /* mnHeap, mxHeap */ | |
@@ -12628,6 +12819,9 @@ | |
/* Opaque type used by code in vdbesort.c */ | |
typedef struct VdbeSorter VdbeSorter; | |
+/* Opaque type used by the explainer */ | |
+typedef struct Explain Explain; | |
+ | |
/* | |
** A cursor is a pointer into a single BTree within a database file. | |
** The cursor can seek to a BTree entry with a particular key, or | |
@@ -12712,6 +12906,8 @@ | |
int nOp; /* Size of aOp array */ | |
Mem *aMem; /* Array of memory cells for parent frame */ | |
int nMem; /* Number of entries in aMem */ | |
+ u8 *aOnceFlag; /* Array of OP_Once flags for parent frame */ | |
+ int nOnceFlag; /* Number of entries in aOnceFlag */ | |
VdbeCursor **apCsr; /* Array of Vdbe cursors for parent frame */ | |
u16 nCursor; /* Number of entries in apCsr */ | |
void *token; /* Copy of SubProgram.token */ | |
@@ -12851,6 +13047,18 @@ | |
}; | |
/* | |
+** An Explain object accumulates indented output which is helpful | |
+** in describing recursive data structures. | |
+*/ | |
+struct Explain { | |
+ Vdbe *pVdbe; /* Attach the explanation to this Vdbe */ | |
+ StrAccum str; /* The string being accumulated */ | |
+ int nIndent; /* Number of elements in aIndent */ | |
+ u16 aIndent[100]; /* Levels of indentation */ | |
+ char zBase[100]; /* Initial space */ | |
+}; | |
+ | |
+/* | |
** An instance of the virtual machine. This structure contains the complete | |
** state of the virtual machine. | |
** | |
@@ -12916,11 +13124,17 @@ | |
#ifdef SQLITE_DEBUG | |
FILE *trace; /* Write an execution trace here, if not NULL */ | |
#endif | |
+#ifdef SQLITE_ENABLE_TREE_EXPLAIN | |
+ Explain *pExplain; /* The explainer */ | |
+ char *zExplain; /* Explanation of data structures */ | |
+#endif | |
VdbeFrame *pFrame; /* Parent frame */ | |
VdbeFrame *pDelFrame; /* List of frame objects to free on VM reset */ | |
int nFrame; /* Number of frames in pFrame list */ | |
u32 expmask; /* Binding to these vars invalidates VM */ | |
SubProgram *pProgram; /* Linked list of all sub-programs used by VM */ | |
+ int nOnceFlag; /* Size of array aOnceFlag[] */ | |
+ u8 *aOnceFlag; /* Flags for OP_Once */ | |
}; | |
/* | |
@@ -12980,7 +13194,7 @@ | |
SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,int,int,int,Mem*); | |
SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); | |
SQLITE_PRIVATE void sqlite3VdbeMemReleaseExternal(Mem *p); | |
-#define MemReleaseExt(X) \ | |
+#define VdbeMemRelease(X) \ | |
if((X)->flags&(MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame)) \ | |
sqlite3VdbeMemReleaseExternal(X); | |
SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); | |
@@ -13019,7 +13233,7 @@ | |
#endif | |
#ifdef SQLITE_DEBUG | |
-SQLITE_PRIVATE void sqlite3VdbeMemPrepareToChange(Vdbe*,Mem*); | |
+SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe*,Mem*); | |
#endif | |
#ifndef SQLITE_OMIT_FOREIGN_KEY | |
@@ -13037,8 +13251,10 @@ | |
#ifndef SQLITE_OMIT_INCRBLOB | |
SQLITE_PRIVATE int sqlite3VdbeMemExpandBlob(Mem *); | |
+ #define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) | |
#else | |
#define sqlite3VdbeMemExpandBlob(x) SQLITE_OK | |
+ #define ExpandBlob(P) SQLITE_OK | |
#endif | |
#endif /* !defined(_VDBEINT_H_) */ | |
@@ -14438,11 +14654,18 @@ | |
** The following functions are instrumented for malloc() failure | |
** testing: | |
** | |
-** sqlite3OsOpen() | |
** sqlite3OsRead() | |
** sqlite3OsWrite() | |
** sqlite3OsSync() | |
+** sqlite3OsFileSize() | |
** sqlite3OsLock() | |
+** sqlite3OsCheckReservedLock() | |
+** sqlite3OsFileControl() | |
+** sqlite3OsShmMap() | |
+** sqlite3OsOpen() | |
+** sqlite3OsDelete() | |
+** sqlite3OsAccess() | |
+** sqlite3OsFullPathname() | |
** | |
*/ | |
#if defined(SQLITE_TEST) | |
@@ -14501,9 +14724,23 @@ | |
DO_OS_MALLOC_TEST(id); | |
return id->pMethods->xCheckReservedLock(id, pResOut); | |
} | |
+ | |
+/* | |
+** Use sqlite3OsFileControl() when we are doing something that might fail | |
+** and we need to know about the failures. Use sqlite3OsFileControlHint() | |
+** when simply tossing information over the wall to the VFS and we do not | |
+** really care if the VFS receives and understands the information since it | |
+** is only a hint and can be safely ignored. The sqlite3OsFileControlHint() | |
+** routine has no return value since the return value would be meaningless. | |
+*/ | |
SQLITE_PRIVATE int sqlite3OsFileControl(sqlite3_file *id, int op, void *pArg){ | |
+ DO_OS_MALLOC_TEST(id); | |
return id->pMethods->xFileControl(id, op, pArg); | |
} | |
+SQLITE_PRIVATE void sqlite3OsFileControlHint(sqlite3_file *id, int op, void *pArg){ | |
+ (void)id->pMethods->xFileControl(id, op, pArg); | |
+} | |
+ | |
SQLITE_PRIVATE int sqlite3OsSectorSize(sqlite3_file *id){ | |
int (*xSectorSize)(sqlite3_file*) = id->pMethods->xSectorSize; | |
return (xSectorSize ? xSectorSize(id) : SQLITE_DEFAULT_SECTOR_SIZE); | |
@@ -14527,6 +14764,7 @@ | |
int bExtend, /* True to extend file if necessary */ | |
void volatile **pp /* OUT: Pointer to mapping */ | |
){ | |
+ DO_OS_MALLOC_TEST(id); | |
return id->pMethods->xShmMap(id, iPage, pgsz, bExtend, pp); | |
} | |
@@ -14543,7 +14781,7 @@ | |
){ | |
int rc; | |
DO_OS_MALLOC_TEST(0); | |
- /* 0x87f3f is a mask of SQLITE_OPEN_ flags that are valid to be passed | |
+ /* 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. */ | |
@@ -14552,6 +14790,8 @@ | |
return rc; | |
} | |
SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){ | |
+ DO_OS_MALLOC_TEST(0); | |
+ assert( dirSync==0 || dirSync==1 ); | |
return pVfs->xDelete(pVfs, zPath, dirSync); | |
} | |
SQLITE_PRIVATE int sqlite3OsAccess( | |
@@ -14569,6 +14809,7 @@ | |
int nPathOut, | |
char *zPathOut | |
){ | |
+ DO_OS_MALLOC_TEST(0); | |
zPathOut[0] = 0; | |
return pVfs->xFullPathname(pVfs, zPath, nPathOut, zPathOut); | |
} | |
@@ -14921,6 +15162,47 @@ | |
#ifdef SQLITE_SYSTEM_MALLOC | |
/* | |
+** Windows systems have malloc_usable_size() but it is called _msize() | |
+*/ | |
+#if !defined(HAVE_MALLOC_USABLE_SIZE) && SQLITE_OS_WIN | |
+# define HAVE_MALLOC_USABLE_SIZE 1 | |
+# define malloc_usable_size _msize | |
+#endif | |
+ | |
+#if defined(__APPLE__) | |
+ | |
+/* | |
+** Use the zone allocator available on apple products | |
+*/ | |
+#include <sys/sysctl.h> | |
+#include <malloc/malloc.h> | |
+#include <libkern/OSAtomic.h> | |
+static malloc_zone_t* _sqliteZone_; | |
+#define SQLITE_MALLOC(x) malloc_zone_malloc(_sqliteZone_, (x)) | |
+#define SQLITE_FREE(x) malloc_zone_free(_sqliteZone_, (x)); | |
+#define SQLITE_REALLOC(x,y) malloc_zone_realloc(_sqliteZone_, (x), (y)) | |
+#define SQLITE_MALLOCSIZE(x) \ | |
+ (_sqliteZone_ ? _sqliteZone_->size(_sqliteZone_,x) : malloc_size(x)) | |
+ | |
+#else /* if not __APPLE__ */ | |
+ | |
+/* | |
+** Use standard C library malloc and free on non-Apple systems. | |
+*/ | |
+#define SQLITE_MALLOC(x) malloc(x) | |
+#define SQLITE_FREE(x) free(x) | |
+#define SQLITE_REALLOC(x,y) realloc((x),(y)) | |
+ | |
+#ifdef HAVE_MALLOC_USABLE_SIZE | |
+#include <malloc.h> | |
+#define SQLITE_MALLOCSIZE(x) malloc_usable_size(x) | |
+#else | |
+#undef SQLITE_MALLOCSIZE | |
+#endif | |
+ | |
+#endif /* __APPLE__ or not __APPLE__ */ | |
+ | |
+/* | |
** Like malloc(), but remember the size of the allocation | |
** so that we can find it later using sqlite3MemSize(). | |
** | |
@@ -14929,10 +15211,18 @@ | |
** routines. | |
*/ | |
static void *sqlite3MemMalloc(int nByte){ | |
+#ifdef SQLITE_MALLOCSIZE | |
+ void *p = SQLITE_MALLOC( nByte ); | |
+ if( p==0 ){ | |
+ testcase( sqlite3GlobalConfig.xLog!=0 ); | |
+ sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); | |
+ } | |
+ return p; | |
+#else | |
sqlite3_int64 *p; | |
assert( nByte>0 ); | |
nByte = ROUND8(nByte); | |
- p = malloc( nByte+8 ); | |
+ p = SQLITE_MALLOC( nByte+8 ); | |
if( p ){ | |
p[0] = nByte; | |
p++; | |
@@ -14941,6 +15231,7 @@ | |
sqlite3_log(SQLITE_NOMEM, "failed to allocate %u bytes of memory", nByte); | |
} | |
return (void *)p; | |
+#endif | |
} | |
/* | |
@@ -14952,10 +15243,14 @@ | |
** by higher-level routines. | |
*/ | |
static void sqlite3MemFree(void *pPrior){ | |
+#ifdef SQLITE_MALLOCSIZE | |
+ SQLITE_FREE(pPrior); | |
+#else | |
sqlite3_int64 *p = (sqlite3_int64*)pPrior; | |
assert( pPrior!=0 ); | |
p--; | |
- free(p); | |
+ SQLITE_FREE(p); | |
+#endif | |
} | |
/* | |
@@ -14963,11 +15258,15 @@ | |
** or xRealloc(). | |
*/ | |
static int sqlite3MemSize(void *pPrior){ | |
+#ifdef SQLITE_MALLOCSIZE | |
+ return pPrior ? (int)SQLITE_MALLOCSIZE(pPrior) : 0; | |
+#else | |
sqlite3_int64 *p; | |
if( pPrior==0 ) return 0; | |
p = (sqlite3_int64*)pPrior; | |
p--; | |
return (int)p[0]; | |
+#endif | |
} | |
/* | |
@@ -14981,11 +15280,21 @@ | |
** routines and redirected to xFree. | |
*/ | |
static void *sqlite3MemRealloc(void *pPrior, int nByte){ | |
+#ifdef SQLITE_MALLOCSIZE | |
+ void *p = SQLITE_REALLOC(pPrior, nByte); | |
+ if( p==0 ){ | |
+ testcase( sqlite3GlobalConfig.xLog!=0 ); | |
+ sqlite3_log(SQLITE_NOMEM, | |
+ "failed memory resize %u to %u bytes", | |
+ SQLITE_MALLOCSIZE(pPrior), nByte); | |
+ } | |
+ return p; | |
+#else | |
sqlite3_int64 *p = (sqlite3_int64*)pPrior; | |
assert( pPrior!=0 && nByte>0 ); | |
assert( nByte==ROUND8(nByte) ); /* EV: R-46199-30249 */ | |
p--; | |
- p = realloc(p, nByte+8 ); | |
+ p = SQLITE_REALLOC(p, nByte+8 ); | |
if( p ){ | |
p[0] = nByte; | |
p++; | |
@@ -14996,6 +15305,7 @@ | |
sqlite3MemSize(pPrior), nByte); | |
} | |
return (void*)p; | |
+#endif | |
} | |
/* | |
@@ -15009,6 +15319,34 @@ | |
** Initialize this module. | |
*/ | |
static int sqlite3MemInit(void *NotUsed){ | |
+#if defined(__APPLE__) | |
+ int cpuCount; | |
+ size_t len; | |
+ if( _sqliteZone_ ){ | |
+ return SQLITE_OK; | |
+ } | |
+ len = sizeof(cpuCount); | |
+ /* One usually wants to use hw.acctivecpu for MT decisions, but not here */ | |
+ sysctlbyname("hw.ncpu", &cpuCount, &len, NULL, 0); | |
+ if( cpuCount>1 ){ | |
+ /* defer MT decisions to system malloc */ | |
+ _sqliteZone_ = malloc_default_zone(); | |
+ }else{ | |
+ /* only 1 core, use our own zone to contention over global locks, | |
+ ** e.g. we have our own dedicated locks */ | |
+ bool success; | |
+ malloc_zone_t* newzone = malloc_create_zone(4096, 0); | |
+ malloc_set_zone_name(newzone, "Sqlite_Heap"); | |
+ do{ | |
+ success = OSAtomicCompareAndSwapPtrBarrier(NULL, newzone, | |
+ (void * volatile *)&_sqliteZone_); | |
+ }while(!_sqliteZone_); | |
+ if( !success ){ | |
+ /* somebody registered a zone first */ | |
+ malloc_destroy_zone(newzone); | |
+ } | |
+ } | |
+#endif | |
UNUSED_PARAMETER(NotUsed); | |
return SQLITE_OK; | |
} | |
@@ -16998,7 +17336,7 @@ | |
} | |
#endif | |
-#endif /* SQLITE_MUTEX_OMIT */ | |
+#endif /* !defined(SQLITE_MUTEX_OMIT) */ | |
/************** End of mutex.c ***********************************************/ | |
/************** Begin file mutex_noop.c **************************************/ | |
@@ -17205,8 +17543,8 @@ | |
SQLITE_PRIVATE sqlite3_mutex_methods const *sqlite3DefaultMutex(void){ | |
return sqlite3NoopMutex(); | |
} | |
-#endif /* SQLITE_MUTEX_NOOP */ | |
-#endif /* SQLITE_MUTEX_OMIT */ | |
+#endif /* defined(SQLITE_MUTEX_NOOP) */ | |
+#endif /* !defined(SQLITE_MUTEX_OMIT) */ | |
/************** End of mutex_noop.c ******************************************/ | |
/************** Begin file mutex_os2.c ***************************************/ | |
@@ -17835,7 +18173,7 @@ | |
return &sMutex; | |
} | |
-#endif /* SQLITE_MUTEX_PTHREAD */ | |
+#endif /* SQLITE_MUTEX_PTHREADS */ | |
/************** End of mutex_unix.c ******************************************/ | |
/************** Begin file mutex_w32.c ***************************************/ | |
@@ -18304,7 +18642,8 @@ | |
sqlite3_int64 priorLimit; | |
sqlite3_int64 excess; | |
#ifndef SQLITE_OMIT_AUTOINIT | |
- sqlite3_initialize(); | |
+ int rc = sqlite3_initialize(); | |
+ if( rc ) return -1; | |
#endif | |
sqlite3_mutex_enter(mem0.mutex); | |
priorLimit = mem0.alarmThreshold; | |
@@ -19089,7 +19428,7 @@ | |
/* | |
** Append N space characters to the given string buffer. | |
*/ | |
-static void appendSpace(StrAccum *pAccum, int N){ | |
+SQLITE_PRIVATE void sqlite3AppendSpace(StrAccum *pAccum, int N){ | |
static const char zSpaces[] = " "; | |
while( N>=(int)sizeof(zSpaces)-1 ){ | |
sqlite3StrAccumAppend(pAccum, zSpaces, sizeof(zSpaces)-1); | |
@@ -19617,7 +19956,7 @@ | |
register int nspace; | |
nspace = width-length; | |
if( nspace>0 ){ | |
- appendSpace(pAccum, nspace); | |
+ sqlite3AppendSpace(pAccum, nspace); | |
} | |
} | |
if( length>0 ){ | |
@@ -19627,7 +19966,7 @@ | |
register int nspace; | |
nspace = width-length; | |
if( nspace>0 ){ | |
- appendSpace(pAccum, nspace); | |
+ sqlite3AppendSpace(pAccum, nspace); | |
} | |
} | |
sqlite3_free(zExtra); | |
@@ -21802,18 +22141,17 @@ | |
** test.db-journal => test.nal | |
** test.db-wal => test.wal | |
** test.db-shm => test.shm | |
+** test.db-mj7f3319fa => test.9fa | |
*/ | |
SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){ | |
#if SQLITE_ENABLE_8_3_NAMES<2 | |
- const char *zOk; | |
- zOk = sqlite3_uri_parameter(zBaseFilename, "8_3_names"); | |
- if( zOk && sqlite3GetBoolean(zOk) ) | |
+ if( sqlite3_uri_boolean(zBaseFilename, "8_3_names", 0) ) | |
#endif | |
{ | |
int i, sz; | |
sz = sqlite3Strlen30(z); | |
for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){} | |
- if( z[i]=='.' && ALWAYS(sz>i+4) ) memcpy(&z[i+1], &z[sz-3], 4); | |
+ if( z[i]=='.' && ALWAYS(sz>i+4) ) memmove(&z[i+1], &z[sz-3], 4); | |
} | |
} | |
#endif | |
@@ -24519,6 +24857,7 @@ | |
#include <sys/mman.h> | |
#endif | |
+ | |
#if SQLITE_ENABLE_LOCKING_STYLE | |
# include <sys/ioctl.h> | |
# if OS_VXWORKS | |
@@ -24602,6 +24941,7 @@ | |
typedef struct unixFile unixFile; | |
struct unixFile { | |
sqlite3_io_methods const *pMethod; /* Always the first entry */ | |
+ sqlite3_vfs *pVfs; /* The VFS that created this unixFile */ | |
unixInodeInfo *pInode; /* Info about locks on this inode */ | |
int h; /* The file descriptor */ | |
unsigned char eFileLock; /* The type of lock held on this fd */ | |
@@ -24619,7 +24959,6 @@ | |
unsigned fsFlags; /* cached details from statfs() */ | |
#endif | |
#if OS_VXWORKS | |
- int isDelete; /* Delete on close if true */ | |
struct vxworksFileId *pId; /* Unique file ID */ | |
#endif | |
#ifndef NDEBUG | |
@@ -24653,6 +24992,10 @@ | |
#else | |
# define UNIXFILE_DIRSYNC 0x00 | |
#endif | |
+#define UNIXFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ | |
+#define UNIXFILE_DELETE 0x20 /* Delete on close */ | |
+#define UNIXFILE_URI 0x40 /* Filename might have query parameters */ | |
+#define UNIXFILE_NOLOCK 0x80 /* Do no file locking */ | |
/* | |
** Include code that is common to all os_*.c files | |
@@ -25011,6 +25354,12 @@ | |
{ "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 }, | |
#define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent) | |
+ { "mkdir", (sqlite3_syscall_ptr)mkdir, 0 }, | |
+#define osMkdir ((int(*)(const char*,mode_t))aSyscall[18].pCurrent) | |
+ | |
+ { "rmdir", (sqlite3_syscall_ptr)rmdir, 0 }, | |
+#define osRmdir ((int(*)(const char*))aSyscall[19].pCurrent) | |
+ | |
}; /* End of the overrideable system calls */ | |
/* | |
@@ -26360,7 +26709,7 @@ | |
} | |
#if OS_VXWORKS | |
if( pFile->pId ){ | |
- if( pFile->isDelete ){ | |
+ if( pFile->ctrlFlags & UNIXFILE_DELETE ){ | |
osUnlink(pFile->pId->zCanonicalName); | |
} | |
vxworksReleaseFileId(pFile->pId); | |
@@ -26449,8 +26798,8 @@ | |
************************* Begin dot-file Locking ****************************** | |
** | |
** The dotfile locking implementation uses the existance of separate lock | |
-** files in order to control access to the database. This works on just | |
-** about every filesystem imaginable. But there are serious downsides: | |
+** files (really a directory) to control access to the database. This works | |
+** on just about every filesystem imaginable. But there are serious downsides: | |
** | |
** (1) There is zero concurrency. A single reader blocks all other | |
** connections from reading or writing the database. | |
@@ -26461,15 +26810,15 @@ | |
** Nevertheless, a dotlock is an appropriate locking mode for use if no | |
** other locking strategy is available. | |
** | |
-** Dotfile locking works by creating a file in the same directory as the | |
-** database and with the same name but with a ".lock" extension added. | |
-** The existance of a lock file implies an EXCLUSIVE lock. All other lock | |
-** types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. | |
+** Dotfile locking works by creating a subdirectory in the same directory as | |
+** the database and with the same name but with a ".lock" extension added. | |
+** The existance of a lock directory implies an EXCLUSIVE lock. All other | |
+** lock types (SHARED, RESERVED, PENDING) are mapped into EXCLUSIVE. | |
*/ | |
/* | |
** The file suffix added to the data base filename in order to create the | |
-** lock file. | |
+** lock directory. | |
*/ | |
#define DOTLOCK_SUFFIX ".lock" | |
@@ -26536,7 +26885,6 @@ | |
*/ | |
static int dotlockLock(sqlite3_file *id, int eFileLock) { | |
unixFile *pFile = (unixFile*)id; | |
- int fd; | |
char *zLockFile = (char *)pFile->lockingContext; | |
int rc = SQLITE_OK; | |
@@ -26556,9 +26904,9 @@ | |
} | |
/* grab an exclusive lock */ | |
- fd = robust_open(zLockFile,O_RDONLY|O_CREAT|O_EXCL,0600); | |
- if( fd<0 ){ | |
- /* failed to open/create the file, someone else may have stolen the lock */ | |
+ rc = osMkdir(zLockFile, 0777); | |
+ if( rc<0 ){ | |
+ /* failed to open/create the lock directory */ | |
int tErrno = errno; | |
if( EEXIST == tErrno ){ | |
rc = SQLITE_BUSY; | |
@@ -26570,7 +26918,6 @@ | |
} | |
return rc; | |
} | |
- robust_close(pFile, fd, __LINE__); | |
/* got it, set the type and return ok */ | |
pFile->eFileLock = eFileLock; | |
@@ -26589,6 +26936,7 @@ | |
static int dotlockUnlock(sqlite3_file *id, int eFileLock) { | |
unixFile *pFile = (unixFile*)id; | |
char *zLockFile = (char *)pFile->lockingContext; | |
+ int rc; | |
assert( pFile ); | |
OSTRACE(("UNLOCK %d %d was %d pid=%d (dotlock)\n", pFile->h, eFileLock, | |
@@ -26610,9 +26958,11 @@ | |
/* To fully unlock the database, delete the lock file */ | |
assert( eFileLock==NO_LOCK ); | |
- if( osUnlink(zLockFile) ){ | |
- int rc = 0; | |
+ rc = osRmdir(zLockFile); | |
+ if( rc<0 && errno==ENOTDIR ) rc = osUnlink(zLockFile); | |
+ if( rc<0 ){ | |
int tErrno = errno; | |
+ rc = 0; | |
if( ENOENT != tErrno ){ | |
rc = SQLITE_IOERR_UNLOCK; | |
} | |
@@ -27548,35 +27898,48 @@ | |
*/ | |
static int seekAndRead(unixFile *id, sqlite3_int64 offset, void *pBuf, int cnt){ | |
int got; | |
+ int prior = 0; | |
#if (!defined(USE_PREAD) && !defined(USE_PREAD64)) | |
i64 newOffset; | |
#endif | |
TIMER_START; | |
+ do{ | |
#if defined(USE_PREAD) | |
- do{ got = osPread(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR ); | |
- SimulateIOError( got = -1 ); | |
+ got = osPread(id->h, pBuf, cnt, offset); | |
+ SimulateIOError( got = -1 ); | |
#elif defined(USE_PREAD64) | |
- do{ got = osPread64(id->h, pBuf, cnt, offset); }while( got<0 && errno==EINTR); | |
- SimulateIOError( got = -1 ); | |
+ got = osPread64(id->h, pBuf, cnt, offset); | |
+ SimulateIOError( got = -1 ); | |
#else | |
- newOffset = lseek(id->h, offset, SEEK_SET); | |
- SimulateIOError( newOffset-- ); | |
- if( newOffset!=offset ){ | |
- if( newOffset == -1 ){ | |
- ((unixFile*)id)->lastErrno = errno; | |
- }else{ | |
- ((unixFile*)id)->lastErrno = 0; | |
+ newOffset = lseek(id->h, offset, SEEK_SET); | |
+ SimulateIOError( newOffset-- ); | |
+ if( newOffset!=offset ){ | |
+ if( newOffset == -1 ){ | |
+ ((unixFile*)id)->lastErrno = errno; | |
+ }else{ | |
+ ((unixFile*)id)->lastErrno = 0; | |
+ } | |
+ return -1; | |
} | |
- return -1; | |
- } | |
- do{ got = osRead(id->h, pBuf, cnt); }while( got<0 && errno==EINTR ); | |
+ got = osRead(id->h, pBuf, cnt); | |
#endif | |
+ if( got==cnt ) break; | |
+ if( got<0 ){ | |
+ if( errno==EINTR ){ got = 1; continue; } | |
+ prior = 0; | |
+ ((unixFile*)id)->lastErrno = errno; | |
+ break; | |
+ }else if( got>0 ){ | |
+ cnt -= got; | |
+ offset += got; | |
+ prior += got; | |
+ pBuf = (void*)(got + (char*)pBuf); | |
+ } | |
+ }while( got>0 ); | |
TIMER_END; | |
- if( got<0 ){ | |
- ((unixFile*)id)->lastErrno = errno; | |
- } | |
- OSTRACE(("READ %-3d %5d %7lld %llu\n", id->h, got, offset, TIMER_ELAPSED)); | |
- return got; | |
+ OSTRACE(("READ %-3d %5d %7lld %llu\n", | |
+ id->h, got+prior, offset-prior, TIMER_ELAPSED)); | |
+ return got+prior; | |
} | |
/* | |
@@ -28082,6 +28445,22 @@ | |
} | |
/* | |
+** If *pArg is inititially negative then this is a query. Set *pArg to | |
+** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. | |
+** | |
+** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. | |
+*/ | |
+static void unixModeBit(unixFile *pFile, unsigned char mask, int *pArg){ | |
+ if( *pArg<0 ){ | |
+ *pArg = (pFile->ctrlFlags & mask)!=0; | |
+ }else if( (*pArg)==0 ){ | |
+ pFile->ctrlFlags &= ~mask; | |
+ }else{ | |
+ pFile->ctrlFlags |= mask; | |
+ } | |
+} | |
+ | |
+/* | |
** Information and control of an open file handle. | |
*/ | |
static int unixFileControl(sqlite3_file *id, int op, void *pArg){ | |
@@ -28107,14 +28486,15 @@ | |
return rc; | |
} | |
case SQLITE_FCNTL_PERSIST_WAL: { | |
- int bPersist = *(int*)pArg; | |
- if( bPersist<0 ){ | |
- *(int*)pArg = (pFile->ctrlFlags & UNIXFILE_PERSIST_WAL)!=0; | |
- }else if( bPersist==0 ){ | |
- pFile->ctrlFlags &= ~UNIXFILE_PERSIST_WAL; | |
- }else{ | |
- pFile->ctrlFlags |= UNIXFILE_PERSIST_WAL; | |
- } | |
+ unixModeBit(pFile, UNIXFILE_PERSIST_WAL, (int*)pArg); | |
+ return SQLITE_OK; | |
+ } | |
+ case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { | |
+ unixModeBit(pFile, UNIXFILE_PSOW, (int*)pArg); | |
+ return SQLITE_OK; | |
+ } | |
+ case SQLITE_FCNTL_VFSNAME: { | |
+ *(char**)pArg = sqlite3_mprintf("%s", pFile->pVfs->zName); | |
return SQLITE_OK; | |
} | |
#ifndef NDEBUG | |
@@ -28134,9 +28514,6 @@ | |
return proxyFileControl(id,op,pArg); | |
} | |
#endif /* SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) */ | |
- case SQLITE_FCNTL_SYNC_OMITTED: { | |
- return SQLITE_OK; /* A no-op */ | |
- } | |
} | |
return SQLITE_NOTFOUND; | |
} | |
@@ -28151,17 +28528,31 @@ | |
** a database and its journal file) that the sector size will be the | |
** same for both. | |
*/ | |
-static int unixSectorSize(sqlite3_file *NotUsed){ | |
- UNUSED_PARAMETER(NotUsed); | |
+static int unixSectorSize(sqlite3_file *pFile){ | |
+ (void)pFile; | |
return SQLITE_DEFAULT_SECTOR_SIZE; | |
} | |
/* | |
-** Return the device characteristics for the file. This is always 0 for unix. | |
-*/ | |
-static int unixDeviceCharacteristics(sqlite3_file *NotUsed){ | |
- UNUSED_PARAMETER(NotUsed); | |
- return 0; | |
+** Return the device characteristics for the file. | |
+** | |
+** This VFS is set up to return SQLITE_IOCAP_POWERSAFE_OVERWRITE by default. | |
+** However, that choice is contraversial since technically the underlying | |
+** file system does not always provide powersafe overwrites. (In other | |
+** words, after a power-loss event, parts of the file that were never | |
+** written might end up being altered.) However, non-PSOW behavior is very, | |
+** very rare. And asserting PSOW makes a large reduction in the amount | |
+** of required I/O for journaling, since a lot of padding is eliminated. | |
+** Hence, while POWERSAFE_OVERWRITE is on by default, there is a file-control | |
+** available to turn it off and URI query parameter available to turn it off. | |
+*/ | |
+static int unixDeviceCharacteristics(sqlite3_file *id){ | |
+ unixFile *p = (unixFile*)id; | |
+ if( p->ctrlFlags & UNIXFILE_PSOW ){ | |
+ return SQLITE_IOCAP_POWERSAFE_OVERWRITE; | |
+ }else{ | |
+ return 0; | |
+ } | |
} | |
#ifndef SQLITE_OMIT_WAL | |
@@ -28416,16 +28807,16 @@ | |
} | |
#ifdef SQLITE_SHM_DIRECTORY | |
- nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 30; | |
+ nShmFilename = sizeof(SQLITE_SHM_DIRECTORY) + 31; | |
#else | |
- nShmFilename = 5 + (int)strlen(pDbFd->zPath); | |
+ nShmFilename = 6 + (int)strlen(pDbFd->zPath); | |
#endif | |
pShmNode = sqlite3_malloc( sizeof(*pShmNode) + nShmFilename ); | |
if( pShmNode==0 ){ | |
rc = SQLITE_NOMEM; | |
goto shm_open_err; | |
} | |
- memset(pShmNode, 0, sizeof(*pShmNode)); | |
+ memset(pShmNode, 0, sizeof(*pShmNode)+nShmFilename); | |
zShmFilename = pShmNode->zFilename = (char*)&pShmNode[1]; | |
#ifdef SQLITE_SHM_DIRECTORY | |
sqlite3_snprintf(nShmFilename, zShmFilename, | |
@@ -28445,10 +28836,8 @@ | |
} | |
if( pInode->bProcessLock==0 ){ | |
- const char *zRO; | |
int openFlags = O_RDWR | O_CREAT; | |
- zRO = sqlite3_uri_parameter(pDbFd->zPath, "readonly_shm"); | |
- if( zRO && sqlite3GetBoolean(zRO) ){ | |
+ if( sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0) ){ | |
openFlags = O_RDONLY; | |
pShmNode->isReadonly = 1; | |
} | |
@@ -29110,12 +29499,9 @@ | |
static int fillInUnixFile( | |
sqlite3_vfs *pVfs, /* Pointer to vfs object */ | |
int h, /* Open file descriptor of file being opened */ | |
- int syncDir, /* True to sync directory on first sync */ | |
sqlite3_file *pId, /* Write to the unixFile structure here */ | |
const char *zFilename, /* Name of the file being opened */ | |
- int noLock, /* Omit locking if true */ | |
- int isDelete, /* Delete on close if true */ | |
- int isReadOnly /* True if the file is opened read-only */ | |
+ int ctrlFlags /* Zero or more UNIXFILE_* values */ | |
){ | |
const sqlite3_io_methods *pLockingStyle; | |
unixFile *pNew = (unixFile *)pId; | |
@@ -29123,11 +29509,6 @@ | |
assert( pNew->pInode==NULL ); | |
- /* Parameter isDelete is only used on vxworks. Express this explicitly | |
- ** here to prevent compiler warnings about unused parameters. | |
- */ | |
- UNUSED_PARAMETER(isDelete); | |
- | |
/* Usually the path zFilename should not be a relative pathname. The | |
** exception is when opening the proxy "conch" file in builds that | |
** include the special Apple locking styles. | |
@@ -29140,32 +29521,30 @@ | |
#endif | |
/* No locking occurs in temporary files */ | |
- assert( zFilename!=0 || noLock ); | |
+ assert( zFilename!=0 || (ctrlFlags & UNIXFILE_NOLOCK)!=0 ); | |
OSTRACE(("OPEN %-3d %s\n", h, zFilename)); | |
pNew->h = h; | |
+ pNew->pVfs = pVfs; | |
pNew->zPath = zFilename; | |
- if( memcmp(pVfs->zName,"unix-excl",10)==0 ){ | |
- pNew->ctrlFlags = UNIXFILE_EXCL; | |
- }else{ | |
- pNew->ctrlFlags = 0; | |
+ pNew->ctrlFlags = (u8)ctrlFlags; | |
+ if( sqlite3_uri_boolean(((ctrlFlags & UNIXFILE_URI) ? zFilename : 0), | |
+ "psow", SQLITE_POWERSAFE_OVERWRITE) ){ | |
+ pNew->ctrlFlags |= UNIXFILE_PSOW; | |
} | |
- if( isReadOnly ){ | |
- pNew->ctrlFlags |= UNIXFILE_RDONLY; | |
- } | |
- if( syncDir ){ | |
- pNew->ctrlFlags |= UNIXFILE_DIRSYNC; | |
+ if( memcmp(pVfs->zName,"unix-excl",10)==0 ){ | |
+ pNew->ctrlFlags |= UNIXFILE_EXCL; | |
} | |
#if OS_VXWORKS | |
pNew->pId = vxworksFindFileId(zFilename); | |
if( pNew->pId==0 ){ | |
- noLock = 1; | |
+ ctrlFlags |= UNIXFILE_NOLOCK; | |
rc = SQLITE_NOMEM; | |
} | |
#endif | |
- if( noLock ){ | |
+ if( ctrlFlags & UNIXFILE_NOLOCK ){ | |
pLockingStyle = &nolockIoMethods; | |
}else{ | |
pLockingStyle = (**(finder_type*)pVfs->pAppData)(zFilename, pNew); | |
@@ -29286,7 +29665,7 @@ | |
osUnlink(zFilename); | |
isDelete = 0; | |
} | |
- pNew->isDelete = isDelete; | |
+ if( isDelete ) pNew->ctrlFlags |= UNIXFILE_DELETE; | |
#endif | |
if( rc!=SQLITE_OK ){ | |
if( h>=0 ) robust_close(pNew, h, __LINE__); | |
@@ -29351,18 +29730,19 @@ | |
/* Check that the output buffer is large enough for the temporary file | |
** name. If it is not, return SQLITE_ERROR. | |
*/ | |
- if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 17) >= (size_t)nBuf ){ | |
+ if( (strlen(zDir) + strlen(SQLITE_TEMP_FILE_PREFIX) + 18) >= (size_t)nBuf ){ | |
return SQLITE_ERROR; | |
} | |
do{ | |
- sqlite3_snprintf(nBuf-17, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); | |
+ sqlite3_snprintf(nBuf-18, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX, zDir); | |
j = (int)strlen(zBuf); | |
sqlite3_randomness(15, &zBuf[j]); | |
for(i=0; i<15; i++, j++){ | |
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; | |
} | |
zBuf[j] = 0; | |
+ zBuf[j+1] = 0; | |
}while( osAccess(zBuf,0)==0 ); | |
return SQLITE_OK; | |
} | |
@@ -29483,7 +29863,7 @@ | |
*/ | |
nDb = sqlite3Strlen30(zPath) - 1; | |
#ifdef SQLITE_ENABLE_8_3_NAMES | |
- while( nDb>0 && !sqlite3Isalnum(zPath[nDb]) ) nDb--; | |
+ while( nDb>0 && sqlite3Isalnum(zPath[nDb]) ) nDb--; | |
if( nDb==0 || zPath[nDb]!='-' ) return SQLITE_OK; | |
#else | |
while( zPath[nDb]!='-' ){ | |
@@ -29541,6 +29921,7 @@ | |
int eType = flags&0xFFFFFF00; /* Type of file to open */ | |
int noLock; /* True to omit locking primitives */ | |
int rc = SQLITE_OK; /* Function Return Code */ | |
+ int ctrlFlags = 0; /* UNIXFILE_* flags */ | |
int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); | |
int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); | |
@@ -29567,7 +29948,7 @@ | |
/* If argument zPath is a NULL pointer, this function is required to open | |
** a temporary file. Use this buffer to store the file name in. | |
*/ | |
- char zTmpname[MAX_PATHNAME+1]; | |
+ char zTmpname[MAX_PATHNAME+2]; | |
const char *zName = zPath; | |
/* Check the following statements are true: | |
@@ -29610,14 +29991,24 @@ | |
} | |
} | |
p->pUnused = pUnused; | |
+ | |
+ /* Database filenames are double-zero terminated if they are not | |
+ ** URIs with parameters. Hence, they can always be passed into | |
+ ** sqlite3_uri_parameter(). */ | |
+ assert( (flags & SQLITE_OPEN_URI) || zName[strlen(zName)+1]==0 ); | |
+ | |
}else if( !zName ){ | |
/* If zName is NULL, the upper layer is requesting a temp file. */ | |
assert(isDelete && !syncDir); | |
- rc = unixGetTempname(MAX_PATHNAME+1, zTmpname); | |
+ rc = unixGetTempname(MAX_PATHNAME+2, zTmpname); | |
if( rc!=SQLITE_OK ){ | |
return rc; | |
} | |
zName = zTmpname; | |
+ | |
+ /* Generated temporary filenames are always double-zero terminated | |
+ ** for use by sqlite3_uri_parameter(). */ | |
+ assert( zName[strlen(zName)+1]==0 ); | |
} | |
/* Determine the value of the flags parameter passed to POSIX function | |
@@ -29694,7 +30085,14 @@ | |
((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS; | |
} | |
#endif | |
- | |
+ | |
+ /* Set up appropriate ctrlFlags */ | |
+ if( isDelete ) ctrlFlags |= UNIXFILE_DELETE; | |
+ if( isReadonly ) ctrlFlags |= UNIXFILE_RDONLY; | |
+ if( noLock ) ctrlFlags |= UNIXFILE_NOLOCK; | |
+ if( syncDir ) ctrlFlags |= UNIXFILE_DIRSYNC; | |
+ if( flags & SQLITE_OPEN_URI ) ctrlFlags |= UNIXFILE_URI; | |
+ | |
#if SQLITE_ENABLE_LOCKING_STYLE | |
#if SQLITE_PREFER_PROXY_LOCKING | |
isAutoProxy = 1; | |
@@ -29724,8 +30122,7 @@ | |
useProxy = !(fsInfo.f_flags&MNT_LOCAL); | |
} | |
if( useProxy ){ | |
- rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, | |
- isDelete, isReadonly); | |
+ rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); | |
if( rc==SQLITE_OK ){ | |
rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:"); | |
if( rc!=SQLITE_OK ){ | |
@@ -29742,8 +30139,8 @@ | |
} | |
#endif | |
- rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock, | |
- isDelete, isReadonly); | |
+ rc = fillInUnixFile(pVfs, fd, pFile, zPath, ctrlFlags); | |
+ | |
open_finished: | |
if( rc!=SQLITE_OK ){ | |
sqlite3_free(p->pUnused); | |
@@ -29768,7 +30165,7 @@ | |
return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath); | |
} | |
#ifndef SQLITE_DISABLE_DIRSYNC | |
- if( dirSync ){ | |
+ if( (dirSync & 1)!=0 ){ | |
int fd; | |
rc = osOpenDirectory(zPath, &fd); | |
if( rc==SQLITE_OK ){ | |
@@ -30319,7 +30716,7 @@ | |
if( i-start>2 || (i-start==1 && buf[start] != '.' && buf[start] != '/') | |
|| (i-start==2 && buf[start] != '.' && buf[start+1] != '.') ){ | |
buf[i]='\0'; | |
- if( mkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ | |
+ if( osMkdir(buf, SQLITE_DEFAULT_PROXYDIR_PERMISSIONS) ){ | |
int err=errno; | |
if( err!=EEXIST ) { | |
OSTRACE(("CREATELOCKPATH FAILED creating %s, " | |
@@ -30414,7 +30811,7 @@ | |
pUnused->flags = openFlags; | |
pNew->pUnused = pUnused; | |
- rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0); | |
+ rc = fillInUnixFile(&dummyVfs, fd, (sqlite3_file*)pNew, path, 0); | |
if( rc==SQLITE_OK ){ | |
*ppFile = pNew; | |
return SQLITE_OK; | |
@@ -31355,7 +31752,7 @@ | |
/* Double-check that the aSyscall[] array has been constructed | |
** correctly. See ticket [bb3a86e890c8e96ab] */ | |
- assert( ArraySize(aSyscall)==18 ); | |
+ assert( ArraySize(aSyscall)==20 ); | |
/* Register all VFSes defined in the aVfs[] array */ | |
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){ | |
@@ -31391,51 +31788,15 @@ | |
** | |
****************************************************************************** | |
** | |
-** This file contains code that is specific to windows. | |
-*/ | |
-#if SQLITE_OS_WIN /* This file is used for windows only */ | |
- | |
- | |
-/* | |
-** A Note About Memory Allocation: | |
-** | |
-** This driver uses malloc()/free() directly rather than going through | |
-** the SQLite-wrappers sqlite3_malloc()/sqlite3_free(). Those wrappers | |
-** are designed for use on embedded systems where memory is scarce and | |
-** malloc failures happen frequently. Win32 does not typically run on | |
-** embedded systems, and when it does the developers normally have bigger | |
-** problems to worry about than running out of memory. So there is not | |
-** a compelling need to use the wrappers. | |
-** | |
-** But there is a good reason to not use the wrappers. If we use the | |
-** wrappers then we will get simulated malloc() failures within this | |
-** driver. And that causes all kinds of problems for our tests. We | |
-** could enhance SQLite to deal with simulated malloc failures within | |
-** the OS driver, but the code to deal with those failure would not | |
-** be exercised on Linux (which does not need to malloc() in the driver) | |
-** and so we would have difficulty writing coverage tests for that | |
-** code. Better to leave the code out, we think. | |
-** | |
-** The point of this discussion is as follows: When creating a new | |
-** OS layer for an embedded system, if you use this file as an example, | |
-** avoid the use of malloc()/free(). Those routines work ok on windows | |
-** desktops but not so well in embedded systems. | |
+** This file contains code that is specific to Windows. | |
*/ | |
- | |
-#include <winbase.h> | |
+#if SQLITE_OS_WIN /* This file is used for Windows only */ | |
#ifdef __CYGWIN__ | |
# include <sys/cygwin.h> | |
#endif | |
/* | |
-** Macros used to determine whether or not to use threads. | |
-*/ | |
-#if defined(THREADSAFE) && THREADSAFE | |
-# define SQLITE_W32_THREADS 1 | |
-#endif | |
- | |
-/* | |
** Include code that is common to all os_*.c files | |
*/ | |
/************** Include os_common.h in the middle of os_win.c ****************/ | |
@@ -31649,21 +32010,12 @@ | |
/************** Continuing where we left off in os_win.c *********************/ | |
/* | |
-** Some microsoft compilers lack this definition. | |
+** Some Microsoft compilers lack this definition. | |
*/ | |
#ifndef INVALID_FILE_ATTRIBUTES | |
# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) | |
#endif | |
-/* | |
-** Determine if we are dealing with WindowsCE - which has a much | |
-** reduced API. | |
-*/ | |
-#if SQLITE_OS_WINCE | |
-# define AreFileApisANSI() 1 | |
-# define FormatMessageW(a,b,c,d,e,f,g) 0 | |
-#endif | |
- | |
/* Forward references */ | |
typedef struct winShm winShm; /* A connection to shared-memory */ | |
typedef struct winShmNode winShmNode; /* A region of shared-memory */ | |
@@ -31692,14 +32044,13 @@ | |
HANDLE h; /* Handle for accessing the file */ | |
u8 locktype; /* Type of lock currently held on this file */ | |
short sharedLockByte; /* Randomly chosen byte used as a shared lock */ | |
- u8 bPersistWal; /* True to persist WAL files */ | |
+ u8 ctrlFlags; /* Flags. See WINFILE_* below */ | |
DWORD lastErrno; /* The Windows errno from the last I/O error */ | |
- DWORD sectorSize; /* Sector size of the device file is on */ | |
winShm *pShm; /* Instance of shared memory on this file */ | |
const char *zPath; /* Full pathname of this file */ | |
int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */ | |
#if SQLITE_OS_WINCE | |
- WCHAR *zDeleteOnClose; /* Name of file to delete when closing */ | |
+ LPWSTR zDeleteOnClose; /* Name of file to delete when closing */ | |
HANDLE hMutex; /* Mutex used to control access to shared lock */ | |
HANDLE hShared; /* Shared memory segment used for locking */ | |
winceLock local; /* Locks obtained by this instance of winFile */ | |
@@ -31708,6 +32059,12 @@ | |
}; | |
/* | |
+** Allowed values for winFile.ctrlFlags | |
+*/ | |
+#define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ | |
+#define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ | |
+ | |
+/* | |
* If compiled with SQLITE_WIN32_MALLOC on Windows, we will use the | |
* various Win32 API heap functions instead of our own. | |
*/ | |
@@ -31779,20 +32136,12 @@ | |
#endif /* SQLITE_WIN32_MALLOC */ | |
/* | |
-** Forward prototypes. | |
-*/ | |
-static int getSectorSize( | |
- sqlite3_vfs *pVfs, | |
- const char *zRelative /* UTF-8 file name */ | |
-); | |
- | |
-/* | |
** The following variable is (normally) set once and never changes | |
-** thereafter. It records whether the operating system is Win95 | |
+** thereafter. It records whether the operating system is Win9x | |
** or WinNT. | |
** | |
** 0: Operating system unknown. | |
-** 1: Operating system is Win95. | |
+** 1: Operating system is Win9x. | |
** 2: Operating system is WinNT. | |
** | |
** In order to facilitate testing on a WinNT system, the test fixture | |
@@ -31805,338 +32154,883 @@ | |
#endif | |
/* | |
-** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, | |
-** or WinCE. Return false (zero) for Win95, Win98, or WinME. | |
-** | |
-** Here is an interesting observation: Win95, Win98, and WinME lack | |
-** the LockFileEx() API. But we can still statically link against that | |
-** API as long as we don't call it when running Win95/98/ME. A call to | |
-** this routine is used to determine if the host is Win95/98/ME or | |
-** WinNT/2K/XP so that we will know whether or not we can safely call | |
-** the LockFileEx() API. | |
+** Many system calls are accessed through pointer-to-functions so that | |
+** they may be overridden at runtime to facilitate fault injection during | |
+** testing and sandboxing. The following array holds the names and pointers | |
+** to all overrideable system calls. | |
*/ | |
-#if SQLITE_OS_WINCE | |
-# define isNT() (1) | |
-#else | |
- static int isNT(void){ | |
- if( sqlite3_os_type==0 ){ | |
- OSVERSIONINFO sInfo; | |
- sInfo.dwOSVersionInfoSize = sizeof(sInfo); | |
- GetVersionEx(&sInfo); | |
- sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; | |
- } | |
- return sqlite3_os_type==2; | |
- } | |
-#endif /* SQLITE_OS_WINCE */ | |
+#if !SQLITE_OS_WINCE | |
+# define SQLITE_WIN32_HAS_ANSI | |
+#endif | |
-#ifdef SQLITE_WIN32_MALLOC | |
-/* | |
-** Allocate nBytes of memory. | |
-*/ | |
-static void *winMemMalloc(int nBytes){ | |
- HANDLE hHeap; | |
- void *p; | |
+#if SQLITE_OS_WINCE || SQLITE_OS_WINNT | |
+# define SQLITE_WIN32_HAS_WIDE | |
+#endif | |
- winMemAssertMagic(); | |
- hHeap = winMemGetHeap(); | |
- assert( hHeap!=0 ); | |
- assert( hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#ifndef SYSCALL | |
+# define SYSCALL sqlite3_syscall_ptr | |
#endif | |
- assert( nBytes>=0 ); | |
- p = HeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); | |
- if( !p ){ | |
- sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%d), heap=%p", | |
- nBytes, GetLastError(), (void*)hHeap); | |
- } | |
- return p; | |
-} | |
+#if SQLITE_OS_WINCE | |
/* | |
-** Free memory. | |
-*/ | |
-static void winMemFree(void *pPrior){ | |
- HANDLE hHeap; | |
+** These macros are necessary because Windows CE does not natively support the | |
+** Win32 APIs LockFile, UnlockFile, and LockFileEx. | |
+ */ | |
- winMemAssertMagic(); | |
- hHeap = winMemGetHeap(); | |
- assert( hHeap!=0 ); | |
- assert( hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); | |
-#endif | |
- if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */ | |
- if( !HeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){ | |
- sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%d), heap=%p", | |
- pPrior, GetLastError(), (void*)hHeap); | |
- } | |
-} | |
+# define LockFile(a,b,c,d,e) winceLockFile(&a, b, c, d, e) | |
+# define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e) | |
+# define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f) | |
/* | |
-** Change the size of an existing memory allocation | |
-*/ | |
-static void *winMemRealloc(void *pPrior, int nBytes){ | |
- HANDLE hHeap; | |
- void *p; | |
+** These are the special syscall hacks for Windows CE. The locking related | |
+** defines here refer to the macros defined just above. | |
+ */ | |
- winMemAssertMagic(); | |
- hHeap = winMemGetHeap(); | |
- assert( hHeap!=0 ); | |
- assert( hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); | |
+# define osAreFileApisANSI() 1 | |
+# define osLockFile LockFile | |
+# define osUnlockFile UnlockFile | |
+# define osLockFileEx LockFileEx | |
#endif | |
- assert( nBytes>=0 ); | |
- if( !pPrior ){ | |
- p = HeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); | |
- }else{ | |
- p = HeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes); | |
- } | |
- if( !p ){ | |
- sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%d), heap=%p", | |
- pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, GetLastError(), | |
- (void*)hHeap); | |
- } | |
- return p; | |
-} | |
-/* | |
-** Return the size of an outstanding allocation, in bytes. | |
-*/ | |
-static int winMemSize(void *p){ | |
- HANDLE hHeap; | |
- SIZE_T n; | |
+static struct win_syscall { | |
+ const char *zName; /* Name of the sytem call */ | |
+ sqlite3_syscall_ptr pCurrent; /* Current value of the system call */ | |
+ sqlite3_syscall_ptr pDefault; /* Default value */ | |
+} aSyscall[] = { | |
+#if !SQLITE_OS_WINCE | |
+ { "AreFileApisANSI", (SYSCALL)AreFileApisANSI, 0 }, | |
- winMemAssertMagic(); | |
- hHeap = winMemGetHeap(); | |
- assert( hHeap!=0 ); | |
- assert( hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert ( HeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#define osAreFileApisANSI ((BOOL(WINAPI*)(VOID))aSyscall[0].pCurrent) | |
+#else | |
+ { "AreFileApisANSI", (SYSCALL)0, 0 }, | |
#endif | |
- if( !p ) return 0; | |
- n = HeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p); | |
- if( n==(SIZE_T)-1 ){ | |
- sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%d), heap=%p", | |
- p, GetLastError(), (void*)hHeap); | |
- return 0; | |
- } | |
- return (int)n; | |
-} | |
-/* | |
-** Round up a request size to the next valid allocation size. | |
-*/ | |
-static int winMemRoundup(int n){ | |
- return n; | |
-} | |
+#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "CharLowerW", (SYSCALL)CharLowerW, 0 }, | |
+#else | |
+ { "CharLowerW", (SYSCALL)0, 0 }, | |
+#endif | |
-/* | |
-** Initialize this module. | |
-*/ | |
-static int winMemInit(void *pAppData){ | |
- winMemData *pWinMemData = (winMemData *)pAppData; | |
+#define osCharLowerW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[1].pCurrent) | |
- if( !pWinMemData ) return SQLITE_ERROR; | |
- assert( pWinMemData->magic==WINMEM_MAGIC ); | |
- if( !pWinMemData->hHeap ){ | |
- pWinMemData->hHeap = HeapCreate(SQLITE_WIN32_HEAP_FLAGS, | |
- SQLITE_WIN32_HEAP_INIT_SIZE, | |
- SQLITE_WIN32_HEAP_MAX_SIZE); | |
- if( !pWinMemData->hHeap ){ | |
- sqlite3_log(SQLITE_NOMEM, | |
- "failed to HeapCreate (%d), flags=%u, initSize=%u, maxSize=%u", | |
- GetLastError(), SQLITE_WIN32_HEAP_FLAGS, SQLITE_WIN32_HEAP_INIT_SIZE, | |
- SQLITE_WIN32_HEAP_MAX_SIZE); | |
- return SQLITE_NOMEM; | |
- } | |
- pWinMemData->bOwned = TRUE; | |
- } | |
- assert( pWinMemData->hHeap!=0 ); | |
- assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert( HeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#if SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "CharUpperW", (SYSCALL)CharUpperW, 0 }, | |
+#else | |
+ { "CharUpperW", (SYSCALL)0, 0 }, | |
#endif | |
- return SQLITE_OK; | |
-} | |
-/* | |
-** Deinitialize this module. | |
-*/ | |
-static void winMemShutdown(void *pAppData){ | |
- winMemData *pWinMemData = (winMemData *)pAppData; | |
+#define osCharUpperW ((LPWSTR(WINAPI*)(LPWSTR))aSyscall[2].pCurrent) | |
- if( !pWinMemData ) return; | |
- if( pWinMemData->hHeap ){ | |
- assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); | |
-#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
- assert( HeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+ { "CloseHandle", (SYSCALL)CloseHandle, 0 }, | |
+ | |
+#define osCloseHandle ((BOOL(WINAPI*)(HANDLE))aSyscall[3].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "CreateFileA", (SYSCALL)CreateFileA, 0 }, | |
+#else | |
+ { "CreateFileA", (SYSCALL)0, 0 }, | |
#endif | |
- if( pWinMemData->bOwned ){ | |
- if( !HeapDestroy(pWinMemData->hHeap) ){ | |
- sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%d), heap=%p", | |
- GetLastError(), (void*)pWinMemData->hHeap); | |
- } | |
- pWinMemData->bOwned = FALSE; | |
- } | |
- pWinMemData->hHeap = NULL; | |
- } | |
-} | |
-/* | |
-** Populate the low-level memory allocation function pointers in | |
-** sqlite3GlobalConfig.m with pointers to the routines in this file. The | |
-** arguments specify the block of memory to manage. | |
-** | |
-** This routine is only called by sqlite3_config(), and therefore | |
-** is not required to be threadsafe (it is not). | |
-*/ | |
-SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){ | |
- static const sqlite3_mem_methods winMemMethods = { | |
- winMemMalloc, | |
- winMemFree, | |
- winMemRealloc, | |
- winMemSize, | |
- winMemRoundup, | |
- winMemInit, | |
- winMemShutdown, | |
- &win_mem_data | |
- }; | |
- return &winMemMethods; | |
-} | |
+#define osCreateFileA ((HANDLE(WINAPI*)(LPCSTR,DWORD,DWORD, \ | |
+ LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[4].pCurrent) | |
-SQLITE_PRIVATE void sqlite3MemSetDefault(void){ | |
- sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); | |
-} | |
-#endif /* SQLITE_WIN32_MALLOC */ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "CreateFileW", (SYSCALL)CreateFileW, 0 }, | |
+#else | |
+ { "CreateFileW", (SYSCALL)0, 0 }, | |
+#endif | |
-/* | |
-** Convert a UTF-8 string to microsoft unicode (UTF-16?). | |
-** | |
-** Space to hold the returned string is obtained from malloc. | |
-*/ | |
-static WCHAR *utf8ToUnicode(const char *zFilename){ | |
- int nChar; | |
- WCHAR *zWideFilename; | |
+#define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ | |
+ LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) | |
- nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); | |
- zWideFilename = malloc( nChar*sizeof(zWideFilename[0]) ); | |
- if( zWideFilename==0 ){ | |
- return 0; | |
- } | |
- nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar); | |
- if( nChar==0 ){ | |
- free(zWideFilename); | |
- zWideFilename = 0; | |
- } | |
- return zWideFilename; | |
-} | |
+ { "CreateFileMapping", (SYSCALL)CreateFileMapping, 0 }, | |
-/* | |
-** Convert microsoft unicode to UTF-8. Space to hold the returned string is | |
-** obtained from malloc(). | |
-*/ | |
-static char *unicodeToUtf8(const WCHAR *zWideFilename){ | |
- int nByte; | |
- char *zFilename; | |
+#define osCreateFileMapping ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ | |
+ DWORD,DWORD,DWORD,LPCTSTR))aSyscall[6].pCurrent) | |
- nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); | |
- zFilename = malloc( nByte ); | |
- if( zFilename==0 ){ | |
- return 0; | |
- } | |
- nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, | |
- 0, 0); | |
- if( nByte == 0 ){ | |
- free(zFilename); | |
- zFilename = 0; | |
- } | |
- return zFilename; | |
-} | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "CreateFileMappingW", (SYSCALL)CreateFileMappingW, 0 }, | |
+#else | |
+ { "CreateFileMappingW", (SYSCALL)0, 0 }, | |
+#endif | |
-/* | |
-** Convert an ansi string to microsoft unicode, based on the | |
-** current codepage settings for file apis. | |
-** | |
-** Space to hold the returned string is obtained | |
-** from malloc. | |
-*/ | |
-static WCHAR *mbcsToUnicode(const char *zFilename){ | |
- int nByte; | |
- WCHAR *zMbcsFilename; | |
- int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; | |
+#define osCreateFileMappingW ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ | |
+ DWORD,DWORD,DWORD,LPCWSTR))aSyscall[7].pCurrent) | |
- nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); | |
- zMbcsFilename = malloc( nByte*sizeof(zMbcsFilename[0]) ); | |
- if( zMbcsFilename==0 ){ | |
- return 0; | |
- } | |
- nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); | |
- if( nByte==0 ){ | |
- free(zMbcsFilename); | |
- zMbcsFilename = 0; | |
- } | |
- return zMbcsFilename; | |
-} | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "CreateMutexW", (SYSCALL)CreateMutexW, 0 }, | |
+#else | |
+ { "CreateMutexW", (SYSCALL)0, 0 }, | |
+#endif | |
-/* | |
-** Convert microsoft unicode to multibyte character string, based on the | |
-** user's Ansi codepage. | |
-** | |
-** Space to hold the returned string is obtained from | |
-** malloc(). | |
-*/ | |
-static char *unicodeToMbcs(const WCHAR *zWideFilename){ | |
- int nByte; | |
- char *zFilename; | |
- int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; | |
+#define osCreateMutexW ((HANDLE(WINAPI*)(LPSECURITY_ATTRIBUTES,BOOL, \ | |
+ LPCWSTR))aSyscall[8].pCurrent) | |
- nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); | |
- zFilename = malloc( nByte ); | |
- if( zFilename==0 ){ | |
- return 0; | |
- } | |
- nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte, | |
- 0, 0); | |
- if( nByte == 0 ){ | |
- free(zFilename); | |
- zFilename = 0; | |
- } | |
- return zFilename; | |
-} | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "DeleteFileA", (SYSCALL)DeleteFileA, 0 }, | |
+#else | |
+ { "DeleteFileA", (SYSCALL)0, 0 }, | |
+#endif | |
-/* | |
-** Convert multibyte character string to UTF-8. Space to hold the | |
-** returned string is obtained from malloc(). | |
-*/ | |
-SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){ | |
- char *zFilenameUtf8; | |
- WCHAR *zTmpWide; | |
+#define osDeleteFileA ((BOOL(WINAPI*)(LPCSTR))aSyscall[9].pCurrent) | |
- zTmpWide = mbcsToUnicode(zFilename); | |
- if( zTmpWide==0 ){ | |
- return 0; | |
- } | |
- zFilenameUtf8 = unicodeToUtf8(zTmpWide); | |
- free(zTmpWide); | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "DeleteFileW", (SYSCALL)DeleteFileW, 0 }, | |
+#else | |
+ { "DeleteFileW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osDeleteFileW ((BOOL(WINAPI*)(LPCWSTR))aSyscall[10].pCurrent) | |
+ | |
+#if SQLITE_OS_WINCE | |
+ { "FileTimeToLocalFileTime", (SYSCALL)FileTimeToLocalFileTime, 0 }, | |
+#else | |
+ { "FileTimeToLocalFileTime", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osFileTimeToLocalFileTime ((BOOL(WINAPI*)(CONST FILETIME*, \ | |
+ LPFILETIME))aSyscall[11].pCurrent) | |
+ | |
+#if SQLITE_OS_WINCE | |
+ { "FileTimeToSystemTime", (SYSCALL)FileTimeToSystemTime, 0 }, | |
+#else | |
+ { "FileTimeToSystemTime", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osFileTimeToSystemTime ((BOOL(WINAPI*)(CONST FILETIME*, \ | |
+ LPSYSTEMTIME))aSyscall[12].pCurrent) | |
+ | |
+ { "FlushFileBuffers", (SYSCALL)FlushFileBuffers, 0 }, | |
+ | |
+#define osFlushFileBuffers ((BOOL(WINAPI*)(HANDLE))aSyscall[13].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "FormatMessageA", (SYSCALL)FormatMessageA, 0 }, | |
+#else | |
+ { "FormatMessageA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osFormatMessageA ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPSTR, \ | |
+ DWORD,va_list*))aSyscall[14].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "FormatMessageW", (SYSCALL)FormatMessageW, 0 }, | |
+#else | |
+ { "FormatMessageW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osFormatMessageW ((DWORD(WINAPI*)(DWORD,LPCVOID,DWORD,DWORD,LPWSTR, \ | |
+ DWORD,va_list*))aSyscall[15].pCurrent) | |
+ | |
+ { "FreeLibrary", (SYSCALL)FreeLibrary, 0 }, | |
+ | |
+#define osFreeLibrary ((BOOL(WINAPI*)(HMODULE))aSyscall[16].pCurrent) | |
+ | |
+ { "GetCurrentProcessId", (SYSCALL)GetCurrentProcessId, 0 }, | |
+ | |
+#define osGetCurrentProcessId ((DWORD(WINAPI*)(VOID))aSyscall[17].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "GetDiskFreeSpaceA", (SYSCALL)GetDiskFreeSpaceA, 0 }, | |
+#else | |
+ { "GetDiskFreeSpaceA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetDiskFreeSpaceA ((BOOL(WINAPI*)(LPCSTR,LPDWORD,LPDWORD,LPDWORD, \ | |
+ LPDWORD))aSyscall[18].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "GetDiskFreeSpaceW", (SYSCALL)GetDiskFreeSpaceW, 0 }, | |
+#else | |
+ { "GetDiskFreeSpaceW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetDiskFreeSpaceW ((BOOL(WINAPI*)(LPCWSTR,LPDWORD,LPDWORD,LPDWORD, \ | |
+ LPDWORD))aSyscall[19].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "GetFileAttributesA", (SYSCALL)GetFileAttributesA, 0 }, | |
+#else | |
+ { "GetFileAttributesA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetFileAttributesA ((DWORD(WINAPI*)(LPCSTR))aSyscall[20].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "GetFileAttributesW", (SYSCALL)GetFileAttributesW, 0 }, | |
+#else | |
+ { "GetFileAttributesW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetFileAttributesW ((DWORD(WINAPI*)(LPCWSTR))aSyscall[21].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "GetFileAttributesExW", (SYSCALL)GetFileAttributesExW, 0 }, | |
+#else | |
+ { "GetFileAttributesExW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetFileAttributesExW ((BOOL(WINAPI*)(LPCWSTR,GET_FILEEX_INFO_LEVELS, \ | |
+ LPVOID))aSyscall[22].pCurrent) | |
+ | |
+ { "GetFileSize", (SYSCALL)GetFileSize, 0 }, | |
+ | |
+#define osGetFileSize ((DWORD(WINAPI*)(HANDLE,LPDWORD))aSyscall[23].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "GetFullPathNameA", (SYSCALL)GetFullPathNameA, 0 }, | |
+#else | |
+ { "GetFullPathNameA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetFullPathNameA ((DWORD(WINAPI*)(LPCSTR,DWORD,LPSTR, \ | |
+ LPSTR*))aSyscall[24].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE && defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "GetFullPathNameW", (SYSCALL)GetFullPathNameW, 0 }, | |
+#else | |
+ { "GetFullPathNameW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetFullPathNameW ((DWORD(WINAPI*)(LPCWSTR,DWORD,LPWSTR, \ | |
+ LPWSTR*))aSyscall[25].pCurrent) | |
+ | |
+ { "GetLastError", (SYSCALL)GetLastError, 0 }, | |
+ | |
+#define osGetLastError ((DWORD(WINAPI*)(VOID))aSyscall[26].pCurrent) | |
+ | |
+#if SQLITE_OS_WINCE | |
+ /* The GetProcAddressA() routine is only available on Windows CE. */ | |
+ { "GetProcAddressA", (SYSCALL)GetProcAddressA, 0 }, | |
+#else | |
+ /* All other Windows platforms expect GetProcAddress() to take | |
+ ** an ANSI string regardless of the _UNICODE setting */ | |
+ { "GetProcAddressA", (SYSCALL)GetProcAddress, 0 }, | |
+#endif | |
+ | |
+#define osGetProcAddressA ((FARPROC(WINAPI*)(HMODULE, \ | |
+ LPCSTR))aSyscall[27].pCurrent) | |
+ | |
+ { "GetSystemInfo", (SYSCALL)GetSystemInfo, 0 }, | |
+ | |
+#define osGetSystemInfo ((VOID(WINAPI*)(LPSYSTEM_INFO))aSyscall[28].pCurrent) | |
+ | |
+ { "GetSystemTime", (SYSCALL)GetSystemTime, 0 }, | |
+ | |
+#define osGetSystemTime ((VOID(WINAPI*)(LPSYSTEMTIME))aSyscall[29].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE | |
+ { "GetSystemTimeAsFileTime", (SYSCALL)GetSystemTimeAsFileTime, 0 }, | |
+#else | |
+ { "GetSystemTimeAsFileTime", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetSystemTimeAsFileTime ((VOID(WINAPI*)( \ | |
+ LPFILETIME))aSyscall[30].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "GetTempPathA", (SYSCALL)GetTempPathA, 0 }, | |
+#else | |
+ { "GetTempPathA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetTempPathA ((DWORD(WINAPI*)(DWORD,LPSTR))aSyscall[31].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "GetTempPathW", (SYSCALL)GetTempPathW, 0 }, | |
+#else | |
+ { "GetTempPathW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) | |
+ | |
+ { "GetTickCount", (SYSCALL)GetTickCount, 0 }, | |
+ | |
+#define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, | |
+#else | |
+ { "GetVersionExA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osGetVersionExA ((BOOL(WINAPI*)( \ | |
+ LPOSVERSIONINFOA))aSyscall[34].pCurrent) | |
+ | |
+ { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, | |
+ | |
+#define osHeapAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD, \ | |
+ SIZE_T))aSyscall[35].pCurrent) | |
+ | |
+ { "HeapCreate", (SYSCALL)HeapCreate, 0 }, | |
+ | |
+#define osHeapCreate ((HANDLE(WINAPI*)(DWORD,SIZE_T, \ | |
+ SIZE_T))aSyscall[36].pCurrent) | |
+ | |
+ { "HeapDestroy", (SYSCALL)HeapDestroy, 0 }, | |
+ | |
+#define osHeapDestroy ((BOOL(WINAPI*)(HANDLE))aSyscall[37].pCurrent) | |
+ | |
+ { "HeapFree", (SYSCALL)HeapFree, 0 }, | |
+ | |
+#define osHeapFree ((BOOL(WINAPI*)(HANDLE,DWORD,LPVOID))aSyscall[38].pCurrent) | |
+ | |
+ { "HeapReAlloc", (SYSCALL)HeapReAlloc, 0 }, | |
+ | |
+#define osHeapReAlloc ((LPVOID(WINAPI*)(HANDLE,DWORD,LPVOID, \ | |
+ SIZE_T))aSyscall[39].pCurrent) | |
+ | |
+ { "HeapSize", (SYSCALL)HeapSize, 0 }, | |
+ | |
+#define osHeapSize ((SIZE_T(WINAPI*)(HANDLE,DWORD, \ | |
+ LPCVOID))aSyscall[40].pCurrent) | |
+ | |
+ { "HeapValidate", (SYSCALL)HeapValidate, 0 }, | |
+ | |
+#define osHeapValidate ((BOOL(WINAPI*)(HANDLE,DWORD, \ | |
+ LPCVOID))aSyscall[41].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_ANSI) | |
+ { "LoadLibraryA", (SYSCALL)LoadLibraryA, 0 }, | |
+#else | |
+ { "LoadLibraryA", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osLoadLibraryA ((HMODULE(WINAPI*)(LPCSTR))aSyscall[42].pCurrent) | |
+ | |
+#if defined(SQLITE_WIN32_HAS_WIDE) | |
+ { "LoadLibraryW", (SYSCALL)LoadLibraryW, 0 }, | |
+#else | |
+ { "LoadLibraryW", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#define osLoadLibraryW ((HMODULE(WINAPI*)(LPCWSTR))aSyscall[43].pCurrent) | |
+ | |
+ { "LocalFree", (SYSCALL)LocalFree, 0 }, | |
+ | |
+#define osLocalFree ((HLOCAL(WINAPI*)(HLOCAL))aSyscall[44].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE | |
+ { "LockFile", (SYSCALL)LockFile, 0 }, | |
+ | |
+#define osLockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ | |
+ DWORD))aSyscall[45].pCurrent) | |
+#else | |
+ { "LockFile", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#if !SQLITE_OS_WINCE | |
+ { "LockFileEx", (SYSCALL)LockFileEx, 0 }, | |
+ | |
+#define osLockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD,DWORD, \ | |
+ LPOVERLAPPED))aSyscall[46].pCurrent) | |
+#else | |
+ { "LockFileEx", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+ { "MapViewOfFile", (SYSCALL)MapViewOfFile, 0 }, | |
+ | |
+#define osMapViewOfFile ((LPVOID(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ | |
+ SIZE_T))aSyscall[47].pCurrent) | |
+ | |
+ { "MultiByteToWideChar", (SYSCALL)MultiByteToWideChar, 0 }, | |
+ | |
+#define osMultiByteToWideChar ((int(WINAPI*)(UINT,DWORD,LPCSTR,int,LPWSTR, \ | |
+ int))aSyscall[48].pCurrent) | |
+ | |
+ { "QueryPerformanceCounter", (SYSCALL)QueryPerformanceCounter, 0 }, | |
+ | |
+#define osQueryPerformanceCounter ((BOOL(WINAPI*)( \ | |
+ LARGE_INTEGER*))aSyscall[49].pCurrent) | |
+ | |
+ { "ReadFile", (SYSCALL)ReadFile, 0 }, | |
+ | |
+#define osReadFile ((BOOL(WINAPI*)(HANDLE,LPVOID,DWORD,LPDWORD, \ | |
+ LPOVERLAPPED))aSyscall[50].pCurrent) | |
+ | |
+ { "SetEndOfFile", (SYSCALL)SetEndOfFile, 0 }, | |
+ | |
+#define osSetEndOfFile ((BOOL(WINAPI*)(HANDLE))aSyscall[51].pCurrent) | |
+ | |
+ { "SetFilePointer", (SYSCALL)SetFilePointer, 0 }, | |
+ | |
+#define osSetFilePointer ((DWORD(WINAPI*)(HANDLE,LONG,PLONG, \ | |
+ DWORD))aSyscall[52].pCurrent) | |
+ | |
+ { "Sleep", (SYSCALL)Sleep, 0 }, | |
+ | |
+#define osSleep ((VOID(WINAPI*)(DWORD))aSyscall[53].pCurrent) | |
+ | |
+ { "SystemTimeToFileTime", (SYSCALL)SystemTimeToFileTime, 0 }, | |
+ | |
+#define osSystemTimeToFileTime ((BOOL(WINAPI*)(CONST SYSTEMTIME*, \ | |
+ LPFILETIME))aSyscall[54].pCurrent) | |
+ | |
+#if !SQLITE_OS_WINCE | |
+ { "UnlockFile", (SYSCALL)UnlockFile, 0 }, | |
+ | |
+#define osUnlockFile ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ | |
+ DWORD))aSyscall[55].pCurrent) | |
+#else | |
+ { "UnlockFile", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+#if !SQLITE_OS_WINCE | |
+ { "UnlockFileEx", (SYSCALL)UnlockFileEx, 0 }, | |
+ | |
+#define osUnlockFileEx ((BOOL(WINAPI*)(HANDLE,DWORD,DWORD,DWORD, \ | |
+ LPOVERLAPPED))aSyscall[56].pCurrent) | |
+#else | |
+ { "UnlockFileEx", (SYSCALL)0, 0 }, | |
+#endif | |
+ | |
+ { "UnmapViewOfFile", (SYSCALL)UnmapViewOfFile, 0 }, | |
+ | |
+#define osUnmapViewOfFile ((BOOL(WINAPI*)(LPCVOID))aSyscall[57].pCurrent) | |
+ | |
+ { "WideCharToMultiByte", (SYSCALL)WideCharToMultiByte, 0 }, | |
+ | |
+#define osWideCharToMultiByte ((int(WINAPI*)(UINT,DWORD,LPCWSTR,int,LPSTR,int, \ | |
+ LPCSTR,LPBOOL))aSyscall[58].pCurrent) | |
+ | |
+ { "WriteFile", (SYSCALL)WriteFile, 0 }, | |
+ | |
+#define osWriteFile ((BOOL(WINAPI*)(HANDLE,LPCVOID,DWORD,LPDWORD, \ | |
+ LPOVERLAPPED))aSyscall[59].pCurrent) | |
+ | |
+}; /* End of the overrideable system calls */ | |
+ | |
+/* | |
+** This is the xSetSystemCall() method of sqlite3_vfs for all of the | |
+** "win32" VFSes. Return SQLITE_OK opon successfully updating the | |
+** system call pointer, or SQLITE_NOTFOUND if there is no configurable | |
+** system call named zName. | |
+*/ | |
+static int winSetSystemCall( | |
+ sqlite3_vfs *pNotUsed, /* The VFS pointer. Not used */ | |
+ const char *zName, /* Name of system call to override */ | |
+ sqlite3_syscall_ptr pNewFunc /* Pointer to new system call value */ | |
+){ | |
+ unsigned int i; | |
+ int rc = SQLITE_NOTFOUND; | |
+ | |
+ UNUSED_PARAMETER(pNotUsed); | |
+ if( zName==0 ){ | |
+ /* If no zName is given, restore all system calls to their default | |
+ ** settings and return NULL | |
+ */ | |
+ rc = SQLITE_OK; | |
+ for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){ | |
+ if( aSyscall[i].pDefault ){ | |
+ aSyscall[i].pCurrent = aSyscall[i].pDefault; | |
+ } | |
+ } | |
+ }else{ | |
+ /* If zName is specified, operate on only the one system call | |
+ ** specified. | |
+ */ | |
+ for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){ | |
+ if( strcmp(zName, aSyscall[i].zName)==0 ){ | |
+ if( aSyscall[i].pDefault==0 ){ | |
+ aSyscall[i].pDefault = aSyscall[i].pCurrent; | |
+ } | |
+ rc = SQLITE_OK; | |
+ if( pNewFunc==0 ) pNewFunc = aSyscall[i].pDefault; | |
+ aSyscall[i].pCurrent = pNewFunc; | |
+ break; | |
+ } | |
+ } | |
+ } | |
+ return rc; | |
+} | |
+ | |
+/* | |
+** Return the value of a system call. Return NULL if zName is not a | |
+** recognized system call name. NULL is also returned if the system call | |
+** is currently undefined. | |
+*/ | |
+static sqlite3_syscall_ptr winGetSystemCall( | |
+ sqlite3_vfs *pNotUsed, | |
+ const char *zName | |
+){ | |
+ unsigned int i; | |
+ | |
+ UNUSED_PARAMETER(pNotUsed); | |
+ for(i=0; i<sizeof(aSyscall)/sizeof(aSyscall[0]); i++){ | |
+ if( strcmp(zName, aSyscall[i].zName)==0 ) return aSyscall[i].pCurrent; | |
+ } | |
+ return 0; | |
+} | |
+ | |
+/* | |
+** Return the name of the first system call after zName. If zName==NULL | |
+** then return the name of the first system call. Return NULL if zName | |
+** is the last system call or if zName is not the name of a valid | |
+** system call. | |
+*/ | |
+static const char *winNextSystemCall(sqlite3_vfs *p, const char *zName){ | |
+ int i = -1; | |
+ | |
+ UNUSED_PARAMETER(p); | |
+ if( zName ){ | |
+ for(i=0; i<ArraySize(aSyscall)-1; i++){ | |
+ if( strcmp(zName, aSyscall[i].zName)==0 ) break; | |
+ } | |
+ } | |
+ for(i++; i<ArraySize(aSyscall); i++){ | |
+ if( aSyscall[i].pCurrent!=0 ) return aSyscall[i].zName; | |
+ } | |
+ return 0; | |
+} | |
+ | |
+/* | |
+** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, | |
+** or WinCE. Return false (zero) for Win95, Win98, or WinME. | |
+** | |
+** Here is an interesting observation: Win95, Win98, and WinME lack | |
+** the LockFileEx() API. But we can still statically link against that | |
+** API as long as we don't call it when running Win95/98/ME. A call to | |
+** this routine is used to determine if the host is Win95/98/ME or | |
+** WinNT/2K/XP so that we will know whether or not we can safely call | |
+** the LockFileEx() API. | |
+*/ | |
+#if SQLITE_OS_WINCE | |
+# define isNT() (1) | |
+#else | |
+ static int isNT(void){ | |
+ if( sqlite3_os_type==0 ){ | |
+ OSVERSIONINFOA sInfo; | |
+ sInfo.dwOSVersionInfoSize = sizeof(sInfo); | |
+ osGetVersionExA(&sInfo); | |
+ sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; | |
+ } | |
+ return sqlite3_os_type==2; | |
+ } | |
+#endif /* SQLITE_OS_WINCE */ | |
+ | |
+#ifdef SQLITE_WIN32_MALLOC | |
+/* | |
+** Allocate nBytes of memory. | |
+*/ | |
+static void *winMemMalloc(int nBytes){ | |
+ HANDLE hHeap; | |
+ void *p; | |
+ | |
+ winMemAssertMagic(); | |
+ hHeap = winMemGetHeap(); | |
+ assert( hHeap!=0 ); | |
+ assert( hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#endif | |
+ assert( nBytes>=0 ); | |
+ p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); | |
+ if( !p ){ | |
+ sqlite3_log(SQLITE_NOMEM, "failed to HeapAlloc %u bytes (%d), heap=%p", | |
+ nBytes, osGetLastError(), (void*)hHeap); | |
+ } | |
+ return p; | |
+} | |
+ | |
+/* | |
+** Free memory. | |
+*/ | |
+static void winMemFree(void *pPrior){ | |
+ HANDLE hHeap; | |
+ | |
+ winMemAssertMagic(); | |
+ hHeap = winMemGetHeap(); | |
+ assert( hHeap!=0 ); | |
+ assert( hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); | |
+#endif | |
+ if( !pPrior ) return; /* Passing NULL to HeapFree is undefined. */ | |
+ if( !osHeapFree(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ){ | |
+ sqlite3_log(SQLITE_NOMEM, "failed to HeapFree block %p (%d), heap=%p", | |
+ pPrior, osGetLastError(), (void*)hHeap); | |
+ } | |
+} | |
+ | |
+/* | |
+** Change the size of an existing memory allocation | |
+*/ | |
+static void *winMemRealloc(void *pPrior, int nBytes){ | |
+ HANDLE hHeap; | |
+ void *p; | |
+ | |
+ winMemAssertMagic(); | |
+ hHeap = winMemGetHeap(); | |
+ assert( hHeap!=0 ); | |
+ assert( hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior) ); | |
+#endif | |
+ assert( nBytes>=0 ); | |
+ if( !pPrior ){ | |
+ p = osHeapAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, (SIZE_T)nBytes); | |
+ }else{ | |
+ p = osHeapReAlloc(hHeap, SQLITE_WIN32_HEAP_FLAGS, pPrior, (SIZE_T)nBytes); | |
+ } | |
+ if( !p ){ | |
+ sqlite3_log(SQLITE_NOMEM, "failed to %s %u bytes (%d), heap=%p", | |
+ pPrior ? "HeapReAlloc" : "HeapAlloc", nBytes, osGetLastError(), | |
+ (void*)hHeap); | |
+ } | |
+ return p; | |
+} | |
+ | |
+/* | |
+** Return the size of an outstanding allocation, in bytes. | |
+*/ | |
+static int winMemSize(void *p){ | |
+ HANDLE hHeap; | |
+ SIZE_T n; | |
+ | |
+ winMemAssertMagic(); | |
+ hHeap = winMemGetHeap(); | |
+ assert( hHeap!=0 ); | |
+ assert( hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert ( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#endif | |
+ if( !p ) return 0; | |
+ n = osHeapSize(hHeap, SQLITE_WIN32_HEAP_FLAGS, p); | |
+ if( n==(SIZE_T)-1 ){ | |
+ sqlite3_log(SQLITE_NOMEM, "failed to HeapSize block %p (%d), heap=%p", | |
+ p, osGetLastError(), (void*)hHeap); | |
+ return 0; | |
+ } | |
+ return (int)n; | |
+} | |
+ | |
+/* | |
+** Round up a request size to the next valid allocation size. | |
+*/ | |
+static int winMemRoundup(int n){ | |
+ return n; | |
+} | |
+ | |
+/* | |
+** Initialize this module. | |
+*/ | |
+static int winMemInit(void *pAppData){ | |
+ winMemData *pWinMemData = (winMemData *)pAppData; | |
+ | |
+ if( !pWinMemData ) return SQLITE_ERROR; | |
+ assert( pWinMemData->magic==WINMEM_MAGIC ); | |
+ if( !pWinMemData->hHeap ){ | |
+ pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS, | |
+ SQLITE_WIN32_HEAP_INIT_SIZE, | |
+ SQLITE_WIN32_HEAP_MAX_SIZE); | |
+ if( !pWinMemData->hHeap ){ | |
+ sqlite3_log(SQLITE_NOMEM, | |
+ "failed to HeapCreate (%d), flags=%u, initSize=%u, maxSize=%u", | |
+ osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, | |
+ SQLITE_WIN32_HEAP_INIT_SIZE, SQLITE_WIN32_HEAP_MAX_SIZE); | |
+ return SQLITE_NOMEM; | |
+ } | |
+ pWinMemData->bOwned = TRUE; | |
+ } | |
+ assert( pWinMemData->hHeap!=0 ); | |
+ assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#endif | |
+ return SQLITE_OK; | |
+} | |
+ | |
+/* | |
+** Deinitialize this module. | |
+*/ | |
+static void winMemShutdown(void *pAppData){ | |
+ winMemData *pWinMemData = (winMemData *)pAppData; | |
+ | |
+ if( !pWinMemData ) return; | |
+ if( pWinMemData->hHeap ){ | |
+ assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); | |
+#ifdef SQLITE_WIN32_MALLOC_VALIDATE | |
+ assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); | |
+#endif | |
+ if( pWinMemData->bOwned ){ | |
+ if( !osHeapDestroy(pWinMemData->hHeap) ){ | |
+ sqlite3_log(SQLITE_NOMEM, "failed to HeapDestroy (%d), heap=%p", | |
+ osGetLastError(), (void*)pWinMemData->hHeap); | |
+ } | |
+ pWinMemData->bOwned = FALSE; | |
+ } | |
+ pWinMemData->hHeap = NULL; | |
+ } | |
+} | |
+ | |
+/* | |
+** Populate the low-level memory allocation function pointers in | |
+** sqlite3GlobalConfig.m with pointers to the routines in this file. The | |
+** arguments specify the block of memory to manage. | |
+** | |
+** This routine is only called by sqlite3_config(), and therefore | |
+** is not required to be threadsafe (it is not). | |
+*/ | |
+SQLITE_PRIVATE const sqlite3_mem_methods *sqlite3MemGetWin32(void){ | |
+ static const sqlite3_mem_methods winMemMethods = { | |
+ winMemMalloc, | |
+ winMemFree, | |
+ winMemRealloc, | |
+ winMemSize, | |
+ winMemRoundup, | |
+ winMemInit, | |
+ winMemShutdown, | |
+ &win_mem_data | |
+ }; | |
+ return &winMemMethods; | |
+} | |
+ | |
+SQLITE_PRIVATE void sqlite3MemSetDefault(void){ | |
+ sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); | |
+} | |
+#endif /* SQLITE_WIN32_MALLOC */ | |
+ | |
+/* | |
+** Convert a UTF-8 string to Microsoft Unicode (UTF-16?). | |
+** | |
+** Space to hold the returned string is obtained from malloc. | |
+*/ | |
+static LPWSTR utf8ToUnicode(const char *zFilename){ | |
+ int nChar; | |
+ LPWSTR zWideFilename; | |
+ | |
+ nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); | |
+ if( nChar==0 ){ | |
+ return 0; | |
+ } | |
+ zWideFilename = sqlite3_malloc( nChar*sizeof(zWideFilename[0]) ); | |
+ if( zWideFilename==0 ){ | |
+ return 0; | |
+ } | |
+ nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, | |
+ nChar); | |
+ if( nChar==0 ){ | |
+ sqlite3_free(zWideFilename); | |
+ zWideFilename = 0; | |
+ } | |
+ return zWideFilename; | |
+} | |
+ | |
+/* | |
+** Convert Microsoft Unicode to UTF-8. Space to hold the returned string is | |
+** obtained from sqlite3_malloc(). | |
+*/ | |
+static char *unicodeToUtf8(LPCWSTR zWideFilename){ | |
+ int nByte; | |
+ char *zFilename; | |
+ | |
+ nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); | |
+ if( nByte == 0 ){ | |
+ return 0; | |
+ } | |
+ zFilename = sqlite3_malloc( nByte ); | |
+ if( zFilename==0 ){ | |
+ return 0; | |
+ } | |
+ nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, | |
+ 0, 0); | |
+ if( nByte == 0 ){ | |
+ sqlite3_free(zFilename); | |
+ zFilename = 0; | |
+ } | |
+ return zFilename; | |
+} | |
+ | |
+/* | |
+** Convert an ANSI string to Microsoft Unicode, based on the | |
+** current codepage settings for file apis. | |
+** | |
+** Space to hold the returned string is obtained | |
+** from sqlite3_malloc. | |
+*/ | |
+static LPWSTR mbcsToUnicode(const char *zFilename){ | |
+ int nByte; | |
+ LPWSTR zMbcsFilename; | |
+ int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; | |
+ | |
+ nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, NULL, | |
+ 0)*sizeof(WCHAR); | |
+ if( nByte==0 ){ | |
+ return 0; | |
+ } | |
+ zMbcsFilename = sqlite3_malloc( nByte*sizeof(zMbcsFilename[0]) ); | |
+ if( zMbcsFilename==0 ){ | |
+ return 0; | |
+ } | |
+ nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, | |
+ nByte); | |
+ if( nByte==0 ){ | |
+ sqlite3_free(zMbcsFilename); | |
+ zMbcsFilename = 0; | |
+ } | |
+ return zMbcsFilename; | |
+} | |
+ | |
+/* | |
+** Convert Microsoft Unicode to multi-byte character string, based on the | |
+** user's ANSI codepage. | |
+** | |
+** Space to hold the returned string is obtained from | |
+** sqlite3_malloc(). | |
+*/ | |
+static char *unicodeToMbcs(LPCWSTR zWideFilename){ | |
+ int nByte; | |
+ char *zFilename; | |
+ int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; | |
+ | |
+ nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); | |
+ if( nByte == 0 ){ | |
+ return 0; | |
+ } | |
+ zFilename = sqlite3_malloc( nByte ); | |
+ if( zFilename==0 ){ | |
+ return 0; | |
+ } | |
+ nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, | |
+ nByte, 0, 0); | |
+ if( nByte == 0 ){ | |
+ sqlite3_free(zFilename); | |
+ zFilename = 0; | |
+ } | |
+ return zFilename; | |
+} | |
+ | |
+/* | |
+** Convert multibyte character string to UTF-8. Space to hold the | |
+** returned string is obtained from sqlite3_malloc(). | |
+*/ | |
+SQLITE_API char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){ | |
+ char *zFilenameUtf8; | |
+ LPWSTR zTmpWide; | |
+ | |
+ zTmpWide = mbcsToUnicode(zFilename); | |
+ if( zTmpWide==0 ){ | |
+ return 0; | |
+ } | |
+ zFilenameUtf8 = unicodeToUtf8(zTmpWide); | |
+ sqlite3_free(zTmpWide); | |
return zFilenameUtf8; | |
} | |
/* | |
** Convert UTF-8 to multibyte character string. Space to hold the | |
-** returned string is obtained from malloc(). | |
+** returned string is obtained from sqlite3_malloc(). | |
*/ | |
SQLITE_API char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){ | |
char *zFilenameMbcs; | |
- WCHAR *zTmpWide; | |
+ LPWSTR zTmpWide; | |
zTmpWide = utf8ToUnicode(zFilename); | |
if( zTmpWide==0 ){ | |
return 0; | |
} | |
zFilenameMbcs = unicodeToMbcs(zTmpWide); | |
- free(zTmpWide); | |
+ sqlite3_free(zTmpWide); | |
return zFilenameMbcs; | |
} | |
@@ -32146,59 +33040,66 @@ | |
** is zero if the error message fits in the buffer, or non-zero | |
** otherwise (if the message was truncated). | |
*/ | |
-static int getLastErrorMsg(int nBuf, char *zBuf){ | |
+static int getLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){ | |
/* FormatMessage returns 0 on failure. Otherwise it | |
** returns the number of TCHARs written to the output | |
** buffer, excluding the terminating null char. | |
*/ | |
- DWORD error = GetLastError(); | |
DWORD dwLen = 0; | |
char *zOut = 0; | |
if( isNT() ){ | |
- WCHAR *zTempWide = NULL; | |
- dwLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | |
- NULL, | |
- error, | |
- 0, | |
- (LPWSTR) &zTempWide, | |
- 0, | |
- 0); | |
+ LPWSTR zTempWide = NULL; | |
+ dwLen = osFormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
+ FORMAT_MESSAGE_FROM_SYSTEM | | |
+ FORMAT_MESSAGE_IGNORE_INSERTS, | |
+ NULL, | |
+ lastErrno, | |
+ 0, | |
+ (LPWSTR) &zTempWide, | |
+ 0, | |
+ 0); | |
if( dwLen > 0 ){ | |
/* allocate a buffer and convert to UTF8 */ | |
+ sqlite3BeginBenignMalloc(); | |
zOut = unicodeToUtf8(zTempWide); | |
+ sqlite3EndBenignMalloc(); | |
/* free the system buffer allocated by FormatMessage */ | |
- LocalFree(zTempWide); | |
+ osLocalFree(zTempWide); | |
} | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
char *zTemp = NULL; | |
- dwLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, | |
- NULL, | |
- error, | |
- 0, | |
- (LPSTR) &zTemp, | |
- 0, | |
- 0); | |
+ dwLen = osFormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | | |
+ FORMAT_MESSAGE_FROM_SYSTEM | | |
+ FORMAT_MESSAGE_IGNORE_INSERTS, | |
+ NULL, | |
+ lastErrno, | |
+ 0, | |
+ (LPSTR) &zTemp, | |
+ 0, | |
+ 0); | |
if( dwLen > 0 ){ | |
/* allocate a buffer and convert to UTF8 */ | |
+ sqlite3BeginBenignMalloc(); | |
zOut = sqlite3_win32_mbcs_to_utf8(zTemp); | |
+ sqlite3EndBenignMalloc(); | |
/* free the system buffer allocated by FormatMessage */ | |
- LocalFree(zTemp); | |
+ osLocalFree(zTemp); | |
} | |
#endif | |
} | |
if( 0 == dwLen ){ | |
- sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error); | |
+ sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", lastErrno, lastErrno); | |
}else{ | |
/* copy a maximum of nBuf chars to output buffer */ | |
sqlite3_snprintf(nBuf, zBuf, "%s", zOut); | |
/* free the UTF8 buffer */ | |
- free(zOut); | |
+ sqlite3_free(zOut); | |
} | |
return 0; | |
} | |
@@ -32218,26 +33119,26 @@ | |
** The two subsequent arguments should be the name of the OS function that | |
** failed and the the associated file-system path, if any. | |
*/ | |
-#define winLogError(a,b,c) winLogErrorAtLine(a,b,c,__LINE__) | |
+#define winLogError(a,b,c,d) winLogErrorAtLine(a,b,c,d,__LINE__) | |
static int winLogErrorAtLine( | |
int errcode, /* SQLite error code */ | |
+ DWORD lastErrno, /* Win32 last error */ | |
const char *zFunc, /* Name of OS function that failed */ | |
const char *zPath, /* File path associated with error */ | |
int iLine /* Source line number where error occurred */ | |
){ | |
char zMsg[500]; /* Human readable error text */ | |
int i; /* Loop counter */ | |
- DWORD iErrno = GetLastError(); /* Error code */ | |
zMsg[0] = 0; | |
- getLastErrorMsg(sizeof(zMsg), zMsg); | |
+ getLastErrorMsg(lastErrno, sizeof(zMsg), zMsg); | |
assert( errcode!=SQLITE_OK ); | |
if( zPath==0 ) zPath = ""; | |
for(i=0; zMsg[i] && zMsg[i]!='\r' && zMsg[i]!='\n'; i++){} | |
zMsg[i] = 0; | |
sqlite3_log(errcode, | |
"os_win.c:%d: (%d) %s(%s) - %s", | |
- iLine, iErrno, zFunc, zPath, zMsg | |
+ iLine, lastErrno, zFunc, zPath, zMsg | |
); | |
return errcode; | |
@@ -32263,19 +33164,24 @@ | |
** to see if it should be retried. Return TRUE to retry. Return FALSE | |
** to give up with an error. | |
*/ | |
-static int retryIoerr(int *pnRetry){ | |
- DWORD e; | |
+static int retryIoerr(int *pnRetry, DWORD *pError){ | |
+ DWORD e = osGetLastError(); | |
if( *pnRetry>=win32IoerrRetry ){ | |
+ if( pError ){ | |
+ *pError = e; | |
+ } | |
return 0; | |
} | |
- e = GetLastError(); | |
if( e==ERROR_ACCESS_DENIED || | |
e==ERROR_LOCK_VIOLATION || | |
e==ERROR_SHARING_VIOLATION ){ | |
- Sleep(win32IoerrRetryDelay*(1+*pnRetry)); | |
+ osSleep(win32IoerrRetryDelay*(1+*pnRetry)); | |
++*pnRetry; | |
return 1; | |
} | |
+ if( pError ){ | |
+ *pError = e; | |
+ } | |
return 0; | |
} | |
@@ -32296,7 +33202,7 @@ | |
** This section contains code for WinCE only. | |
*/ | |
/* | |
-** WindowsCE does not have a localtime() function. So create a | |
+** Windows CE does not have a localtime() function. So create a | |
** substitute. | |
*/ | |
/* #include <time.h> */ | |
@@ -32310,8 +33216,8 @@ | |
t64 = (t64 + 11644473600)*10000000; | |
uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); | |
uTm.dwHighDateTime= (DWORD)(t64 >> 32); | |
- FileTimeToLocalFileTime(&uTm,&lTm); | |
- FileTimeToSystemTime(&lTm,&pTm); | |
+ osFileTimeToLocalFileTime(&uTm,&lTm); | |
+ osFileTimeToSystemTime(&lTm,&pTm); | |
y.tm_year = pTm.wYear - 1900; | |
y.tm_mon = pTm.wMonth - 1; | |
y.tm_wday = pTm.wDayOfWeek; | |
@@ -32322,13 +33228,6 @@ | |
return &y; | |
} | |
-/* This will never be called, but defined to make the code compile */ | |
-#define GetTempPathA(a,b) | |
- | |
-#define LockFile(a,b,c,d,e) winceLockFile(&a, b, c, d, e) | |
-#define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e) | |
-#define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f) | |
- | |
#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] | |
/* | |
@@ -32350,26 +33249,32 @@ | |
** descriptor pFile | |
*/ | |
static BOOL winceCreateLock(const char *zFilename, winFile *pFile){ | |
- WCHAR *zTok; | |
- WCHAR *zName = utf8ToUnicode(zFilename); | |
+ LPWSTR zTok; | |
+ LPWSTR zName; | |
BOOL bInit = TRUE; | |
+ zName = utf8ToUnicode(zFilename); | |
+ if( zName==0 ){ | |
+ /* out of memory */ | |
+ return FALSE; | |
+ } | |
+ | |
/* Initialize the local lockdata */ | |
- ZeroMemory(&pFile->local, sizeof(pFile->local)); | |
+ memset(&pFile->local, 0, sizeof(pFile->local)); | |
/* Replace the backslashes from the filename and lowercase it | |
** to derive a mutex name. */ | |
- zTok = CharLowerW(zName); | |
+ zTok = osCharLowerW(zName); | |
for (;*zTok;zTok++){ | |
if (*zTok == '\\') *zTok = '_'; | |
} | |
/* Create/open the named mutex */ | |
- pFile->hMutex = CreateMutexW(NULL, FALSE, zName); | |
+ pFile->hMutex = osCreateMutexW(NULL, FALSE, zName); | |
if (!pFile->hMutex){ | |
- pFile->lastErrno = GetLastError(); | |
- winLogError(SQLITE_ERROR, "winceCreateLock1", zFilename); | |
- free(zName); | |
+ pFile->lastErrno = osGetLastError(); | |
+ winLogError(SQLITE_ERROR, pFile->lastErrno, "winceCreateLock1", zFilename); | |
+ sqlite3_free(zName); | |
return FALSE; | |
} | |
@@ -32380,28 +33285,29 @@ | |
** case-sensitive, take advantage of that by uppercasing the mutex name | |
** and using that as the shared filemapping name. | |
*/ | |
- CharUpperW(zName); | |
- pFile->hShared = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, | |
- PAGE_READWRITE, 0, sizeof(winceLock), | |
- zName); | |
+ osCharUpperW(zName); | |
+ pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL, | |
+ PAGE_READWRITE, 0, sizeof(winceLock), | |
+ zName); | |
/* Set a flag that indicates we're the first to create the memory so it | |
** must be zero-initialized */ | |
- if (GetLastError() == ERROR_ALREADY_EXISTS){ | |
+ if (osGetLastError() == ERROR_ALREADY_EXISTS){ | |
bInit = FALSE; | |
} | |
- free(zName); | |
+ sqlite3_free(zName); | |
/* If we succeeded in making the shared memory handle, map it. */ | |
if (pFile->hShared){ | |
- pFile->shared = (winceLock*)MapViewOfFile(pFile->hShared, | |
+ pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared, | |
FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); | |
/* If mapping failed, close the shared memory handle and erase it */ | |
if (!pFile->shared){ | |
- pFile->lastErrno = GetLastError(); | |
- winLogError(SQLITE_ERROR, "winceCreateLock2", zFilename); | |
- CloseHandle(pFile->hShared); | |
+ pFile->lastErrno = osGetLastError(); | |
+ winLogError(SQLITE_ERROR, pFile->lastErrno, | |
+ "winceCreateLock2", zFilename); | |
+ osCloseHandle(pFile->hShared); | |
pFile->hShared = NULL; | |
} | |
} | |
@@ -32409,14 +33315,14 @@ | |
/* If shared memory could not be created, then close the mutex and fail */ | |
if (pFile->hShared == NULL){ | |
winceMutexRelease(pFile->hMutex); | |
- CloseHandle(pFile->hMutex); | |
+ osCloseHandle(pFile->hMutex); | |
pFile->hMutex = NULL; | |
return FALSE; | |
} | |
/* Initialize the shared memory if we're supposed to */ | |
if (bInit) { | |
- ZeroMemory(pFile->shared, sizeof(winceLock)); | |
+ memset(pFile->shared, 0, sizeof(winceLock)); | |
} | |
winceMutexRelease(pFile->hMutex); | |
@@ -32447,18 +33353,18 @@ | |
} | |
/* De-reference and close our copy of the shared memory handle */ | |
- UnmapViewOfFile(pFile->shared); | |
- CloseHandle(pFile->hShared); | |
+ osUnmapViewOfFile(pFile->shared); | |
+ osCloseHandle(pFile->hShared); | |
/* Done with the mutex */ | |
winceMutexRelease(pFile->hMutex); | |
- CloseHandle(pFile->hMutex); | |
+ osCloseHandle(pFile->hMutex); | |
pFile->hMutex = NULL; | |
} | |
} | |
/* | |
-** An implementation of the LockFile() API of windows for wince | |
+** An implementation of the LockFile() API of Windows for CE | |
*/ | |
static BOOL winceLockFile( | |
HANDLE *phFile, | |
@@ -32522,7 +33428,7 @@ | |
} | |
/* | |
-** An implementation of the UnlockFile API of windows for wince | |
+** An implementation of the UnlockFile API of Windows for CE | |
*/ | |
static BOOL winceUnlockFile( | |
HANDLE *phFile, | |
@@ -32584,7 +33490,7 @@ | |
} | |
/* | |
-** An implementation of the LockFileEx() API of windows for wince | |
+** An implementation of the LockFileEx() API of Windows for CE | |
*/ | |
static BOOL winceLockFileEx( | |
HANDLE *phFile, | |
@@ -32617,7 +33523,7 @@ | |
******************************************************************************/ | |
/* | |
-** Some microsoft compilers lack this definition. | |
+** Some Microsoft compilers lack this definition. | |
*/ | |
#ifndef INVALID_SET_FILE_POINTER | |
# define INVALID_SET_FILE_POINTER ((DWORD)-1) | |
@@ -32632,6 +33538,7 @@ | |
LONG upperBits; /* Most sig. 32 bits of new offset */ | |
LONG lowerBits; /* Least sig. 32 bits of new offset */ | |
DWORD dwRet; /* Value returned by SetFilePointer() */ | |
+ DWORD lastErrno; /* Value returned by GetLastError() */ | |
upperBits = (LONG)((iOffset>>32) & 0x7fffffff); | |
lowerBits = (LONG)(iOffset & 0xffffffff); | |
@@ -32643,10 +33550,13 @@ | |
** whether an error has actually occured, it is also necessary to call | |
** GetLastError(). | |
*/ | |
- dwRet = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); | |
- if( (dwRet==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) ){ | |
- pFile->lastErrno = GetLastError(); | |
- winLogError(SQLITE_IOERR_SEEK, "seekWinFile", pFile->zPath); | |
+ dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); | |
+ | |
+ if( (dwRet==INVALID_SET_FILE_POINTER | |
+ && ((lastErrno = osGetLastError())!=NO_ERROR)) ){ | |
+ pFile->lastErrno = lastErrno; | |
+ winLogError(SQLITE_IOERR_SEEK, pFile->lastErrno, | |
+ "seekWinFile", pFile->zPath); | |
return 1; | |
} | |
@@ -32657,7 +33567,7 @@ | |
** Close a file. | |
** | |
** It is reported that an attempt to close a handle might sometimes | |
-** fail. This is a very unreasonable result, but windows is notorious | |
+** fail. This is a very unreasonable result, but Windows is notorious | |
** for being unreasonable so I do not doubt that it might happen. If | |
** the close fails, we pause for 100 milliseconds and try again. As | |
** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before | |
@@ -32672,28 +33582,29 @@ | |
assert( pFile->pShm==0 ); | |
OSTRACE(("CLOSE %d\n", pFile->h)); | |
do{ | |
- rc = CloseHandle(pFile->h); | |
+ rc = osCloseHandle(pFile->h); | |
/* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ | |
- }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (Sleep(100), 1) ); | |
+ }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (osSleep(100), 1) ); | |
#if SQLITE_OS_WINCE | |
#define WINCE_DELETION_ATTEMPTS 3 | |
winceDestroyLock(pFile); | |
if( pFile->zDeleteOnClose ){ | |
int cnt = 0; | |
while( | |
- DeleteFileW(pFile->zDeleteOnClose)==0 | |
- && GetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff | |
+ osDeleteFileW(pFile->zDeleteOnClose)==0 | |
+ && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff | |
&& cnt++ < WINCE_DELETION_ATTEMPTS | |
){ | |
- Sleep(100); /* Wait a little before trying again */ | |
+ osSleep(100); /* Wait a little before trying again */ | |
} | |
- free(pFile->zDeleteOnClose); | |
+ sqlite3_free(pFile->zDeleteOnClose); | |
} | |
#endif | |
OSTRACE(("CLOSE %d %s\n", pFile->h, rc ? "ok" : "failed")); | |
OpenCounter(-1); | |
return rc ? SQLITE_OK | |
- : winLogError(SQLITE_IOERR_CLOSE, "winClose", pFile->zPath); | |
+ : winLogError(SQLITE_IOERR_CLOSE, osGetLastError(), | |
+ "winClose", pFile->zPath); | |
} | |
/* | |
@@ -32718,10 +33629,12 @@ | |
if( seekWinFile(pFile, offset) ){ | |
return SQLITE_FULL; | |
} | |
- while( !ReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ | |
- if( retryIoerr(&nRetry) ) continue; | |
- pFile->lastErrno = GetLastError(); | |
- return winLogError(SQLITE_IOERR_READ, "winRead", pFile->zPath); | |
+ while( !osReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ | |
+ DWORD lastErrno; | |
+ if( retryIoerr(&nRetry, &lastErrno) ) continue; | |
+ pFile->lastErrno = lastErrno; | |
+ return winLogError(SQLITE_IOERR_READ, pFile->lastErrno, | |
+ "winRead", pFile->zPath); | |
} | |
logIoerr(nRetry); | |
if( nRead<(DWORD)amt ){ | |
@@ -32759,10 +33672,11 @@ | |
u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ | |
int nRem = amt; /* Number of bytes yet to be written */ | |
DWORD nWrite; /* Bytes written by each WriteFile() call */ | |
+ DWORD lastErrno = NO_ERROR; /* Value returned by GetLastError() */ | |
while( nRem>0 ){ | |
- if( !WriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ | |
- if( retryIoerr(&nRetry) ) continue; | |
+ if( !osWriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){ | |
+ if( retryIoerr(&nRetry, &lastErrno) ) continue; | |
break; | |
} | |
if( nWrite<=0 ) break; | |
@@ -32770,7 +33684,7 @@ | |
nRem -= nWrite; | |
} | |
if( nRem>0 ){ | |
- pFile->lastErrno = GetLastError(); | |
+ pFile->lastErrno = lastErrno; | |
rc = 1; | |
} | |
} | |
@@ -32780,7 +33694,8 @@ | |
|| ( pFile->lastErrno==ERROR_DISK_FULL )){ | |
return SQLITE_FULL; | |
} | |
- return winLogError(SQLITE_IOERR_WRITE, "winWrite", pFile->zPath); | |
+ return winLogError(SQLITE_IOERR_WRITE, pFile->lastErrno, | |
+ "winWrite", pFile->zPath); | |
}else{ | |
logIoerr(nRetry); | |
} | |
@@ -32810,10 +33725,12 @@ | |
/* SetEndOfFile() returns non-zero when successful, or zero when it fails. */ | |
if( seekWinFile(pFile, nByte) ){ | |
- rc = winLogError(SQLITE_IOERR_TRUNCATE, "winTruncate1", pFile->zPath); | |
- }else if( 0==SetEndOfFile(pFile->h) ){ | |
- pFile->lastErrno = GetLastError(); | |
- rc = winLogError(SQLITE_IOERR_TRUNCATE, "winTruncate2", pFile->zPath); | |
+ rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, | |
+ "winTruncate1", pFile->zPath); | |
+ }else if( 0==osSetEndOfFile(pFile->h) ){ | |
+ pFile->lastErrno = osGetLastError(); | |
+ rc = winLogError(SQLITE_IOERR_TRUNCATE, pFile->lastErrno, | |
+ "winTruncate2", pFile->zPath); | |
} | |
OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc ? "failed" : "ok")); | |
@@ -32878,13 +33795,14 @@ | |
#ifdef SQLITE_NO_SYNC | |
return SQLITE_OK; | |
#else | |
- rc = FlushFileBuffers(pFile->h); | |
+ rc = osFlushFileBuffers(pFile->h); | |
SimulateIOError( rc=FALSE ); | |
if( rc ){ | |
return SQLITE_OK; | |
}else{ | |
- pFile->lastErrno = GetLastError(); | |
- return winLogError(SQLITE_IOERR_FSYNC, "winSync", pFile->zPath); | |
+ pFile->lastErrno = osGetLastError(); | |
+ return winLogError(SQLITE_IOERR_FSYNC, pFile->lastErrno, | |
+ "winSync", pFile->zPath); | |
} | |
#endif | |
} | |
@@ -32896,16 +33814,17 @@ | |
DWORD upperBits; | |
DWORD lowerBits; | |
winFile *pFile = (winFile*)id; | |
- DWORD error; | |
+ DWORD lastErrno; | |
assert( id!=0 ); | |
SimulateIOError(return SQLITE_IOERR_FSTAT); | |
- lowerBits = GetFileSize(pFile->h, &upperBits); | |
+ lowerBits = osGetFileSize(pFile->h, &upperBits); | |
if( (lowerBits == INVALID_FILE_SIZE) | |
- && ((error = GetLastError()) != NO_ERROR) ) | |
+ && ((lastErrno = osGetLastError())!=NO_ERROR) ) | |
{ | |
- pFile->lastErrno = error; | |
- return winLogError(SQLITE_IOERR_FSTAT, "winFileSize", pFile->zPath); | |
+ pFile->lastErrno = lastErrno; | |
+ return winLogError(SQLITE_IOERR_FSTAT, pFile->lastErrno, | |
+ "winFileSize", pFile->zPath); | |
} | |
*pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; | |
return SQLITE_OK; | |
@@ -32921,7 +33840,7 @@ | |
/* | |
** Acquire a reader lock. | |
** Different API routines are called depending on whether or not this | |
-** is Win95 or WinNT. | |
+** is Win9x or WinNT. | |
*/ | |
static int getReadLock(winFile *pFile){ | |
int res; | |
@@ -32930,8 +33849,8 @@ | |
ovlp.Offset = SHARED_FIRST; | |
ovlp.OffsetHigh = 0; | |
ovlp.hEvent = 0; | |
- res = LockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY, | |
- 0, SHARED_SIZE, 0, &ovlp); | |
+ res = osLockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY, | |
+ 0, SHARED_SIZE, 0, &ovlp); | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
@@ -32939,11 +33858,11 @@ | |
int lk; | |
sqlite3_randomness(sizeof(lk), &lk); | |
pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1)); | |
- res = LockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); | |
+ res = osLockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); | |
#endif | |
} | |
if( res == 0 ){ | |
- pFile->lastErrno = GetLastError(); | |
+ pFile->lastErrno = osGetLastError(); | |
/* No need to log a failure to lock */ | |
} | |
return res; | |
@@ -32954,18 +33873,20 @@ | |
*/ | |
static int unlockReadLock(winFile *pFile){ | |
int res; | |
+ DWORD lastErrno; | |
if( isNT() ){ | |
- res = UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
+ res = osUnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
- res = UnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); | |
+ res = osUnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); | |
#endif | |
} | |
- if( res==0 && GetLastError()!=ERROR_NOT_LOCKED ){ | |
- pFile->lastErrno = GetLastError(); | |
- winLogError(SQLITE_IOERR_UNLOCK, "unlockReadLock", pFile->zPath); | |
+ if( res==0 && ((lastErrno = osGetLastError())!=ERROR_NOT_LOCKED) ){ | |
+ pFile->lastErrno = lastErrno; | |
+ winLogError(SQLITE_IOERR_UNLOCK, pFile->lastErrno, | |
+ "unlockReadLock", pFile->zPath); | |
} | |
return res; | |
} | |
@@ -32998,11 +33919,11 @@ | |
*/ | |
static int winLock(sqlite3_file *id, int locktype){ | |
int rc = SQLITE_OK; /* Return code from subroutines */ | |
- int res = 1; /* Result of a windows lock call */ | |
+ int res = 1; /* Result of a Windows lock call */ | |
int newLocktype; /* Set pFile->locktype to this value before exiting */ | |
int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ | |
winFile *pFile = (winFile*)id; | |
- DWORD error = NO_ERROR; | |
+ DWORD lastErrno = NO_ERROR; | |
assert( id!=0 ); | |
OSTRACE(("LOCK %d %d was %d(%d)\n", | |
@@ -33032,16 +33953,19 @@ | |
&& (pFile->locktype==RESERVED_LOCK)) | |
){ | |
int cnt = 3; | |
- while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){ | |
- /* Try 3 times to get the pending lock. The pending lock might be | |
- ** held by another reader process who will release it momentarily. | |
+ while( cnt-->0 && (res = osLockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){ | |
+ /* Try 3 times to get the pending lock. This is needed to work | |
+ ** around problems caused by indexing and/or anti-virus software on | |
+ ** Windows systems. | |
+ ** If you are using this code as a model for alternative VFSes, do not | |
+ ** copy this retry logic. It is a hack intended for Windows only. | |
*/ | |
OSTRACE(("could not get a PENDING lock. cnt=%d\n", cnt)); | |
- Sleep(1); | |
+ if( cnt ) osSleep(1); | |
} | |
gotPendingLock = res; | |
if( !res ){ | |
- error = GetLastError(); | |
+ lastErrno = osGetLastError(); | |
} | |
} | |
@@ -33053,7 +33977,7 @@ | |
if( res ){ | |
newLocktype = SHARED_LOCK; | |
}else{ | |
- error = GetLastError(); | |
+ lastErrno = osGetLastError(); | |
} | |
} | |
@@ -33061,11 +33985,11 @@ | |
*/ | |
if( locktype==RESERVED_LOCK && res ){ | |
assert( pFile->locktype==SHARED_LOCK ); | |
- res = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
+ res = osLockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
if( res ){ | |
newLocktype = RESERVED_LOCK; | |
}else{ | |
- error = GetLastError(); | |
+ lastErrno = osGetLastError(); | |
} | |
} | |
@@ -33082,12 +34006,12 @@ | |
assert( pFile->locktype>=SHARED_LOCK ); | |
res = unlockReadLock(pFile); | |
OSTRACE(("unreadlock = %d\n", res)); | |
- res = LockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
+ res = osLockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
if( res ){ | |
newLocktype = EXCLUSIVE_LOCK; | |
}else{ | |
- error = GetLastError(); | |
- OSTRACE(("error-code = %d\n", error)); | |
+ lastErrno = osGetLastError(); | |
+ OSTRACE(("error-code = %d\n", lastErrno)); | |
getReadLock(pFile); | |
} | |
} | |
@@ -33096,7 +34020,7 @@ | |
** release it now. | |
*/ | |
if( gotPendingLock && locktype==SHARED_LOCK ){ | |
- UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); | |
+ osUnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); | |
} | |
/* Update the state of the lock has held in the file descriptor then | |
@@ -33107,7 +34031,7 @@ | |
}else{ | |
OSTRACE(("LOCK FAILED %d trying for %d but got %d\n", pFile->h, | |
locktype, newLocktype)); | |
- pFile->lastErrno = error; | |
+ pFile->lastErrno = lastErrno; | |
rc = SQLITE_BUSY; | |
} | |
pFile->locktype = (u8)newLocktype; | |
@@ -33130,9 +34054,9 @@ | |
rc = 1; | |
OSTRACE(("TEST WR-LOCK %d %d (local)\n", pFile->h, rc)); | |
}else{ | |
- rc = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
+ rc = osLockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
if( rc ){ | |
- UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
+ osUnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
} | |
rc = !rc; | |
OSTRACE(("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc)); | |
@@ -33162,27 +34086,44 @@ | |
pFile->locktype, pFile->sharedLockByte)); | |
type = pFile->locktype; | |
if( type>=EXCLUSIVE_LOCK ){ | |
- UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
+ osUnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); | |
if( locktype==SHARED_LOCK && !getReadLock(pFile) ){ | |
/* This should never happen. We should always be able to | |
** reacquire the read lock */ | |
- rc = winLogError(SQLITE_IOERR_UNLOCK, "winUnlock", pFile->zPath); | |
+ rc = winLogError(SQLITE_IOERR_UNLOCK, osGetLastError(), | |
+ "winUnlock", pFile->zPath); | |
} | |
} | |
if( type>=RESERVED_LOCK ){ | |
- UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
+ osUnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); | |
} | |
if( locktype==NO_LOCK && type>=SHARED_LOCK ){ | |
unlockReadLock(pFile); | |
} | |
if( type>=PENDING_LOCK ){ | |
- UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); | |
+ osUnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); | |
} | |
pFile->locktype = (u8)locktype; | |
return rc; | |
} | |
/* | |
+** If *pArg is inititially negative then this is a query. Set *pArg to | |
+** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. | |
+** | |
+** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. | |
+*/ | |
+static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ | |
+ if( *pArg<0 ){ | |
+ *pArg = (pFile->ctrlFlags & mask)!=0; | |
+ }else if( (*pArg)==0 ){ | |
+ pFile->ctrlFlags &= ~mask; | |
+ }else{ | |
+ pFile->ctrlFlags |= mask; | |
+ } | |
+} | |
+ | |
+/* | |
** Control and query of the open file handle. | |
*/ | |
static int winFileControl(sqlite3_file *id, int op, void *pArg){ | |
@@ -33217,15 +34158,15 @@ | |
return SQLITE_OK; | |
} | |
case SQLITE_FCNTL_PERSIST_WAL: { | |
- int bPersist = *(int*)pArg; | |
- if( bPersist<0 ){ | |
- *(int*)pArg = pFile->bPersistWal; | |
- }else{ | |
- pFile->bPersistWal = bPersist!=0; | |
- } | |
+ winModeBit(pFile, WINFILE_PERSIST_WAL, (int*)pArg); | |
return SQLITE_OK; | |
} | |
- case SQLITE_FCNTL_SYNC_OMITTED: { | |
+ case SQLITE_FCNTL_POWERSAFE_OVERWRITE: { | |
+ winModeBit(pFile, WINFILE_PSOW, (int*)pArg); | |
+ return SQLITE_OK; | |
+ } | |
+ case SQLITE_FCNTL_VFSNAME: { | |
+ *(char**)pArg = sqlite3_mprintf("win32"); | |
return SQLITE_OK; | |
} | |
case SQLITE_FCNTL_WIN32_AV_RETRY: { | |
@@ -33257,16 +34198,17 @@ | |
** same for both. | |
*/ | |
static int winSectorSize(sqlite3_file *id){ | |
- assert( id!=0 ); | |
- return (int)(((winFile*)id)->sectorSize); | |
+ (void)id; | |
+ return SQLITE_DEFAULT_SECTOR_SIZE; | |
} | |
/* | |
** Return a vector of device characteristics. | |
*/ | |
static int winDeviceCharacteristics(sqlite3_file *id){ | |
- UNUSED_PARAMETER(id); | |
- return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN; | |
+ winFile *p = (winFile*)id; | |
+ return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | | |
+ ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); | |
} | |
#ifndef SQLITE_OMIT_WAL | |
@@ -33413,15 +34355,15 @@ | |
/* Release/Acquire the system-level lock */ | |
if( lockType==_SHM_UNLCK ){ | |
- rc = UnlockFileEx(pFile->hFile.h, 0, nByte, 0, &ovlp); | |
+ rc = osUnlockFileEx(pFile->hFile.h, 0, nByte, 0, &ovlp); | |
}else{ | |
- rc = LockFileEx(pFile->hFile.h, dwFlags, 0, nByte, 0, &ovlp); | |
+ rc = osLockFileEx(pFile->hFile.h, dwFlags, 0, nByte, 0, &ovlp); | |
} | |
if( rc!= 0 ){ | |
rc = SQLITE_OK; | |
}else{ | |
- pFile->lastErrno = GetLastError(); | |
+ pFile->lastErrno = osGetLastError(); | |
rc = SQLITE_BUSY; | |
} | |
@@ -33455,13 +34397,13 @@ | |
int i; | |
if( p->mutex ) sqlite3_mutex_free(p->mutex); | |
for(i=0; i<p->nRegion; i++){ | |
- bRc = UnmapViewOfFile(p->aRegion[i].pMap); | |
+ bRc = osUnmapViewOfFile(p->aRegion[i].pMap); | |
OSTRACE(("SHM-PURGE pid-%d unmap region=%d %s\n", | |
- (int)GetCurrentProcessId(), i, | |
+ (int)osGetCurrentProcessId(), i, | |
bRc ? "ok" : "failed")); | |
- bRc = CloseHandle(p->aRegion[i].hMap); | |
+ bRc = osCloseHandle(p->aRegion[i].hMap); | |
OSTRACE(("SHM-PURGE pid-%d close region=%d %s\n", | |
- (int)GetCurrentProcessId(), i, | |
+ (int)osGetCurrentProcessId(), i, | |
bRc ? "ok" : "failed")); | |
} | |
if( p->hFile.h != INVALID_HANDLE_VALUE ){ | |
@@ -33471,7 +34413,9 @@ | |
} | |
if( deleteFlag ){ | |
SimulateIOErrorBenign(1); | |
+ sqlite3BeginBenignMalloc(); | |
winDelete(pVfs, p->zFilename, 0); | |
+ sqlite3EndBenignMalloc(); | |
SimulateIOErrorBenign(0); | |
} | |
*pp = p->pNext; | |
@@ -33503,15 +34447,15 @@ | |
** allocate space for a new winShmNode and filename. | |
*/ | |
p = sqlite3_malloc( sizeof(*p) ); | |
- if( p==0 ) return SQLITE_NOMEM; | |
+ if( p==0 ) return SQLITE_IOERR_NOMEM; | |
memset(p, 0, sizeof(*p)); | |
nName = sqlite3Strlen30(pDbFd->zPath); | |
- pNew = sqlite3_malloc( sizeof(*pShmNode) + nName + 15 ); | |
+ pNew = sqlite3_malloc( sizeof(*pShmNode) + nName + 17 ); | |
if( pNew==0 ){ | |
sqlite3_free(p); | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
- memset(pNew, 0, sizeof(*pNew)); | |
+ memset(pNew, 0, sizeof(*pNew) + nName + 17); | |
pNew->zFilename = (char*)&pNew[1]; | |
sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); | |
sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); | |
@@ -33537,7 +34481,7 @@ | |
pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); | |
if( pShmNode->mutex==0 ){ | |
- rc = SQLITE_NOMEM; | |
+ rc = SQLITE_IOERR_NOMEM; | |
goto shm_open_err; | |
} | |
@@ -33547,7 +34491,6 @@ | |
SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, /* Mode flags */ | |
0); | |
if( SQLITE_OK!=rc ){ | |
- rc = SQLITE_CANTOPEN_BKPT; | |
goto shm_open_err; | |
} | |
@@ -33557,7 +34500,8 @@ | |
if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){ | |
rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0); | |
if( rc!=SQLITE_OK ){ | |
- rc = winLogError(SQLITE_IOERR_SHMOPEN, "winOpenShm", pDbFd->zPath); | |
+ rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), | |
+ "winOpenShm", pDbFd->zPath); | |
} | |
} | |
if( rc==SQLITE_OK ){ | |
@@ -33742,7 +34686,7 @@ | |
} | |
sqlite3_mutex_leave(pShmNode->mutex); | |
OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x %s\n", | |
- p->id, (int)GetCurrentProcessId(), p->sharedMask, p->exclMask, | |
+ p->id, (int)osGetCurrentProcessId(), p->sharedMask, p->exclMask, | |
rc ? "failed" : "ok")); | |
return rc; | |
} | |
@@ -33816,7 +34760,8 @@ | |
*/ | |
rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz); | |
if( rc!=SQLITE_OK ){ | |
- rc = winLogError(SQLITE_IOERR_SHMSIZE, "winShmMap1", pDbFd->zPath); | |
+ rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), | |
+ "winShmMap1", pDbFd->zPath); | |
goto shmpage_out; | |
} | |
@@ -33830,7 +34775,8 @@ | |
if( !isWrite ) goto shmpage_out; | |
rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte); | |
if( rc!=SQLITE_OK ){ | |
- rc = winLogError(SQLITE_IOERR_SHMSIZE, "winShmMap2", pDbFd->zPath); | |
+ rc = winLogError(SQLITE_IOERR_SHMSIZE, osGetLastError(), | |
+ "winShmMap2", pDbFd->zPath); | |
goto shmpage_out; | |
} | |
} | |
@@ -33849,26 +34795,27 @@ | |
HANDLE hMap; /* file-mapping handle */ | |
void *pMap = 0; /* Mapped memory region */ | |
- hMap = CreateFileMapping(pShmNode->hFile.h, | |
+ hMap = osCreateFileMapping(pShmNode->hFile.h, | |
NULL, PAGE_READWRITE, 0, nByte, NULL | |
); | |
OSTRACE(("SHM-MAP pid-%d create region=%d nbyte=%d %s\n", | |
- (int)GetCurrentProcessId(), pShmNode->nRegion, nByte, | |
+ (int)osGetCurrentProcessId(), pShmNode->nRegion, nByte, | |
hMap ? "ok" : "failed")); | |
if( hMap ){ | |
int iOffset = pShmNode->nRegion*szRegion; | |
int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; | |
- pMap = MapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, | |
+ pMap = osMapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, | |
0, iOffset - iOffsetShift, szRegion + iOffsetShift | |
); | |
OSTRACE(("SHM-MAP pid-%d map region=%d offset=%d size=%d %s\n", | |
- (int)GetCurrentProcessId(), pShmNode->nRegion, iOffset, szRegion, | |
- pMap ? "ok" : "failed")); | |
+ (int)osGetCurrentProcessId(), pShmNode->nRegion, iOffset, | |
+ szRegion, pMap ? "ok" : "failed")); | |
} | |
if( !pMap ){ | |
- pShmNode->lastErrno = GetLastError(); | |
- rc = winLogError(SQLITE_IOERR_SHMMAP, "winShmMap3", pDbFd->zPath); | |
- if( hMap ) CloseHandle(hMap); | |
+ pShmNode->lastErrno = osGetLastError(); | |
+ rc = winLogError(SQLITE_IOERR_SHMMAP, pShmNode->lastErrno, | |
+ "winShmMap3", pDbFd->zPath); | |
+ if( hMap ) osCloseHandle(hMap); | |
goto shmpage_out; | |
} | |
@@ -33966,7 +34913,7 @@ | |
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" | |
"0123456789"; | |
size_t i, j; | |
- char zTempPath[MAX_PATH+1]; | |
+ char zTempPath[MAX_PATH+2]; | |
/* It's odd to simulate an io-error here, but really this is just | |
** using the io-error infrastructure to test that SQLite handles this | |
@@ -33979,29 +34926,29 @@ | |
}else if( isNT() ){ | |
char *zMulti; | |
WCHAR zWidePath[MAX_PATH]; | |
- GetTempPathW(MAX_PATH-30, zWidePath); | |
+ osGetTempPathW(MAX_PATH-30, zWidePath); | |
zMulti = unicodeToUtf8(zWidePath); | |
if( zMulti ){ | |
sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti); | |
- free(zMulti); | |
+ sqlite3_free(zMulti); | |
}else{ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
char *zUtf8; | |
char zMbcsPath[MAX_PATH]; | |
- GetTempPathA(MAX_PATH-30, zMbcsPath); | |
+ osGetTempPathA(MAX_PATH-30, zMbcsPath); | |
zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath); | |
if( zUtf8 ){ | |
sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8); | |
- free(zUtf8); | |
+ sqlite3_free(zUtf8); | |
}else{ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
#endif | |
} | |
@@ -34009,14 +34956,14 @@ | |
/* Check that the output buffer is large enough for the temporary file | |
** name. If it is not, return SQLITE_ERROR. | |
*/ | |
- if( (sqlite3Strlen30(zTempPath) + sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX) + 17) >= nBuf ){ | |
+ if( (sqlite3Strlen30(zTempPath) + sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX) + 18) >= nBuf ){ | |
return SQLITE_ERROR; | |
} | |
for(i=sqlite3Strlen30(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){} | |
zTempPath[i] = 0; | |
- sqlite3_snprintf(nBuf-17, zBuf, | |
+ sqlite3_snprintf(nBuf-18, zBuf, | |
"%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath); | |
j = sqlite3Strlen30(zBuf); | |
sqlite3_randomness(15, &zBuf[j]); | |
@@ -34024,6 +34971,7 @@ | |
zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; | |
} | |
zBuf[j] = 0; | |
+ zBuf[j+1] = 0; | |
OSTRACE(("TEMP FILENAME: %s\n", zBuf)); | |
return SQLITE_OK; | |
@@ -34040,6 +34988,7 @@ | |
int *pOutFlags /* Status return flags */ | |
){ | |
HANDLE h; | |
+ DWORD lastErrno; | |
DWORD dwDesiredAccess; | |
DWORD dwShareMode; | |
DWORD dwCreationDisposition; | |
@@ -34055,7 +35004,7 @@ | |
/* If argument zPath is a NULL pointer, this function is required to open | |
** a temporary file. Use this buffer to store the file name in. | |
*/ | |
- char zTmpname[MAX_PATH+1]; /* Buffer used to create temp filename */ | |
+ char zTmpname[MAX_PATH+2]; /* Buffer used to create temp filename */ | |
int rc = SQLITE_OK; /* Function Return Code */ | |
#if !defined(NDEBUG) || SQLITE_OS_WINCE | |
@@ -34114,17 +35063,24 @@ | |
*/ | |
if( !zUtf8Name ){ | |
assert(isDelete && !isOpenJournal); | |
- rc = getTempname(MAX_PATH+1, zTmpname); | |
+ rc = getTempname(MAX_PATH+2, zTmpname); | |
if( rc!=SQLITE_OK ){ | |
return rc; | |
} | |
zUtf8Name = zTmpname; | |
} | |
+ /* Database filenames are double-zero terminated if they are not | |
+ ** URIs with parameters. Hence, they can always be passed into | |
+ ** sqlite3_uri_parameter(). | |
+ */ | |
+ assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) || | |
+ zUtf8Name[strlen(zUtf8Name)+1]==0 ); | |
+ | |
/* Convert the filename to the system encoding. */ | |
zConverted = convertUtf8Filename(zUtf8Name); | |
if( zConverted==0 ){ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
if( isReadWrite ){ | |
@@ -34170,26 +35126,26 @@ | |
#endif | |
if( isNT() ){ | |
- while( (h = CreateFileW((WCHAR*)zConverted, | |
- dwDesiredAccess, | |
- dwShareMode, NULL, | |
- dwCreationDisposition, | |
- dwFlagsAndAttributes, | |
- NULL))==INVALID_HANDLE_VALUE && | |
- retryIoerr(&cnt) ){} | |
+ while( (h = osCreateFileW((LPCWSTR)zConverted, | |
+ dwDesiredAccess, | |
+ dwShareMode, NULL, | |
+ dwCreationDisposition, | |
+ dwFlagsAndAttributes, | |
+ NULL))==INVALID_HANDLE_VALUE && | |
+ retryIoerr(&cnt, &lastErrno) ){} | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
- while( (h = CreateFileA((char*)zConverted, | |
- dwDesiredAccess, | |
- dwShareMode, NULL, | |
- dwCreationDisposition, | |
- dwFlagsAndAttributes, | |
- NULL))==INVALID_HANDLE_VALUE && | |
- retryIoerr(&cnt) ){} | |
+ while( (h = osCreateFileA((LPCSTR)zConverted, | |
+ dwDesiredAccess, | |
+ dwShareMode, NULL, | |
+ dwCreationDisposition, | |
+ dwFlagsAndAttributes, | |
+ NULL))==INVALID_HANDLE_VALUE && | |
+ retryIoerr(&cnt, &lastErrno) ){} | |
#endif | |
} | |
@@ -34200,9 +35156,9 @@ | |
h==INVALID_HANDLE_VALUE ? "failed" : "ok")); | |
if( h==INVALID_HANDLE_VALUE ){ | |
- pFile->lastErrno = GetLastError(); | |
- winLogError(SQLITE_CANTOPEN, "winOpen", zUtf8Name); | |
- free(zConverted); | |
+ pFile->lastErrno = lastErrno; | |
+ winLogError(SQLITE_CANTOPEN, pFile->lastErrno, "winOpen", zUtf8Name); | |
+ sqlite3_free(zConverted); | |
if( isReadWrite && !isExclusive ){ | |
return winOpen(pVfs, zName, id, | |
((flags|SQLITE_OPEN_READONLY)&~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), pOutFlags); | |
@@ -34226,14 +35182,16 @@ | |
pFile->pVfs = pVfs; | |
pFile->pShm = 0; | |
pFile->zPath = zName; | |
- pFile->sectorSize = getSectorSize(pVfs, zUtf8Name); | |
+ if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){ | |
+ pFile->ctrlFlags |= WINFILE_PSOW; | |
+ } | |
#if SQLITE_OS_WINCE | |
if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB | |
&& !winceCreateLock(zName, pFile) | |
){ | |
- CloseHandle(h); | |
- free(zConverted); | |
+ osCloseHandle(h); | |
+ sqlite3_free(zConverted); | |
return SQLITE_CANTOPEN_BKPT; | |
} | |
if( isTemp ){ | |
@@ -34241,7 +35199,7 @@ | |
}else | |
#endif | |
{ | |
- free(zConverted); | |
+ sqlite3_free(zConverted); | |
} | |
OpenCounter(+1); | |
@@ -34251,7 +35209,7 @@ | |
/* | |
** Delete the named file. | |
** | |
-** Note that windows does not allow a file to be deleted if some other | |
+** Note that Windows does not allow a file to be deleted if some other | |
** process has it open. Sometimes a virus scanner or indexing program | |
** will open a journal file shortly after it is created in order to do | |
** whatever it does. While this other process is holding the | |
@@ -34267,6 +35225,7 @@ | |
){ | |
int cnt = 0; | |
int rc; | |
+ DWORD lastErrno; | |
void *zConverted; | |
UNUSED_PARAMETER(pVfs); | |
UNUSED_PARAMETER(syncDir); | |
@@ -34274,31 +35233,32 @@ | |
SimulateIOError(return SQLITE_IOERR_DELETE); | |
zConverted = convertUtf8Filename(zFilename); | |
if( zConverted==0 ){ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
if( isNT() ){ | |
rc = 1; | |
- while( GetFileAttributesW(zConverted)!=INVALID_FILE_ATTRIBUTES && | |
- (rc = DeleteFileW(zConverted))==0 && retryIoerr(&cnt) ){} | |
+ while( osGetFileAttributesW(zConverted)!=INVALID_FILE_ATTRIBUTES && | |
+ (rc = osDeleteFileW(zConverted))==0 && retryIoerr(&cnt, &lastErrno) ){} | |
rc = rc ? SQLITE_OK : SQLITE_ERROR; | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
rc = 1; | |
- while( GetFileAttributesA(zConverted)!=INVALID_FILE_ATTRIBUTES && | |
- (rc = DeleteFileA(zConverted))==0 && retryIoerr(&cnt) ){} | |
+ while( osGetFileAttributesA(zConverted)!=INVALID_FILE_ATTRIBUTES && | |
+ (rc = osDeleteFileA(zConverted))==0 && retryIoerr(&cnt, &lastErrno) ){} | |
rc = rc ? SQLITE_OK : SQLITE_ERROR; | |
#endif | |
} | |
if( rc ){ | |
- rc = winLogError(SQLITE_IOERR_DELETE, "winDelete", zFilename); | |
+ rc = winLogError(SQLITE_IOERR_DELETE, lastErrno, | |
+ "winDelete", zFilename); | |
}else{ | |
logIoerr(cnt); | |
} | |
- free(zConverted); | |
+ sqlite3_free(zConverted); | |
OSTRACE(("DELETE \"%s\" %s\n", zFilename, (rc ? "failed" : "ok" ))); | |
return rc; | |
} | |
@@ -34314,21 +35274,22 @@ | |
){ | |
DWORD attr; | |
int rc = 0; | |
+ DWORD lastErrno; | |
void *zConverted; | |
UNUSED_PARAMETER(pVfs); | |
SimulateIOError( return SQLITE_IOERR_ACCESS; ); | |
zConverted = convertUtf8Filename(zFilename); | |
if( zConverted==0 ){ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
if( isNT() ){ | |
int cnt = 0; | |
WIN32_FILE_ATTRIBUTE_DATA sAttrData; | |
memset(&sAttrData, 0, sizeof(sAttrData)); | |
- while( !(rc = GetFileAttributesExW((WCHAR*)zConverted, | |
+ while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, | |
GetFileExInfoStandard, | |
- &sAttrData)) && retryIoerr(&cnt) ){} | |
+ &sAttrData)) && retryIoerr(&cnt, &lastErrno) ){} | |
if( rc ){ | |
/* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file | |
** as if it does not exist. | |
@@ -34342,24 +35303,24 @@ | |
} | |
}else{ | |
logIoerr(cnt); | |
- if( GetLastError()!=ERROR_FILE_NOT_FOUND ){ | |
- winLogError(SQLITE_IOERR_ACCESS, "winAccess", zFilename); | |
- free(zConverted); | |
+ if( lastErrno!=ERROR_FILE_NOT_FOUND ){ | |
+ winLogError(SQLITE_IOERR_ACCESS, lastErrno, "winAccess", zFilename); | |
+ sqlite3_free(zConverted); | |
return SQLITE_IOERR_ACCESS; | |
}else{ | |
attr = INVALID_FILE_ATTRIBUTES; | |
} | |
} | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
- attr = GetFileAttributesA((char*)zConverted); | |
+ attr = osGetFileAttributesA((char*)zConverted); | |
#endif | |
} | |
- free(zConverted); | |
+ sqlite3_free(zConverted); | |
switch( flags ){ | |
case SQLITE_ACCESS_READ: | |
case SQLITE_ACCESS_EXISTS: | |
@@ -34424,117 +35385,50 @@ | |
SimulateIOError( return SQLITE_ERROR ); | |
UNUSED_PARAMETER(nFull); | |
zConverted = convertUtf8Filename(zRelative); | |
+ if( zConverted==0 ){ | |
+ return SQLITE_IOERR_NOMEM; | |
+ } | |
if( isNT() ){ | |
- WCHAR *zTemp; | |
- nByte = GetFullPathNameW((WCHAR*)zConverted, 0, 0, 0) + 3; | |
- zTemp = malloc( nByte*sizeof(zTemp[0]) ); | |
+ LPWSTR zTemp; | |
+ nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0) + 3; | |
+ zTemp = sqlite3_malloc( nByte*sizeof(zTemp[0]) ); | |
if( zTemp==0 ){ | |
- free(zConverted); | |
- return SQLITE_NOMEM; | |
+ sqlite3_free(zConverted); | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
- GetFullPathNameW((WCHAR*)zConverted, nByte, zTemp, 0); | |
- free(zConverted); | |
+ osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); | |
+ sqlite3_free(zConverted); | |
zOut = unicodeToUtf8(zTemp); | |
- free(zTemp); | |
+ sqlite3_free(zTemp); | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
char *zTemp; | |
- nByte = GetFullPathNameA((char*)zConverted, 0, 0, 0) + 3; | |
- zTemp = malloc( nByte*sizeof(zTemp[0]) ); | |
+ nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0) + 3; | |
+ zTemp = sqlite3_malloc( nByte*sizeof(zTemp[0]) ); | |
if( zTemp==0 ){ | |
- free(zConverted); | |
- return SQLITE_NOMEM; | |
+ sqlite3_free(zConverted); | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
- GetFullPathNameA((char*)zConverted, nByte, zTemp, 0); | |
- free(zConverted); | |
+ osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); | |
+ sqlite3_free(zConverted); | |
zOut = sqlite3_win32_mbcs_to_utf8(zTemp); | |
- free(zTemp); | |
+ sqlite3_free(zTemp); | |
#endif | |
} | |
if( zOut ){ | |
sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zOut); | |
- free(zOut); | |
+ sqlite3_free(zOut); | |
return SQLITE_OK; | |
}else{ | |
- return SQLITE_NOMEM; | |
+ return SQLITE_IOERR_NOMEM; | |
} | |
#endif | |
} | |
-/* | |
-** Get the sector size of the device used to store | |
-** file. | |
-*/ | |
-static int getSectorSize( | |
- sqlite3_vfs *pVfs, | |
- const char *zRelative /* UTF-8 file name */ | |
-){ | |
- DWORD bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE; | |
- /* GetDiskFreeSpace is not supported under WINCE */ | |
-#if SQLITE_OS_WINCE | |
- UNUSED_PARAMETER(pVfs); | |
- UNUSED_PARAMETER(zRelative); | |
-#else | |
- char zFullpath[MAX_PATH+1]; | |
- int rc; | |
- DWORD dwRet = 0; | |
- DWORD dwDummy; | |
- | |
- /* | |
- ** We need to get the full path name of the file | |
- ** to get the drive letter to look up the sector | |
- ** size. | |
- */ | |
- SimulateIOErrorBenign(1); | |
- rc = winFullPathname(pVfs, zRelative, MAX_PATH, zFullpath); | |
- SimulateIOErrorBenign(0); | |
- if( rc == SQLITE_OK ) | |
- { | |
- void *zConverted = convertUtf8Filename(zFullpath); | |
- if( zConverted ){ | |
- if( isNT() ){ | |
- /* trim path to just drive reference */ | |
- WCHAR *p = zConverted; | |
- for(;*p;p++){ | |
- if( *p == '\\' ){ | |
- *p = '\0'; | |
- break; | |
- } | |
- } | |
- dwRet = GetDiskFreeSpaceW((WCHAR*)zConverted, | |
- &dwDummy, | |
- &bytesPerSector, | |
- &dwDummy, | |
- &dwDummy); | |
- }else{ | |
- /* trim path to just drive reference */ | |
- char *p = (char *)zConverted; | |
- for(;*p;p++){ | |
- if( *p == '\\' ){ | |
- *p = '\0'; | |
- break; | |
- } | |
- } | |
- dwRet = GetDiskFreeSpaceA((char*)zConverted, | |
- &dwDummy, | |
- &bytesPerSector, | |
- &dwDummy, | |
- &dwDummy); | |
- } | |
- free(zConverted); | |
- } | |
- if( !dwRet ){ | |
- bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE; | |
- } | |
- } | |
-#endif | |
- return (int) bytesPerSector; | |
-} | |
- | |
#ifndef SQLITE_OMIT_LOAD_EXTENSION | |
/* | |
** Interfaces for opening a shared library, finding entry points | |
@@ -34552,37 +35446,30 @@ | |
return 0; | |
} | |
if( isNT() ){ | |
- h = LoadLibraryW((WCHAR*)zConverted); | |
+ h = osLoadLibraryW((LPCWSTR)zConverted); | |
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. | |
-** Since the ASCII version of these Windows API do not exist for WINCE, | |
+** Since the ANSI version of these Windows API do not exist for WINCE, | |
** it's important to not reference them for WINCE builds. | |
*/ | |
#if SQLITE_OS_WINCE==0 | |
}else{ | |
- h = LoadLibraryA((char*)zConverted); | |
+ h = osLoadLibraryA((char*)zConverted); | |
#endif | |
} | |
- free(zConverted); | |
+ sqlite3_free(zConverted); | |
return (void*)h; | |
} | |
static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ | |
UNUSED_PARAMETER(pVfs); | |
- getLastErrorMsg(nBuf, zBufOut); | |
+ getLastErrorMsg(osGetLastError(), nBuf, zBufOut); | |
} | |
static void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){ | |
UNUSED_PARAMETER(pVfs); | |
-#if SQLITE_OS_WINCE | |
- /* The GetProcAddressA() routine is only available on wince. */ | |
- return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol); | |
-#else | |
- /* All other windows platforms expect GetProcAddress() to take | |
- ** an Ansi string regardless of the _UNICODE setting */ | |
- return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol); | |
-#endif | |
+ return (void(*)(void))osGetProcAddressA((HANDLE)pHandle, zSymbol); | |
} | |
static void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ | |
UNUSED_PARAMETER(pVfs); | |
- FreeLibrary((HANDLE)pHandle); | |
+ osFreeLibrary((HANDLE)pHandle); | |
} | |
#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ | |
#define winDlOpen 0 | |
@@ -34604,23 +35491,23 @@ | |
#else | |
if( sizeof(SYSTEMTIME)<=nBuf-n ){ | |
SYSTEMTIME x; | |
- GetSystemTime(&x); | |
+ osGetSystemTime(&x); | |
memcpy(&zBuf[n], &x, sizeof(x)); | |
n += sizeof(x); | |
} | |
if( sizeof(DWORD)<=nBuf-n ){ | |
- DWORD pid = GetCurrentProcessId(); | |
+ DWORD pid = osGetCurrentProcessId(); | |
memcpy(&zBuf[n], &pid, sizeof(pid)); | |
n += sizeof(pid); | |
} | |
if( sizeof(DWORD)<=nBuf-n ){ | |
- DWORD cnt = GetTickCount(); | |
+ DWORD cnt = osGetTickCount(); | |
memcpy(&zBuf[n], &cnt, sizeof(cnt)); | |
n += sizeof(cnt); | |
} | |
if( sizeof(LARGE_INTEGER)<=nBuf-n ){ | |
LARGE_INTEGER i; | |
- QueryPerformanceCounter(&i); | |
+ osQueryPerformanceCounter(&i); | |
memcpy(&zBuf[n], &i, sizeof(i)); | |
n += sizeof(i); | |
} | |
@@ -34633,7 +35520,7 @@ | |
** Sleep for a little while. Return the amount of time slept. | |
*/ | |
static int winSleep(sqlite3_vfs *pVfs, int microsec){ | |
- Sleep((microsec+999)/1000); | |
+ osSleep((microsec+999)/1000); | |
UNUSED_PARAMETER(pVfs); | |
return ((microsec+999)/1000)*1000; | |
} | |
@@ -34672,13 +35559,13 @@ | |
#if SQLITE_OS_WINCE | |
SYSTEMTIME time; | |
- GetSystemTime(&time); | |
+ osGetSystemTime(&time); | |
/* if SystemTimeToFileTime() fails, it returns zero. */ | |
- if (!SystemTimeToFileTime(&time,&ft)){ | |
+ if (!osSystemTimeToFileTime(&time,&ft)){ | |
return SQLITE_ERROR; | |
} | |
#else | |
- GetSystemTimeAsFileTime( &ft ); | |
+ osGetSystemTimeAsFileTime( &ft ); | |
#endif | |
*piNow = winFiletimeEpoch + | |
@@ -34711,8 +35598,8 @@ | |
/* | |
** The idea is that this function works like a combination of | |
-** GetLastError() and FormatMessage() on windows (or errno and | |
-** strerror_r() on unix). After an error is returned by an OS | |
+** GetLastError() and FormatMessage() on Windows (or errno and | |
+** strerror_r() on Unix). After an error is returned by an OS | |
** function, SQLite calls this function with zBuf pointing to | |
** a buffer of nBuf bytes. The OS layer should populate the | |
** buffer with a nul-terminated UTF-8 encoded error message | |
@@ -34741,11 +35628,9 @@ | |
*/ | |
static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ | |
UNUSED_PARAMETER(pVfs); | |
- return getLastErrorMsg(nBuf, zBuf); | |
+ return getLastErrorMsg(osGetLastError(), nBuf, zBuf); | |
} | |
- | |
- | |
/* | |
** Initialize and deinitialize the operating system interface. | |
*/ | |
@@ -34770,21 +35655,26 @@ | |
winCurrentTime, /* xCurrentTime */ | |
winGetLastError, /* xGetLastError */ | |
winCurrentTimeInt64, /* xCurrentTimeInt64 */ | |
- 0, /* xSetSystemCall */ | |
- 0, /* xGetSystemCall */ | |
- 0, /* xNextSystemCall */ | |
+ winSetSystemCall, /* xSetSystemCall */ | |
+ winGetSystemCall, /* xGetSystemCall */ | |
+ winNextSystemCall, /* xNextSystemCall */ | |
}; | |
+ /* Double-check that the aSyscall[] array has been constructed | |
+ ** correctly. See ticket [bb3a86e890c8e96ab] */ | |
+ assert( ArraySize(aSyscall)==60 ); | |
+ | |
#ifndef SQLITE_OMIT_WAL | |
/* get memory map allocation granularity */ | |
memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); | |
- GetSystemInfo(&winSysInfo); | |
+ osGetSystemInfo(&winSysInfo); | |
assert(winSysInfo.dwAllocationGranularity > 0); | |
#endif | |
sqlite3_vfs_register(&winVfs, 1); | |
return SQLITE_OK; | |
} | |
+ | |
SQLITE_API int sqlite3_os_end(void){ | |
return SQLITE_OK; | |
} | |
@@ -35224,7 +36114,7 @@ | |
PgHdr *pDirty, *pDirtyTail; /* List of dirty pages in LRU order */ | |
PgHdr *pSynced; /* Last synced page in dirty page list */ | |
int nRef; /* Number of referenced pages */ | |
- int nMax; /* Configured cache size */ | |
+ int szCache; /* Configured cache size */ | |
int szPage; /* Size of every page in this cache */ | |
int szExtra; /* Size of extra space for each page */ | |
int bPurgeable; /* True if pages are on backing store */ | |
@@ -35335,7 +36225,7 @@ | |
if( p->pgno==1 ){ | |
pCache->pPage1 = 0; | |
} | |
- sqlite3GlobalConfig.pcache.xUnpin(pCache->pCache, p, 0); | |
+ sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, p->pPage, 0); | |
} | |
} | |
@@ -35345,18 +36235,18 @@ | |
** functions are threadsafe. | |
*/ | |
SQLITE_PRIVATE int sqlite3PcacheInitialize(void){ | |
- if( sqlite3GlobalConfig.pcache.xInit==0 ){ | |
+ if( sqlite3GlobalConfig.pcache2.xInit==0 ){ | |
/* IMPLEMENTATION-OF: R-26801-64137 If the xInit() method is NULL, then the | |
** built-in default page cache is used instead of the application defined | |
** page cache. */ | |
sqlite3PCacheSetDefault(); | |
} | |
- return sqlite3GlobalConfig.pcache.xInit(sqlite3GlobalConfig.pcache.pArg); | |
+ return sqlite3GlobalConfig.pcache2.xInit(sqlite3GlobalConfig.pcache2.pArg); | |
} | |
SQLITE_PRIVATE void sqlite3PcacheShutdown(void){ | |
- if( sqlite3GlobalConfig.pcache.xShutdown ){ | |
+ if( sqlite3GlobalConfig.pcache2.xShutdown ){ | |
/* IMPLEMENTATION-OF: R-26000-56589 The xShutdown() method may be NULL. */ | |
- sqlite3GlobalConfig.pcache.xShutdown(sqlite3GlobalConfig.pcache.pArg); | |
+ sqlite3GlobalConfig.pcache2.xShutdown(sqlite3GlobalConfig.pcache2.pArg); | |
} | |
} | |
@@ -35385,7 +36275,7 @@ | |
p->bPurgeable = bPurgeable; | |
p->xStress = xStress; | |
p->pStress = pStress; | |
- p->nMax = 100; | |
+ p->szCache = 100; | |
} | |
/* | |
@@ -35395,7 +36285,7 @@ | |
SQLITE_PRIVATE void sqlite3PcacheSetPageSize(PCache *pCache, int szPage){ | |
assert( pCache->nRef==0 && pCache->pDirty==0 ); | |
if( pCache->pCache ){ | |
- sqlite3GlobalConfig.pcache.xDestroy(pCache->pCache); | |
+ sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); | |
pCache->pCache = 0; | |
pCache->pPage1 = 0; | |
} | |
@@ -35403,6 +36293,17 @@ | |
} | |
/* | |
+** Compute the number of pages of cache requested. | |
+*/ | |
+static int numberOfCachePages(PCache *p){ | |
+ if( p->szCache>=0 ){ | |
+ return p->szCache; | |
+ }else{ | |
+ return (int)((-1024*(i64)p->szCache)/(p->szPage+p->szExtra)); | |
+ } | |
+} | |
+ | |
+/* | |
** Try to obtain a page from the cache. | |
*/ | |
SQLITE_PRIVATE int sqlite3PcacheFetch( | |
@@ -35411,7 +36312,8 @@ | |
int createFlag, /* If true, create page if it does not exist already */ | |
PgHdr **ppPage /* Write the page here */ | |
){ | |
- PgHdr *pPage = 0; | |
+ sqlite3_pcache_page *pPage = 0; | |
+ PgHdr *pPgHdr = 0; | |
int eCreate; | |
assert( pCache!=0 ); | |
@@ -35423,19 +36325,19 @@ | |
*/ | |
if( !pCache->pCache && createFlag ){ | |
sqlite3_pcache *p; | |
- int nByte; | |
- nByte = pCache->szPage + pCache->szExtra + sizeof(PgHdr); | |
- p = sqlite3GlobalConfig.pcache.xCreate(nByte, pCache->bPurgeable); | |
+ p = sqlite3GlobalConfig.pcache2.xCreate( | |
+ pCache->szPage, pCache->szExtra + sizeof(PgHdr), pCache->bPurgeable | |
+ ); | |
if( !p ){ | |
return SQLITE_NOMEM; | |
} | |
- sqlite3GlobalConfig.pcache.xCachesize(p, pCache->nMax); | |
+ sqlite3GlobalConfig.pcache2.xCachesize(p, numberOfCachePages(pCache)); | |
pCache->pCache = p; | |
} | |
eCreate = createFlag * (1 + (!pCache->bPurgeable || !pCache->pDirty)); | |
if( pCache->pCache ){ | |
- pPage = sqlite3GlobalConfig.pcache.xFetch(pCache->pCache, pgno, eCreate); | |
+ pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, eCreate); | |
} | |
if( !pPage && eCreate==1 ){ | |
@@ -35462,7 +36364,7 @@ | |
"spill page %d making room for %d - cache used: %d/%d", | |
pPg->pgno, pgno, | |
sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache), | |
- pCache->nMax); | |
+ numberOfCachePages(pCache)); | |
#endif | |
rc = pCache->xStress(pCache->pStress, pPg); | |
if( rc!=SQLITE_OK && rc!=SQLITE_BUSY ){ | |
@@ -35470,33 +36372,36 @@ | |
} | |
} | |
- pPage = sqlite3GlobalConfig.pcache.xFetch(pCache->pCache, pgno, 2); | |
+ pPage = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, pgno, 2); | |
} | |
if( pPage ){ | |
- if( !pPage->pData ){ | |
- memset(pPage, 0, sizeof(PgHdr)); | |
- pPage->pData = (void *)&pPage[1]; | |
- pPage->pExtra = (void*)&((char *)pPage->pData)[pCache->szPage]; | |
- memset(pPage->pExtra, 0, pCache->szExtra); | |
- pPage->pCache = pCache; | |
- pPage->pgno = pgno; | |
- } | |
- assert( pPage->pCache==pCache ); | |
- assert( pPage->pgno==pgno ); | |
- assert( pPage->pData==(void *)&pPage[1] ); | |
- assert( pPage->pExtra==(void *)&((char *)&pPage[1])[pCache->szPage] ); | |
+ pPgHdr = (PgHdr *)pPage->pExtra; | |
+ | |
+ if( !pPgHdr->pPage ){ | |
+ memset(pPgHdr, 0, sizeof(PgHdr)); | |
+ pPgHdr->pPage = pPage; | |
+ pPgHdr->pData = pPage->pBuf; | |
+ pPgHdr->pExtra = (void *)&pPgHdr[1]; | |
+ memset(pPgHdr->pExtra, 0, pCache->szExtra); | |
+ pPgHdr->pCache = pCache; | |
+ pPgHdr->pgno = pgno; | |
+ } | |
+ assert( pPgHdr->pCache==pCache ); | |
+ assert( pPgHdr->pgno==pgno ); | |
+ assert( pPgHdr->pData==pPage->pBuf ); | |
+ assert( pPgHdr->pExtra==(void *)&pPgHdr[1] ); | |
- if( 0==pPage->nRef ){ | |
+ if( 0==pPgHdr->nRef ){ | |
pCache->nRef++; | |
} | |
- pPage->nRef++; | |
+ pPgHdr->nRef++; | |
if( pgno==1 ){ | |
- pCache->pPage1 = pPage; | |
+ pCache->pPage1 = pPgHdr; | |
} | |
} | |
- *ppPage = pPage; | |
- return (pPage==0 && eCreate) ? SQLITE_NOMEM : SQLITE_OK; | |
+ *ppPage = pPgHdr; | |
+ return (pPgHdr==0 && eCreate) ? SQLITE_NOMEM : SQLITE_OK; | |
} | |
/* | |
@@ -35543,7 +36448,7 @@ | |
if( p->pgno==1 ){ | |
pCache->pPage1 = 0; | |
} | |
- sqlite3GlobalConfig.pcache.xUnpin(pCache->pCache, p, 1); | |
+ sqlite3GlobalConfig.pcache2.xUnpin(pCache->pCache, p->pPage, 1); | |
} | |
/* | |
@@ -35601,7 +36506,7 @@ | |
PCache *pCache = p->pCache; | |
assert( p->nRef>0 ); | |
assert( newPgno>0 ); | |
- sqlite3GlobalConfig.pcache.xRekey(pCache->pCache, p, p->pgno, newPgno); | |
+ sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); | |
p->pgno = newPgno; | |
if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ | |
pcacheRemoveFromDirtyList(p); | |
@@ -35638,7 +36543,7 @@ | |
memset(pCache->pPage1->pData, 0, pCache->szPage); | |
pgno = 1; | |
} | |
- sqlite3GlobalConfig.pcache.xTruncate(pCache->pCache, pgno+1); | |
+ sqlite3GlobalConfig.pcache2.xTruncate(pCache->pCache, pgno+1); | |
} | |
} | |
@@ -35647,7 +36552,7 @@ | |
*/ | |
SQLITE_PRIVATE void sqlite3PcacheClose(PCache *pCache){ | |
if( pCache->pCache ){ | |
- sqlite3GlobalConfig.pcache.xDestroy(pCache->pCache); | |
+ sqlite3GlobalConfig.pcache2.xDestroy(pCache->pCache); | |
} | |
} | |
@@ -35759,7 +36664,7 @@ | |
SQLITE_PRIVATE int sqlite3PcachePagecount(PCache *pCache){ | |
int nPage = 0; | |
if( pCache->pCache ){ | |
- nPage = sqlite3GlobalConfig.pcache.xPagecount(pCache->pCache); | |
+ nPage = sqlite3GlobalConfig.pcache2.xPagecount(pCache->pCache); | |
} | |
return nPage; | |
} | |
@@ -35769,7 +36674,7 @@ | |
** Get the suggested cache-size value. | |
*/ | |
SQLITE_PRIVATE int sqlite3PcacheGetCachesize(PCache *pCache){ | |
- return pCache->nMax; | |
+ return numberOfCachePages(pCache); | |
} | |
#endif | |
@@ -35777,9 +36682,19 @@ | |
** Set the suggested cache-size value. | |
*/ | |
SQLITE_PRIVATE void sqlite3PcacheSetCachesize(PCache *pCache, int mxPage){ | |
- pCache->nMax = mxPage; | |
+ pCache->szCache = mxPage; | |
if( pCache->pCache ){ | |
- sqlite3GlobalConfig.pcache.xCachesize(pCache->pCache, mxPage); | |
+ sqlite3GlobalConfig.pcache2.xCachesize(pCache->pCache, | |
+ numberOfCachePages(pCache)); | |
+ } | |
+} | |
+ | |
+/* | |
+** Free up as much memory as possible from the page cache. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3PcacheShrink(PCache *pCache){ | |
+ if( pCache->pCache ){ | |
+ sqlite3GlobalConfig.pcache2.xShrink(pCache->pCache); | |
} | |
} | |
@@ -35824,7 +36739,6 @@ | |
typedef struct PgFreeslot PgFreeslot; | |
typedef struct PGroup PGroup; | |
- | |
/* Each page cache (or PCache) belongs to a PGroup. A PGroup is a set | |
** of one or more PCaches that are able to recycle each others unpinned | |
** pages when they are under memory pressure. A PGroup is an instance of | |
@@ -35841,7 +36755,7 @@ | |
** Mode 1 uses more memory (since PCache instances are not able to rob | |
** unused pages from other PCaches) but it also operates without a mutex, | |
** and is therefore often faster. Mode 2 requires a mutex in order to be | |
-** threadsafe, but is able recycle pages more efficient. | |
+** threadsafe, but recycles pages more efficiently. | |
** | |
** For mode (1), PGroup.mutex is NULL. For mode (2) there is only a single | |
** PGroup which is the pcache1.grp global variable and its mutex is | |
@@ -35849,10 +36763,10 @@ | |
*/ | |
struct PGroup { | |
sqlite3_mutex *mutex; /* MUTEX_STATIC_LRU or NULL */ | |
- int nMaxPage; /* Sum of nMax for purgeable caches */ | |
- int nMinPage; /* Sum of nMin for purgeable caches */ | |
- int mxPinned; /* nMaxpage + 10 - nMinPage */ | |
- int nCurrentPage; /* Number of purgeable pages allocated */ | |
+ unsigned int nMaxPage; /* Sum of nMax for purgeable caches */ | |
+ unsigned int nMinPage; /* Sum of nMin for purgeable caches */ | |
+ unsigned int mxPinned; /* nMaxpage + 10 - nMinPage */ | |
+ unsigned int nCurrentPage; /* Number of purgeable pages allocated */ | |
PgHdr1 *pLruHead, *pLruTail; /* LRU list of unpinned pages */ | |
}; | |
@@ -35867,11 +36781,12 @@ | |
struct PCache1 { | |
/* Cache configuration parameters. Page size (szPage) and the purgeable | |
** flag (bPurgeable) are set when the cache is created. nMax may be | |
- ** modified at any time by a call to the pcache1CacheSize() method. | |
+ ** modified at any time by a call to the pcache1Cachesize() method. | |
** The PGroup mutex must be held when accessing nMax. | |
*/ | |
PGroup *pGroup; /* PGroup this cache belongs to */ | |
int szPage; /* Size of allocated pages in bytes */ | |
+ int szExtra; /* Size of extra space in bytes */ | |
int bPurgeable; /* True if cache is purgeable */ | |
unsigned int nMin; /* Minimum number of pages reserved */ | |
unsigned int nMax; /* Configured "cache_size" value */ | |
@@ -35890,11 +36805,12 @@ | |
/* | |
** Each cache entry is represented by an instance of the following | |
-** structure. A buffer of PgHdr1.pCache->szPage bytes is allocated | |
-** directly before this structure in memory (see the PGHDR1_TO_PAGE() | |
-** macro below). | |
+** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of | |
+** PgHdr1.pCache->szPage bytes is allocated directly before this structure | |
+** in memory. | |
*/ | |
struct PgHdr1 { | |
+ sqlite3_pcache_page page; | |
unsigned int iKey; /* Key value (page number) */ | |
PgHdr1 *pNext; /* Next in hash table chain */ | |
PCache1 *pCache; /* Cache that currently owns this page */ | |
@@ -35945,21 +36861,6 @@ | |
#define pcache1 (GLOBAL(struct PCacheGlobal, pcache1_g)) | |
/* | |
-** When a PgHdr1 structure is allocated, the associated PCache1.szPage | |
-** bytes of data are located directly before it in memory (i.e. the total | |
-** size of the allocation is sizeof(PgHdr1)+PCache1.szPage byte). The | |
-** PGHDR1_TO_PAGE() macro takes a pointer to a PgHdr1 structure as | |
-** an argument and returns a pointer to the associated block of szPage | |
-** bytes. The PAGE_TO_PGHDR1() macro does the opposite: its argument is | |
-** a pointer to a block of szPage bytes of data and the return value is | |
-** a pointer to the associated PgHdr1 structure. | |
-** | |
-** assert( PGHDR1_TO_PAGE(PAGE_TO_PGHDR1(pCache, X))==X ); | |
-*/ | |
-#define PGHDR1_TO_PAGE(p) (void*)(((char*)p) - p->pCache->szPage) | |
-#define PAGE_TO_PGHDR1(c, p) (PgHdr1*)(((char*)p) + c->szPage) | |
- | |
-/* | |
** Macros to enter and leave the PCache LRU mutex. | |
*/ | |
#define pcache1EnterMutex(X) sqlite3_mutex_enter((X)->mutex) | |
@@ -36041,8 +36942,9 @@ | |
/* | |
** Free an allocated buffer obtained from pcache1Alloc(). | |
*/ | |
-static void pcache1Free(void *p){ | |
- if( p==0 ) return; | |
+static int pcache1Free(void *p){ | |
+ int nFreed = 0; | |
+ if( p==0 ) return 0; | |
if( p>=pcache1.pStart && p<pcache1.pEnd ){ | |
PgFreeslot *pSlot; | |
sqlite3_mutex_enter(pcache1.mutex); | |
@@ -36055,15 +36957,15 @@ | |
assert( pcache1.nFreeSlot<=pcache1.nSlot ); | |
sqlite3_mutex_leave(pcache1.mutex); | |
}else{ | |
- int iSize; | |
assert( sqlite3MemdebugHasType(p, MEMTYPE_PCACHE) ); | |
sqlite3MemdebugSetType(p, MEMTYPE_HEAP); | |
- iSize = sqlite3MallocSize(p); | |
+ nFreed = sqlite3MallocSize(p); | |
sqlite3_mutex_enter(pcache1.mutex); | |
- sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, -iSize); | |
+ sqlite3StatusAdd(SQLITE_STATUS_PAGECACHE_OVERFLOW, -nFreed); | |
sqlite3_mutex_leave(pcache1.mutex); | |
sqlite3_free(p); | |
} | |
+ return nFreed; | |
} | |
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT | |
@@ -36088,7 +36990,6 @@ | |
** Allocate a new page object initially associated with cache pCache. | |
*/ | |
static PgHdr1 *pcache1AllocPage(PCache1 *pCache){ | |
- int nByte = sizeof(PgHdr1) + pCache->szPage; | |
PgHdr1 *p = 0; | |
void *pPg; | |
@@ -36097,16 +36998,29 @@ | |
** this mutex is not held. */ | |
assert( sqlite3_mutex_held(pCache->pGroup->mutex) ); | |
pcache1LeaveMutex(pCache->pGroup); | |
- pPg = pcache1Alloc(nByte); | |
+#ifdef SQLITE_PCACHE_SEPARATE_HEADER | |
+ pPg = pcache1Alloc(pCache->szPage); | |
+ p = sqlite3Malloc(sizeof(PgHdr1) + pCache->szExtra); | |
+ if( !pPg || !p ){ | |
+ pcache1Free(pPg); | |
+ sqlite3_free(p); | |
+ pPg = 0; | |
+ } | |
+#else | |
+ pPg = pcache1Alloc(sizeof(PgHdr1) + pCache->szPage + pCache->szExtra); | |
+ p = (PgHdr1 *)&((u8 *)pPg)[pCache->szPage]; | |
+#endif | |
pcache1EnterMutex(pCache->pGroup); | |
if( pPg ){ | |
- p = PAGE_TO_PGHDR1(pCache, pPg); | |
+ p->page.pBuf = pPg; | |
+ p->page.pExtra = &p[1]; | |
if( pCache->bPurgeable ){ | |
pCache->pGroup->nCurrentPage++; | |
} | |
+ return p; | |
} | |
- return p; | |
+ return 0; | |
} | |
/* | |
@@ -36120,7 +37034,10 @@ | |
if( ALWAYS(p) ){ | |
PCache1 *pCache = p->pCache; | |
assert( sqlite3_mutex_held(p->pCache->pGroup->mutex) ); | |
- pcache1Free(PGHDR1_TO_PAGE(p)); | |
+ pcache1Free(p->page.pBuf); | |
+#ifdef SQLITE_PCACHE_SEPARATE_HEADER | |
+ sqlite3_free(p); | |
+#endif | |
if( pCache->bPurgeable ){ | |
pCache->pGroup->nCurrentPage--; | |
} | |
@@ -36155,13 +37072,13 @@ | |
** for all page cache needs and we should not need to spill the | |
** allocation onto the heap. | |
** | |
-** Or, the heap is used for all page cache memory put the heap is | |
+** Or, the heap is used for all page cache memory but the heap is | |
** under memory pressure, then again it is desirable to avoid | |
** allocating a new page cache entry in order to avoid stressing | |
** the heap even further. | |
*/ | |
static int pcache1UnderMemoryPressure(PCache1 *pCache){ | |
- if( pcache1.nSlot && pCache->szPage<=pcache1.szSlot ){ | |
+ if( pcache1.nSlot && (pCache->szPage+pCache->szExtra)<=pcache1.szSlot ){ | |
return pcache1.bUnderPressure; | |
}else{ | |
return sqlite3HeapNearlyFull(); | |
@@ -36352,7 +37269,7 @@ | |
** | |
** Allocate a new cache. | |
*/ | |
-static sqlite3_pcache *pcache1Create(int szPage, int bPurgeable){ | |
+static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ | |
PCache1 *pCache; /* The newly created page cache */ | |
PGroup *pGroup; /* The group the new page cache will belong to */ | |
int sz; /* Bytes of memory required to allocate the new cache */ | |
@@ -36375,6 +37292,9 @@ | |
int separateCache = sqlite3GlobalConfig.bCoreMutex>0; | |
#endif | |
+ assert( (szPage & (szPage-1))==0 && szPage>=512 && szPage<=65536 ); | |
+ assert( szExtra < 300 ); | |
+ | |
sz = sizeof(PCache1) + sizeof(PGroup)*separateCache; | |
pCache = (PCache1 *)sqlite3_malloc(sz); | |
if( pCache ){ | |
@@ -36387,6 +37307,7 @@ | |
} | |
pCache->pGroup = pGroup; | |
pCache->szPage = szPage; | |
+ pCache->szExtra = szExtra; | |
pCache->bPurgeable = (bPurgeable ? 1 : 0); | |
if( bPurgeable ){ | |
pCache->nMin = 10; | |
@@ -36419,6 +37340,25 @@ | |
} | |
/* | |
+** Implementation of the sqlite3_pcache.xShrink method. | |
+** | |
+** Free up as much memory as possible. | |
+*/ | |
+static void pcache1Shrink(sqlite3_pcache *p){ | |
+ PCache1 *pCache = (PCache1*)p; | |
+ if( pCache->bPurgeable ){ | |
+ PGroup *pGroup = pCache->pGroup; | |
+ int savedMaxPage; | |
+ pcache1EnterMutex(pGroup); | |
+ savedMaxPage = pGroup->nMaxPage; | |
+ pGroup->nMaxPage = 0; | |
+ pcache1EnforceMaxPage(pGroup); | |
+ pGroup->nMaxPage = savedMaxPage; | |
+ pcache1LeaveMutex(pGroup); | |
+ } | |
+} | |
+ | |
+/* | |
** Implementation of the sqlite3_pcache.xPagecount method. | |
*/ | |
static int pcache1Pagecount(sqlite3_pcache *p){ | |
@@ -36443,7 +37383,7 @@ | |
** For a non-purgeable cache (a cache used as the storage for an in-memory | |
** database) there is really no difference between createFlag 1 and 2. So | |
** the calling function (pcache.c) will never have a createFlag of 1 on | |
-** a non-purgable cache. | |
+** a non-purgeable cache. | |
** | |
** There are three different approaches to obtaining space for a page, | |
** depending on the value of parameter createFlag (which may be 0, 1 or 2). | |
@@ -36484,8 +37424,12 @@ | |
** | |
** 5. Otherwise, allocate and return a new page buffer. | |
*/ | |
-static void *pcache1Fetch(sqlite3_pcache *p, unsigned int iKey, int createFlag){ | |
- int nPinned; | |
+static sqlite3_pcache_page *pcache1Fetch( | |
+ sqlite3_pcache *p, | |
+ unsigned int iKey, | |
+ int createFlag | |
+){ | |
+ unsigned int nPinned; | |
PCache1 *pCache = (PCache1 *)p; | |
PGroup *pGroup; | |
PgHdr1 *pPage = 0; | |
@@ -36519,15 +37463,14 @@ | |
pGroup = pCache->pGroup; | |
#endif | |
- | |
/* Step 3: Abort if createFlag is 1 but the cache is nearly full */ | |
+ assert( pCache->nPage >= pCache->nRecyclable ); | |
nPinned = pCache->nPage - pCache->nRecyclable; | |
- assert( nPinned>=0 ); | |
assert( pGroup->mxPinned == pGroup->nMaxPage + 10 - pGroup->nMinPage ); | |
assert( pCache->n90pct == pCache->nMax*9/10 ); | |
if( createFlag==1 && ( | |
nPinned>=pGroup->mxPinned | |
- || nPinned>=(int)pCache->n90pct | |
+ || nPinned>=pCache->n90pct | |
|| pcache1UnderMemoryPressure(pCache) | |
)){ | |
goto fetch_out; | |
@@ -36543,16 +37486,24 @@ | |
|| pGroup->nCurrentPage>=pGroup->nMaxPage | |
|| pcache1UnderMemoryPressure(pCache) | |
)){ | |
- PCache1 *pOtherCache; | |
+ PCache1 *pOther; | |
pPage = pGroup->pLruTail; | |
pcache1RemoveFromHash(pPage); | |
pcache1PinPage(pPage); | |
- if( (pOtherCache = pPage->pCache)->szPage!=pCache->szPage ){ | |
+ pOther = pPage->pCache; | |
+ | |
+ /* We want to verify that szPage and szExtra are the same for pOther | |
+ ** and pCache. Assert that we can verify this by comparing sums. */ | |
+ assert( (pCache->szPage & (pCache->szPage-1))==0 && pCache->szPage>=512 ); | |
+ assert( pCache->szExtra<512 ); | |
+ assert( (pOther->szPage & (pOther->szPage-1))==0 && pOther->szPage>=512 ); | |
+ assert( pOther->szExtra<512 ); | |
+ | |
+ if( pOther->szPage+pOther->szExtra != pCache->szPage+pCache->szExtra ){ | |
pcache1FreePage(pPage); | |
pPage = 0; | |
}else{ | |
- pGroup->nCurrentPage -= | |
- (pOtherCache->bPurgeable - pCache->bPurgeable); | |
+ pGroup->nCurrentPage -= (pOther->bPurgeable - pCache->bPurgeable); | |
} | |
} | |
@@ -36573,7 +37524,7 @@ | |
pPage->pCache = pCache; | |
pPage->pLruPrev = 0; | |
pPage->pLruNext = 0; | |
- *(void **)(PGHDR1_TO_PAGE(pPage)) = 0; | |
+ *(void **)pPage->page.pExtra = 0; | |
pCache->apHash[h] = pPage; | |
} | |
@@ -36582,7 +37533,7 @@ | |
pCache->iMaxKey = iKey; | |
} | |
pcache1LeaveMutex(pGroup); | |
- return (pPage ? PGHDR1_TO_PAGE(pPage) : 0); | |
+ return &pPage->page; | |
} | |
@@ -36591,9 +37542,13 @@ | |
** | |
** Mark a page as unpinned (eligible for asynchronous recycling). | |
*/ | |
-static void pcache1Unpin(sqlite3_pcache *p, void *pPg, int reuseUnlikely){ | |
+static void pcache1Unpin( | |
+ sqlite3_pcache *p, | |
+ sqlite3_pcache_page *pPg, | |
+ int reuseUnlikely | |
+){ | |
PCache1 *pCache = (PCache1 *)p; | |
- PgHdr1 *pPage = PAGE_TO_PGHDR1(pCache, pPg); | |
+ PgHdr1 *pPage = (PgHdr1 *)pPg; | |
PGroup *pGroup = pCache->pGroup; | |
assert( pPage->pCache==pCache ); | |
@@ -36629,12 +37584,12 @@ | |
*/ | |
static void pcache1Rekey( | |
sqlite3_pcache *p, | |
- void *pPg, | |
+ sqlite3_pcache_page *pPg, | |
unsigned int iOld, | |
unsigned int iNew | |
){ | |
PCache1 *pCache = (PCache1 *)p; | |
- PgHdr1 *pPage = PAGE_TO_PGHDR1(pCache, pPg); | |
+ PgHdr1 *pPage = (PgHdr1 *)pPg; | |
PgHdr1 **pp; | |
unsigned int h; | |
assert( pPage->iKey==iOld ); | |
@@ -36688,7 +37643,9 @@ | |
assert( pCache->bPurgeable || (pCache->nMax==0 && pCache->nMin==0) ); | |
pcache1EnterMutex(pGroup); | |
pcache1TruncateUnsafe(pCache, 0); | |
+ assert( pGroup->nMaxPage >= pCache->nMax ); | |
pGroup->nMaxPage -= pCache->nMax; | |
+ assert( pGroup->nMinPage >= pCache->nMin ); | |
pGroup->nMinPage -= pCache->nMin; | |
pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; | |
pcache1EnforceMaxPage(pGroup); | |
@@ -36703,7 +37660,8 @@ | |
** already provided an alternative. | |
*/ | |
SQLITE_PRIVATE void sqlite3PCacheSetDefault(void){ | |
- static const sqlite3_pcache_methods defaultMethods = { | |
+ static const sqlite3_pcache_methods2 defaultMethods = { | |
+ 1, /* iVersion */ | |
0, /* pArg */ | |
pcache1Init, /* xInit */ | |
pcache1Shutdown, /* xShutdown */ | |
@@ -36714,9 +37672,10 @@ | |
pcache1Unpin, /* xUnpin */ | |
pcache1Rekey, /* xRekey */ | |
pcache1Truncate, /* xTruncate */ | |
- pcache1Destroy /* xDestroy */ | |
+ pcache1Destroy, /* xDestroy */ | |
+ pcache1Shrink /* xShrink */ | |
}; | |
- sqlite3_config(SQLITE_CONFIG_PCACHE, &defaultMethods); | |
+ sqlite3_config(SQLITE_CONFIG_PCACHE2, &defaultMethods); | |
} | |
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT | |
@@ -36737,7 +37696,10 @@ | |
PgHdr1 *p; | |
pcache1EnterMutex(&pcache1.grp); | |
while( (nReq<0 || nFree<nReq) && ((p=pcache1.grp.pLruTail)!=0) ){ | |
- nFree += pcache1MemSize(PGHDR1_TO_PAGE(p)); | |
+ nFree += pcache1MemSize(p->page.pBuf); | |
+#ifdef SQLITE_PCACHE_SEPARATE_HEADER | |
+ nFree += sqlite3MemSize(p); | |
+#endif | |
pcache1PinPage(p); | |
pcache1RemoveFromHash(p); | |
pcache1FreePage(p); | |
@@ -36765,8 +37727,8 @@ | |
nRecyclable++; | |
} | |
*pnCurrent = pcache1.grp.nCurrentPage; | |
- *pnMax = pcache1.grp.nMaxPage; | |
- *pnMin = pcache1.grp.nMinPage; | |
+ *pnMax = (int)pcache1.grp.nMaxPage; | |
+ *pnMin = (int)pcache1.grp.nMinPage; | |
*pnRecyclable = nRecyclable; | |
} | |
#endif | |
@@ -37240,6 +38202,12 @@ | |
#define _WAL_H_ | |
+/* Additional values that can be added to the sync_flags argument of | |
+** sqlite3WalFrames(): | |
+*/ | |
+#define WAL_SYNC_TRANSACTIONS 0x20 /* Sync at the end of each transaction */ | |
+#define SQLITE_SYNC_MASK 0x13 /* Mask off the SQLITE_SYNC_* values */ | |
+ | |
#ifdef SQLITE_OMIT_WAL | |
# define sqlite3WalOpen(x,y,z) 0 | |
# define sqlite3WalLimit(x,y) | |
@@ -37939,6 +38907,7 @@ | |
u8 noSync; /* Do not sync the journal if true */ | |
u8 fullSync; /* Do extra syncs of the journal for robustness */ | |
u8 ckptSyncFlags; /* SYNC_NORMAL or SYNC_FULL for checkpoint */ | |
+ u8 walSyncFlags; /* SYNC_NORMAL or SYNC_FULL for wal writes */ | |
u8 syncFlags; /* SYNC_NORMAL or SYNC_FULL otherwise */ | |
u8 tempFile; /* zFilename is a temporary file */ | |
u8 readOnly; /* True for a read-only database */ | |
@@ -38109,7 +39078,7 @@ | |
#else | |
# define pagerUseWal(x) 0 | |
# define pagerRollbackWal(x) 0 | |
-# define pagerWalFrames(v,w,x,y,z) 0 | |
+# define pagerWalFrames(v,w,x,y) 0 | |
# define pagerOpenWalIfPresent(z) SQLITE_OK | |
# define pagerBeginReadTransaction(z) SQLITE_OK | |
#endif | |
@@ -39808,10 +40777,9 @@ | |
if( rc==SQLITE_OK && currentSize!=newSize ){ | |
if( currentSize>newSize ){ | |
rc = sqlite3OsTruncate(pPager->fd, newSize); | |
- }else{ | |
+ }else if( (currentSize+szPage)<=newSize ){ | |
char *pTmp = pPager->pTmpSpace; | |
memset(pTmp, 0, szPage); | |
- testcase( (newSize-szPage) < currentSize ); | |
testcase( (newSize-szPage) == currentSize ); | |
testcase( (newSize-szPage) > currentSize ); | |
rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); | |
@@ -39837,23 +40805,36 @@ | |
** the value returned by the xSectorSize() method rounded up to 32 if | |
** it is less than 32, or rounded down to MAX_SECTOR_SIZE if it | |
** is greater than MAX_SECTOR_SIZE. | |
+** | |
+** If the file has the SQLITE_IOCAP_POWERSAFE_OVERWRITE property, then set | |
+** the effective sector size to its minimum value (512). The purpose of | |
+** pPager->sectorSize is to define the "blast radius" of bytes that | |
+** might change if a crash occurs while writing to a single byte in | |
+** that range. But with POWERSAFE_OVERWRITE, the blast radius is zero | |
+** (that is what POWERSAFE_OVERWRITE means), so we minimize the sector | |
+** size. For backwards compatibility of the rollback journal file format, | |
+** we cannot reduce the effective sector size below 512. | |
*/ | |
static void setSectorSize(Pager *pPager){ | |
assert( isOpen(pPager->fd) || pPager->tempFile ); | |
- if( !pPager->tempFile ){ | |
+ if( pPager->tempFile | |
+ || (sqlite3OsDeviceCharacteristics(pPager->fd) & | |
+ SQLITE_IOCAP_POWERSAFE_OVERWRITE)!=0 | |
+ ){ | |
/* Sector size doesn't matter for temporary files. Also, the file | |
** may not have been opened yet, in which case the OsSectorSize() | |
- ** call will segfault. | |
- */ | |
- pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); | |
- } | |
- if( pPager->sectorSize<32 ){ | |
+ ** call will segfault. */ | |
pPager->sectorSize = 512; | |
- } | |
- if( pPager->sectorSize>MAX_SECTOR_SIZE ){ | |
- assert( MAX_SECTOR_SIZE>=512 ); | |
- pPager->sectorSize = MAX_SECTOR_SIZE; | |
+ }else{ | |
+ pPager->sectorSize = sqlite3OsSectorSize(pPager->fd); | |
+ if( pPager->sectorSize<32 ){ | |
+ pPager->sectorSize = 512; | |
+ } | |
+ if( pPager->sectorSize>MAX_SECTOR_SIZE ){ | |
+ assert( MAX_SECTOR_SIZE>=512 ); | |
+ pPager->sectorSize = MAX_SECTOR_SIZE; | |
+ } | |
} | |
} | |
@@ -40056,10 +41037,11 @@ | |
** SQLITE_FCNTL_DB_UNCHANGED file-control method to disable the | |
** assertion that the transaction counter was modified. | |
*/ | |
- assert( | |
- pPager->fd->pMethods==0 || | |
- sqlite3OsFileControl(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0)>=SQLITE_OK | |
- ); | |
+#ifdef SQLITE_DEBUG | |
+ if( pPager->fd->pMethods ){ | |
+ sqlite3OsFileControlHint(pPager->fd,SQLITE_FCNTL_DB_UNCHANGED,0); | |
+ } | |
+#endif | |
/* If this playback is happening automatically as a result of an IO or | |
** malloc error that occurred after the change-counter was updated but | |
@@ -40278,8 +41260,7 @@ | |
Pager *pPager, /* Pager object */ | |
PgHdr *pList, /* List of frames to log */ | |
Pgno nTruncate, /* Database size after this commit */ | |
- int isCommit, /* True if this is a commit */ | |
- int syncFlags /* Flags to pass to OsSync() (or 0) */ | |
+ int isCommit /* True if this is a commit */ | |
){ | |
int rc; /* Return code */ | |
#if defined(SQLITE_DEBUG) || defined(SQLITE_CHECK_PAGES) | |
@@ -40310,7 +41291,7 @@ | |
if( pList->pgno==1 ) pager_write_changecounter(pList); | |
rc = sqlite3WalFrames(pPager->pWal, | |
- pPager->pageSize, pList, nTruncate, isCommit, syncFlags | |
+ pPager->pageSize, pList, nTruncate, isCommit, pPager->walSyncFlags | |
); | |
if( rc==SQLITE_OK && pPager->pBackup ){ | |
PgHdr *p; | |
@@ -40397,10 +41378,7 @@ | |
return rc; | |
} | |
} | |
- nPage = (Pgno)(n / pPager->pageSize); | |
- if( nPage==0 && n>0 ){ | |
- nPage = 1; | |
- } | |
+ nPage = (Pgno)((n+pPager->pageSize-1) / pPager->pageSize); | |
} | |
/* If the current number of pages in the file is greater than the | |
@@ -40590,13 +41568,13 @@ | |
*/ | |
if( pSavepoint ){ | |
u32 ii; /* Loop counter */ | |
- i64 offset = pSavepoint->iSubRec*(4+pPager->pageSize); | |
+ i64 offset = (i64)pSavepoint->iSubRec*(4+pPager->pageSize); | |
if( pagerUseWal(pPager) ){ | |
rc = sqlite3WalSavepointUndo(pPager->pWal, pSavepoint->aWalData); | |
} | |
for(ii=pSavepoint->iSubRec; rc==SQLITE_OK && ii<pPager->nSubRec; ii++){ | |
- assert( offset==ii*(4+pPager->pageSize) ); | |
+ assert( offset==(i64)ii*(4+pPager->pageSize) ); | |
rc = pager_playback_one_page(pPager, &offset, pDone, 0, 1); | |
} | |
assert( rc!=SQLITE_DONE ); | |
@@ -40618,6 +41596,13 @@ | |
} | |
/* | |
+** Free as much memory as possible from the pager. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3PagerShrink(Pager *pPager){ | |
+ sqlite3PcacheShrink(pPager->pPCache); | |
+} | |
+ | |
+/* | |
** Adjust the robustness of the database to damage due to OS crashes | |
** or power failures by changing the number of syncs()s when writing | |
** the rollback journal. There are three levels: | |
@@ -40683,6 +41668,10 @@ | |
pPager->syncFlags = SQLITE_SYNC_NORMAL; | |
pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; | |
} | |
+ pPager->walSyncFlags = pPager->syncFlags; | |
+ if( pPager->fullSync ){ | |
+ pPager->walSyncFlags |= WAL_SYNC_TRANSACTIONS; | |
+ } | |
} | |
#endif | |
@@ -40820,7 +41809,7 @@ | |
if( rc==SQLITE_OK ){ | |
pager_reset(pPager); | |
- pPager->dbSize = (Pgno)(nByte/pageSize); | |
+ pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); | |
pPager->pageSize = pageSize; | |
sqlite3PageFree(pPager->pTmpSpace); | |
pPager->pTmpSpace = pNew; | |
@@ -41328,7 +42317,7 @@ | |
assert( rc!=SQLITE_OK || isOpen(pPager->fd) ); | |
if( rc==SQLITE_OK && pPager->dbSize>pPager->dbHintSize ){ | |
sqlite3_int64 szFile = pPager->pageSize * (sqlite3_int64)pPager->dbSize; | |
- sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); | |
+ sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &szFile); | |
pPager->dbHintSize = pPager->dbSize; | |
} | |
@@ -41437,7 +42426,7 @@ | |
** write the journal record into the file. */ | |
if( rc==SQLITE_OK ){ | |
void *pData = pPg->pData; | |
- i64 offset = pPager->nSubRec*(4+pPager->pageSize); | |
+ i64 offset = (i64)pPager->nSubRec*(4+pPager->pageSize); | |
char *pData2; | |
CODEC2(pPager, pData, pPg->pgno, 7, return SQLITE_NOMEM, pData2); | |
@@ -41510,7 +42499,7 @@ | |
rc = subjournalPage(pPg); | |
} | |
if( rc==SQLITE_OK ){ | |
- rc = pagerWalFrames(pPager, pPg, 0, 0, 0); | |
+ rc = pagerWalFrames(pPager, pPg, 0, 0); | |
} | |
}else{ | |
@@ -41669,7 +42658,8 @@ | |
z += sqlite3Strlen30(z)+1; | |
z += sqlite3Strlen30(z)+1; | |
} | |
- nUri = &z[1] - zUri; | |
+ nUri = (int)(&z[1] - zUri); | |
+ assert( nUri>=0 ); | |
if( rc==SQLITE_OK && nPathname+8>pVfs->mxPathname ){ | |
/* This branch is taken when the journal path required by | |
** the database being opened will be more than pVfs->mxPathname | |
@@ -41703,9 +42693,9 @@ | |
ROUND8(pVfs->szOsFile) + /* The main db file */ | |
journalFileSize * 2 + /* The two journal files */ | |
nPathname + 1 + nUri + /* zFilename */ | |
- nPathname + 8 + 1 /* zJournal */ | |
+ nPathname + 8 + 2 /* zJournal */ | |
#ifndef SQLITE_OMIT_WAL | |
- + nPathname + 4 + 1 /* zWal */ | |
+ + nPathname + 4 + 2 /* zWal */ | |
#endif | |
); | |
assert( EIGHT_BYTE_ALIGNMENT(SQLITE_INT_TO_PTR(journalFileSize)) ); | |
@@ -41728,12 +42718,12 @@ | |
memcpy(pPager->zFilename, zPathname, nPathname); | |
memcpy(&pPager->zFilename[nPathname+1], zUri, nUri); | |
memcpy(pPager->zJournal, zPathname, nPathname); | |
- memcpy(&pPager->zJournal[nPathname], "-journal", 8); | |
+ memcpy(&pPager->zJournal[nPathname], "-journal\000", 8+1); | |
sqlite3FileSuffix3(pPager->zFilename, pPager->zJournal); | |
#ifndef SQLITE_OMIT_WAL | |
pPager->zWal = &pPager->zJournal[nPathname+8+1]; | |
memcpy(pPager->zWal, zPathname, nPathname); | |
- memcpy(&pPager->zWal[nPathname], "-wal", 4); | |
+ memcpy(&pPager->zWal[nPathname], "-wal\000", 4+1); | |
sqlite3FileSuffix3(pPager->zFilename, pPager->zWal); | |
#endif | |
sqlite3_free(zPathname); | |
@@ -41849,9 +42839,17 @@ | |
pPager->readOnly = (u8)readOnly; | |
assert( useJournal || pPager->tempFile ); | |
pPager->noSync = pPager->tempFile; | |
- pPager->fullSync = pPager->noSync ?0:1; | |
- pPager->syncFlags = pPager->noSync ? 0 : SQLITE_SYNC_NORMAL; | |
- pPager->ckptSyncFlags = pPager->syncFlags; | |
+ if( pPager->noSync ){ | |
+ assert( pPager->fullSync==0 ); | |
+ assert( pPager->syncFlags==0 ); | |
+ assert( pPager->walSyncFlags==0 ); | |
+ assert( pPager->ckptSyncFlags==0 ); | |
+ }else{ | |
+ pPager->fullSync = 1; | |
+ pPager->syncFlags = SQLITE_SYNC_NORMAL; | |
+ pPager->walSyncFlags = SQLITE_SYNC_NORMAL | WAL_SYNC_TRANSACTIONS; | |
+ pPager->ckptSyncFlags = SQLITE_SYNC_NORMAL; | |
+ } | |
/* pPager->pFirst = 0; */ | |
/* pPager->pFirstSynced = 0; */ | |
/* pPager->pLast = 0; */ | |
@@ -42984,7 +43982,10 @@ | |
rc = sqlite3OsSync(pPager->fd, pPager->syncFlags); | |
}else if( isOpen(pPager->fd) ){ | |
assert( !MEMDB ); | |
- sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, (void *)&rc); | |
+ rc = sqlite3OsFileControl(pPager->fd, SQLITE_FCNTL_SYNC_OMITTED, 0); | |
+ if( rc==SQLITE_NOTFOUND ){ | |
+ rc = SQLITE_OK; | |
+ } | |
} | |
return rc; | |
} | |
@@ -43081,9 +44082,7 @@ | |
} | |
assert( rc==SQLITE_OK ); | |
if( ALWAYS(pList) ){ | |
- rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1, | |
- (pPager->fullSync ? pPager->syncFlags : 0) | |
- ); | |
+ rc = pagerWalFrames(pPager, pList, pPager->dbSize, 1); | |
} | |
sqlite3PagerUnref(pPageOne); | |
if( rc==SQLITE_OK ){ | |
@@ -43342,7 +44341,8 @@ | |
} | |
assert( pPager->eState==PAGER_READER || rc!=SQLITE_OK ); | |
- assert( rc==SQLITE_OK || rc==SQLITE_FULL || (rc&0xFF)==SQLITE_IOERR ); | |
+ assert( rc==SQLITE_OK || rc==SQLITE_FULL | |
+ || rc==SQLITE_NOMEM || (rc&0xFF)==SQLITE_IOERR ); | |
/* If an error occurs during a ROLLBACK, we can no longer trust the pager | |
** cache. So call pager_error() on the way out to make any error persistent. | |
@@ -43983,6 +44983,15 @@ | |
return &pPager->pBackup; | |
} | |
+#ifndef SQLITE_OMIT_VACUUM | |
+/* | |
+** Unless this is an in-memory or temporary database, clear the pager cache. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ | |
+ if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager); | |
+} | |
+#endif | |
+ | |
#ifndef SQLITE_OMIT_WAL | |
/* | |
** This function is called when the user invokes "PRAGMA wal_checkpoint", | |
@@ -44159,13 +45168,6 @@ | |
return rc; | |
} | |
-/* | |
-** Unless this is an in-memory or temporary database, clear the pager cache. | |
-*/ | |
-SQLITE_PRIVATE void sqlite3PagerClearCache(Pager *pPager){ | |
- if( !MEMDB && pPager->tempFile==0 ) pager_reset(pPager); | |
-} | |
- | |
#ifdef SQLITE_HAS_CODEC | |
/* | |
** This function is called by the wal module when writing page content | |
@@ -44602,13 +45604,18 @@ | |
u32 iCallback; /* Value to pass to log callback (or 0) */ | |
i64 mxWalSize; /* Truncate WAL to this size upon reset */ | |
int nWiData; /* Size of array apWiData */ | |
+ int szFirstBlock; /* Size of first block written to WAL file */ | |
volatile u32 **apWiData; /* Pointer to wal-index content in memory */ | |
u32 szPage; /* Database page size */ | |
i16 readLock; /* Which read lock is being held. -1 for none */ | |
+ u8 syncFlags; /* Flags to use to sync header writes */ | |
u8 exclusiveMode; /* Non-zero if connection is in exclusive mode */ | |
u8 writeLock; /* True if in a write transaction */ | |
u8 ckptLock; /* True if holding a checkpoint lock */ | |
u8 readOnly; /* WAL_RDWR, WAL_RDONLY, or WAL_SHM_RDONLY */ | |
+ u8 truncateOnCommit; /* True to truncate WAL file on commit */ | |
+ u8 syncHeader; /* Fsync the WAL header if true */ | |
+ u8 padToSectorBoundary; /* Pad transactions out to the next sector */ | |
WalIndexHdr hdr; /* Wal-index header for current transaction */ | |
const char *zWalName; /* Name of WAL file */ | |
u32 nCkpt; /* Checkpoint sequence counter in the wal-header */ | |
@@ -45281,6 +46288,7 @@ | |
int szPage; /* Page size according to the log */ | |
u32 magic; /* Magic value read from WAL header */ | |
u32 version; /* Magic value read from WAL header */ | |
+ int isValid; /* True if this frame is valid */ | |
/* Read in the WAL header. */ | |
rc = sqlite3OsRead(pWal->pWalFd, aBuf, WAL_HDRSIZE, 0); | |
@@ -45339,14 +46347,14 @@ | |
for(iOffset=WAL_HDRSIZE; (iOffset+szFrame)<=nSize; iOffset+=szFrame){ | |
u32 pgno; /* Database page number for frame */ | |
u32 nTruncate; /* dbsize field from frame header */ | |
- int isValid; /* True if this frame is valid */ | |
/* Read and decode the next log frame. */ | |
+ iFrame++; | |
rc = sqlite3OsRead(pWal->pWalFd, aFrame, szFrame, iOffset); | |
if( rc!=SQLITE_OK ) break; | |
isValid = walDecodeFrame(pWal, &pgno, &nTruncate, aData, aFrame); | |
if( !isValid ) break; | |
- rc = walIndexAppend(pWal, ++iFrame, pgno); | |
+ rc = walIndexAppend(pWal, iFrame, pgno); | |
if( rc!=SQLITE_OK ) break; | |
/* If nTruncate is non-zero, this is a commit record. */ | |
@@ -45469,6 +46477,8 @@ | |
pRet->readLock = -1; | |
pRet->mxWalSize = mxWalSize; | |
pRet->zWalName = zWalName; | |
+ pRet->syncHeader = 1; | |
+ pRet->padToSectorBoundary = 1; | |
pRet->exclusiveMode = (bNoShm ? WAL_HEAPMEMORY_MODE: WAL_NORMAL_MODE); | |
/* Open file handle on the write-ahead log file. */ | |
@@ -45483,6 +46493,11 @@ | |
sqlite3OsClose(pRet->pWalFd); | |
sqlite3_free(pRet); | |
}else{ | |
+ int iDC = sqlite3OsDeviceCharacteristics(pRet->pWalFd); | |
+ if( iDC & SQLITE_IOCAP_SEQUENTIAL ){ pRet->syncHeader = 0; } | |
+ if( iDC & SQLITE_IOCAP_POWERSAFE_OVERWRITE ){ | |
+ pRet->padToSectorBoundary = 0; | |
+ } | |
*ppWal = pRet; | |
WALTRACE(("WAL%d: opened\n", pRet)); | |
} | |
@@ -45902,7 +46917,7 @@ | |
i64 nReq = ((i64)mxPage * szPage); | |
rc = sqlite3OsFileSize(pWal->pDbFd, &nSize); | |
if( rc==SQLITE_OK && nSize<nReq ){ | |
- sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); | |
+ sqlite3OsFileControlHint(pWal->pDbFd, SQLITE_FCNTL_SIZE_HINT, &nReq); | |
} | |
} | |
@@ -45970,6 +46985,24 @@ | |
} | |
/* | |
+** If the WAL file is currently larger than nMax bytes in size, truncate | |
+** it to exactly nMax bytes. If an error occurs while doing so, ignore it. | |
+*/ | |
+static void walLimitSize(Wal *pWal, i64 nMax){ | |
+ i64 sz; | |
+ int rx; | |
+ sqlite3BeginBenignMalloc(); | |
+ rx = sqlite3OsFileSize(pWal->pWalFd, &sz); | |
+ if( rx==SQLITE_OK && (sz > nMax ) ){ | |
+ rx = sqlite3OsTruncate(pWal->pWalFd, nMax); | |
+ } | |
+ sqlite3EndBenignMalloc(); | |
+ if( rx ){ | |
+ sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); | |
+ } | |
+} | |
+ | |
+/* | |
** Close a connection to a log file. | |
*/ | |
SQLITE_PRIVATE int sqlite3WalClose( | |
@@ -45992,23 +47025,40 @@ | |
*/ | |
rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE); | |
if( rc==SQLITE_OK ){ | |
- int bPersistWal = -1; | |
if( pWal->exclusiveMode==WAL_NORMAL_MODE ){ | |
pWal->exclusiveMode = WAL_EXCLUSIVE_MODE; | |
} | |
rc = sqlite3WalCheckpoint( | |
pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0 | |
); | |
- sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersistWal); | |
- if( rc==SQLITE_OK && bPersistWal!=1 ){ | |
- isDelete = 1; | |
+ if( rc==SQLITE_OK ){ | |
+ int bPersist = -1; | |
+ sqlite3OsFileControlHint( | |
+ pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersist | |
+ ); | |
+ if( bPersist!=1 ){ | |
+ /* Try to delete the WAL file if the checkpoint completed and | |
+ ** fsyned (rc==SQLITE_OK) and if we are not in persistent-wal | |
+ ** mode (!bPersist) */ | |
+ isDelete = 1; | |
+ }else if( pWal->mxWalSize>=0 ){ | |
+ /* Try to truncate the WAL file to zero bytes if the checkpoint | |
+ ** completed and fsynced (rc==SQLITE_OK) and we are in persistent | |
+ ** WAL mode (bPersist) and if the PRAGMA journal_size_limit is a | |
+ ** non-negative value (pWal->mxWalSize>=0). Note that we truncate | |
+ ** to zero bytes as truncating to the journal_size_limit might | |
+ ** leave a corrupt WAL file on disk. */ | |
+ walLimitSize(pWal, 0); | |
+ } | |
} | |
} | |
walIndexClose(pWal, isDelete); | |
sqlite3OsClose(pWal->pWalFd); | |
if( isDelete ){ | |
+ sqlite3BeginBenignMalloc(); | |
sqlite3OsDelete(pWal->pVfs, pWal->zWalName, 0); | |
+ sqlite3EndBenignMalloc(); | |
} | |
WALTRACE(("WAL%p: closed\n", pWal)); | |
sqlite3_free((void *)pWal->apWiData); | |
@@ -46498,7 +47548,7 @@ | |
for(iKey=walHash(pgno); aHash[iKey]; iKey=walNextHash(iKey)){ | |
u32 iFrame = aHash[iKey] + iZero; | |
if( iFrame<=iLast && aPgno[aHash[iKey]]==pgno ){ | |
- assert( iFrame>iRead ); | |
+ /* assert( iFrame>iRead ); -- not true if there is corruption */ | |
iRead = iFrame; | |
} | |
if( (nCollide--)==0 ){ | |
@@ -46610,6 +47660,7 @@ | |
if( pWal->writeLock ){ | |
walUnlockExclusive(pWal, WAL_WRITE_LOCK, 1); | |
pWal->writeLock = 0; | |
+ pWal->truncateOnCommit = 0; | |
} | |
return SQLITE_OK; | |
} | |
@@ -46706,6 +47757,7 @@ | |
return rc; | |
} | |
+ | |
/* | |
** This function is called just before writing a set of frames to the log | |
** file (see sqlite3WalFrames()). It checks to see if, instead of appending | |
@@ -46743,23 +47795,6 @@ | |
int i; /* Loop counter */ | |
u32 *aSalt = pWal->hdr.aSalt; /* Big-endian salt values */ | |
- /* Limit the size of WAL file if the journal_size_limit PRAGMA is | |
- ** set to a non-negative value. Log errors encountered | |
- ** during the truncation attempt. */ | |
- if( pWal->mxWalSize>=0 ){ | |
- i64 sz; | |
- int rx; | |
- sqlite3BeginBenignMalloc(); | |
- rx = sqlite3OsFileSize(pWal->pWalFd, &sz); | |
- if( rx==SQLITE_OK && (sz > pWal->mxWalSize) ){ | |
- rx = sqlite3OsTruncate(pWal->pWalFd, pWal->mxWalSize); | |
- } | |
- sqlite3EndBenignMalloc(); | |
- if( rx ){ | |
- sqlite3_log(rx, "cannot limit WAL size: %s", pWal->zWalName); | |
- } | |
- } | |
- | |
pWal->nCkpt++; | |
pWal->hdr.mxFrame = 0; | |
sqlite3Put4byte((u8*)&aSalt[0], 1 + sqlite3Get4byte((u8*)&aSalt[0])); | |
@@ -46788,6 +47823,74 @@ | |
return rc; | |
} | |
+/* | |
+** Information about the current state of the WAL file and where | |
+** the next fsync should occur - passed from sqlite3WalFrames() into | |
+** walWriteToLog(). | |
+*/ | |
+typedef struct WalWriter { | |
+ Wal *pWal; /* The complete WAL information */ | |
+ sqlite3_file *pFd; /* The WAL file to which we write */ | |
+ sqlite3_int64 iSyncPoint; /* Fsync at this offset */ | |
+ int syncFlags; /* Flags for the fsync */ | |
+ int szPage; /* Size of one page */ | |
+} WalWriter; | |
+ | |
+/* | |
+** Write iAmt bytes of content into the WAL file beginning at iOffset. | |
+** Do a sync when crossing the p->iSyncPoint boundary. | |
+** | |
+** In other words, if iSyncPoint is in between iOffset and iOffset+iAmt, | |
+** first write the part before iSyncPoint, then sync, then write the | |
+** rest. | |
+*/ | |
+static int walWriteToLog( | |
+ WalWriter *p, /* WAL to write to */ | |
+ void *pContent, /* Content to be written */ | |
+ int iAmt, /* Number of bytes to write */ | |
+ sqlite3_int64 iOffset /* Start writing at this offset */ | |
+){ | |
+ int rc; | |
+ if( iOffset<p->iSyncPoint && iOffset+iAmt>=p->iSyncPoint ){ | |
+ int iFirstAmt = (int)(p->iSyncPoint - iOffset); | |
+ rc = sqlite3OsWrite(p->pFd, pContent, iFirstAmt, iOffset); | |
+ if( rc ) return rc; | |
+ iOffset += iFirstAmt; | |
+ iAmt -= iFirstAmt; | |
+ pContent = (void*)(iFirstAmt + (char*)pContent); | |
+ assert( p->syncFlags & (SQLITE_SYNC_NORMAL|SQLITE_SYNC_FULL) ); | |
+ rc = sqlite3OsSync(p->pFd, p->syncFlags); | |
+ if( iAmt==0 || rc ) return rc; | |
+ } | |
+ rc = sqlite3OsWrite(p->pFd, pContent, iAmt, iOffset); | |
+ return rc; | |
+} | |
+ | |
+/* | |
+** Write out a single frame of the WAL | |
+*/ | |
+static int walWriteOneFrame( | |
+ WalWriter *p, /* Where to write the frame */ | |
+ PgHdr *pPage, /* The page of the frame to be written */ | |
+ int nTruncate, /* The commit flag. Usually 0. >0 for commit */ | |
+ sqlite3_int64 iOffset /* Byte offset at which to write */ | |
+){ | |
+ int rc; /* Result code from subfunctions */ | |
+ void *pData; /* Data actually written */ | |
+ u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ | |
+#if defined(SQLITE_HAS_CODEC) | |
+ if( (pData = sqlite3PagerCodec(pPage))==0 ) return SQLITE_NOMEM; | |
+#else | |
+ pData = pPage->pData; | |
+#endif | |
+ walEncodeFrame(p->pWal, pPage->pgno, nTruncate, pData, aFrame); | |
+ rc = walWriteToLog(p, aFrame, sizeof(aFrame), iOffset); | |
+ if( rc ) return rc; | |
+ /* Write the page data */ | |
+ rc = walWriteToLog(p, pData, p->szPage, iOffset+sizeof(aFrame)); | |
+ return rc; | |
+} | |
+ | |
/* | |
** Write a set of frames to the log. The caller must hold the write-lock | |
** on the log file (obtained using sqlite3WalBeginWriteTransaction()). | |
@@ -46802,14 +47905,20 @@ | |
){ | |
int rc; /* Used to catch return codes */ | |
u32 iFrame; /* Next frame address */ | |
- u8 aFrame[WAL_FRAME_HDRSIZE]; /* Buffer to assemble frame-header in */ | |
PgHdr *p; /* Iterator to run through pList with. */ | |
PgHdr *pLast = 0; /* Last frame in list */ | |
- int nLast = 0; /* Number of extra copies of last page */ | |
+ int nExtra = 0; /* Number of extra copies of last page */ | |
+ int szFrame; /* The size of a single frame */ | |
+ i64 iOffset; /* Next byte to write in WAL file */ | |
+ WalWriter w; /* The writer */ | |
assert( pList ); | |
assert( pWal->writeLock ); | |
+ /* If this frame set completes a transaction, then nTruncate>0. If | |
+ ** nTruncate==0 then this frame set does not complete the transaction. */ | |
+ assert( (isCommit!=0)==(nTruncate!=0) ); | |
+ | |
#if defined(SQLITE_TEST) && defined(SQLITE_DEBUG) | |
{ int cnt; for(cnt=0, p=pList; p; p=p->pDirty, cnt++){} | |
WALTRACE(("WAL%p: frame write begin. %d frames. mxFrame=%d. %s\n", | |
@@ -46837,7 +47946,7 @@ | |
sqlite3Put4byte(&aWalHdr[4], WAL_MAX_VERSION); | |
sqlite3Put4byte(&aWalHdr[8], szPage); | |
sqlite3Put4byte(&aWalHdr[12], pWal->nCkpt); | |
- sqlite3_randomness(8, pWal->hdr.aSalt); | |
+ if( pWal->nCkpt==0 ) sqlite3_randomness(8, pWal->hdr.aSalt); | |
memcpy(&aWalHdr[16], pWal->hdr.aSalt, 8); | |
walChecksumBytes(1, aWalHdr, WAL_HDRSIZE-2*4, 0, aCksum); | |
sqlite3Put4byte(&aWalHdr[24], aCksum[0]); | |
@@ -46847,77 +47956,89 @@ | |
pWal->hdr.bigEndCksum = SQLITE_BIGENDIAN; | |
pWal->hdr.aFrameCksum[0] = aCksum[0]; | |
pWal->hdr.aFrameCksum[1] = aCksum[1]; | |
+ pWal->truncateOnCommit = 1; | |
rc = sqlite3OsWrite(pWal->pWalFd, aWalHdr, sizeof(aWalHdr), 0); | |
WALTRACE(("WAL%p: wal-header write %s\n", pWal, rc ? "failed" : "ok")); | |
if( rc!=SQLITE_OK ){ | |
return rc; | |
} | |
+ | |
+ /* Sync the header (unless SQLITE_IOCAP_SEQUENTIAL is true or unless | |
+ ** all syncing is turned off by PRAGMA synchronous=OFF). Otherwise | |
+ ** an out-of-order write following a WAL restart could result in | |
+ ** database corruption. See the ticket: | |
+ ** | |
+ ** http://localhost:591/sqlite/info/ff5be73dee | |
+ */ | |
+ if( pWal->syncHeader && sync_flags ){ | |
+ rc = sqlite3OsSync(pWal->pWalFd, sync_flags & SQLITE_SYNC_MASK); | |
+ if( rc ) return rc; | |
+ } | |
} | |
assert( (int)pWal->szPage==szPage ); | |
- /* Write the log file. */ | |
- for(p=pList; p; p=p->pDirty){ | |
- u32 nDbsize; /* Db-size field for frame header */ | |
- i64 iOffset; /* Write offset in log file */ | |
- void *pData; | |
- | |
- iOffset = walFrameOffset(++iFrame, szPage); | |
- /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */ | |
- | |
- /* Populate and write the frame header */ | |
- nDbsize = (isCommit && p->pDirty==0) ? nTruncate : 0; | |
-#if defined(SQLITE_HAS_CODEC) | |
- if( (pData = sqlite3PagerCodec(p))==0 ) return SQLITE_NOMEM; | |
-#else | |
- pData = p->pData; | |
-#endif | |
- walEncodeFrame(pWal, p->pgno, nDbsize, pData, aFrame); | |
- rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOffset); | |
- if( rc!=SQLITE_OK ){ | |
- return rc; | |
- } | |
+ /* Setup information needed to write frames into the WAL */ | |
+ w.pWal = pWal; | |
+ w.pFd = pWal->pWalFd; | |
+ w.iSyncPoint = 0; | |
+ w.syncFlags = sync_flags; | |
+ w.szPage = szPage; | |
+ iOffset = walFrameOffset(iFrame+1, szPage); | |
+ szFrame = szPage + WAL_FRAME_HDRSIZE; | |
- /* Write the page data */ | |
- rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOffset+sizeof(aFrame)); | |
- if( rc!=SQLITE_OK ){ | |
- return rc; | |
- } | |
+ /* Write all frames into the log file exactly once */ | |
+ for(p=pList; p; p=p->pDirty){ | |
+ int nDbSize; /* 0 normally. Positive == commit flag */ | |
+ iFrame++; | |
+ assert( iOffset==walFrameOffset(iFrame, szPage) ); | |
+ nDbSize = (isCommit && p->pDirty==0) ? nTruncate : 0; | |
+ rc = walWriteOneFrame(&w, p, nDbSize, iOffset); | |
+ if( rc ) return rc; | |
pLast = p; | |
+ iOffset += szFrame; | |
} | |
- /* Sync the log file if the 'isSync' flag was specified. */ | |
- if( sync_flags ){ | |
- i64 iSegment = sqlite3OsSectorSize(pWal->pWalFd); | |
- i64 iOffset = walFrameOffset(iFrame+1, szPage); | |
- | |
- assert( isCommit ); | |
- assert( iSegment>0 ); | |
- | |
- iSegment = (((iOffset+iSegment-1)/iSegment) * iSegment); | |
- while( iOffset<iSegment ){ | |
- void *pData; | |
-#if defined(SQLITE_HAS_CODEC) | |
- if( (pData = sqlite3PagerCodec(pLast))==0 ) return SQLITE_NOMEM; | |
-#else | |
- pData = pLast->pData; | |
-#endif | |
- walEncodeFrame(pWal, pLast->pgno, nTruncate, pData, aFrame); | |
- /* testcase( IS_BIG_INT(iOffset) ); // requires a 4GiB WAL */ | |
- rc = sqlite3OsWrite(pWal->pWalFd, aFrame, sizeof(aFrame), iOffset); | |
- if( rc!=SQLITE_OK ){ | |
- return rc; | |
- } | |
- iOffset += WAL_FRAME_HDRSIZE; | |
- rc = sqlite3OsWrite(pWal->pWalFd, pData, szPage, iOffset); | |
- if( rc!=SQLITE_OK ){ | |
- return rc; | |
+ /* If this is the end of a transaction, then we might need to pad | |
+ ** the transaction and/or sync the WAL file. | |
+ ** | |
+ ** Padding and syncing only occur if this set of frames complete a | |
+ ** transaction and if PRAGMA synchronous=FULL. If synchronous==NORMAL | |
+ ** or synchonous==OFF, then no padding or syncing are needed. | |
+ ** | |
+ ** If SQLITE_IOCAP_POWERSAFE_OVERWRITE is defined, then padding is not | |
+ ** needed and only the sync is done. If padding is needed, then the | |
+ ** final frame is repeated (with its commit mark) until the next sector | |
+ ** boundary is crossed. Only the part of the WAL prior to the last | |
+ ** sector boundary is synced; the part of the last frame that extends | |
+ ** past the sector boundary is written after the sync. | |
+ */ | |
+ if( isCommit && (sync_flags & WAL_SYNC_TRANSACTIONS)!=0 ){ | |
+ if( pWal->padToSectorBoundary ){ | |
+ int sectorSize = sqlite3OsSectorSize(pWal->pWalFd); | |
+ w.iSyncPoint = ((iOffset+sectorSize-1)/sectorSize)*sectorSize; | |
+ while( iOffset<w.iSyncPoint ){ | |
+ rc = walWriteOneFrame(&w, pLast, nTruncate, iOffset); | |
+ if( rc ) return rc; | |
+ iOffset += szFrame; | |
+ nExtra++; | |
} | |
- nLast++; | |
- iOffset += szPage; | |
+ }else{ | |
+ rc = sqlite3OsSync(w.pFd, sync_flags & SQLITE_SYNC_MASK); | |
} | |
+ } | |
- rc = sqlite3OsSync(pWal->pWalFd, sync_flags); | |
+ /* 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. | |
+ */ | |
+ if( isCommit && pWal->truncateOnCommit && pWal->mxWalSize>=0 ){ | |
+ i64 sz = pWal->mxWalSize; | |
+ if( walFrameOffset(iFrame+nExtra+1, szPage)>pWal->mxWalSize ){ | |
+ sz = walFrameOffset(iFrame+nExtra+1, szPage); | |
+ } | |
+ walLimitSize(pWal, sz); | |
+ pWal->truncateOnCommit = 0; | |
} | |
/* Append data to the wal-index. It is not necessary to lock the | |
@@ -46930,9 +48051,9 @@ | |
iFrame++; | |
rc = walIndexAppend(pWal, iFrame, p->pgno); | |
} | |
- while( nLast>0 && rc==SQLITE_OK ){ | |
+ while( rc==SQLITE_OK && nExtra>0 ){ | |
iFrame++; | |
- nLast--; | |
+ nExtra--; | |
rc = walIndexAppend(pWal, iFrame, pLast->pgno); | |
} | |
@@ -47438,6 +48559,7 @@ | |
u8 hasData; /* True if this page stores data */ | |
u8 hdrOffset; /* 100 for page 1. 0 otherwise */ | |
u8 childPtrSize; /* 0 if leaf==1. 4 if leaf==0 */ | |
+ u8 max1bytePayload; /* min(maxLocal,127) */ | |
u16 maxLocal; /* Copy of BtShared.maxLocal or BtShared.maxLeaf */ | |
u16 minLocal; /* Copy of BtShared.minLocal or BtShared.minLeaf */ | |
u16 cellOffset; /* Index in aData of first cell pointer */ | |
@@ -47450,6 +48572,8 @@ | |
} aOvfl[5]; | |
BtShared *pBt; /* Pointer to BtShared that this page is part of */ | |
u8 *aData; /* Pointer to disk image of the page data */ | |
+ u8 *aDataEnd; /* One byte past the end of usable data */ | |
+ u8 *aCellIdx; /* The cell index area */ | |
DbPage *pDbPage; /* Pager page handle */ | |
Pgno pgno; /* Page number for this page */ | |
}; | |
@@ -47529,7 +48653,7 @@ | |
/* | |
** An instance of this object represents a single database file. | |
** | |
-** A single database file can be in use as the same time by two | |
+** A single database file can be in use at the same time by two | |
** or more database connections. When two or more connections are | |
** sharing the same database file, each connection has it own | |
** private Btree object for the file and each of those Btrees points | |
@@ -47566,17 +48690,14 @@ | |
sqlite3 *db; /* Database connection currently using this Btree */ | |
BtCursor *pCursor; /* A list of all open cursors */ | |
MemPage *pPage1; /* First page of the database */ | |
- u8 readOnly; /* True if the underlying file is readonly */ | |
- u8 pageSizeFixed; /* True if the page size can no longer be changed */ | |
- u8 secureDelete; /* True if secure_delete is enabled */ | |
- u8 initiallyEmpty; /* Database is empty at start of transaction */ | |
u8 openFlags; /* Flags to sqlite3BtreeOpen() */ | |
#ifndef SQLITE_OMIT_AUTOVACUUM | |
u8 autoVacuum; /* True if auto-vacuum is enabled */ | |
u8 incrVacuum; /* True if incr-vacuum is enabled */ | |
#endif | |
u8 inTransaction; /* Transaction state */ | |
- u8 doNotUseWAL; /* If true, do not open write-ahead-log file */ | |
+ u8 max1bytePayload; /* Maximum first byte of cell for a 1-byte payload */ | |
+ u16 btsFlags; /* Boolean parameters. See BTS_* macros below */ | |
u16 maxLocal; /* Maximum local payload in non-LEAFDATA tables */ | |
u16 minLocal; /* Minimum local payload in non-LEAFDATA tables */ | |
u16 maxLeaf; /* Maximum local payload in a LEAFDATA table */ | |
@@ -47594,13 +48715,22 @@ | |
BtShared *pNext; /* Next on a list of sharable BtShared structs */ | |
BtLock *pLock; /* List of locks held on this shared-btree struct */ | |
Btree *pWriter; /* Btree with currently open write transaction */ | |
- u8 isExclusive; /* True if pWriter has an EXCLUSIVE lock on the db */ | |
- u8 isPending; /* If waiting for read-locks to clear */ | |
#endif | |
u8 *pTmpSpace; /* BtShared.pageSize bytes of space for tmp use */ | |
}; | |
/* | |
+** Allowed values for BtShared.btsFlags | |
+*/ | |
+#define BTS_READ_ONLY 0x0001 /* Underlying file is readonly */ | |
+#define BTS_PAGESIZE_FIXED 0x0002 /* Page size can no longer be changed */ | |
+#define BTS_SECURE_DELETE 0x0004 /* PRAGMA secure_delete is enabled */ | |
+#define BTS_INITIALLY_EMPTY 0x0008 /* Database was empty at trans start */ | |
+#define BTS_NO_WAL 0x0010 /* Do not open write-ahead-log files */ | |
+#define BTS_EXCLUSIVE 0x0020 /* pWriter has an exclusive lock */ | |
+#define BTS_PENDING 0x0040 /* Waiting for read-locks to clear */ | |
+ | |
+/* | |
** An instance of the following structure is used to hold information | |
** about a cell. The parseCellPtr() function fills in this structure | |
** based on information extract from the raw disk page. | |
@@ -47635,7 +48765,7 @@ | |
** The entry is identified by its MemPage and the index in | |
** MemPage.aCell[] of the entry. | |
** | |
-** A single database file can shared by two more database connections, | |
+** A single database file can be shared by two more database connections, | |
** but cursors cannot be shared. Each cursor is associated with a | |
** particular database connection identified BtCursor.pBtree.db. | |
** | |
@@ -47796,7 +48926,7 @@ | |
}; | |
/* | |
-** Read or write a two- and four-byte big-endian integer values. | |
+** Routines to read or write a two- and four-byte big-endian integer values. | |
*/ | |
#define get2byte(x) ((x)[0]<<8 | (x)[1]) | |
#define put2byte(p,v) ((p)[0] = (u8)((v)>>8), (p)[1] = (u8)(v)) | |
@@ -48321,7 +49451,7 @@ | |
/* If some other connection is holding an exclusive lock, the | |
** requested lock may not be obtained. | |
*/ | |
- if( pBt->pWriter!=p && pBt->isExclusive ){ | |
+ if( pBt->pWriter!=p && (pBt->btsFlags & BTS_EXCLUSIVE)!=0 ){ | |
sqlite3ConnectionBlocked(p->db, pBt->pWriter->db); | |
return SQLITE_LOCKED_SHAREDCACHE; | |
} | |
@@ -48342,7 +49472,7 @@ | |
sqlite3ConnectionBlocked(p->db, pIter->pBtree->db); | |
if( eLock==WRITE_LOCK ){ | |
assert( p==pBt->pWriter ); | |
- pBt->isPending = 1; | |
+ pBt->btsFlags |= BTS_PENDING; | |
} | |
return SQLITE_LOCKED_SHAREDCACHE; | |
} | |
@@ -48430,7 +49560,7 @@ | |
** the setSharedCacheTableLock() procedure) held by Btree object p. | |
** | |
** This function assumes that Btree p has an open read or write | |
-** transaction. If it does not, then the BtShared.isPending variable | |
+** transaction. If it does not, then the BTS_PENDING flag | |
** may be incorrectly cleared. | |
*/ | |
static void clearAllSharedCacheTableLocks(Btree *p){ | |
@@ -48443,7 +49573,7 @@ | |
while( *ppIter ){ | |
BtLock *pLock = *ppIter; | |
- assert( pBt->isExclusive==0 || pBt->pWriter==pLock->pBtree ); | |
+ assert( (pBt->btsFlags & BTS_EXCLUSIVE)==0 || pBt->pWriter==pLock->pBtree ); | |
assert( pLock->pBtree->inTrans>=pLock->eLock ); | |
if( pLock->pBtree==p ){ | |
*ppIter = pLock->pNext; | |
@@ -48456,22 +49586,21 @@ | |
} | |
} | |
- assert( pBt->isPending==0 || pBt->pWriter ); | |
+ assert( (pBt->btsFlags & BTS_PENDING)==0 || pBt->pWriter ); | |
if( pBt->pWriter==p ){ | |
pBt->pWriter = 0; | |
- pBt->isExclusive = 0; | |
- pBt->isPending = 0; | |
+ pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); | |
}else if( pBt->nTransaction==2 ){ | |
/* This function is called when Btree p is concluding its | |
** transaction. If there currently exists a writer, and p is not | |
** that writer, then the number of locks held by connections other | |
** than the writer must be about to drop to zero. In this case | |
- ** set the isPending flag to 0. | |
+ ** set the BTS_PENDING flag to 0. | |
** | |
- ** If there is not currently a writer, then BtShared.isPending must | |
+ ** If there is not currently a writer, then BTS_PENDING must | |
** be zero already. So this next line is harmless in that case. | |
*/ | |
- pBt->isPending = 0; | |
+ pBt->btsFlags &= ~BTS_PENDING; | |
} | |
} | |
@@ -48483,8 +49612,7 @@ | |
if( pBt->pWriter==p ){ | |
BtLock *pLock; | |
pBt->pWriter = 0; | |
- pBt->isExclusive = 0; | |
- pBt->isPending = 0; | |
+ pBt->btsFlags &= ~(BTS_EXCLUSIVE|BTS_PENDING); | |
for(pLock=pBt->pLock; pLock; pLock=pLock->pNext){ | |
assert( pLock->eLock==READ_LOCK || pLock->pBtree==p ); | |
pLock->eLock = READ_LOCK; | |
@@ -48937,7 +50065,7 @@ | |
** This routine works only for pages that do not contain overflow cells. | |
*/ | |
#define findCell(P,I) \ | |
- ((P)->aData + ((P)->maskPage & get2byte(&(P)->aData[(P)->cellOffset+2*(I)]))) | |
+ ((P)->aData + ((P)->maskPage & get2byte(&(P)->aCellIdx[2*(I)]))) | |
#define findCellv2(D,M,O,I) (D+(M&get2byte(D+(O+2*(I))))) | |
@@ -49342,7 +50470,7 @@ | |
assert( sqlite3_mutex_held(pPage->pBt->mutex) ); | |
assert( size>=0 ); /* Minimum cell size is 4 */ | |
- if( pPage->pBt->secureDelete ){ | |
+ if( pPage->pBt->btsFlags & BTS_SECURE_DELETE ){ | |
/* Overwrite deleted information with zeros when the secure_delete | |
** option is enabled */ | |
memset(&data[start], 0, size); | |
@@ -49445,6 +50573,7 @@ | |
}else{ | |
return SQLITE_CORRUPT_BKPT; | |
} | |
+ pPage->max1bytePayload = pBt->max1bytePayload; | |
return SQLITE_OK; | |
} | |
@@ -49487,6 +50616,8 @@ | |
pPage->nOverflow = 0; | |
usableSize = pBt->usableSize; | |
pPage->cellOffset = cellOffset = hdr + 12 - 4*pPage->leaf; | |
+ pPage->aDataEnd = &data[usableSize]; | |
+ pPage->aCellIdx = &data[cellOffset]; | |
top = get2byteNotZero(&data[hdr+5]); | |
pPage->nCell = get2byte(&data[hdr+3]); | |
if( pPage->nCell>MX_CELL(pBt) ){ | |
@@ -49578,7 +50709,7 @@ | |
assert( sqlite3PagerGetData(pPage->pDbPage) == data ); | |
assert( sqlite3PagerIswriteable(pPage->pDbPage) ); | |
assert( sqlite3_mutex_held(pBt->mutex) ); | |
- if( pBt->secureDelete ){ | |
+ if( pBt->btsFlags & BTS_SECURE_DELETE ){ | |
memset(&data[hdr], 0, pBt->usableSize - hdr); | |
} | |
data[hdr] = (char)flags; | |
@@ -49590,6 +50721,8 @@ | |
decodeFlags(pPage, flags); | |
pPage->hdrOffset = hdr; | |
pPage->cellOffset = first; | |
+ pPage->aDataEnd = &data[pBt->usableSize]; | |
+ pPage->aCellIdx = &data[first]; | |
pPage->nOverflow = 0; | |
assert( pBt->pageSize>=512 && pBt->pageSize<=65536 ); | |
pPage->maskPage = (u16)(pBt->pageSize - 1); | |
@@ -49850,7 +50983,12 @@ | |
sqlite3_free(p); | |
return SQLITE_NOMEM; | |
} | |
- sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); | |
+ rc = sqlite3OsFullPathname(pVfs, zFilename, nFullPathname, zFullPathname); | |
+ if( rc ){ | |
+ sqlite3_free(zFullPathname); | |
+ sqlite3_free(p); | |
+ return rc; | |
+ } | |
#if SQLITE_THREADSAFE | |
mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); | |
sqlite3_mutex_enter(mutexOpen); | |
@@ -49924,9 +51062,9 @@ | |
pBt->pCursor = 0; | |
pBt->pPage1 = 0; | |
- pBt->readOnly = sqlite3PagerIsreadonly(pBt->pPager); | |
+ if( sqlite3PagerIsreadonly(pBt->pPager) ) pBt->btsFlags |= BTS_READ_ONLY; | |
#ifdef SQLITE_SECURE_DELETE | |
- pBt->secureDelete = 1; | |
+ pBt->btsFlags |= BTS_SECURE_DELETE; | |
#endif | |
pBt->pageSize = (zDbHeader[16]<<8) | (zDbHeader[17]<<16); | |
if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE | |
@@ -49947,7 +51085,7 @@ | |
nReserve = 0; | |
}else{ | |
nReserve = zDbHeader[20]; | |
- pBt->pageSizeFixed = 1; | |
+ pBt->btsFlags |= BTS_PAGESIZE_FIXED; | |
#ifndef SQLITE_OMIT_AUTOVACUUM | |
pBt->autoVacuum = (get4byte(&zDbHeader[36 + 4*4])?1:0); | |
pBt->incrVacuum = (get4byte(&zDbHeader[36 + 7*4])?1:0); | |
@@ -50235,7 +51373,7 @@ | |
** If parameter nReserve is less than zero, then the number of reserved | |
** bytes per page is left unchanged. | |
** | |
-** If the iFix!=0 then the pageSizeFixed flag is set so that the page size | |
+** If the iFix!=0 then the BTS_PAGESIZE_FIXED flag is set so that the page size | |
** and autovacuum mode can no longer be changed. | |
*/ | |
SQLITE_PRIVATE int sqlite3BtreeSetPageSize(Btree *p, int pageSize, int nReserve, int iFix){ | |
@@ -50243,7 +51381,7 @@ | |
BtShared *pBt = p->pBt; | |
assert( nReserve>=-1 && nReserve<=255 ); | |
sqlite3BtreeEnter(p); | |
- if( pBt->pageSizeFixed ){ | |
+ if( pBt->btsFlags & BTS_PAGESIZE_FIXED ){ | |
sqlite3BtreeLeave(p); | |
return SQLITE_READONLY; | |
} | |
@@ -50260,7 +51398,7 @@ | |
} | |
rc = sqlite3PagerSetPagesize(pBt->pPager, &pBt->pageSize, nReserve); | |
pBt->usableSize = pBt->pageSize - (u16)nReserve; | |
- if( iFix ) pBt->pageSizeFixed = 1; | |
+ if( iFix ) pBt->btsFlags |= BTS_PAGESIZE_FIXED; | |
sqlite3BtreeLeave(p); | |
return rc; | |
} | |
@@ -50300,8 +51438,8 @@ | |
} | |
/* | |
-** Set the secureDelete flag if newFlag is 0 or 1. If newFlag is -1, | |
-** then make no changes. Always return the value of the secureDelete | |
+** Set the BTS_SECURE_DELETE flag if newFlag is 0 or 1. If newFlag is -1, | |
+** then make no changes. Always return the value of the BTS_SECURE_DELETE | |
** setting after the change. | |
*/ | |
SQLITE_PRIVATE int sqlite3BtreeSecureDelete(Btree *p, int newFlag){ | |
@@ -50309,9 +51447,10 @@ | |
if( p==0 ) return 0; | |
sqlite3BtreeEnter(p); | |
if( newFlag>=0 ){ | |
- p->pBt->secureDelete = (newFlag!=0) ? 1 : 0; | |
+ p->pBt->btsFlags &= ~BTS_SECURE_DELETE; | |
+ if( newFlag ) p->pBt->btsFlags |= BTS_SECURE_DELETE; | |
} | |
- b = p->pBt->secureDelete; | |
+ b = (p->pBt->btsFlags & BTS_SECURE_DELETE)!=0; | |
sqlite3BtreeLeave(p); | |
return b; | |
} | |
@@ -50332,7 +51471,7 @@ | |
u8 av = (u8)autoVacuum; | |
sqlite3BtreeEnter(p); | |
- if( pBt->pageSizeFixed && (av ?1:0)!=pBt->autoVacuum ){ | |
+ if( (pBt->btsFlags & BTS_PAGESIZE_FIXED)!=0 && (av ?1:0)!=pBt->autoVacuum ){ | |
rc = SQLITE_READONLY; | |
}else{ | |
pBt->autoVacuum = av ?1:0; | |
@@ -50406,14 +51545,14 @@ | |
#ifdef SQLITE_OMIT_WAL | |
if( page1[18]>1 ){ | |
- pBt->readOnly = 1; | |
+ pBt->btsFlags |= BTS_READ_ONLY; | |
} | |
if( page1[19]>1 ){ | |
goto page1_init_failed; | |
} | |
#else | |
if( page1[18]>2 ){ | |
- pBt->readOnly = 1; | |
+ pBt->btsFlags |= BTS_READ_ONLY; | |
} | |
if( page1[19]>2 ){ | |
goto page1_init_failed; | |
@@ -50427,7 +51566,7 @@ | |
** may not be the latest version - there may be a newer one in the log | |
** file. | |
*/ | |
- if( page1[19]==2 && pBt->doNotUseWAL==0 ){ | |
+ if( page1[19]==2 && (pBt->btsFlags & BTS_NO_WAL)==0 ){ | |
int isOpen = 0; | |
rc = sqlite3PagerOpenWal(pBt->pPager, &isOpen); | |
if( rc!=SQLITE_OK ){ | |
@@ -50504,6 +51643,11 @@ | |
pBt->minLocal = (u16)((pBt->usableSize-12)*32/255 - 23); | |
pBt->maxLeaf = (u16)(pBt->usableSize - 35); | |
pBt->minLeaf = (u16)((pBt->usableSize-12)*32/255 - 23); | |
+ if( pBt->maxLocal>127 ){ | |
+ pBt->max1bytePayload = 127; | |
+ }else{ | |
+ pBt->max1bytePayload = (u8)pBt->maxLocal; | |
+ } | |
assert( pBt->maxLeaf + 23 <= MX_CELL_SIZE(pBt) ); | |
pBt->pPage1 = pPage1; | |
pBt->nPage = nPage; | |
@@ -50567,7 +51711,7 @@ | |
data[23] = 32; | |
memset(&data[24], 0, 100-24); | |
zeroPage(pP1, PTF_INTKEY|PTF_LEAF|PTF_LEAFDATA ); | |
- pBt->pageSizeFixed = 1; | |
+ pBt->btsFlags |= BTS_PAGESIZE_FIXED; | |
#ifndef SQLITE_OMIT_AUTOVACUUM | |
assert( pBt->autoVacuum==1 || pBt->autoVacuum==0 ); | |
assert( pBt->incrVacuum==1 || pBt->incrVacuum==0 ); | |
@@ -50631,7 +51775,7 @@ | |
} | |
/* Write transactions are not possible on a read-only database */ | |
- if( pBt->readOnly && wrflag ){ | |
+ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 && wrflag ){ | |
rc = SQLITE_READONLY; | |
goto trans_begun; | |
} | |
@@ -50641,7 +51785,9 @@ | |
** on this shared-btree structure and a second write transaction is | |
** requested, return SQLITE_LOCKED. | |
*/ | |
- if( (wrflag && pBt->inTransaction==TRANS_WRITE) || pBt->isPending ){ | |
+ if( (wrflag && pBt->inTransaction==TRANS_WRITE) | |
+ || (pBt->btsFlags & BTS_PENDING)!=0 | |
+ ){ | |
pBlock = pBt->pWriter->db; | |
}else if( wrflag>1 ){ | |
BtLock *pIter; | |
@@ -50665,7 +51811,8 @@ | |
rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); | |
if( SQLITE_OK!=rc ) goto trans_begun; | |
- pBt->initiallyEmpty = (u8)(pBt->nPage==0); | |
+ pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; | |
+ if( pBt->nPage==0 ) pBt->btsFlags |= BTS_INITIALLY_EMPTY; | |
do { | |
/* Call lockBtree() until either pBt->pPage1 is populated or | |
** lockBtree() returns something other than SQLITE_OK. lockBtree() | |
@@ -50677,7 +51824,7 @@ | |
while( pBt->pPage1==0 && SQLITE_OK==(rc = lockBtree(pBt)) ); | |
if( rc==SQLITE_OK && wrflag ){ | |
- if( pBt->readOnly ){ | |
+ if( (pBt->btsFlags & BTS_READ_ONLY)!=0 ){ | |
rc = SQLITE_READONLY; | |
}else{ | |
rc = sqlite3PagerBegin(pBt->pPager,wrflag>1,sqlite3TempInMemory(p->db)); | |
@@ -50714,7 +51861,8 @@ | |
#ifndef SQLITE_OMIT_SHARED_CACHE | |
assert( !pBt->pWriter ); | |
pBt->pWriter = p; | |
- pBt->isExclusive = (u8)(wrflag>1); | |
+ pBt->btsFlags &= ~BTS_EXCLUSIVE; | |
+ if( wrflag>1 ) pBt->btsFlags |= BTS_EXCLUSIVE; | |
#endif | |
/* If the db-size header field is incorrect (as it may be if an old | |
@@ -51443,7 +52591,7 @@ | |
BtShared *pBt = p->pBt; | |
sqlite3BtreeEnter(p); | |
assert( p->inTrans==TRANS_WRITE ); | |
- assert( pBt->readOnly==0 ); | |
+ assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); | |
assert( iStatement>0 ); | |
assert( iStatement>p->db->nSavepoint ); | |
assert( pBt->inTransaction==TRANS_WRITE ); | |
@@ -51478,7 +52626,9 @@ | |
sqlite3BtreeEnter(p); | |
rc = sqlite3PagerSavepoint(pBt->pPager, op, iSavepoint); | |
if( rc==SQLITE_OK ){ | |
- if( iSavepoint<0 && pBt->initiallyEmpty ) pBt->nPage = 0; | |
+ if( iSavepoint<0 && (pBt->btsFlags & BTS_INITIALLY_EMPTY)!=0 ){ | |
+ pBt->nPage = 0; | |
+ } | |
rc = newDatabase(pBt); | |
pBt->nPage = get4byte(28 + pBt->pPage1->aData); | |
@@ -51548,7 +52698,7 @@ | |
assert( wrFlag==0 || p->inTrans==TRANS_WRITE ); | |
assert( pBt->pPage1 && pBt->pPage1->aData ); | |
- if( NEVER(wrFlag && pBt->readOnly) ){ | |
+ if( NEVER(wrFlag && (pBt->btsFlags & BTS_READ_ONLY)!=0) ){ | |
return SQLITE_READONLY; | |
} | |
if( iTable==1 && btreePagecount(pBt)==0 ){ | |
@@ -52048,7 +53198,7 @@ | |
u8 aSave[4]; | |
u8 *aWrite = &pBuf[-4]; | |
memcpy(aSave, aWrite, 4); | |
- rc = sqlite3OsRead(fd, aWrite, a+4, pBt->pageSize * (nextPage-1)); | |
+ rc = sqlite3OsRead(fd, aWrite, a+4, (i64)pBt->pageSize*(nextPage-1)); | |
nextPage = get4byte(aWrite); | |
memcpy(aWrite, aSave, 4); | |
}else | |
@@ -52252,7 +53402,7 @@ | |
return SQLITE_OK; | |
} | |
-#ifndef NDEBUG | |
+#if 0 | |
/* | |
** Page pParent is an internal (non-leaf) tree page. This function | |
** asserts that page number iChild is the left-child if the iIdx'th | |
@@ -52285,11 +53435,21 @@ | |
assert( pCur->eState==CURSOR_VALID ); | |
assert( pCur->iPage>0 ); | |
assert( pCur->apPage[pCur->iPage] ); | |
+ | |
+ /* UPDATE: It is actually possible for the condition tested by the assert | |
+ ** below to be untrue if the database file is corrupt. This can occur if | |
+ ** one cursor has modified page pParent while a reference to it is held | |
+ ** by a second cursor. Which can only happen if a single page is linked | |
+ ** into more than one b-tree structure in a corrupt database. */ | |
+#if 0 | |
assertParentIndex( | |
pCur->apPage[pCur->iPage-1], | |
pCur->aiIdx[pCur->iPage-1], | |
pCur->apPage[pCur->iPage]->pgno | |
); | |
+#endif | |
+ testcase( pCur->aiIdx[pCur->iPage-1] > pCur->apPage[pCur->iPage-1]->nCell ); | |
+ | |
releasePage(pCur->apPage[pCur->iPage]); | |
pCur->iPage--; | |
pCur->info.nSize = 0; | |
@@ -52628,16 +53788,21 @@ | |
** 2 bytes of the cell. | |
*/ | |
int nCell = pCell[0]; | |
- if( !(nCell & 0x80) && nCell<=pPage->maxLocal ){ | |
+ if( nCell<=pPage->max1bytePayload | |
+ /* && (pCell+nCell)<pPage->aDataEnd */ | |
+ ){ | |
/* This branch runs if the record-size field of the cell is a | |
** single byte varint and the record fits entirely on the main | |
** b-tree page. */ | |
+ testcase( pCell+nCell+1==pPage->aDataEnd ); | |
c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[1], pIdxKey); | |
}else if( !(pCell[1] & 0x80) | |
&& (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal | |
+ /* && (pCell+nCell+2)<=pPage->aDataEnd */ | |
){ | |
/* The record-size field is a 2 byte varint and the record | |
** fits entirely on the main b-tree page. */ | |
+ testcase( pCell+nCell+2==pPage->aDataEnd ); | |
c = sqlite3VdbeRecordCompare(nCell, (void*)&pCell[2], pIdxKey); | |
}else{ | |
/* The record flows over onto one or more overflow pages. In | |
@@ -52754,7 +53919,13 @@ | |
pPage = pCur->apPage[pCur->iPage]; | |
idx = ++pCur->aiIdx[pCur->iPage]; | |
assert( pPage->isInit ); | |
- assert( idx<=pPage->nCell ); | |
+ | |
+ /* If the database file is corrupt, it is possible for the value of idx | |
+ ** to be invalid here. This can only occur if a second cursor modifies | |
+ ** the page while cursor pCur is holding a reference to it. Which can | |
+ ** only happen if the database is corrupt in such a way as to link the | |
+ ** page into more than one b-tree structure. */ | |
+ testcase( idx>pPage->nCell ); | |
pCur->info.nSize = 0; | |
pCur->validNKey = 0; | |
@@ -53179,7 +54350,7 @@ | |
nFree = get4byte(&pPage1->aData[36]); | |
put4byte(&pPage1->aData[36], nFree+1); | |
- if( pBt->secureDelete ){ | |
+ if( pBt->btsFlags & BTS_SECURE_DELETE ){ | |
/* If the secure_delete option is enabled, then | |
** always fully overwrite deleted information with zeros. | |
*/ | |
@@ -53240,7 +54411,7 @@ | |
if( rc==SQLITE_OK ){ | |
put4byte(&pTrunk->aData[4], nLeaf+1); | |
put4byte(&pTrunk->aData[8+nLeaf*4], iPage); | |
- if( pPage && !pBt->secureDelete ){ | |
+ if( pPage && (pBt->btsFlags & BTS_SECURE_DELETE)==0 ){ | |
sqlite3PagerDontWrite(pPage->pDbPage); | |
} | |
rc = btreeSetHasContent(pBt, iPage); | |
@@ -53532,7 +54703,7 @@ | |
assert( sqlite3PagerIswriteable(pPage->pDbPage) ); | |
assert( sqlite3_mutex_held(pPage->pBt->mutex) ); | |
data = pPage->aData; | |
- ptr = &data[pPage->cellOffset + 2*idx]; | |
+ ptr = &pPage->aCellIdx[2*idx]; | |
pc = get2byte(ptr); | |
hdr = pPage->hdrOffset; | |
testcase( pc==get2byte(&data[hdr+5]) ); | |
@@ -53546,7 +54717,7 @@ | |
*pRC = rc; | |
return; | |
} | |
- endPtr = &data[pPage->cellOffset + 2*pPage->nCell - 2]; | |
+ endPtr = &pPage->aCellIdx[2*pPage->nCell - 2]; | |
assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */ | |
while( ptr<endPtr ){ | |
*(u16*)ptr = *(u16*)&ptr[2]; | |
@@ -53688,7 +54859,7 @@ | |
assert( pPage->nCell==0 ); | |
assert( get2byteNotZero(&data[hdr+5])==nUsable ); | |
- pCellptr = &data[pPage->cellOffset + nCell*2]; | |
+ pCellptr = &pPage->aCellIdx[nCell*2]; | |
cellbody = nUsable; | |
for(i=nCell-1; i>=0; i--){ | |
u16 sz = aSize[i]; | |
@@ -54081,7 +55252,7 @@ | |
** In this case, temporarily copy the cell into the aOvflSpace[] | |
** buffer. It will be copied out again as soon as the aSpace[] buffer | |
** is allocated. */ | |
- if( pBt->secureDelete ){ | |
+ if( pBt->btsFlags & BTS_SECURE_DELETE ){ | |
int iOff; | |
iOff = SQLITE_PTR_TO_INT(apDiv[i]) - SQLITE_PTR_TO_INT(pParent->aData); | |
@@ -54266,8 +55437,14 @@ | |
/* Either we found one or more cells (cntnew[0])>0) or pPage is | |
** a virtual root page. A virtual root page is when the real root | |
** page is page 1 and we are the only child of that page. | |
+ ** | |
+ ** UPDATE: The assert() below is not necessarily true if the database | |
+ ** file is corrupt. The corruption will be detected and reported later | |
+ ** in this procedure so there is no need to act upon it now. | |
*/ | |
+#if 0 | |
assert( cntNew[0]>0 || (pParent->pgno==1 && pParent->nCell==0) ); | |
+#endif | |
TRACE(("BALANCE: old: %d %d %d ", | |
apOld[0]->pgno, | |
@@ -54817,7 +55994,8 @@ | |
} | |
assert( cursorHoldsMutex(pCur) ); | |
- assert( pCur->wrFlag && pBt->inTransaction==TRANS_WRITE && !pBt->readOnly ); | |
+ assert( pCur->wrFlag && pBt->inTransaction==TRANS_WRITE | |
+ && (pBt->btsFlags & BTS_READ_ONLY)==0 ); | |
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); | |
/* Assert that the caller has been consistent. If this cursor was opened | |
@@ -54946,7 +56124,7 @@ | |
assert( cursorHoldsMutex(pCur) ); | |
assert( pBt->inTransaction==TRANS_WRITE ); | |
- assert( !pBt->readOnly ); | |
+ assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); | |
assert( pCur->wrFlag ); | |
assert( hasSharedCacheTableLock(p, pCur->pgnoRoot, pCur->pKeyInfo!=0, 2) ); | |
assert( !hasReadConflicts(p, pCur->pgnoRoot) ); | |
@@ -55067,7 +56245,7 @@ | |
assert( sqlite3BtreeHoldsMutex(p) ); | |
assert( pBt->inTransaction==TRANS_WRITE ); | |
- assert( !pBt->readOnly ); | |
+ assert( (pBt->btsFlags & BTS_READ_ONLY)==0 ); | |
#ifdef SQLITE_OMIT_AUTOVACUUM | |
rc = allocateBtreePage(pBt, &pRoot, &pgnoRoot, 1, 0); | |
@@ -55441,7 +56619,9 @@ | |
/* If auto-vacuum is disabled in this build and this is an auto-vacuum | |
** database, mark the database as read-only. */ | |
#ifdef SQLITE_OMIT_AUTOVACUUM | |
- if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ) pBt->readOnly = 1; | |
+ if( idx==BTREE_LARGEST_ROOT_PAGE && *pMeta>0 ){ | |
+ pBt->btsFlags |= BTS_READ_ONLY; | |
+ } | |
#endif | |
sqlite3BtreeLeave(p); | |
@@ -56241,7 +57421,8 @@ | |
if( !pCsr->wrFlag ){ | |
return SQLITE_READONLY; | |
} | |
- assert( !pCsr->pBt->readOnly && pCsr->pBt->inTransaction==TRANS_WRITE ); | |
+ assert( (pCsr->pBt->btsFlags & BTS_READ_ONLY)==0 | |
+ && pCsr->pBt->inTransaction==TRANS_WRITE ); | |
assert( hasSharedCacheTableLock(pCsr->pBtree, pCsr->pgnoRoot, 0, 2) ); | |
assert( !hasReadConflicts(pCsr->pBtree, pCsr->pgnoRoot) ); | |
assert( pCsr->apPage[pCsr->iPage]->intKey ); | |
@@ -56281,7 +57462,8 @@ | |
/* If setting the version fields to 1, do not automatically open the | |
** WAL connection, even if the version fields are currently set to 2. | |
*/ | |
- pBt->doNotUseWAL = (u8)(iVersion==1); | |
+ pBt->btsFlags &= ~BTS_NO_WAL; | |
+ if( iVersion==1 ) pBt->btsFlags |= BTS_NO_WAL; | |
rc = sqlite3BtreeBeginTrans(pBtree, 0); | |
if( rc==SQLITE_OK ){ | |
@@ -56298,7 +57480,7 @@ | |
} | |
} | |
- pBt->doNotUseWAL = 0; | |
+ pBt->btsFlags &= ~BTS_NO_WAL; | |
return rc; | |
} | |
@@ -56982,7 +58164,9 @@ | |
pFd = sqlite3PagerFile(sqlite3BtreePager(pTo)); | |
if( pFd->pMethods ){ | |
i64 nByte = sqlite3BtreeGetPageSize(pFrom)*(i64)sqlite3BtreeLastPage(pFrom); | |
- sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte); | |
+ rc = sqlite3OsFileControl(pFd, SQLITE_FCNTL_OVERWRITE, &nByte); | |
+ if( rc==SQLITE_NOTFOUND ) rc = SQLITE_OK; | |
+ if( rc ) goto copy_finished; | |
} | |
/* Set up an sqlite3_backup object. sqlite3_backup.pDestDb must be set | |
@@ -57007,12 +58191,13 @@ | |
assert( b.rc!=SQLITE_OK ); | |
rc = sqlite3_backup_finish(&b); | |
if( rc==SQLITE_OK ){ | |
- pTo->pBt->pageSizeFixed = 0; | |
+ pTo->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; | |
}else{ | |
sqlite3PagerClearCache(sqlite3BtreePager(b.pDest)); | |
} | |
assert( sqlite3BtreeIsInTrans(pTo)==0 ); | |
+copy_finished: | |
sqlite3BtreeLeave(pFrom); | |
sqlite3BtreeLeave(pTo); | |
return rc; | |
@@ -57040,12 +58225,6 @@ | |
*/ | |
/* | |
-** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*) | |
-** P if required. | |
-*/ | |
-#define expandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) | |
- | |
-/* | |
** If pMem is an object with a valid string representation, this routine | |
** ensures the internal encoding for the string representation is | |
** 'desiredEnc', one of SQLITE_UTF8, SQLITE_UTF16LE or SQLITE_UTF16BE. | |
@@ -57144,7 +58323,7 @@ | |
int f; | |
assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); | |
assert( (pMem->flags&MEM_RowSet)==0 ); | |
- expandBlob(pMem); | |
+ ExpandBlob(pMem); | |
f = pMem->flags; | |
if( (f&(MEM_Str|MEM_Blob)) && pMem->z!=pMem->zMalloc ){ | |
if( sqlite3VdbeMemGrow(pMem, pMem->n + 2, 1) ){ | |
@@ -57313,7 +58492,7 @@ | |
** (Mem.type==SQLITE_TEXT). | |
*/ | |
SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ | |
- MemReleaseExt(p); | |
+ VdbeMemRelease(p); | |
sqlite3DbFree(p->db, p->zMalloc); | |
p->z = 0; | |
p->zMalloc = 0; | |
@@ -57609,7 +58788,7 @@ | |
** This is used for testing and debugging only - to make sure shallow | |
** copies are not misused. | |
*/ | |
-SQLITE_PRIVATE void sqlite3VdbeMemPrepareToChange(Vdbe *pVdbe, Mem *pMem){ | |
+SQLITE_PRIVATE void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ | |
int i; | |
Mem *pX; | |
for(i=1, pX=&pVdbe->aMem[1]; i<=pVdbe->nMem; i++, pX++){ | |
@@ -57635,7 +58814,7 @@ | |
*/ | |
SQLITE_PRIVATE void sqlite3VdbeMemShallowCopy(Mem *pTo, const Mem *pFrom, int srcType){ | |
assert( (pFrom->flags & MEM_RowSet)==0 ); | |
- MemReleaseExt(pTo); | |
+ VdbeMemRelease(pTo); | |
memcpy(pTo, pFrom, MEMCELLSIZE); | |
pTo->xDel = 0; | |
if( (pFrom->flags&MEM_Static)==0 ){ | |
@@ -57653,7 +58832,7 @@ | |
int rc = SQLITE_OK; | |
assert( (pFrom->flags & MEM_RowSet)==0 ); | |
- MemReleaseExt(pTo); | |
+ VdbeMemRelease(pTo); | |
memcpy(pTo, pFrom, MEMCELLSIZE); | |
pTo->flags &= ~MEM_Dyn; | |
@@ -57981,7 +59160,7 @@ | |
} | |
assert( (MEM_Blob>>3) == MEM_Str ); | |
pVal->flags |= (pVal->flags & MEM_Blob)>>3; | |
- expandBlob(pVal); | |
+ ExpandBlob(pVal); | |
if( pVal->flags&MEM_Str ){ | |
sqlite3VdbeChangeEncoding(pVal, enc & ~SQLITE_UTF16_ALIGNED); | |
if( (enc & SQLITE_UTF16_ALIGNED)!=0 && 1==(1&SQLITE_PTR_TO_INT(pVal->z)) ){ | |
@@ -57990,7 +59169,7 @@ | |
return 0; | |
} | |
} | |
- sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-59893-45467 */ | |
+ sqlite3VdbeMemNulTerminate(pVal); /* IMP: R-31275-44060 */ | |
}else{ | |
assert( (pVal->flags&MEM_Blob)==0 ); | |
sqlite3VdbeMemStringify(pVal, enc); | |
@@ -58371,7 +59550,8 @@ | |
/* | |
** Add an OP_ParseSchema opcode. This routine is broken out from | |
-** sqlite3VdbeAddOp4() since it needs to also local all btrees. | |
+** sqlite3VdbeAddOp4() since it needs to also needs to mark all btrees | |
+** as having been used. | |
** | |
** The zWhere string must have been obtained from sqlite3_malloc(). | |
** This routine will take ownership of the allocated memory. | |
@@ -59088,13 +60268,14 @@ | |
} | |
case P4_MEM: { | |
Mem *pMem = pOp->p4.pMem; | |
- assert( (pMem->flags & MEM_Null)==0 ); | |
if( pMem->flags & MEM_Str ){ | |
zP4 = pMem->z; | |
}else if( pMem->flags & MEM_Int ){ | |
sqlite3_snprintf(nTemp, zTemp, "%lld", pMem->u.i); | |
}else if( pMem->flags & MEM_Real ){ | |
sqlite3_snprintf(nTemp, zTemp, "%.16g", pMem->r); | |
+ }else if( pMem->flags & MEM_Null ){ | |
+ sqlite3_snprintf(nTemp, zTemp, "NULL"); | |
}else{ | |
assert( pMem->flags & MEM_Blob ); | |
zP4 = "(blob)"; | |
@@ -59137,8 +60318,9 @@ | |
** Declare to the Vdbe that the BTree object at db->aDb[i] is used. | |
** | |
** The prepared statements need to know in advance the complete set of | |
-** attached databases that they will be using. A mask of these databases | |
-** is maintained in p->btreeMask and is used for locking and other purposes. | |
+** attached databases that will be use. A mask of these databases | |
+** is maintained in p->btreeMask. The p->lockMask value is the subset of | |
+** p->btreeMask of databases that will require a lock. | |
*/ | |
SQLITE_PRIVATE void sqlite3VdbeUsesBtree(Vdbe *p, int i){ | |
assert( i>=0 && i<p->db->nDb && i<(int)sizeof(yDbMask)*8 ); | |
@@ -59269,7 +60451,7 @@ | |
p->zMalloc = 0; | |
} | |
- p->flags = MEM_Null; | |
+ p->flags = MEM_Invalid; | |
} | |
db->mallocFailed = malloc_failed; | |
} | |
@@ -59644,6 +60826,7 @@ | |
int nMem; /* Number of VM memory registers */ | |
int nCursor; /* Number of cursors required */ | |
int nArg; /* Number of arguments in subprograms */ | |
+ int nOnce; /* Number of OP_Once instructions */ | |
int n; /* Loop counter */ | |
u8 *zCsr; /* Memory available for allocation */ | |
u8 *zEnd; /* First byte past allocated memory */ | |
@@ -59659,6 +60842,8 @@ | |
nMem = pParse->nMem; | |
nCursor = pParse->nTab; | |
nArg = pParse->nMaxArg; | |
+ nOnce = pParse->nOnce; | |
+ if( nOnce==0 ) nOnce = 1; /* Ensure at least one byte in p->aOnceFlag[] */ | |
/* For each cursor required, also allocate a memory cell. Memory | |
** cells (nMem+1-nCursor)..nMem, inclusive, will never be used by | |
@@ -59705,6 +60890,7 @@ | |
p->azVar = allocSpace(p->azVar, nVar*sizeof(char*), &zCsr, zEnd, &nByte); | |
p->apCsr = allocSpace(p->apCsr, nCursor*sizeof(VdbeCursor*), | |
&zCsr, zEnd, &nByte); | |
+ p->aOnceFlag = allocSpace(p->aOnceFlag, nOnce, &zCsr, zEnd, &nByte); | |
if( nByte ){ | |
p->pFree = sqlite3DbMallocZero(db, nByte); | |
} | |
@@ -59713,6 +60899,7 @@ | |
}while( nByte && !db->mallocFailed ); | |
p->nCursor = (u16)nCursor; | |
+ p->nOnceFlag = nOnce; | |
if( p->aVar ){ | |
p->nVar = (ynVar)nVar; | |
for(n=0; n<nVar; n++){ | |
@@ -59729,7 +60916,7 @@ | |
p->aMem--; /* aMem[] goes from 1..nMem */ | |
p->nMem = nMem; /* not from 0..nMem-1 */ | |
for(n=1; n<=nMem; n++){ | |
- p->aMem[n].flags = MEM_Null; | |
+ p->aMem[n].flags = MEM_Invalid; | |
p->aMem[n].db = db; | |
} | |
} | |
@@ -59771,6 +60958,8 @@ | |
*/ | |
SQLITE_PRIVATE int sqlite3VdbeFrameRestore(VdbeFrame *pFrame){ | |
Vdbe *v = pFrame->v; | |
+ v->aOnceFlag = pFrame->aOnceFlag; | |
+ v->nOnceFlag = pFrame->nOnceFlag; | |
v->aOp = pFrame->aOp; | |
v->nOp = pFrame->nOp; | |
v->aMem = pFrame->aMem; | |
@@ -59833,8 +61022,10 @@ | |
/* Execute assert() statements to ensure that the Vdbe.apCsr[] and | |
** Vdbe.aMem[] arrays have already been cleaned up. */ | |
int i; | |
- for(i=0; i<p->nCursor; i++) assert( p->apCsr==0 || p->apCsr[i]==0 ); | |
- for(i=1; i<=p->nMem; i++) assert( p->aMem==0 || p->aMem[i].flags==MEM_Null ); | |
+ if( p->apCsr ) for(i=0; i<p->nCursor; i++) assert( p->apCsr[i]==0 ); | |
+ if( p->aMem ){ | |
+ for(i=1; i<=p->nMem; i++) assert( p->aMem[i].flags==MEM_Invalid ); | |
+ } | |
#endif | |
sqlite3DbFree(db, p->zErrMsg); | |
@@ -59999,16 +61190,31 @@ | |
sqlite3_file *pMaster = 0; | |
i64 offset = 0; | |
int res; | |
+ int retryCount = 0; | |
+ int nMainFile; | |
/* Select a master journal file name */ | |
+ nMainFile = sqlite3Strlen30(zMainFile); | |
+ zMaster = sqlite3MPrintf(db, "%s-mjXXXXXX9XXz", zMainFile); | |
+ if( zMaster==0 ) return SQLITE_NOMEM; | |
do { | |
u32 iRandom; | |
- sqlite3DbFree(db, zMaster); | |
- sqlite3_randomness(sizeof(iRandom), &iRandom); | |
- zMaster = sqlite3MPrintf(db, "%s-mj%08X", zMainFile, iRandom&0x7fffffff); | |
- if( !zMaster ){ | |
- return SQLITE_NOMEM; | |
+ if( retryCount ){ | |
+ if( retryCount>100 ){ | |
+ sqlite3_log(SQLITE_FULL, "MJ delete: %s", zMaster); | |
+ sqlite3OsDelete(pVfs, zMaster, 0); | |
+ break; | |
+ }else if( retryCount==1 ){ | |
+ sqlite3_log(SQLITE_FULL, "MJ collide: %s", zMaster); | |
+ } | |
} | |
+ retryCount++; | |
+ sqlite3_randomness(sizeof(iRandom), &iRandom); | |
+ sqlite3_snprintf(13, &zMaster[nMainFile], "-mj%06X9%02X", | |
+ (iRandom>>8)&0xffffff, iRandom&0xff); | |
+ /* The antipenultimate character of the master journal name must | |
+ ** be "9" to avoid name collisions when using 8+3 filenames. */ | |
+ assert( zMaster[sqlite3Strlen30(zMaster)-3]=='9' ); | |
sqlite3FileSuffix3(zMainFile, zMaster); | |
rc = sqlite3OsAccess(pVfs, zMaster, SQLITE_ACCESS_EXISTS, &res); | |
}while( rc==SQLITE_OK && res ); | |
@@ -60302,6 +61508,7 @@ | |
if( p->db->mallocFailed ){ | |
p->rc = SQLITE_NOMEM; | |
} | |
+ if( p->aOnceFlag ) memset(p->aOnceFlag, 0, p->nOnceFlag); | |
closeAllCursors(p); | |
if( p->magic!=VDBE_MAGIC_RUN ){ | |
return SQLITE_OK; | |
@@ -60639,6 +61846,10 @@ | |
sqlite3DbFree(db, p->aColName); | |
sqlite3DbFree(db, p->zSql); | |
sqlite3DbFree(db, p->pFree); | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+ sqlite3DbFree(db, p->zExplain); | |
+ sqlite3DbFree(db, p->pExplain); | |
+#endif | |
sqlite3DbFree(db, p); | |
} | |
@@ -61118,15 +62329,6 @@ | |
** Or if the UNPACKED_MATCH_PREFIX flag is set and the prefixes are | |
** equal, then the keys are considered to be equal and | |
** the parts beyond the common prefix are ignored. | |
-** | |
-** If the UNPACKED_IGNORE_ROWID flag is set, then the last byte of | |
-** the header of pKey1 is ignored. It is assumed that pKey1 is | |
-** an index key, and thus ends with a rowid value. The last byte | |
-** of the header will therefore be the serial type of the rowid: | |
-** one of 1, 2, 3, 4, 5, 6, 8, or 9 - the integer serial types. | |
-** The serial type of the final rowid will always be a single byte. | |
-** By ignoring this last byte of the header, we force the comparison | |
-** to ignore the rowid at the end of key1. | |
*/ | |
SQLITE_PRIVATE int sqlite3VdbeRecordCompare( | |
int nKey1, const void *pKey1, /* Left key */ | |
@@ -61159,9 +62361,6 @@ | |
idx1 = getVarint32(aKey1, szHdr1); | |
d1 = szHdr1; | |
- if( pPKey2->flags & UNPACKED_IGNORE_ROWID ){ | |
- szHdr1--; | |
- } | |
nField = pKeyInfo->nField; | |
while( idx1<szHdr1 && i<pPKey2->nField ){ | |
u32 serial_type1; | |
@@ -61341,7 +62540,7 @@ | |
if( rc ){ | |
return rc; | |
} | |
- assert( pUnpacked->flags & UNPACKED_IGNORE_ROWID ); | |
+ assert( pUnpacked->flags & UNPACKED_PREFIX_MATCH ); | |
*res = sqlite3VdbeRecordCompare(m.n, m.z, pUnpacked); | |
sqlite3VdbeMemRelease(&m); | |
return SQLITE_OK; | |
@@ -61784,7 +62983,7 @@ | |
** | |
** Nevertheless, some published applications that were originally written | |
** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE | |
- ** returns, and the so were broken by the automatic-reset change. As a | |
+ ** returns, and those were broken by the automatic-reset change. As a | |
** a work-around, the SQLITE_OMIT_AUTORESET compile-time restores the | |
** legacy behavior of returning SQLITE_MISUSE for cases where the | |
** previous sqlite3_step() returned something other than a SQLITE_LOCKED | |
@@ -62130,13 +63329,13 @@ | |
/* If the value passed as the second argument is out of range, return | |
** a pointer to the following static Mem object which contains the | |
** value SQL NULL. Even though the Mem structure contains an element | |
- ** of type i64, on certain architecture (x86) with certain compiler | |
+ ** of type i64, on certain architectures (x86) with certain compiler | |
** switches (-Os), gcc may align this Mem object on a 4-byte boundary | |
** instead of an 8-byte one. This all works fine, except that when | |
** running with SQLITE_DEBUG defined the SQLite code sometimes assert()s | |
** that a Mem structure is located on an 8-byte boundary. To prevent | |
- ** this assert() from failing, when building with SQLITE_DEBUG defined | |
- ** using gcc, force nullMem to be 8-byte aligned using the magical | |
+ ** these assert()s from failing, when building with SQLITE_DEBUG defined | |
+ ** using gcc, we force nullMem to be 8-byte aligned using the magical | |
** __attribute__((aligned(8))) macro. */ | |
static const Mem nullMem | |
#if defined(SQLITE_DEBUG) && defined(__GNUC__) | |
@@ -62708,6 +63907,14 @@ | |
} | |
/* | |
+** Return true if the prepared statement is in need of being reset. | |
+*/ | |
+SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ | |
+ Vdbe *v = (Vdbe*)pStmt; | |
+ return v!=0 && v->pc>0 && v->magic==VDBE_MAGIC_RUN; | |
+} | |
+ | |
+/* | |
** Return a pointer to the next prepared statement after pStmt associated | |
** with database connection pDb. If pStmt is NULL, return the first | |
** prepared statement for the database connection. Return NULL if there | |
@@ -62751,6 +63958,8 @@ | |
** | |
** This file contains code used to insert the values of host parameters | |
** (aka "wildcards") into the SQL text output by sqlite3_trace(). | |
+** | |
+** The Vdbe parse-tree explainer is also found here. | |
*/ | |
#ifndef SQLITE_OMIT_TRACE | |
@@ -62890,6 +64099,121 @@ | |
#endif /* #ifndef SQLITE_OMIT_TRACE */ | |
+/***************************************************************************** | |
+** The following code implements the data-structure explaining logic | |
+** for the Vdbe. | |
+*/ | |
+ | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+ | |
+/* | |
+** Allocate a new Explain object | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainBegin(Vdbe *pVdbe){ | |
+ if( pVdbe ){ | |
+ sqlite3BeginBenignMalloc(); | |
+ Explain *p = sqlite3_malloc( sizeof(Explain) ); | |
+ if( p ){ | |
+ memset(p, 0, sizeof(*p)); | |
+ p->pVdbe = pVdbe; | |
+ sqlite3_free(pVdbe->pExplain); | |
+ pVdbe->pExplain = p; | |
+ sqlite3StrAccumInit(&p->str, p->zBase, sizeof(p->zBase), | |
+ SQLITE_MAX_LENGTH); | |
+ p->str.useMalloc = 2; | |
+ }else{ | |
+ sqlite3EndBenignMalloc(); | |
+ } | |
+ } | |
+} | |
+ | |
+/* | |
+** Return true if the Explain ends with a new-line. | |
+*/ | |
+static int endsWithNL(Explain *p){ | |
+ return p && p->str.zText && p->str.nChar | |
+ && p->str.zText[p->str.nChar-1]=='\n'; | |
+} | |
+ | |
+/* | |
+** Append text to the indentation | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainPrintf(Vdbe *pVdbe, const char *zFormat, ...){ | |
+ Explain *p; | |
+ if( pVdbe && (p = pVdbe->pExplain)!=0 ){ | |
+ va_list ap; | |
+ if( p->nIndent && endsWithNL(p) ){ | |
+ int n = p->nIndent; | |
+ if( n>ArraySize(p->aIndent) ) n = ArraySize(p->aIndent); | |
+ sqlite3AppendSpace(&p->str, p->aIndent[n-1]); | |
+ } | |
+ va_start(ap, zFormat); | |
+ sqlite3VXPrintf(&p->str, 1, zFormat, ap); | |
+ va_end(ap); | |
+ } | |
+} | |
+ | |
+/* | |
+** Append a '\n' if there is not already one. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainNL(Vdbe *pVdbe){ | |
+ Explain *p; | |
+ if( pVdbe && (p = pVdbe->pExplain)!=0 && !endsWithNL(p) ){ | |
+ sqlite3StrAccumAppend(&p->str, "\n", 1); | |
+ } | |
+} | |
+ | |
+/* | |
+** Push a new indentation level. Subsequent lines will be indented | |
+** so that they begin at the current cursor position. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainPush(Vdbe *pVdbe){ | |
+ Explain *p; | |
+ if( pVdbe && (p = pVdbe->pExplain)!=0 ){ | |
+ if( p->str.zText && p->nIndent<ArraySize(p->aIndent) ){ | |
+ const char *z = p->str.zText; | |
+ int i = p->str.nChar-1; | |
+ int x; | |
+ while( i>=0 && z[i]!='\n' ){ i--; } | |
+ x = (p->str.nChar - 1) - i; | |
+ if( p->nIndent && x<p->aIndent[p->nIndent-1] ){ | |
+ x = p->aIndent[p->nIndent-1]; | |
+ } | |
+ p->aIndent[p->nIndent] = x; | |
+ } | |
+ p->nIndent++; | |
+ } | |
+} | |
+ | |
+/* | |
+** Pop the indentation stack by one level. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainPop(Vdbe *p){ | |
+ if( p && p->pExplain ) p->pExplain->nIndent--; | |
+} | |
+ | |
+/* | |
+** Free the indentation structure | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainFinish(Vdbe *pVdbe){ | |
+ if( pVdbe && pVdbe->pExplain ){ | |
+ sqlite3_free(pVdbe->zExplain); | |
+ sqlite3ExplainNL(pVdbe); | |
+ pVdbe->zExplain = sqlite3StrAccumFinish(&pVdbe->pExplain->str); | |
+ sqlite3_free(pVdbe->pExplain); | |
+ pVdbe->pExplain = 0; | |
+ sqlite3EndBenignMalloc(); | |
+ } | |
+} | |
+ | |
+/* | |
+** Return the explanation of a virtual machine. | |
+*/ | |
+SQLITE_PRIVATE const char *sqlite3VdbeExplanation(Vdbe *pVdbe){ | |
+ return (pVdbe && pVdbe->zExplain) ? pVdbe->zExplain : 0; | |
+} | |
+#endif /* defined(SQLITE_DEBUG) */ | |
+ | |
/************** End of vdbetrace.c *******************************************/ | |
/************** Begin file vdbe.c ********************************************/ | |
/* | |
@@ -62944,7 +64268,7 @@ | |
** not misused. | |
*/ | |
#ifdef SQLITE_DEBUG | |
-# define memAboutToChange(P,M) sqlite3VdbeMemPrepareToChange(P,M) | |
+# define memAboutToChange(P,M) sqlite3VdbeMemAboutToChange(P,M) | |
#else | |
# define memAboutToChange(P,M) | |
#endif | |
@@ -62962,8 +64286,8 @@ | |
/* | |
** When this global variable is positive, it gets decremented once before | |
-** each instruction in the VDBE. When reaches zero, the u1.isInterrupted | |
-** field of the sqlite3 structure is set in order to simulate and interrupt. | |
+** each instruction in the VDBE. When it reaches zero, the u1.isInterrupted | |
+** field of the sqlite3 structure is set in order to simulate an interrupt. | |
** | |
** This facility is used for testing purposes only. It does not function | |
** in an ordinary build. | |
@@ -63043,12 +64367,6 @@ | |
if( ((P)->flags&MEM_Ephem)!=0 \ | |
&& sqlite3VdbeMemMakeWriteable(P) ){ goto no_mem;} | |
-/* | |
-** Call sqlite3VdbeMemExpandBlob() on the supplied value (type Mem*) | |
-** P if required. | |
-*/ | |
-#define ExpandBlob(P) (((P)->flags&MEM_Zero)?sqlite3VdbeMemExpandBlob(P):0) | |
- | |
/* Return true if the cursor was opened using the OP_OpenSorter opcode. */ | |
#ifdef SQLITE_OMIT_MERGE_SORT | |
# define isSorter(x) 0 | |
@@ -63088,7 +64406,7 @@ | |
Vdbe *p, /* The virtual machine */ | |
int iCur, /* Index of the new VdbeCursor */ | |
int nField, /* Number of fields in the table or index */ | |
- int iDb, /* When database the cursor belongs to, or -1 */ | |
+ int iDb, /* Database the cursor belongs to, or -1 */ | |
int isBtreeCursor /* True for B-Tree. False for pseudo-table or vtab */ | |
){ | |
/* Find the memory cell that will be used to store the blob of memory | |
@@ -63459,7 +64777,7 @@ | |
** | |
** This macro added to every instruction that does a jump in order to | |
** implement a loop. This test used to be on every single instruction, | |
-** but that meant we more testing that we needed. By only testing the | |
+** but that meant we more testing than we needed. By only testing the | |
** flag on jump instructions, we get a (small) speed improvement. | |
*/ | |
#define CHECK_FOR_INTERRUPT \ | |
@@ -63569,48 +64887,51 @@ | |
struct OP_Yield_stack_vars { | |
int pcDest; | |
} aa; | |
+ struct OP_Null_stack_vars { | |
+ int cnt; | |
+ } ab; | |
struct OP_Variable_stack_vars { | |
Mem *pVar; /* Value being transferred */ | |
- } ab; | |
+ } ac; | |
struct OP_Move_stack_vars { | |
char *zMalloc; /* Holding variable for allocated memory */ | |
int n; /* Number of registers left to copy */ | |
int p1; /* Register to copy from */ | |
int p2; /* Register to copy to */ | |
- } ac; | |
+ } ad; | |
struct OP_ResultRow_stack_vars { | |
Mem *pMem; | |
int i; | |
- } ad; | |
+ } ae; | |
struct OP_Concat_stack_vars { | |
i64 nByte; | |
- } ae; | |
+ } af; | |
struct OP_Remainder_stack_vars { | |
int flags; /* Combined MEM_* flags from both inputs */ | |
i64 iA; /* Integer value of left operand */ | |
i64 iB; /* Integer value of right operand */ | |
double rA; /* Real value of left operand */ | |
double rB; /* Real value of right operand */ | |
- } af; | |
+ } ag; | |
struct OP_Function_stack_vars { | |
int i; | |
Mem *pArg; | |
sqlite3_context ctx; | |
sqlite3_value **apVal; | |
int n; | |
- } ag; | |
+ } ah; | |
struct OP_ShiftRight_stack_vars { | |
i64 iA; | |
u64 uA; | |
i64 iB; | |
u8 op; | |
- } ah; | |
+ } ai; | |
struct OP_Ge_stack_vars { | |
int res; /* Result of the comparison of pIn1 against pIn3 */ | |
char affinity; /* Affinity to use for comparison */ | |
u16 flags1; /* Copy of initial value of pIn1->flags */ | |
u16 flags3; /* Copy of initial value of pIn3->flags */ | |
- } ai; | |
+ } aj; | |
struct OP_Compare_stack_vars { | |
int n; | |
int i; | |
@@ -63620,14 +64941,14 @@ | |
int idx; | |
CollSeq *pColl; /* Collating sequence to use on this term */ | |
int bRev; /* True for DESCENDING sort order */ | |
- } aj; | |
+ } ak; | |
struct OP_Or_stack_vars { | |
int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ | |
int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ | |
- } ak; | |
+ } al; | |
struct OP_IfNot_stack_vars { | |
int c; | |
- } al; | |
+ } am; | |
struct OP_Column_stack_vars { | |
u32 payloadSize; /* Number of bytes in the record */ | |
i64 payloadSize64; /* Number of bytes in the record */ | |
@@ -63652,11 +64973,11 @@ | |
int avail; /* Number of bytes of available data */ | |
u32 t; /* A type code from the record header */ | |
Mem *pReg; /* PseudoTable input register */ | |
- } am; | |
+ } an; | |
struct OP_Affinity_stack_vars { | |
const char *zAffinity; /* The affinity to be applied */ | |
char cAff; /* A single character of affinity */ | |
- } an; | |
+ } ao; | |
struct OP_MakeRecord_stack_vars { | |
u8 *zNewRecord; /* A buffer to hold the data for the new record */ | |
Mem *pRec; /* The new record */ | |
@@ -63673,11 +64994,11 @@ | |
int file_format; /* File format to use for encoding */ | |
int i; /* Space used in zNewRecord[] */ | |
int len; /* Length of a field */ | |
- } ao; | |
+ } ap; | |
struct OP_Count_stack_vars { | |
i64 nEntry; | |
BtCursor *pCrsr; | |
- } ap; | |
+ } aq; | |
struct OP_Savepoint_stack_vars { | |
int p1; /* Value of P1 operand */ | |
char *zName; /* Name of savepoint */ | |
@@ -63687,28 +65008,28 @@ | |
Savepoint *pTmp; | |
int iSavepoint; | |
int ii; | |
- } aq; | |
+ } ar; | |
struct OP_AutoCommit_stack_vars { | |
int desiredAutoCommit; | |
int iRollback; | |
int turnOnAC; | |
- } ar; | |
+ } as; | |
struct OP_Transaction_stack_vars { | |
Btree *pBt; | |
- } as; | |
+ } at; | |
struct OP_ReadCookie_stack_vars { | |
int iMeta; | |
int iDb; | |
int iCookie; | |
- } at; | |
+ } au; | |
struct OP_SetCookie_stack_vars { | |
Db *pDb; | |
- } au; | |
+ } av; | |
struct OP_VerifyCookie_stack_vars { | |
int iMeta; | |
int iGen; | |
Btree *pBt; | |
- } av; | |
+ } aw; | |
struct OP_OpenWrite_stack_vars { | |
int nField; | |
KeyInfo *pKeyInfo; | |
@@ -63718,16 +65039,16 @@ | |
Btree *pX; | |
VdbeCursor *pCur; | |
Db *pDb; | |
- } aw; | |
+ } ax; | |
struct OP_OpenEphemeral_stack_vars { | |
VdbeCursor *pCx; | |
- } ax; | |
+ } ay; | |
struct OP_SorterOpen_stack_vars { | |
VdbeCursor *pCx; | |
- } ay; | |
+ } az; | |
struct OP_OpenPseudo_stack_vars { | |
VdbeCursor *pCx; | |
- } az; | |
+ } ba; | |
struct OP_SeekGt_stack_vars { | |
int res; | |
int oc; | |
@@ -63735,10 +65056,10 @@ | |
UnpackedRecord r; | |
int nField; | |
i64 iKey; /* The rowid we are to seek to */ | |
- } ba; | |
+ } bb; | |
struct OP_Seek_stack_vars { | |
VdbeCursor *pC; | |
- } bb; | |
+ } bc; | |
struct OP_Found_stack_vars { | |
int alreadyExists; | |
VdbeCursor *pC; | |
@@ -63747,7 +65068,7 @@ | |
UnpackedRecord *pIdxKey; | |
UnpackedRecord r; | |
char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7]; | |
- } bc; | |
+ } bd; | |
struct OP_IsUnique_stack_vars { | |
u16 ii; | |
VdbeCursor *pCx; | |
@@ -63756,13 +65077,13 @@ | |
Mem *aMx; | |
UnpackedRecord r; /* B-Tree index search key */ | |
i64 R; /* Rowid stored in register P3 */ | |
- } bd; | |
+ } be; | |
struct OP_NotExists_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
u64 iKey; | |
- } be; | |
+ } bf; | |
struct OP_NewRowid_stack_vars { | |
i64 v; /* The new rowid */ | |
VdbeCursor *pC; /* Cursor of table to get the new rowid */ | |
@@ -63770,7 +65091,7 @@ | |
int cnt; /* Counter to limit the number of searches */ | |
Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ | |
VdbeFrame *pFrame; /* Root frame of VDBE */ | |
- } bf; | |
+ } bg; | |
struct OP_InsertInt_stack_vars { | |
Mem *pData; /* MEM cell holding data for the record to be inserted */ | |
Mem *pKey; /* MEM cell holding key for the record */ | |
@@ -63781,89 +65102,89 @@ | |
const char *zDb; /* database name - used by the update hook */ | |
const char *zTbl; /* Table name - used by the opdate hook */ | |
int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ | |
- } bg; | |
+ } bh; | |
struct OP_Delete_stack_vars { | |
i64 iKey; | |
VdbeCursor *pC; | |
- } bh; | |
+ } bi; | |
struct OP_SorterCompare_stack_vars { | |
VdbeCursor *pC; | |
int res; | |
- } bi; | |
+ } bj; | |
struct OP_SorterData_stack_vars { | |
VdbeCursor *pC; | |
- } bj; | |
+ } bk; | |
struct OP_RowData_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
u32 n; | |
i64 n64; | |
- } bk; | |
+ } bl; | |
struct OP_Rowid_stack_vars { | |
VdbeCursor *pC; | |
i64 v; | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
- } bl; | |
+ } bm; | |
struct OP_NullRow_stack_vars { | |
VdbeCursor *pC; | |
- } bm; | |
+ } bn; | |
struct OP_Last_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
- } bn; | |
+ } bo; | |
struct OP_Rewind_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
- } bo; | |
+ } bp; | |
struct OP_Next_stack_vars { | |
VdbeCursor *pC; | |
int res; | |
- } bp; | |
+ } bq; | |
struct OP_IdxInsert_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int nKey; | |
const char *zKey; | |
- } bq; | |
+ } br; | |
struct OP_IdxDelete_stack_vars { | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
UnpackedRecord r; | |
- } br; | |
+ } bs; | |
struct OP_IdxRowid_stack_vars { | |
BtCursor *pCrsr; | |
VdbeCursor *pC; | |
i64 rowid; | |
- } bs; | |
+ } bt; | |
struct OP_IdxGE_stack_vars { | |
VdbeCursor *pC; | |
int res; | |
UnpackedRecord r; | |
- } bt; | |
+ } bu; | |
struct OP_Destroy_stack_vars { | |
int iMoved; | |
int iCnt; | |
Vdbe *pVdbe; | |
int iDb; | |
- } bu; | |
+ } bv; | |
struct OP_Clear_stack_vars { | |
int nChange; | |
- } bv; | |
+ } bw; | |
struct OP_CreateTable_stack_vars { | |
int pgno; | |
int flags; | |
Db *pDb; | |
- } bw; | |
+ } bx; | |
struct OP_ParseSchema_stack_vars { | |
int iDb; | |
const char *zMaster; | |
char *zSql; | |
InitData initData; | |
- } bx; | |
+ } by; | |
struct OP_IntegrityCk_stack_vars { | |
int nRoot; /* Number of tables to check. (Number of root pages.) */ | |
int *aRoot; /* Array of rootpage numbers for tables to be checked */ | |
@@ -63871,14 +65192,14 @@ | |
int nErr; /* Number of errors reported */ | |
char *z; /* Text of the error report */ | |
Mem *pnErr; /* Register keeping track of errors remaining */ | |
- } by; | |
+ } bz; | |
struct OP_RowSetRead_stack_vars { | |
i64 val; | |
- } bz; | |
+ } ca; | |
struct OP_RowSetTest_stack_vars { | |
int iSet; | |
int exists; | |
- } ca; | |
+ } cb; | |
struct OP_Program_stack_vars { | |
int nMem; /* Number of memory registers for sub-program */ | |
int nByte; /* Bytes of runtime space required for sub-program */ | |
@@ -63888,15 +65209,15 @@ | |
VdbeFrame *pFrame; /* New vdbe frame to execute in */ | |
SubProgram *pProgram; /* Sub-program to execute */ | |
void *t; /* Token identifying trigger */ | |
- } cb; | |
+ } cc; | |
struct OP_Param_stack_vars { | |
VdbeFrame *pFrame; | |
Mem *pIn; | |
- } cc; | |
+ } cd; | |
struct OP_MemMax_stack_vars { | |
Mem *pIn1; | |
VdbeFrame *pFrame; | |
- } cd; | |
+ } ce; | |
struct OP_AggStep_stack_vars { | |
int n; | |
int i; | |
@@ -63904,34 +65225,34 @@ | |
Mem *pRec; | |
sqlite3_context ctx; | |
sqlite3_value **apVal; | |
- } ce; | |
+ } cf; | |
struct OP_AggFinal_stack_vars { | |
Mem *pMem; | |
- } cf; | |
+ } cg; | |
struct OP_Checkpoint_stack_vars { | |
int i; /* Loop counter */ | |
int aRes[3]; /* Results */ | |
Mem *pMem; /* Write results here */ | |
- } cg; | |
+ } ch; | |
struct OP_JournalMode_stack_vars { | |
Btree *pBt; /* Btree to change journal mode of */ | |
Pager *pPager; /* Pager associated with pBt */ | |
int eNew; /* New journal mode */ | |
int eOld; /* The old journal mode */ | |
const char *zFilename; /* Name of database file for pPager */ | |
- } ch; | |
+ } ci; | |
struct OP_IncrVacuum_stack_vars { | |
Btree *pBt; | |
- } ci; | |
+ } cj; | |
struct OP_VBegin_stack_vars { | |
VTable *pVTab; | |
- } cj; | |
+ } ck; | |
struct OP_VOpen_stack_vars { | |
VdbeCursor *pCur; | |
sqlite3_vtab_cursor *pVtabCursor; | |
sqlite3_vtab *pVtab; | |
sqlite3_module *pModule; | |
- } ck; | |
+ } cl; | |
struct OP_VFilter_stack_vars { | |
int nArg; | |
int iQuery; | |
@@ -63944,23 +65265,23 @@ | |
int res; | |
int i; | |
Mem **apArg; | |
- } cl; | |
+ } cm; | |
struct OP_VColumn_stack_vars { | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
Mem *pDest; | |
sqlite3_context sContext; | |
- } cm; | |
+ } cn; | |
struct OP_VNext_stack_vars { | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
int res; | |
VdbeCursor *pCur; | |
- } cn; | |
+ } co; | |
struct OP_VRename_stack_vars { | |
sqlite3_vtab *pVtab; | |
Mem *pName; | |
- } co; | |
+ } cp; | |
struct OP_VUpdate_stack_vars { | |
sqlite3_vtab *pVtab; | |
sqlite3_module *pModule; | |
@@ -63969,11 +65290,11 @@ | |
sqlite_int64 rowid; | |
Mem **apArg; | |
Mem *pX; | |
- } cp; | |
+ } cq; | |
struct OP_Trace_stack_vars { | |
char *zTrace; | |
char *z; | |
- } cq; | |
+ } cr; | |
} u; | |
/* End automatically generated code | |
********************************************************************/ | |
@@ -64073,7 +65394,7 @@ | |
assert( pOp->p2<=p->nMem ); | |
pOut = &aMem[pOp->p2]; | |
memAboutToChange(p, pOut); | |
- MemReleaseExt(pOut); | |
+ VdbeMemRelease(pOut); | |
pOut->flags = MEM_Int; | |
} | |
@@ -64164,7 +65485,8 @@ | |
** Write the current address onto register P1 | |
** and then jump to address P2. | |
*/ | |
-case OP_Gosub: { /* jump, in1 */ | |
+case OP_Gosub: { /* jump */ | |
+ assert( pOp->p1>0 && pOp->p1<=p->nMem ); | |
pIn1 = &aMem[pOp->p1]; | |
assert( (pIn1->flags & MEM_Dyn)==0 ); | |
memAboutToChange(p, pIn1); | |
@@ -64363,12 +65685,27 @@ | |
break; | |
} | |
-/* Opcode: Null * P2 * * * | |
+/* Opcode: Null * P2 P3 * * | |
** | |
-** Write a NULL into register P2. | |
+** Write a NULL into registers P2. If P3 greater than P2, then also write | |
+** NULL into register P3 and ever register in between P2 and P3. If P3 | |
+** is less than P2 (typically P3 is zero) then only register P2 is | |
+** set to NULL | |
*/ | |
case OP_Null: { /* out2-prerelease */ | |
+#if 0 /* local variables moved into u.ab */ | |
+ int cnt; | |
+#endif /* local variables moved into u.ab */ | |
+ u.ab.cnt = pOp->p3-pOp->p2; | |
+ assert( pOp->p3<=p->nMem ); | |
pOut->flags = MEM_Null; | |
+ while( u.ab.cnt>0 ){ | |
+ pOut++; | |
+ memAboutToChange(p, pOut); | |
+ VdbeMemRelease(pOut); | |
+ pOut->flags = MEM_Null; | |
+ u.ab.cnt--; | |
+ } | |
break; | |
} | |
@@ -64394,17 +65731,17 @@ | |
** The P4 value is used by sqlite3_bind_parameter_name(). | |
*/ | |
case OP_Variable: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.ab */ | |
+#if 0 /* local variables moved into u.ac */ | |
Mem *pVar; /* Value being transferred */ | |
-#endif /* local variables moved into u.ab */ | |
+#endif /* local variables moved into u.ac */ | |
assert( pOp->p1>0 && pOp->p1<=p->nVar ); | |
assert( pOp->p4.z==0 || pOp->p4.z==p->azVar[pOp->p1-1] ); | |
- u.ab.pVar = &p->aVar[pOp->p1 - 1]; | |
- if( sqlite3VdbeMemTooBig(u.ab.pVar) ){ | |
+ u.ac.pVar = &p->aVar[pOp->p1 - 1]; | |
+ if( sqlite3VdbeMemTooBig(u.ac.pVar) ){ | |
goto too_big; | |
} | |
- sqlite3VdbeMemShallowCopy(pOut, u.ab.pVar, MEM_Static); | |
+ sqlite3VdbeMemShallowCopy(pOut, u.ac.pVar, MEM_Static); | |
UPDATE_MAX_BLOBSIZE(pOut); | |
break; | |
} | |
@@ -64417,36 +65754,36 @@ | |
** P1..P1+P3-1 and P2..P2+P3-1 to overlap. | |
*/ | |
case OP_Move: { | |
-#if 0 /* local variables moved into u.ac */ | |
+#if 0 /* local variables moved into u.ad */ | |
char *zMalloc; /* Holding variable for allocated memory */ | |
int n; /* Number of registers left to copy */ | |
int p1; /* Register to copy from */ | |
int p2; /* Register to copy to */ | |
-#endif /* local variables moved into u.ac */ | |
+#endif /* local variables moved into u.ad */ | |
- u.ac.n = pOp->p3; | |
- u.ac.p1 = pOp->p1; | |
- u.ac.p2 = pOp->p2; | |
- assert( u.ac.n>0 && u.ac.p1>0 && u.ac.p2>0 ); | |
- assert( u.ac.p1+u.ac.n<=u.ac.p2 || u.ac.p2+u.ac.n<=u.ac.p1 ); | |
- | |
- pIn1 = &aMem[u.ac.p1]; | |
- pOut = &aMem[u.ac.p2]; | |
- while( u.ac.n-- ){ | |
+ u.ad.n = pOp->p3; | |
+ u.ad.p1 = pOp->p1; | |
+ u.ad.p2 = pOp->p2; | |
+ assert( u.ad.n>0 && u.ad.p1>0 && u.ad.p2>0 ); | |
+ assert( u.ad.p1+u.ad.n<=u.ad.p2 || u.ad.p2+u.ad.n<=u.ad.p1 ); | |
+ | |
+ pIn1 = &aMem[u.ad.p1]; | |
+ pOut = &aMem[u.ad.p2]; | |
+ while( u.ad.n-- ){ | |
assert( pOut<=&aMem[p->nMem] ); | |
assert( pIn1<=&aMem[p->nMem] ); | |
assert( memIsValid(pIn1) ); | |
memAboutToChange(p, pOut); | |
- u.ac.zMalloc = pOut->zMalloc; | |
+ u.ad.zMalloc = pOut->zMalloc; | |
pOut->zMalloc = 0; | |
sqlite3VdbeMemMove(pOut, pIn1); | |
#ifdef SQLITE_DEBUG | |
- if( pOut->pScopyFrom>=&aMem[u.ac.p1] && pOut->pScopyFrom<&aMem[u.ac.p1+pOp->p3] ){ | |
- pOut->pScopyFrom += u.ac.p1 - pOp->p2; | |
+ if( pOut->pScopyFrom>=&aMem[u.ad.p1] && pOut->pScopyFrom<&aMem[u.ad.p1+pOp->p3] ){ | |
+ pOut->pScopyFrom += u.ad.p1 - pOp->p2; | |
} | |
#endif | |
- pIn1->zMalloc = u.ac.zMalloc; | |
- REGISTER_TRACE(u.ac.p2++, pOut); | |
+ pIn1->zMalloc = u.ad.zMalloc; | |
+ REGISTER_TRACE(u.ad.p2++, pOut); | |
pIn1++; | |
pOut++; | |
} | |
@@ -64503,10 +65840,10 @@ | |
** row. | |
*/ | |
case OP_ResultRow: { | |
-#if 0 /* local variables moved into u.ad */ | |
+#if 0 /* local variables moved into u.ae */ | |
Mem *pMem; | |
int i; | |
-#endif /* local variables moved into u.ad */ | |
+#endif /* local variables moved into u.ae */ | |
assert( p->nResColumn==pOp->p2 ); | |
assert( pOp->p1>0 ); | |
assert( pOp->p1+pOp->p2<=p->nMem+1 ); | |
@@ -64546,17 +65883,17 @@ | |
/* Make sure the results of the current row are \000 terminated | |
** and have an assigned type. The results are de-ephemeralized as | |
- ** as side effect. | |
+ ** a side effect. | |
*/ | |
- u.ad.pMem = p->pResultSet = &aMem[pOp->p1]; | |
- for(u.ad.i=0; u.ad.i<pOp->p2; u.ad.i++){ | |
- assert( memIsValid(&u.ad.pMem[u.ad.i]) ); | |
- Deephemeralize(&u.ad.pMem[u.ad.i]); | |
- assert( (u.ad.pMem[u.ad.i].flags & MEM_Ephem)==0 | |
- || (u.ad.pMem[u.ad.i].flags & (MEM_Str|MEM_Blob))==0 ); | |
- sqlite3VdbeMemNulTerminate(&u.ad.pMem[u.ad.i]); | |
- sqlite3VdbeMemStoreType(&u.ad.pMem[u.ad.i]); | |
- REGISTER_TRACE(pOp->p1+u.ad.i, &u.ad.pMem[u.ad.i]); | |
+ u.ae.pMem = p->pResultSet = &aMem[pOp->p1]; | |
+ for(u.ae.i=0; u.ae.i<pOp->p2; u.ae.i++){ | |
+ assert( memIsValid(&u.ae.pMem[u.ae.i]) ); | |
+ Deephemeralize(&u.ae.pMem[u.ae.i]); | |
+ assert( (u.ae.pMem[u.ae.i].flags & MEM_Ephem)==0 | |
+ || (u.ae.pMem[u.ae.i].flags & (MEM_Str|MEM_Blob))==0 ); | |
+ sqlite3VdbeMemNulTerminate(&u.ae.pMem[u.ae.i]); | |
+ sqlite3VdbeMemStoreType(&u.ae.pMem[u.ae.i]); | |
+ REGISTER_TRACE(pOp->p1+u.ae.i, &u.ae.pMem[u.ae.i]); | |
} | |
if( db->mallocFailed ) goto no_mem; | |
@@ -64580,9 +65917,9 @@ | |
** to avoid a memcpy(). | |
*/ | |
case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ | |
-#if 0 /* local variables moved into u.ae */ | |
+#if 0 /* local variables moved into u.af */ | |
i64 nByte; | |
-#endif /* local variables moved into u.ae */ | |
+#endif /* local variables moved into u.af */ | |
pIn1 = &aMem[pOp->p1]; | |
pIn2 = &aMem[pOp->p2]; | |
@@ -64595,22 +65932,22 @@ | |
if( ExpandBlob(pIn1) || ExpandBlob(pIn2) ) goto no_mem; | |
Stringify(pIn1, encoding); | |
Stringify(pIn2, encoding); | |
- u.ae.nByte = pIn1->n + pIn2->n; | |
- if( u.ae.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
+ u.af.nByte = pIn1->n + pIn2->n; | |
+ if( u.af.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
goto too_big; | |
} | |
MemSetTypeFlag(pOut, MEM_Str); | |
- if( sqlite3VdbeMemGrow(pOut, (int)u.ae.nByte+2, pOut==pIn2) ){ | |
+ if( sqlite3VdbeMemGrow(pOut, (int)u.af.nByte+2, pOut==pIn2) ){ | |
goto no_mem; | |
} | |
if( pOut!=pIn2 ){ | |
memcpy(pOut->z, pIn2->z, pIn2->n); | |
} | |
memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); | |
- pOut->z[u.ae.nByte] = 0; | |
- pOut->z[u.ae.nByte+1] = 0; | |
+ pOut->z[u.af.nByte] = 0; | |
+ pOut->z[u.af.nByte+1] = 0; | |
pOut->flags |= MEM_Term; | |
- pOut->n = (int)u.ae.nByte; | |
+ pOut->n = (int)u.af.nByte; | |
pOut->enc = encoding; | |
UPDATE_MAX_BLOBSIZE(pOut); | |
break; | |
@@ -64654,76 +65991,76 @@ | |
case OP_Multiply: /* same as TK_STAR, in1, in2, out3 */ | |
case OP_Divide: /* same as TK_SLASH, in1, in2, out3 */ | |
case OP_Remainder: { /* same as TK_REM, in1, in2, out3 */ | |
-#if 0 /* local variables moved into u.af */ | |
+#if 0 /* local variables moved into u.ag */ | |
int flags; /* Combined MEM_* flags from both inputs */ | |
i64 iA; /* Integer value of left operand */ | |
i64 iB; /* Integer value of right operand */ | |
double rA; /* Real value of left operand */ | |
double rB; /* Real value of right operand */ | |
-#endif /* local variables moved into u.af */ | |
+#endif /* local variables moved into u.ag */ | |
pIn1 = &aMem[pOp->p1]; | |
applyNumericAffinity(pIn1); | |
pIn2 = &aMem[pOp->p2]; | |
applyNumericAffinity(pIn2); | |
pOut = &aMem[pOp->p3]; | |
- u.af.flags = pIn1->flags | pIn2->flags; | |
- if( (u.af.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; | |
+ u.ag.flags = pIn1->flags | pIn2->flags; | |
+ if( (u.ag.flags & MEM_Null)!=0 ) goto arithmetic_result_is_null; | |
if( (pIn1->flags & pIn2->flags & MEM_Int)==MEM_Int ){ | |
- u.af.iA = pIn1->u.i; | |
- u.af.iB = pIn2->u.i; | |
+ u.ag.iA = pIn1->u.i; | |
+ u.ag.iB = pIn2->u.i; | |
switch( pOp->opcode ){ | |
- case OP_Add: if( sqlite3AddInt64(&u.af.iB,u.af.iA) ) goto fp_math; break; | |
- case OP_Subtract: if( sqlite3SubInt64(&u.af.iB,u.af.iA) ) goto fp_math; break; | |
- case OP_Multiply: if( sqlite3MulInt64(&u.af.iB,u.af.iA) ) goto fp_math; break; | |
+ case OP_Add: if( sqlite3AddInt64(&u.ag.iB,u.ag.iA) ) goto fp_math; break; | |
+ case OP_Subtract: if( sqlite3SubInt64(&u.ag.iB,u.ag.iA) ) goto fp_math; break; | |
+ case OP_Multiply: if( sqlite3MulInt64(&u.ag.iB,u.ag.iA) ) goto fp_math; break; | |
case OP_Divide: { | |
- if( u.af.iA==0 ) goto arithmetic_result_is_null; | |
- if( u.af.iA==-1 && u.af.iB==SMALLEST_INT64 ) goto fp_math; | |
- u.af.iB /= u.af.iA; | |
+ if( u.ag.iA==0 ) goto arithmetic_result_is_null; | |
+ if( u.ag.iA==-1 && u.ag.iB==SMALLEST_INT64 ) goto fp_math; | |
+ u.ag.iB /= u.ag.iA; | |
break; | |
} | |
default: { | |
- if( u.af.iA==0 ) goto arithmetic_result_is_null; | |
- if( u.af.iA==-1 ) u.af.iA = 1; | |
- u.af.iB %= u.af.iA; | |
+ if( u.ag.iA==0 ) goto arithmetic_result_is_null; | |
+ if( u.ag.iA==-1 ) u.ag.iA = 1; | |
+ u.ag.iB %= u.ag.iA; | |
break; | |
} | |
} | |
- pOut->u.i = u.af.iB; | |
+ pOut->u.i = u.ag.iB; | |
MemSetTypeFlag(pOut, MEM_Int); | |
}else{ | |
fp_math: | |
- u.af.rA = sqlite3VdbeRealValue(pIn1); | |
- u.af.rB = sqlite3VdbeRealValue(pIn2); | |
+ u.ag.rA = sqlite3VdbeRealValue(pIn1); | |
+ u.ag.rB = sqlite3VdbeRealValue(pIn2); | |
switch( pOp->opcode ){ | |
- case OP_Add: u.af.rB += u.af.rA; break; | |
- case OP_Subtract: u.af.rB -= u.af.rA; break; | |
- case OP_Multiply: u.af.rB *= u.af.rA; break; | |
+ case OP_Add: u.ag.rB += u.ag.rA; break; | |
+ case OP_Subtract: u.ag.rB -= u.ag.rA; break; | |
+ case OP_Multiply: u.ag.rB *= u.ag.rA; break; | |
case OP_Divide: { | |
/* (double)0 In case of SQLITE_OMIT_FLOATING_POINT... */ | |
- if( u.af.rA==(double)0 ) goto arithmetic_result_is_null; | |
- u.af.rB /= u.af.rA; | |
+ if( u.ag.rA==(double)0 ) goto arithmetic_result_is_null; | |
+ u.ag.rB /= u.ag.rA; | |
break; | |
} | |
default: { | |
- u.af.iA = (i64)u.af.rA; | |
- u.af.iB = (i64)u.af.rB; | |
- if( u.af.iA==0 ) goto arithmetic_result_is_null; | |
- if( u.af.iA==-1 ) u.af.iA = 1; | |
- u.af.rB = (double)(u.af.iB % u.af.iA); | |
+ u.ag.iA = (i64)u.ag.rA; | |
+ u.ag.iB = (i64)u.ag.rB; | |
+ if( u.ag.iA==0 ) goto arithmetic_result_is_null; | |
+ if( u.ag.iA==-1 ) u.ag.iA = 1; | |
+ u.ag.rB = (double)(u.ag.iB % u.ag.iA); | |
break; | |
} | |
} | |
#ifdef SQLITE_OMIT_FLOATING_POINT | |
- pOut->u.i = u.af.rB; | |
+ pOut->u.i = u.ag.rB; | |
MemSetTypeFlag(pOut, MEM_Int); | |
#else | |
- if( sqlite3IsNaN(u.af.rB) ){ | |
+ if( sqlite3IsNaN(u.ag.rB) ){ | |
goto arithmetic_result_is_null; | |
} | |
- pOut->r = u.af.rB; | |
+ pOut->r = u.ag.rB; | |
MemSetTypeFlag(pOut, MEM_Real); | |
- if( (u.af.flags & MEM_Real)==0 ){ | |
+ if( (u.ag.flags & MEM_Real)==0 ){ | |
sqlite3VdbeIntegerAffinity(pOut); | |
} | |
#endif | |
@@ -64768,70 +66105,70 @@ | |
** See also: AggStep and AggFinal | |
*/ | |
case OP_Function: { | |
-#if 0 /* local variables moved into u.ag */ | |
+#if 0 /* local variables moved into u.ah */ | |
int i; | |
Mem *pArg; | |
sqlite3_context ctx; | |
sqlite3_value **apVal; | |
int n; | |
-#endif /* local variables moved into u.ag */ | |
+#endif /* local variables moved into u.ah */ | |
- u.ag.n = pOp->p5; | |
- u.ag.apVal = p->apArg; | |
- assert( u.ag.apVal || u.ag.n==0 ); | |
+ u.ah.n = pOp->p5; | |
+ u.ah.apVal = p->apArg; | |
+ assert( u.ah.apVal || u.ah.n==0 ); | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
pOut = &aMem[pOp->p3]; | |
memAboutToChange(p, pOut); | |
- assert( u.ag.n==0 || (pOp->p2>0 && pOp->p2+u.ag.n<=p->nMem+1) ); | |
- assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+u.ag.n ); | |
- u.ag.pArg = &aMem[pOp->p2]; | |
- for(u.ag.i=0; u.ag.i<u.ag.n; u.ag.i++, u.ag.pArg++){ | |
- assert( memIsValid(u.ag.pArg) ); | |
- u.ag.apVal[u.ag.i] = u.ag.pArg; | |
- Deephemeralize(u.ag.pArg); | |
- sqlite3VdbeMemStoreType(u.ag.pArg); | |
- REGISTER_TRACE(pOp->p2+u.ag.i, u.ag.pArg); | |
+ assert( u.ah.n==0 || (pOp->p2>0 && pOp->p2+u.ah.n<=p->nMem+1) ); | |
+ assert( pOp->p3<pOp->p2 || pOp->p3>=pOp->p2+u.ah.n ); | |
+ u.ah.pArg = &aMem[pOp->p2]; | |
+ for(u.ah.i=0; u.ah.i<u.ah.n; u.ah.i++, u.ah.pArg++){ | |
+ assert( memIsValid(u.ah.pArg) ); | |
+ u.ah.apVal[u.ah.i] = u.ah.pArg; | |
+ Deephemeralize(u.ah.pArg); | |
+ sqlite3VdbeMemStoreType(u.ah.pArg); | |
+ REGISTER_TRACE(pOp->p2+u.ah.i, u.ah.pArg); | |
} | |
assert( pOp->p4type==P4_FUNCDEF || pOp->p4type==P4_VDBEFUNC ); | |
if( pOp->p4type==P4_FUNCDEF ){ | |
- u.ag.ctx.pFunc = pOp->p4.pFunc; | |
- u.ag.ctx.pVdbeFunc = 0; | |
+ u.ah.ctx.pFunc = pOp->p4.pFunc; | |
+ u.ah.ctx.pVdbeFunc = 0; | |
}else{ | |
- u.ag.ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc; | |
- u.ag.ctx.pFunc = u.ag.ctx.pVdbeFunc->pFunc; | |
+ u.ah.ctx.pVdbeFunc = (VdbeFunc*)pOp->p4.pVdbeFunc; | |
+ u.ah.ctx.pFunc = u.ah.ctx.pVdbeFunc->pFunc; | |
} | |
- u.ag.ctx.s.flags = MEM_Null; | |
- u.ag.ctx.s.db = db; | |
- u.ag.ctx.s.xDel = 0; | |
- u.ag.ctx.s.zMalloc = 0; | |
+ u.ah.ctx.s.flags = MEM_Null; | |
+ u.ah.ctx.s.db = db; | |
+ u.ah.ctx.s.xDel = 0; | |
+ u.ah.ctx.s.zMalloc = 0; | |
/* The output cell may already have a buffer allocated. Move | |
- ** the pointer to u.ag.ctx.s so in case the user-function can use | |
+ ** the pointer to u.ah.ctx.s so in case the user-function can use | |
** the already allocated buffer instead of allocating a new one. | |
*/ | |
- sqlite3VdbeMemMove(&u.ag.ctx.s, pOut); | |
- MemSetTypeFlag(&u.ag.ctx.s, MEM_Null); | |
+ sqlite3VdbeMemMove(&u.ah.ctx.s, pOut); | |
+ MemSetTypeFlag(&u.ah.ctx.s, MEM_Null); | |
- u.ag.ctx.isError = 0; | |
- if( u.ag.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ | |
+ u.ah.ctx.isError = 0; | |
+ if( u.ah.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ | |
assert( pOp>aOp ); | |
assert( pOp[-1].p4type==P4_COLLSEQ ); | |
assert( pOp[-1].opcode==OP_CollSeq ); | |
- u.ag.ctx.pColl = pOp[-1].p4.pColl; | |
+ u.ah.ctx.pColl = pOp[-1].p4.pColl; | |
} | |
db->lastRowid = lastRowid; | |
- (*u.ag.ctx.pFunc->xFunc)(&u.ag.ctx, u.ag.n, u.ag.apVal); /* IMP: R-24505-23230 */ | |
+ (*u.ah.ctx.pFunc->xFunc)(&u.ah.ctx, u.ah.n, u.ah.apVal); /* IMP: R-24505-23230 */ | |
lastRowid = db->lastRowid; | |
/* If any auxiliary data functions have been called by this user function, | |
** immediately call the destructor for any non-static values. | |
*/ | |
- if( u.ag.ctx.pVdbeFunc ){ | |
- sqlite3VdbeDeleteAuxData(u.ag.ctx.pVdbeFunc, pOp->p1); | |
- pOp->p4.pVdbeFunc = u.ag.ctx.pVdbeFunc; | |
+ if( u.ah.ctx.pVdbeFunc ){ | |
+ sqlite3VdbeDeleteAuxData(u.ah.ctx.pVdbeFunc, pOp->p1); | |
+ pOp->p4.pVdbeFunc = u.ah.ctx.pVdbeFunc; | |
pOp->p4type = P4_VDBEFUNC; | |
} | |
@@ -64841,19 +66178,19 @@ | |
** to return a value. The following call releases any resources | |
** associated with such a value. | |
*/ | |
- sqlite3VdbeMemRelease(&u.ag.ctx.s); | |
+ sqlite3VdbeMemRelease(&u.ah.ctx.s); | |
goto no_mem; | |
} | |
/* If the function returned an error, throw an exception */ | |
- if( u.ag.ctx.isError ){ | |
- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ag.ctx.s)); | |
- rc = u.ag.ctx.isError; | |
+ if( u.ah.ctx.isError ){ | |
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ah.ctx.s)); | |
+ rc = u.ah.ctx.isError; | |
} | |
/* Copy the result of the function into register P3 */ | |
- sqlite3VdbeChangeEncoding(&u.ag.ctx.s, encoding); | |
- sqlite3VdbeMemMove(pOut, &u.ag.ctx.s); | |
+ sqlite3VdbeChangeEncoding(&u.ah.ctx.s, encoding); | |
+ sqlite3VdbeMemMove(pOut, &u.ah.ctx.s); | |
if( sqlite3VdbeMemTooBig(pOut) ){ | |
goto too_big; | |
} | |
@@ -64901,12 +66238,12 @@ | |
case OP_BitOr: /* same as TK_BITOR, in1, in2, out3 */ | |
case OP_ShiftLeft: /* same as TK_LSHIFT, in1, in2, out3 */ | |
case OP_ShiftRight: { /* same as TK_RSHIFT, in1, in2, out3 */ | |
-#if 0 /* local variables moved into u.ah */ | |
+#if 0 /* local variables moved into u.ai */ | |
i64 iA; | |
u64 uA; | |
i64 iB; | |
u8 op; | |
-#endif /* local variables moved into u.ah */ | |
+#endif /* local variables moved into u.ai */ | |
pIn1 = &aMem[pOp->p1]; | |
pIn2 = &aMem[pOp->p2]; | |
@@ -64915,38 +66252,38 @@ | |
sqlite3VdbeMemSetNull(pOut); | |
break; | |
} | |
- u.ah.iA = sqlite3VdbeIntValue(pIn2); | |
- u.ah.iB = sqlite3VdbeIntValue(pIn1); | |
- u.ah.op = pOp->opcode; | |
- if( u.ah.op==OP_BitAnd ){ | |
- u.ah.iA &= u.ah.iB; | |
- }else if( u.ah.op==OP_BitOr ){ | |
- u.ah.iA |= u.ah.iB; | |
- }else if( u.ah.iB!=0 ){ | |
- assert( u.ah.op==OP_ShiftRight || u.ah.op==OP_ShiftLeft ); | |
+ u.ai.iA = sqlite3VdbeIntValue(pIn2); | |
+ u.ai.iB = sqlite3VdbeIntValue(pIn1); | |
+ u.ai.op = pOp->opcode; | |
+ if( u.ai.op==OP_BitAnd ){ | |
+ u.ai.iA &= u.ai.iB; | |
+ }else if( u.ai.op==OP_BitOr ){ | |
+ u.ai.iA |= u.ai.iB; | |
+ }else if( u.ai.iB!=0 ){ | |
+ assert( u.ai.op==OP_ShiftRight || u.ai.op==OP_ShiftLeft ); | |
/* If shifting by a negative amount, shift in the other direction */ | |
- if( u.ah.iB<0 ){ | |
+ if( u.ai.iB<0 ){ | |
assert( OP_ShiftRight==OP_ShiftLeft+1 ); | |
- u.ah.op = 2*OP_ShiftLeft + 1 - u.ah.op; | |
- u.ah.iB = u.ah.iB>(-64) ? -u.ah.iB : 64; | |
+ u.ai.op = 2*OP_ShiftLeft + 1 - u.ai.op; | |
+ u.ai.iB = u.ai.iB>(-64) ? -u.ai.iB : 64; | |
} | |
- if( u.ah.iB>=64 ){ | |
- u.ah.iA = (u.ah.iA>=0 || u.ah.op==OP_ShiftLeft) ? 0 : -1; | |
+ if( u.ai.iB>=64 ){ | |
+ u.ai.iA = (u.ai.iA>=0 || u.ai.op==OP_ShiftLeft) ? 0 : -1; | |
}else{ | |
- memcpy(&u.ah.uA, &u.ah.iA, sizeof(u.ah.uA)); | |
- if( u.ah.op==OP_ShiftLeft ){ | |
- u.ah.uA <<= u.ah.iB; | |
+ memcpy(&u.ai.uA, &u.ai.iA, sizeof(u.ai.uA)); | |
+ if( u.ai.op==OP_ShiftLeft ){ | |
+ u.ai.uA <<= u.ai.iB; | |
}else{ | |
- u.ah.uA >>= u.ah.iB; | |
+ u.ai.uA >>= u.ai.iB; | |
/* Sign-extend on a right shift of a negative number */ | |
- if( u.ah.iA<0 ) u.ah.uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-u.ah.iB); | |
+ if( u.ai.iA<0 ) u.ai.uA |= ((((u64)0xffffffff)<<32)|0xffffffff) << (64-u.ai.iB); | |
} | |
- memcpy(&u.ah.iA, &u.ah.uA, sizeof(u.ah.iA)); | |
+ memcpy(&u.ai.iA, &u.ai.uA, sizeof(u.ai.iA)); | |
} | |
} | |
- pOut->u.i = u.ah.iA; | |
+ pOut->u.i = u.ai.iA; | |
MemSetTypeFlag(pOut, MEM_Int); | |
break; | |
} | |
@@ -65187,18 +66524,18 @@ | |
case OP_Le: /* same as TK_LE, jump, in1, in3 */ | |
case OP_Gt: /* same as TK_GT, jump, in1, in3 */ | |
case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ | |
-#if 0 /* local variables moved into u.ai */ | |
+#if 0 /* local variables moved into u.aj */ | |
int res; /* Result of the comparison of pIn1 against pIn3 */ | |
char affinity; /* Affinity to use for comparison */ | |
u16 flags1; /* Copy of initial value of pIn1->flags */ | |
u16 flags3; /* Copy of initial value of pIn3->flags */ | |
-#endif /* local variables moved into u.ai */ | |
+#endif /* local variables moved into u.aj */ | |
pIn1 = &aMem[pOp->p1]; | |
pIn3 = &aMem[pOp->p3]; | |
- u.ai.flags1 = pIn1->flags; | |
- u.ai.flags3 = pIn3->flags; | |
- if( (u.ai.flags1 | u.ai.flags3)&MEM_Null ){ | |
+ u.aj.flags1 = pIn1->flags; | |
+ u.aj.flags3 = pIn3->flags; | |
+ if( (u.aj.flags1 | u.aj.flags3)&MEM_Null ){ | |
/* One or both operands are NULL */ | |
if( pOp->p5 & SQLITE_NULLEQ ){ | |
/* If SQLITE_NULLEQ is set (which will only happen if the operator is | |
@@ -65206,7 +66543,7 @@ | |
** or not both operands are null. | |
*/ | |
assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); | |
- u.ai.res = (u.ai.flags1 & u.ai.flags3 & MEM_Null)==0; | |
+ u.aj.res = (u.aj.flags1 & u.aj.flags3 & MEM_Null)==0; | |
}else{ | |
/* SQLITE_NULLEQ is clear and at least one operand is NULL, | |
** then the result is always NULL. | |
@@ -65223,40 +66560,40 @@ | |
} | |
}else{ | |
/* Neither operand is NULL. Do a comparison. */ | |
- u.ai.affinity = pOp->p5 & SQLITE_AFF_MASK; | |
- if( u.ai.affinity ){ | |
- applyAffinity(pIn1, u.ai.affinity, encoding); | |
- applyAffinity(pIn3, u.ai.affinity, encoding); | |
+ u.aj.affinity = pOp->p5 & SQLITE_AFF_MASK; | |
+ if( u.aj.affinity ){ | |
+ applyAffinity(pIn1, u.aj.affinity, encoding); | |
+ applyAffinity(pIn3, u.aj.affinity, encoding); | |
if( db->mallocFailed ) goto no_mem; | |
} | |
assert( pOp->p4type==P4_COLLSEQ || pOp->p4.pColl==0 ); | |
ExpandBlob(pIn1); | |
ExpandBlob(pIn3); | |
- u.ai.res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); | |
+ u.aj.res = sqlite3MemCompare(pIn3, pIn1, pOp->p4.pColl); | |
} | |
switch( pOp->opcode ){ | |
- case OP_Eq: u.ai.res = u.ai.res==0; break; | |
- case OP_Ne: u.ai.res = u.ai.res!=0; break; | |
- case OP_Lt: u.ai.res = u.ai.res<0; break; | |
- case OP_Le: u.ai.res = u.ai.res<=0; break; | |
- case OP_Gt: u.ai.res = u.ai.res>0; break; | |
- default: u.ai.res = u.ai.res>=0; break; | |
+ case OP_Eq: u.aj.res = u.aj.res==0; break; | |
+ case OP_Ne: u.aj.res = u.aj.res!=0; break; | |
+ case OP_Lt: u.aj.res = u.aj.res<0; break; | |
+ case OP_Le: u.aj.res = u.aj.res<=0; break; | |
+ case OP_Gt: u.aj.res = u.aj.res>0; break; | |
+ default: u.aj.res = u.aj.res>=0; break; | |
} | |
if( pOp->p5 & SQLITE_STOREP2 ){ | |
pOut = &aMem[pOp->p2]; | |
memAboutToChange(p, pOut); | |
MemSetTypeFlag(pOut, MEM_Int); | |
- pOut->u.i = u.ai.res; | |
+ pOut->u.i = u.aj.res; | |
REGISTER_TRACE(pOp->p2, pOut); | |
- }else if( u.ai.res ){ | |
+ }else if( u.aj.res ){ | |
pc = pOp->p2-1; | |
} | |
/* Undo any changes made by applyAffinity() to the input registers. */ | |
- pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (u.ai.flags1&MEM_TypeMask); | |
- pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (u.ai.flags3&MEM_TypeMask); | |
+ pIn1->flags = (pIn1->flags&~MEM_TypeMask) | (u.aj.flags1&MEM_TypeMask); | |
+ pIn3->flags = (pIn3->flags&~MEM_TypeMask) | (u.aj.flags3&MEM_TypeMask); | |
break; | |
} | |
@@ -65291,7 +66628,7 @@ | |
** and strings are less than blobs. | |
*/ | |
case OP_Compare: { | |
-#if 0 /* local variables moved into u.aj */ | |
+#if 0 /* local variables moved into u.ak */ | |
int n; | |
int i; | |
int p1; | |
@@ -65300,37 +66637,37 @@ | |
int idx; | |
CollSeq *pColl; /* Collating sequence to use on this term */ | |
int bRev; /* True for DESCENDING sort order */ | |
-#endif /* local variables moved into u.aj */ | |
+#endif /* local variables moved into u.ak */ | |
- u.aj.n = pOp->p3; | |
- u.aj.pKeyInfo = pOp->p4.pKeyInfo; | |
- assert( u.aj.n>0 ); | |
- assert( u.aj.pKeyInfo!=0 ); | |
- u.aj.p1 = pOp->p1; | |
- u.aj.p2 = pOp->p2; | |
+ u.ak.n = pOp->p3; | |
+ u.ak.pKeyInfo = pOp->p4.pKeyInfo; | |
+ assert( u.ak.n>0 ); | |
+ assert( u.ak.pKeyInfo!=0 ); | |
+ u.ak.p1 = pOp->p1; | |
+ u.ak.p2 = pOp->p2; | |
#if SQLITE_DEBUG | |
if( aPermute ){ | |
int k, mx = 0; | |
- for(k=0; k<u.aj.n; k++) if( aPermute[k]>mx ) mx = aPermute[k]; | |
- assert( u.aj.p1>0 && u.aj.p1+mx<=p->nMem+1 ); | |
- assert( u.aj.p2>0 && u.aj.p2+mx<=p->nMem+1 ); | |
+ for(k=0; k<u.ak.n; k++) if( aPermute[k]>mx ) mx = aPermute[k]; | |
+ assert( u.ak.p1>0 && u.ak.p1+mx<=p->nMem+1 ); | |
+ assert( u.ak.p2>0 && u.ak.p2+mx<=p->nMem+1 ); | |
}else{ | |
- assert( u.aj.p1>0 && u.aj.p1+u.aj.n<=p->nMem+1 ); | |
- assert( u.aj.p2>0 && u.aj.p2+u.aj.n<=p->nMem+1 ); | |
+ assert( u.ak.p1>0 && u.ak.p1+u.ak.n<=p->nMem+1 ); | |
+ assert( u.ak.p2>0 && u.ak.p2+u.ak.n<=p->nMem+1 ); | |
} | |
#endif /* SQLITE_DEBUG */ | |
- for(u.aj.i=0; u.aj.i<u.aj.n; u.aj.i++){ | |
- u.aj.idx = aPermute ? aPermute[u.aj.i] : u.aj.i; | |
- assert( memIsValid(&aMem[u.aj.p1+u.aj.idx]) ); | |
- assert( memIsValid(&aMem[u.aj.p2+u.aj.idx]) ); | |
- REGISTER_TRACE(u.aj.p1+u.aj.idx, &aMem[u.aj.p1+u.aj.idx]); | |
- REGISTER_TRACE(u.aj.p2+u.aj.idx, &aMem[u.aj.p2+u.aj.idx]); | |
- assert( u.aj.i<u.aj.pKeyInfo->nField ); | |
- u.aj.pColl = u.aj.pKeyInfo->aColl[u.aj.i]; | |
- u.aj.bRev = u.aj.pKeyInfo->aSortOrder[u.aj.i]; | |
- iCompare = sqlite3MemCompare(&aMem[u.aj.p1+u.aj.idx], &aMem[u.aj.p2+u.aj.idx], u.aj.pColl); | |
+ for(u.ak.i=0; u.ak.i<u.ak.n; u.ak.i++){ | |
+ u.ak.idx = aPermute ? aPermute[u.ak.i] : u.ak.i; | |
+ assert( memIsValid(&aMem[u.ak.p1+u.ak.idx]) ); | |
+ assert( memIsValid(&aMem[u.ak.p2+u.ak.idx]) ); | |
+ REGISTER_TRACE(u.ak.p1+u.ak.idx, &aMem[u.ak.p1+u.ak.idx]); | |
+ REGISTER_TRACE(u.ak.p2+u.ak.idx, &aMem[u.ak.p2+u.ak.idx]); | |
+ assert( u.ak.i<u.ak.pKeyInfo->nField ); | |
+ u.ak.pColl = u.ak.pKeyInfo->aColl[u.ak.i]; | |
+ u.ak.bRev = u.ak.pKeyInfo->aSortOrder[u.ak.i]; | |
+ iCompare = sqlite3MemCompare(&aMem[u.ak.p1+u.ak.idx], &aMem[u.ak.p2+u.ak.idx], u.ak.pColl); | |
if( iCompare ){ | |
- if( u.aj.bRev ) iCompare = -iCompare; | |
+ if( u.ak.bRev ) iCompare = -iCompare; | |
break; | |
} | |
} | |
@@ -65375,35 +66712,35 @@ | |
*/ | |
case OP_And: /* same as TK_AND, in1, in2, out3 */ | |
case OP_Or: { /* same as TK_OR, in1, in2, out3 */ | |
-#if 0 /* local variables moved into u.ak */ | |
+#if 0 /* local variables moved into u.al */ | |
int v1; /* Left operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ | |
int v2; /* Right operand: 0==FALSE, 1==TRUE, 2==UNKNOWN or NULL */ | |
-#endif /* local variables moved into u.ak */ | |
+#endif /* local variables moved into u.al */ | |
pIn1 = &aMem[pOp->p1]; | |
if( pIn1->flags & MEM_Null ){ | |
- u.ak.v1 = 2; | |
+ u.al.v1 = 2; | |
}else{ | |
- u.ak.v1 = sqlite3VdbeIntValue(pIn1)!=0; | |
+ u.al.v1 = sqlite3VdbeIntValue(pIn1)!=0; | |
} | |
pIn2 = &aMem[pOp->p2]; | |
if( pIn2->flags & MEM_Null ){ | |
- u.ak.v2 = 2; | |
+ u.al.v2 = 2; | |
}else{ | |
- u.ak.v2 = sqlite3VdbeIntValue(pIn2)!=0; | |
+ u.al.v2 = sqlite3VdbeIntValue(pIn2)!=0; | |
} | |
if( pOp->opcode==OP_And ){ | |
static const unsigned char and_logic[] = { 0, 0, 0, 0, 1, 2, 0, 2, 2 }; | |
- u.ak.v1 = and_logic[u.ak.v1*3+u.ak.v2]; | |
+ u.al.v1 = and_logic[u.al.v1*3+u.al.v2]; | |
}else{ | |
static const unsigned char or_logic[] = { 0, 1, 2, 1, 1, 1, 2, 1, 2 }; | |
- u.ak.v1 = or_logic[u.ak.v1*3+u.ak.v2]; | |
+ u.al.v1 = or_logic[u.al.v1*3+u.al.v2]; | |
} | |
pOut = &aMem[pOp->p3]; | |
- if( u.ak.v1==2 ){ | |
+ if( u.al.v1==2 ){ | |
MemSetTypeFlag(pOut, MEM_Null); | |
}else{ | |
- pOut->u.i = u.ak.v1; | |
+ pOut->u.i = u.al.v1; | |
MemSetTypeFlag(pOut, MEM_Int); | |
} | |
break; | |
@@ -65445,51 +66782,51 @@ | |
/* Opcode: Once P1 P2 * * * | |
** | |
-** Jump to P2 if the value in register P1 is a not null or zero. If | |
-** the value is NULL or zero, fall through and change the P1 register | |
-** to an integer 1. | |
-** | |
-** When P1 is not used otherwise in a program, this opcode falls through | |
-** once and jumps on all subsequent invocations. It is the equivalent | |
-** of "OP_If P1 P2", followed by "OP_Integer 1 P1". | |
+** Check if OP_Once flag P1 is set. If so, jump to instruction P2. Otherwise, | |
+** set the flag and fall through to the next instruction. | |
+** | |
+** See also: JumpOnce | |
*/ | |
+case OP_Once: { /* jump */ | |
+ assert( pOp->p1<p->nOnceFlag ); | |
+ if( p->aOnceFlag[pOp->p1] ){ | |
+ pc = pOp->p2-1; | |
+ }else{ | |
+ p->aOnceFlag[pOp->p1] = 1; | |
+ } | |
+ break; | |
+} | |
+ | |
/* Opcode: If P1 P2 P3 * * | |
** | |
** Jump to P2 if the value in register P1 is true. The value | |
** is considered true if it is numeric and non-zero. If the value | |
-** in P1 is NULL then take the jump if P3 is true. | |
+** in P1 is NULL then take the jump if P3 is non-zero. | |
*/ | |
/* Opcode: IfNot P1 P2 P3 * * | |
** | |
** Jump to P2 if the value in register P1 is False. The value | |
-** is considered true if it has a numeric value of zero. If the value | |
-** in P1 is NULL then take the jump if P3 is true. | |
+** is considered false if it has a numeric value of zero. If the value | |
+** in P1 is NULL then take the jump if P3 is zero. | |
*/ | |
-case OP_Once: /* jump, in1 */ | |
case OP_If: /* jump, in1 */ | |
case OP_IfNot: { /* jump, in1 */ | |
-#if 0 /* local variables moved into u.al */ | |
+#if 0 /* local variables moved into u.am */ | |
int c; | |
-#endif /* local variables moved into u.al */ | |
+#endif /* local variables moved into u.am */ | |
pIn1 = &aMem[pOp->p1]; | |
if( pIn1->flags & MEM_Null ){ | |
- u.al.c = pOp->p3; | |
+ u.am.c = pOp->p3; | |
}else{ | |
#ifdef SQLITE_OMIT_FLOATING_POINT | |
- u.al.c = sqlite3VdbeIntValue(pIn1)!=0; | |
+ u.am.c = sqlite3VdbeIntValue(pIn1)!=0; | |
#else | |
- u.al.c = sqlite3VdbeRealValue(pIn1)!=0.0; | |
+ u.am.c = sqlite3VdbeRealValue(pIn1)!=0.0; | |
#endif | |
- if( pOp->opcode==OP_IfNot ) u.al.c = !u.al.c; | |
+ if( pOp->opcode==OP_IfNot ) u.am.c = !u.am.c; | |
} | |
- if( u.al.c ){ | |
+ if( u.am.c ){ | |
pc = pOp->p2-1; | |
- }else if( pOp->opcode==OP_Once ){ | |
- assert( (pIn1->flags & (MEM_Agg|MEM_Dyn|MEM_RowSet|MEM_Frame))==0 ); | |
- memAboutToChange(p, pIn1); | |
- pIn1->flags = MEM_Int; | |
- pIn1->u.i = 1; | |
- REGISTER_TRACE(pOp->p1, pIn1); | |
} | |
break; | |
} | |
@@ -65538,7 +66875,7 @@ | |
** register has changed should have this bit set. | |
*/ | |
case OP_Column: { | |
-#if 0 /* local variables moved into u.am */ | |
+#if 0 /* local variables moved into u.an */ | |
u32 payloadSize; /* Number of bytes in the record */ | |
i64 payloadSize64; /* Number of bytes in the record */ | |
int p1; /* P1 value of the opcode */ | |
@@ -65562,126 +66899,126 @@ | |
int avail; /* Number of bytes of available data */ | |
u32 t; /* A type code from the record header */ | |
Mem *pReg; /* PseudoTable input register */ | |
-#endif /* local variables moved into u.am */ | |
+#endif /* local variables moved into u.an */ | |
- u.am.p1 = pOp->p1; | |
- u.am.p2 = pOp->p2; | |
- u.am.pC = 0; | |
- memset(&u.am.sMem, 0, sizeof(u.am.sMem)); | |
- assert( u.am.p1<p->nCursor ); | |
+ u.an.p1 = pOp->p1; | |
+ u.an.p2 = pOp->p2; | |
+ u.an.pC = 0; | |
+ memset(&u.an.sMem, 0, sizeof(u.an.sMem)); | |
+ assert( u.an.p1<p->nCursor ); | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
- u.am.pDest = &aMem[pOp->p3]; | |
- memAboutToChange(p, u.am.pDest); | |
- u.am.zRec = 0; | |
+ u.an.pDest = &aMem[pOp->p3]; | |
+ memAboutToChange(p, u.an.pDest); | |
+ u.an.zRec = 0; | |
- /* This block sets the variable u.am.payloadSize to be the total number of | |
+ /* This block sets the variable u.an.payloadSize to be the total number of | |
** bytes in the record. | |
** | |
- ** u.am.zRec is set to be the complete text of the record if it is available. | |
+ ** u.an.zRec is set to be the complete text of the record if it is available. | |
** The complete record text is always available for pseudo-tables | |
** If the record is stored in a cursor, the complete record text | |
- ** might be available in the u.am.pC->aRow cache. Or it might not be. | |
- ** If the data is unavailable, u.am.zRec is set to NULL. | |
+ ** might be available in the u.an.pC->aRow cache. Or it might not be. | |
+ ** If the data is unavailable, u.an.zRec is set to NULL. | |
** | |
** We also compute the number of columns in the record. For cursors, | |
** the number of columns is stored in the VdbeCursor.nField element. | |
*/ | |
- u.am.pC = p->apCsr[u.am.p1]; | |
- assert( u.am.pC!=0 ); | |
+ u.an.pC = p->apCsr[u.an.p1]; | |
+ assert( u.an.pC!=0 ); | |
#ifndef SQLITE_OMIT_VIRTUALTABLE | |
- assert( u.am.pC->pVtabCursor==0 ); | |
+ assert( u.an.pC->pVtabCursor==0 ); | |
#endif | |
- u.am.pCrsr = u.am.pC->pCursor; | |
- if( u.am.pCrsr!=0 ){ | |
+ u.an.pCrsr = u.an.pC->pCursor; | |
+ if( u.an.pCrsr!=0 ){ | |
/* The record is stored in a B-Tree */ | |
- rc = sqlite3VdbeCursorMoveto(u.am.pC); | |
+ rc = sqlite3VdbeCursorMoveto(u.an.pC); | |
if( rc ) goto abort_due_to_error; | |
- if( u.am.pC->nullRow ){ | |
- u.am.payloadSize = 0; | |
- }else if( u.am.pC->cacheStatus==p->cacheCtr ){ | |
- u.am.payloadSize = u.am.pC->payloadSize; | |
- u.am.zRec = (char*)u.am.pC->aRow; | |
- }else if( u.am.pC->isIndex ){ | |
- assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) ); | |
- VVA_ONLY(rc =) sqlite3BtreeKeySize(u.am.pCrsr, &u.am.payloadSize64); | |
+ if( u.an.pC->nullRow ){ | |
+ u.an.payloadSize = 0; | |
+ }else if( u.an.pC->cacheStatus==p->cacheCtr ){ | |
+ u.an.payloadSize = u.an.pC->payloadSize; | |
+ u.an.zRec = (char*)u.an.pC->aRow; | |
+ }else if( u.an.pC->isIndex ){ | |
+ assert( sqlite3BtreeCursorIsValid(u.an.pCrsr) ); | |
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(u.an.pCrsr, &u.an.payloadSize64); | |
assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ | |
/* sqlite3BtreeParseCellPtr() uses getVarint32() to extract the | |
- ** payload size, so it is impossible for u.am.payloadSize64 to be | |
+ ** payload size, so it is impossible for u.an.payloadSize64 to be | |
** larger than 32 bits. */ | |
- assert( (u.am.payloadSize64 & SQLITE_MAX_U32)==(u64)u.am.payloadSize64 ); | |
- u.am.payloadSize = (u32)u.am.payloadSize64; | |
+ assert( (u.an.payloadSize64 & SQLITE_MAX_U32)==(u64)u.an.payloadSize64 ); | |
+ u.an.payloadSize = (u32)u.an.payloadSize64; | |
}else{ | |
- assert( sqlite3BtreeCursorIsValid(u.am.pCrsr) ); | |
- VVA_ONLY(rc =) sqlite3BtreeDataSize(u.am.pCrsr, &u.am.payloadSize); | |
+ assert( sqlite3BtreeCursorIsValid(u.an.pCrsr) ); | |
+ VVA_ONLY(rc =) sqlite3BtreeDataSize(u.an.pCrsr, &u.an.payloadSize); | |
assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ | |
} | |
- }else if( ALWAYS(u.am.pC->pseudoTableReg>0) ){ | |
- u.am.pReg = &aMem[u.am.pC->pseudoTableReg]; | |
- assert( u.am.pReg->flags & MEM_Blob ); | |
- assert( memIsValid(u.am.pReg) ); | |
- u.am.payloadSize = u.am.pReg->n; | |
- u.am.zRec = u.am.pReg->z; | |
- u.am.pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr; | |
- assert( u.am.payloadSize==0 || u.am.zRec!=0 ); | |
+ }else if( ALWAYS(u.an.pC->pseudoTableReg>0) ){ | |
+ u.an.pReg = &aMem[u.an.pC->pseudoTableReg]; | |
+ assert( u.an.pReg->flags & MEM_Blob ); | |
+ assert( memIsValid(u.an.pReg) ); | |
+ u.an.payloadSize = u.an.pReg->n; | |
+ u.an.zRec = u.an.pReg->z; | |
+ u.an.pC->cacheStatus = (pOp->p5&OPFLAG_CLEARCACHE) ? CACHE_STALE : p->cacheCtr; | |
+ assert( u.an.payloadSize==0 || u.an.zRec!=0 ); | |
}else{ | |
/* Consider the row to be NULL */ | |
- u.am.payloadSize = 0; | |
+ u.an.payloadSize = 0; | |
} | |
- /* If u.am.payloadSize is 0, then just store a NULL. This can happen because of | |
+ /* If u.an.payloadSize is 0, then just store a NULL. This can happen because of | |
** nullRow or because of a corrupt database. */ | |
- if( u.am.payloadSize==0 ){ | |
- MemSetTypeFlag(u.am.pDest, MEM_Null); | |
+ if( u.an.payloadSize==0 ){ | |
+ MemSetTypeFlag(u.an.pDest, MEM_Null); | |
goto op_column_out; | |
} | |
assert( db->aLimit[SQLITE_LIMIT_LENGTH]>=0 ); | |
- if( u.am.payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
+ if( u.an.payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
goto too_big; | |
} | |
- u.am.nField = u.am.pC->nField; | |
- assert( u.am.p2<u.am.nField ); | |
+ u.an.nField = u.an.pC->nField; | |
+ assert( u.an.p2<u.an.nField ); | |
/* Read and parse the table header. Store the results of the parse | |
** into the record header cache fields of the cursor. | |
*/ | |
- u.am.aType = u.am.pC->aType; | |
- if( u.am.pC->cacheStatus==p->cacheCtr ){ | |
- u.am.aOffset = u.am.pC->aOffset; | |
- }else{ | |
- assert(u.am.aType); | |
- u.am.avail = 0; | |
- u.am.pC->aOffset = u.am.aOffset = &u.am.aType[u.am.nField]; | |
- u.am.pC->payloadSize = u.am.payloadSize; | |
- u.am.pC->cacheStatus = p->cacheCtr; | |
+ u.an.aType = u.an.pC->aType; | |
+ if( u.an.pC->cacheStatus==p->cacheCtr ){ | |
+ u.an.aOffset = u.an.pC->aOffset; | |
+ }else{ | |
+ assert(u.an.aType); | |
+ u.an.avail = 0; | |
+ u.an.pC->aOffset = u.an.aOffset = &u.an.aType[u.an.nField]; | |
+ u.an.pC->payloadSize = u.an.payloadSize; | |
+ u.an.pC->cacheStatus = p->cacheCtr; | |
/* Figure out how many bytes are in the header */ | |
- if( u.am.zRec ){ | |
- u.am.zData = u.am.zRec; | |
+ if( u.an.zRec ){ | |
+ u.an.zData = u.an.zRec; | |
}else{ | |
- if( u.am.pC->isIndex ){ | |
- u.am.zData = (char*)sqlite3BtreeKeyFetch(u.am.pCrsr, &u.am.avail); | |
+ if( u.an.pC->isIndex ){ | |
+ u.an.zData = (char*)sqlite3BtreeKeyFetch(u.an.pCrsr, &u.an.avail); | |
}else{ | |
- u.am.zData = (char*)sqlite3BtreeDataFetch(u.am.pCrsr, &u.am.avail); | |
+ u.an.zData = (char*)sqlite3BtreeDataFetch(u.an.pCrsr, &u.an.avail); | |
} | |
/* If KeyFetch()/DataFetch() managed to get the entire payload, | |
- ** save the payload in the u.am.pC->aRow cache. That will save us from | |
+ ** save the payload in the u.an.pC->aRow cache. That will save us from | |
** having to make additional calls to fetch the content portion of | |
** the record. | |
*/ | |
- assert( u.am.avail>=0 ); | |
- if( u.am.payloadSize <= (u32)u.am.avail ){ | |
- u.am.zRec = u.am.zData; | |
- u.am.pC->aRow = (u8*)u.am.zData; | |
+ assert( u.an.avail>=0 ); | |
+ if( u.an.payloadSize <= (u32)u.an.avail ){ | |
+ u.an.zRec = u.an.zData; | |
+ u.an.pC->aRow = (u8*)u.an.zData; | |
}else{ | |
- u.am.pC->aRow = 0; | |
+ u.an.pC->aRow = 0; | |
} | |
} | |
/* The following assert is true in all cases accept when | |
** the database file has been corrupted externally. | |
- ** assert( u.am.zRec!=0 || u.am.avail>=u.am.payloadSize || u.am.avail>=9 ); */ | |
- u.am.szHdr = getVarint32((u8*)u.am.zData, u.am.offset); | |
+ ** assert( u.an.zRec!=0 || u.an.avail>=u.an.payloadSize || u.an.avail>=9 ); */ | |
+ u.an.szHdr = getVarint32((u8*)u.an.zData, u.an.offset); | |
/* Make sure a corrupt database has not given us an oversize header. | |
** Do this now to avoid an oversize memory allocation. | |
@@ -65692,26 +67029,26 @@ | |
** 3-byte type for each of the maximum of 32768 columns plus three | |
** extra bytes for the header length itself. 32768*3 + 3 = 98307. | |
*/ | |
- if( u.am.offset > 98307 ){ | |
+ if( u.an.offset > 98307 ){ | |
rc = SQLITE_CORRUPT_BKPT; | |
goto op_column_out; | |
} | |
- /* Compute in u.am.len the number of bytes of data we need to read in order | |
- ** to get u.am.nField type values. u.am.offset is an upper bound on this. But | |
- ** u.am.nField might be significantly less than the true number of columns | |
- ** in the table, and in that case, 5*u.am.nField+3 might be smaller than u.am.offset. | |
- ** We want to minimize u.am.len in order to limit the size of the memory | |
- ** allocation, especially if a corrupt database file has caused u.am.offset | |
+ /* Compute in u.an.len the number of bytes of data we need to read in order | |
+ ** to get u.an.nField type values. u.an.offset is an upper bound on this. But | |
+ ** u.an.nField might be significantly less than the true number of columns | |
+ ** in the table, and in that case, 5*u.an.nField+3 might be smaller than u.an.offset. | |
+ ** We want to minimize u.an.len in order to limit the size of the memory | |
+ ** allocation, especially if a corrupt database file has caused u.an.offset | |
** to be oversized. Offset is limited to 98307 above. But 98307 might | |
** still exceed Robson memory allocation limits on some configurations. | |
- ** On systems that cannot tolerate large memory allocations, u.am.nField*5+3 | |
- ** will likely be much smaller since u.am.nField will likely be less than | |
+ ** On systems that cannot tolerate large memory allocations, u.an.nField*5+3 | |
+ ** will likely be much smaller since u.an.nField will likely be less than | |
** 20 or so. This insures that Robson memory allocation limits are | |
** not exceeded even for corrupt database files. | |
*/ | |
- u.am.len = u.am.nField*5 + 3; | |
- if( u.am.len > (int)u.am.offset ) u.am.len = (int)u.am.offset; | |
+ u.an.len = u.an.nField*5 + 3; | |
+ if( u.an.len > (int)u.an.offset ) u.an.len = (int)u.an.offset; | |
/* The KeyFetch() or DataFetch() above are fast and will get the entire | |
** record header in most cases. But they will fail to get the complete | |
@@ -65719,51 +67056,51 @@ | |
** in the B-Tree. When that happens, use sqlite3VdbeMemFromBtree() to | |
** acquire the complete header text. | |
*/ | |
- if( !u.am.zRec && u.am.avail<u.am.len ){ | |
- u.am.sMem.flags = 0; | |
- u.am.sMem.db = 0; | |
- rc = sqlite3VdbeMemFromBtree(u.am.pCrsr, 0, u.am.len, u.am.pC->isIndex, &u.am.sMem); | |
+ if( !u.an.zRec && u.an.avail<u.an.len ){ | |
+ u.an.sMem.flags = 0; | |
+ u.an.sMem.db = 0; | |
+ rc = sqlite3VdbeMemFromBtree(u.an.pCrsr, 0, u.an.len, u.an.pC->isIndex, &u.an.sMem); | |
if( rc!=SQLITE_OK ){ | |
goto op_column_out; | |
} | |
- u.am.zData = u.am.sMem.z; | |
+ u.an.zData = u.an.sMem.z; | |
} | |
- u.am.zEndHdr = (u8 *)&u.am.zData[u.am.len]; | |
- u.am.zIdx = (u8 *)&u.am.zData[u.am.szHdr]; | |
+ u.an.zEndHdr = (u8 *)&u.an.zData[u.an.len]; | |
+ u.an.zIdx = (u8 *)&u.an.zData[u.an.szHdr]; | |
- /* Scan the header and use it to fill in the u.am.aType[] and u.am.aOffset[] | |
- ** arrays. u.am.aType[u.am.i] will contain the type integer for the u.am.i-th | |
- ** column and u.am.aOffset[u.am.i] will contain the u.am.offset from the beginning | |
- ** of the record to the start of the data for the u.am.i-th column | |
- */ | |
- for(u.am.i=0; u.am.i<u.am.nField; u.am.i++){ | |
- if( u.am.zIdx<u.am.zEndHdr ){ | |
- u.am.aOffset[u.am.i] = u.am.offset; | |
- if( u.am.zIdx[0]<0x80 ){ | |
- u.am.t = u.am.zIdx[0]; | |
- u.am.zIdx++; | |
+ /* Scan the header and use it to fill in the u.an.aType[] and u.an.aOffset[] | |
+ ** arrays. u.an.aType[u.an.i] will contain the type integer for the u.an.i-th | |
+ ** column and u.an.aOffset[u.an.i] will contain the u.an.offset from the beginning | |
+ ** of the record to the start of the data for the u.an.i-th column | |
+ */ | |
+ for(u.an.i=0; u.an.i<u.an.nField; u.an.i++){ | |
+ if( u.an.zIdx<u.an.zEndHdr ){ | |
+ u.an.aOffset[u.an.i] = u.an.offset; | |
+ if( u.an.zIdx[0]<0x80 ){ | |
+ u.an.t = u.an.zIdx[0]; | |
+ u.an.zIdx++; | |
}else{ | |
- u.am.zIdx += sqlite3GetVarint32(u.am.zIdx, &u.am.t); | |
+ u.an.zIdx += sqlite3GetVarint32(u.an.zIdx, &u.an.t); | |
} | |
- u.am.aType[u.am.i] = u.am.t; | |
- u.am.szField = sqlite3VdbeSerialTypeLen(u.am.t); | |
- u.am.offset += u.am.szField; | |
- if( u.am.offset<u.am.szField ){ /* True if u.am.offset overflows */ | |
- u.am.zIdx = &u.am.zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */ | |
+ u.an.aType[u.an.i] = u.an.t; | |
+ u.an.szField = sqlite3VdbeSerialTypeLen(u.an.t); | |
+ u.an.offset += u.an.szField; | |
+ if( u.an.offset<u.an.szField ){ /* True if u.an.offset overflows */ | |
+ u.an.zIdx = &u.an.zEndHdr[1]; /* Forces SQLITE_CORRUPT return below */ | |
break; | |
} | |
}else{ | |
- /* If u.am.i is less that u.am.nField, then there are less fields in this | |
+ /* If u.an.i is less that u.an.nField, then there are less fields in this | |
** record than SetNumColumns indicated there are columns in the | |
- ** table. Set the u.am.offset for any extra columns not present in | |
+ ** table. Set the u.an.offset for any extra columns not present in | |
** the record to 0. This tells code below to store a NULL | |
** instead of deserializing a value from the record. | |
*/ | |
- u.am.aOffset[u.am.i] = 0; | |
+ u.an.aOffset[u.an.i] = 0; | |
} | |
} | |
- sqlite3VdbeMemRelease(&u.am.sMem); | |
- u.am.sMem.flags = MEM_Null; | |
+ sqlite3VdbeMemRelease(&u.an.sMem); | |
+ u.an.sMem.flags = MEM_Null; | |
/* If we have read more header data than was contained in the header, | |
** or if the end of the last field appears to be past the end of the | |
@@ -65771,63 +67108,63 @@ | |
** of the record (when all fields present), then we must be dealing | |
** with a corrupt database. | |
*/ | |
- if( (u.am.zIdx > u.am.zEndHdr) || (u.am.offset > u.am.payloadSize) | |
- || (u.am.zIdx==u.am.zEndHdr && u.am.offset!=u.am.payloadSize) ){ | |
+ if( (u.an.zIdx > u.an.zEndHdr) || (u.an.offset > u.an.payloadSize) | |
+ || (u.an.zIdx==u.an.zEndHdr && u.an.offset!=u.an.payloadSize) ){ | |
rc = SQLITE_CORRUPT_BKPT; | |
goto op_column_out; | |
} | |
} | |
- /* Get the column information. If u.am.aOffset[u.am.p2] is non-zero, then | |
- ** deserialize the value from the record. If u.am.aOffset[u.am.p2] is zero, | |
+ /* Get the column information. If u.an.aOffset[u.an.p2] is non-zero, then | |
+ ** deserialize the value from the record. If u.an.aOffset[u.an.p2] is zero, | |
** then there are not enough fields in the record to satisfy the | |
** request. In this case, set the value NULL or to P4 if P4 is | |
** a pointer to a Mem object. | |
*/ | |
- if( u.am.aOffset[u.am.p2] ){ | |
+ if( u.an.aOffset[u.an.p2] ){ | |
assert( rc==SQLITE_OK ); | |
- if( u.am.zRec ){ | |
- MemReleaseExt(u.am.pDest); | |
- sqlite3VdbeSerialGet((u8 *)&u.am.zRec[u.am.aOffset[u.am.p2]], u.am.aType[u.am.p2], u.am.pDest); | |
- }else{ | |
- u.am.len = sqlite3VdbeSerialTypeLen(u.am.aType[u.am.p2]); | |
- sqlite3VdbeMemMove(&u.am.sMem, u.am.pDest); | |
- rc = sqlite3VdbeMemFromBtree(u.am.pCrsr, u.am.aOffset[u.am.p2], u.am.len, u.am.pC->isIndex, &u.am.sMem); | |
+ if( u.an.zRec ){ | |
+ VdbeMemRelease(u.an.pDest); | |
+ sqlite3VdbeSerialGet((u8 *)&u.an.zRec[u.an.aOffset[u.an.p2]], u.an.aType[u.an.p2], u.an.pDest); | |
+ }else{ | |
+ u.an.len = sqlite3VdbeSerialTypeLen(u.an.aType[u.an.p2]); | |
+ sqlite3VdbeMemMove(&u.an.sMem, u.an.pDest); | |
+ rc = sqlite3VdbeMemFromBtree(u.an.pCrsr, u.an.aOffset[u.an.p2], u.an.len, u.an.pC->isIndex, &u.an.sMem); | |
if( rc!=SQLITE_OK ){ | |
goto op_column_out; | |
} | |
- u.am.zData = u.am.sMem.z; | |
- sqlite3VdbeSerialGet((u8*)u.am.zData, u.am.aType[u.am.p2], u.am.pDest); | |
+ u.an.zData = u.an.sMem.z; | |
+ sqlite3VdbeSerialGet((u8*)u.an.zData, u.an.aType[u.an.p2], u.an.pDest); | |
} | |
- u.am.pDest->enc = encoding; | |
+ u.an.pDest->enc = encoding; | |
}else{ | |
if( pOp->p4type==P4_MEM ){ | |
- sqlite3VdbeMemShallowCopy(u.am.pDest, pOp->p4.pMem, MEM_Static); | |
+ sqlite3VdbeMemShallowCopy(u.an.pDest, pOp->p4.pMem, MEM_Static); | |
}else{ | |
- MemSetTypeFlag(u.am.pDest, MEM_Null); | |
+ MemSetTypeFlag(u.an.pDest, MEM_Null); | |
} | |
} | |
/* If we dynamically allocated space to hold the data (in the | |
** sqlite3VdbeMemFromBtree() call above) then transfer control of that | |
- ** dynamically allocated space over to the u.am.pDest structure. | |
+ ** dynamically allocated space over to the u.an.pDest structure. | |
** This prevents a memory copy. | |
*/ | |
- if( u.am.sMem.zMalloc ){ | |
- assert( u.am.sMem.z==u.am.sMem.zMalloc ); | |
- assert( !(u.am.pDest->flags & MEM_Dyn) ); | |
- assert( !(u.am.pDest->flags & (MEM_Blob|MEM_Str)) || u.am.pDest->z==u.am.sMem.z ); | |
- u.am.pDest->flags &= ~(MEM_Ephem|MEM_Static); | |
- u.am.pDest->flags |= MEM_Term; | |
- u.am.pDest->z = u.am.sMem.z; | |
- u.am.pDest->zMalloc = u.am.sMem.zMalloc; | |
+ if( u.an.sMem.zMalloc ){ | |
+ assert( u.an.sMem.z==u.an.sMem.zMalloc ); | |
+ assert( !(u.an.pDest->flags & MEM_Dyn) ); | |
+ assert( !(u.an.pDest->flags & (MEM_Blob|MEM_Str)) || u.an.pDest->z==u.an.sMem.z ); | |
+ u.an.pDest->flags &= ~(MEM_Ephem|MEM_Static); | |
+ u.an.pDest->flags |= MEM_Term; | |
+ u.an.pDest->z = u.an.sMem.z; | |
+ u.an.pDest->zMalloc = u.an.sMem.zMalloc; | |
} | |
- rc = sqlite3VdbeMemMakeWriteable(u.am.pDest); | |
+ rc = sqlite3VdbeMemMakeWriteable(u.an.pDest); | |
op_column_out: | |
- UPDATE_MAX_BLOBSIZE(u.am.pDest); | |
- REGISTER_TRACE(pOp->p3, u.am.pDest); | |
+ UPDATE_MAX_BLOBSIZE(u.an.pDest); | |
+ REGISTER_TRACE(pOp->p3, u.an.pDest); | |
break; | |
} | |
@@ -65840,20 +67177,20 @@ | |
** memory cell in the range. | |
*/ | |
case OP_Affinity: { | |
-#if 0 /* local variables moved into u.an */ | |
+#if 0 /* local variables moved into u.ao */ | |
const char *zAffinity; /* The affinity to be applied */ | |
char cAff; /* A single character of affinity */ | |
-#endif /* local variables moved into u.an */ | |
+#endif /* local variables moved into u.ao */ | |
- u.an.zAffinity = pOp->p4.z; | |
- assert( u.an.zAffinity!=0 ); | |
- assert( u.an.zAffinity[pOp->p2]==0 ); | |
+ u.ao.zAffinity = pOp->p4.z; | |
+ assert( u.ao.zAffinity!=0 ); | |
+ assert( u.ao.zAffinity[pOp->p2]==0 ); | |
pIn1 = &aMem[pOp->p1]; | |
- while( (u.an.cAff = *(u.an.zAffinity++))!=0 ){ | |
+ while( (u.ao.cAff = *(u.ao.zAffinity++))!=0 ){ | |
assert( pIn1 <= &p->aMem[p->nMem] ); | |
assert( memIsValid(pIn1) ); | |
ExpandBlob(pIn1); | |
- applyAffinity(pIn1, u.an.cAff, encoding); | |
+ applyAffinity(pIn1, u.ao.cAff, encoding); | |
pIn1++; | |
} | |
break; | |
@@ -65875,7 +67212,7 @@ | |
** If P4 is NULL then all index fields have the affinity NONE. | |
*/ | |
case OP_MakeRecord: { | |
-#if 0 /* local variables moved into u.ao */ | |
+#if 0 /* local variables moved into u.ap */ | |
u8 *zNewRecord; /* A buffer to hold the data for the new record */ | |
Mem *pRec; /* The new record */ | |
u64 nData; /* Number of bytes of data space */ | |
@@ -65891,7 +67228,7 @@ | |
int file_format; /* File format to use for encoding */ | |
int i; /* Space used in zNewRecord[] */ | |
int len; /* Length of a field */ | |
-#endif /* local variables moved into u.ao */ | |
+#endif /* local variables moved into u.ap */ | |
/* Assuming the record contains N fields, the record format looks | |
** like this: | |
@@ -65908,16 +67245,16 @@ | |
** hdr-size field is also a varint which is the offset from the beginning | |
** of the record to data0. | |
*/ | |
- u.ao.nData = 0; /* Number of bytes of data space */ | |
- u.ao.nHdr = 0; /* Number of bytes of header space */ | |
- u.ao.nZero = 0; /* Number of zero bytes at the end of the record */ | |
- u.ao.nField = pOp->p1; | |
- u.ao.zAffinity = pOp->p4.z; | |
- assert( u.ao.nField>0 && pOp->p2>0 && pOp->p2+u.ao.nField<=p->nMem+1 ); | |
- u.ao.pData0 = &aMem[u.ao.nField]; | |
- u.ao.nField = pOp->p2; | |
- u.ao.pLast = &u.ao.pData0[u.ao.nField-1]; | |
- u.ao.file_format = p->minWriteFileFormat; | |
+ u.ap.nData = 0; /* Number of bytes of data space */ | |
+ u.ap.nHdr = 0; /* Number of bytes of header space */ | |
+ u.ap.nZero = 0; /* Number of zero bytes at the end of the record */ | |
+ u.ap.nField = pOp->p1; | |
+ u.ap.zAffinity = pOp->p4.z; | |
+ assert( u.ap.nField>0 && pOp->p2>0 && pOp->p2+u.ap.nField<=p->nMem+1 ); | |
+ u.ap.pData0 = &aMem[u.ap.nField]; | |
+ u.ap.nField = pOp->p2; | |
+ u.ap.pLast = &u.ap.pData0[u.ap.nField-1]; | |
+ u.ap.file_format = p->minWriteFileFormat; | |
/* Identify the output register */ | |
assert( pOp->p3<pOp->p1 || pOp->p3>=pOp->p1+pOp->p2 ); | |
@@ -65927,34 +67264,34 @@ | |
/* Loop through the elements that will make up the record to figure | |
** out how much space is required for the new record. | |
*/ | |
- for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){ | |
- assert( memIsValid(u.ao.pRec) ); | |
- if( u.ao.zAffinity ){ | |
- applyAffinity(u.ao.pRec, u.ao.zAffinity[u.ao.pRec-u.ao.pData0], encoding); | |
- } | |
- if( u.ao.pRec->flags&MEM_Zero && u.ao.pRec->n>0 ){ | |
- sqlite3VdbeMemExpandBlob(u.ao.pRec); | |
- } | |
- u.ao.serial_type = sqlite3VdbeSerialType(u.ao.pRec, u.ao.file_format); | |
- u.ao.len = sqlite3VdbeSerialTypeLen(u.ao.serial_type); | |
- u.ao.nData += u.ao.len; | |
- u.ao.nHdr += sqlite3VarintLen(u.ao.serial_type); | |
- if( u.ao.pRec->flags & MEM_Zero ){ | |
+ for(u.ap.pRec=u.ap.pData0; u.ap.pRec<=u.ap.pLast; u.ap.pRec++){ | |
+ assert( memIsValid(u.ap.pRec) ); | |
+ if( u.ap.zAffinity ){ | |
+ applyAffinity(u.ap.pRec, u.ap.zAffinity[u.ap.pRec-u.ap.pData0], encoding); | |
+ } | |
+ if( u.ap.pRec->flags&MEM_Zero && u.ap.pRec->n>0 ){ | |
+ sqlite3VdbeMemExpandBlob(u.ap.pRec); | |
+ } | |
+ u.ap.serial_type = sqlite3VdbeSerialType(u.ap.pRec, u.ap.file_format); | |
+ u.ap.len = sqlite3VdbeSerialTypeLen(u.ap.serial_type); | |
+ u.ap.nData += u.ap.len; | |
+ u.ap.nHdr += sqlite3VarintLen(u.ap.serial_type); | |
+ if( u.ap.pRec->flags & MEM_Zero ){ | |
/* Only pure zero-filled BLOBs can be input to this Opcode. | |
** We do not allow blobs with a prefix and a zero-filled tail. */ | |
- u.ao.nZero += u.ao.pRec->u.nZero; | |
- }else if( u.ao.len ){ | |
- u.ao.nZero = 0; | |
+ u.ap.nZero += u.ap.pRec->u.nZero; | |
+ }else if( u.ap.len ){ | |
+ u.ap.nZero = 0; | |
} | |
} | |
/* Add the initial header varint and total the size */ | |
- u.ao.nHdr += u.ao.nVarint = sqlite3VarintLen(u.ao.nHdr); | |
- if( u.ao.nVarint<sqlite3VarintLen(u.ao.nHdr) ){ | |
- u.ao.nHdr++; | |
+ u.ap.nHdr += u.ap.nVarint = sqlite3VarintLen(u.ap.nHdr); | |
+ if( u.ap.nVarint<sqlite3VarintLen(u.ap.nHdr) ){ | |
+ u.ap.nHdr++; | |
} | |
- u.ao.nByte = u.ao.nHdr+u.ao.nData-u.ao.nZero; | |
- if( u.ao.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
+ u.ap.nByte = u.ap.nHdr+u.ap.nData-u.ap.nZero; | |
+ if( u.ap.nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
goto too_big; | |
} | |
@@ -65963,28 +67300,28 @@ | |
** be one of the input registers (because the following call to | |
** sqlite3VdbeMemGrow() could clobber the value before it is used). | |
*/ | |
- if( sqlite3VdbeMemGrow(pOut, (int)u.ao.nByte, 0) ){ | |
+ if( sqlite3VdbeMemGrow(pOut, (int)u.ap.nByte, 0) ){ | |
goto no_mem; | |
} | |
- u.ao.zNewRecord = (u8 *)pOut->z; | |
+ u.ap.zNewRecord = (u8 *)pOut->z; | |
/* Write the record */ | |
- u.ao.i = putVarint32(u.ao.zNewRecord, u.ao.nHdr); | |
- for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){ | |
- u.ao.serial_type = sqlite3VdbeSerialType(u.ao.pRec, u.ao.file_format); | |
- u.ao.i += putVarint32(&u.ao.zNewRecord[u.ao.i], u.ao.serial_type); /* serial type */ | |
+ u.ap.i = putVarint32(u.ap.zNewRecord, u.ap.nHdr); | |
+ for(u.ap.pRec=u.ap.pData0; u.ap.pRec<=u.ap.pLast; u.ap.pRec++){ | |
+ u.ap.serial_type = sqlite3VdbeSerialType(u.ap.pRec, u.ap.file_format); | |
+ u.ap.i += putVarint32(&u.ap.zNewRecord[u.ap.i], u.ap.serial_type); /* serial type */ | |
} | |
- for(u.ao.pRec=u.ao.pData0; u.ao.pRec<=u.ao.pLast; u.ao.pRec++){ /* serial data */ | |
- u.ao.i += sqlite3VdbeSerialPut(&u.ao.zNewRecord[u.ao.i], (int)(u.ao.nByte-u.ao.i), u.ao.pRec,u.ao.file_format); | |
+ for(u.ap.pRec=u.ap.pData0; u.ap.pRec<=u.ap.pLast; u.ap.pRec++){ /* serial data */ | |
+ u.ap.i += sqlite3VdbeSerialPut(&u.ap.zNewRecord[u.ap.i], (int)(u.ap.nByte-u.ap.i), u.ap.pRec,u.ap.file_format); | |
} | |
- assert( u.ao.i==u.ao.nByte ); | |
+ assert( u.ap.i==u.ap.nByte ); | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
- pOut->n = (int)u.ao.nByte; | |
+ pOut->n = (int)u.ap.nByte; | |
pOut->flags = MEM_Blob | MEM_Dyn; | |
pOut->xDel = 0; | |
- if( u.ao.nZero ){ | |
- pOut->u.nZero = u.ao.nZero; | |
+ if( u.ap.nZero ){ | |
+ pOut->u.nZero = u.ap.nZero; | |
pOut->flags |= MEM_Zero; | |
} | |
pOut->enc = SQLITE_UTF8; /* In case the blob is ever converted to text */ | |
@@ -66000,18 +67337,18 @@ | |
*/ | |
#ifndef SQLITE_OMIT_BTREECOUNT | |
case OP_Count: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.ap */ | |
+#if 0 /* local variables moved into u.aq */ | |
i64 nEntry; | |
BtCursor *pCrsr; | |
-#endif /* local variables moved into u.ap */ | |
+#endif /* local variables moved into u.aq */ | |
- u.ap.pCrsr = p->apCsr[pOp->p1]->pCursor; | |
- if( ALWAYS(u.ap.pCrsr) ){ | |
- rc = sqlite3BtreeCount(u.ap.pCrsr, &u.ap.nEntry); | |
+ u.aq.pCrsr = p->apCsr[pOp->p1]->pCursor; | |
+ if( ALWAYS(u.aq.pCrsr) ){ | |
+ rc = sqlite3BtreeCount(u.aq.pCrsr, &u.aq.nEntry); | |
}else{ | |
- u.ap.nEntry = 0; | |
+ u.aq.nEntry = 0; | |
} | |
- pOut->u.i = u.ap.nEntry; | |
+ pOut->u.i = u.aq.nEntry; | |
break; | |
} | |
#endif | |
@@ -66023,7 +67360,7 @@ | |
** existing savepoint, P1==1, or to rollback an existing savepoint P1==2. | |
*/ | |
case OP_Savepoint: { | |
-#if 0 /* local variables moved into u.aq */ | |
+#if 0 /* local variables moved into u.ar */ | |
int p1; /* Value of P1 operand */ | |
char *zName; /* Name of savepoint */ | |
int nName; | |
@@ -66032,20 +67369,20 @@ | |
Savepoint *pTmp; | |
int iSavepoint; | |
int ii; | |
-#endif /* local variables moved into u.aq */ | |
+#endif /* local variables moved into u.ar */ | |
- u.aq.p1 = pOp->p1; | |
- u.aq.zName = pOp->p4.z; | |
+ u.ar.p1 = pOp->p1; | |
+ u.ar.zName = pOp->p4.z; | |
- /* Assert that the u.aq.p1 parameter is valid. Also that if there is no open | |
+ /* Assert that the u.ar.p1 parameter is valid. Also that if there is no open | |
** transaction, then there cannot be any savepoints. | |
*/ | |
assert( db->pSavepoint==0 || db->autoCommit==0 ); | |
- assert( u.aq.p1==SAVEPOINT_BEGIN||u.aq.p1==SAVEPOINT_RELEASE||u.aq.p1==SAVEPOINT_ROLLBACK ); | |
+ assert( u.ar.p1==SAVEPOINT_BEGIN||u.ar.p1==SAVEPOINT_RELEASE||u.ar.p1==SAVEPOINT_ROLLBACK ); | |
assert( db->pSavepoint || db->isTransactionSavepoint==0 ); | |
assert( checkSavepointCount(db) ); | |
- if( u.aq.p1==SAVEPOINT_BEGIN ){ | |
+ if( u.ar.p1==SAVEPOINT_BEGIN ){ | |
if( db->writeVdbeCnt>0 ){ | |
/* A new savepoint cannot be created if there are active write | |
** statements (i.e. open read/write incremental blob handles). | |
@@ -66054,7 +67391,7 @@ | |
"SQL statements in progress"); | |
rc = SQLITE_BUSY; | |
}else{ | |
- u.aq.nName = sqlite3Strlen30(u.aq.zName); | |
+ u.ar.nName = sqlite3Strlen30(u.ar.zName); | |
#ifndef SQLITE_OMIT_VIRTUALTABLE | |
/* This call is Ok even if this savepoint is actually a transaction | |
@@ -66068,10 +67405,10 @@ | |
#endif | |
/* Create a new savepoint structure. */ | |
- u.aq.pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+u.aq.nName+1); | |
- if( u.aq.pNew ){ | |
- u.aq.pNew->zName = (char *)&u.aq.pNew[1]; | |
- memcpy(u.aq.pNew->zName, u.aq.zName, u.aq.nName+1); | |
+ u.ar.pNew = sqlite3DbMallocRaw(db, sizeof(Savepoint)+u.ar.nName+1); | |
+ if( u.ar.pNew ){ | |
+ u.ar.pNew->zName = (char *)&u.ar.pNew[1]; | |
+ memcpy(u.ar.pNew->zName, u.ar.zName, u.ar.nName+1); | |
/* If there is no open transaction, then mark this as a special | |
** "transaction savepoint". */ | |
@@ -66083,28 +67420,28 @@ | |
} | |
/* Link the new savepoint into the database handle's list. */ | |
- u.aq.pNew->pNext = db->pSavepoint; | |
- db->pSavepoint = u.aq.pNew; | |
- u.aq.pNew->nDeferredCons = db->nDeferredCons; | |
+ u.ar.pNew->pNext = db->pSavepoint; | |
+ db->pSavepoint = u.ar.pNew; | |
+ u.ar.pNew->nDeferredCons = db->nDeferredCons; | |
} | |
} | |
}else{ | |
- u.aq.iSavepoint = 0; | |
+ u.ar.iSavepoint = 0; | |
/* Find the named savepoint. If there is no such savepoint, then an | |
** an error is returned to the user. */ | |
for( | |
- u.aq.pSavepoint = db->pSavepoint; | |
- u.aq.pSavepoint && sqlite3StrICmp(u.aq.pSavepoint->zName, u.aq.zName); | |
- u.aq.pSavepoint = u.aq.pSavepoint->pNext | |
+ u.ar.pSavepoint = db->pSavepoint; | |
+ u.ar.pSavepoint && sqlite3StrICmp(u.ar.pSavepoint->zName, u.ar.zName); | |
+ u.ar.pSavepoint = u.ar.pSavepoint->pNext | |
){ | |
- u.aq.iSavepoint++; | |
+ u.ar.iSavepoint++; | |
} | |
- if( !u.aq.pSavepoint ){ | |
- sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", u.aq.zName); | |
+ if( !u.ar.pSavepoint ){ | |
+ sqlite3SetString(&p->zErrMsg, db, "no such savepoint: %s", u.ar.zName); | |
rc = SQLITE_ERROR; | |
}else if( | |
- db->writeVdbeCnt>0 || (u.aq.p1==SAVEPOINT_ROLLBACK && db->activeVdbeCnt>1) | |
+ db->writeVdbeCnt>0 || (u.ar.p1==SAVEPOINT_ROLLBACK && db->activeVdbeCnt>1) | |
){ | |
/* It is not possible to release (commit) a savepoint if there are | |
** active write statements. It is not possible to rollback a savepoint | |
@@ -66112,7 +67449,7 @@ | |
*/ | |
sqlite3SetString(&p->zErrMsg, db, | |
"cannot %s savepoint - SQL statements in progress", | |
- (u.aq.p1==SAVEPOINT_ROLLBACK ? "rollback": "release") | |
+ (u.ar.p1==SAVEPOINT_ROLLBACK ? "rollback": "release") | |
); | |
rc = SQLITE_BUSY; | |
}else{ | |
@@ -66121,8 +67458,8 @@ | |
** and this is a RELEASE command, then the current transaction | |
** is committed. | |
*/ | |
- int isTransaction = u.aq.pSavepoint->pNext==0 && db->isTransactionSavepoint; | |
- if( isTransaction && u.aq.p1==SAVEPOINT_RELEASE ){ | |
+ int isTransaction = u.ar.pSavepoint->pNext==0 && db->isTransactionSavepoint; | |
+ if( isTransaction && u.ar.p1==SAVEPOINT_RELEASE ){ | |
if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ | |
goto vdbe_return; | |
} | |
@@ -66136,14 +67473,14 @@ | |
db->isTransactionSavepoint = 0; | |
rc = p->rc; | |
}else{ | |
- u.aq.iSavepoint = db->nSavepoint - u.aq.iSavepoint - 1; | |
- for(u.aq.ii=0; u.aq.ii<db->nDb; u.aq.ii++){ | |
- rc = sqlite3BtreeSavepoint(db->aDb[u.aq.ii].pBt, u.aq.p1, u.aq.iSavepoint); | |
+ u.ar.iSavepoint = db->nSavepoint - u.ar.iSavepoint - 1; | |
+ for(u.ar.ii=0; u.ar.ii<db->nDb; u.ar.ii++){ | |
+ rc = sqlite3BtreeSavepoint(db->aDb[u.ar.ii].pBt, u.ar.p1, u.ar.iSavepoint); | |
if( rc!=SQLITE_OK ){ | |
goto abort_due_to_error; | |
} | |
} | |
- if( u.aq.p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){ | |
+ if( u.ar.p1==SAVEPOINT_ROLLBACK && (db->flags&SQLITE_InternChanges)!=0 ){ | |
sqlite3ExpirePreparedStatements(db); | |
sqlite3ResetInternalSchema(db, -1); | |
db->flags = (db->flags | SQLITE_InternChanges); | |
@@ -66152,10 +67489,10 @@ | |
/* Regardless of whether this is a RELEASE or ROLLBACK, destroy all | |
** savepoints nested inside of the savepoint being operated on. */ | |
- while( db->pSavepoint!=u.aq.pSavepoint ){ | |
- u.aq.pTmp = db->pSavepoint; | |
- db->pSavepoint = u.aq.pTmp->pNext; | |
- sqlite3DbFree(db, u.aq.pTmp); | |
+ while( db->pSavepoint!=u.ar.pSavepoint ){ | |
+ u.ar.pTmp = db->pSavepoint; | |
+ db->pSavepoint = u.ar.pTmp->pNext; | |
+ sqlite3DbFree(db, u.ar.pTmp); | |
db->nSavepoint--; | |
} | |
@@ -66163,19 +67500,19 @@ | |
** too. If it is a ROLLBACK TO, then set the number of deferred | |
** constraint violations present in the database to the value stored | |
** when the savepoint was created. */ | |
- if( u.aq.p1==SAVEPOINT_RELEASE ){ | |
- assert( u.aq.pSavepoint==db->pSavepoint ); | |
- db->pSavepoint = u.aq.pSavepoint->pNext; | |
- sqlite3DbFree(db, u.aq.pSavepoint); | |
+ if( u.ar.p1==SAVEPOINT_RELEASE ){ | |
+ assert( u.ar.pSavepoint==db->pSavepoint ); | |
+ db->pSavepoint = u.ar.pSavepoint->pNext; | |
+ sqlite3DbFree(db, u.ar.pSavepoint); | |
if( !isTransaction ){ | |
db->nSavepoint--; | |
} | |
}else{ | |
- db->nDeferredCons = u.aq.pSavepoint->nDeferredCons; | |
+ db->nDeferredCons = u.ar.pSavepoint->nDeferredCons; | |
} | |
if( !isTransaction ){ | |
- rc = sqlite3VtabSavepoint(db, u.aq.p1, u.aq.iSavepoint); | |
+ rc = sqlite3VtabSavepoint(db, u.ar.p1, u.ar.iSavepoint); | |
if( rc!=SQLITE_OK ) goto abort_due_to_error; | |
} | |
} | |
@@ -66194,20 +67531,20 @@ | |
** This instruction causes the VM to halt. | |
*/ | |
case OP_AutoCommit: { | |
-#if 0 /* local variables moved into u.ar */ | |
+#if 0 /* local variables moved into u.as */ | |
int desiredAutoCommit; | |
int iRollback; | |
int turnOnAC; | |
-#endif /* local variables moved into u.ar */ | |
+#endif /* local variables moved into u.as */ | |
- u.ar.desiredAutoCommit = pOp->p1; | |
- u.ar.iRollback = pOp->p2; | |
- u.ar.turnOnAC = u.ar.desiredAutoCommit && !db->autoCommit; | |
- assert( u.ar.desiredAutoCommit==1 || u.ar.desiredAutoCommit==0 ); | |
- assert( u.ar.desiredAutoCommit==1 || u.ar.iRollback==0 ); | |
+ u.as.desiredAutoCommit = pOp->p1; | |
+ u.as.iRollback = pOp->p2; | |
+ u.as.turnOnAC = u.as.desiredAutoCommit && !db->autoCommit; | |
+ assert( u.as.desiredAutoCommit==1 || u.as.desiredAutoCommit==0 ); | |
+ assert( u.as.desiredAutoCommit==1 || u.as.iRollback==0 ); | |
assert( db->activeVdbeCnt>0 ); /* At least this one VM is active */ | |
- if( u.ar.turnOnAC && u.ar.iRollback && db->activeVdbeCnt>1 ){ | |
+ if( u.as.turnOnAC && u.as.iRollback && db->activeVdbeCnt>1 ){ | |
/* If this instruction implements a ROLLBACK and other VMs are | |
** still running, and a transaction is active, return an error indicating | |
** that the other VMs must complete first. | |
@@ -66215,25 +67552,25 @@ | |
sqlite3SetString(&p->zErrMsg, db, "cannot rollback transaction - " | |
"SQL statements in progress"); | |
rc = SQLITE_BUSY; | |
- }else if( u.ar.turnOnAC && !u.ar.iRollback && db->writeVdbeCnt>0 ){ | |
+ }else if( u.as.turnOnAC && !u.as.iRollback && db->writeVdbeCnt>0 ){ | |
/* If this instruction implements a COMMIT and other VMs are writing | |
** return an error indicating that the other VMs must complete first. | |
*/ | |
sqlite3SetString(&p->zErrMsg, db, "cannot commit transaction - " | |
"SQL statements in progress"); | |
rc = SQLITE_BUSY; | |
- }else if( u.ar.desiredAutoCommit!=db->autoCommit ){ | |
- if( u.ar.iRollback ){ | |
- assert( u.ar.desiredAutoCommit==1 ); | |
+ }else if( u.as.desiredAutoCommit!=db->autoCommit ){ | |
+ if( u.as.iRollback ){ | |
+ assert( u.as.desiredAutoCommit==1 ); | |
sqlite3RollbackAll(db); | |
db->autoCommit = 1; | |
}else if( (rc = sqlite3VdbeCheckFk(p, 1))!=SQLITE_OK ){ | |
goto vdbe_return; | |
}else{ | |
- db->autoCommit = (u8)u.ar.desiredAutoCommit; | |
+ db->autoCommit = (u8)u.as.desiredAutoCommit; | |
if( sqlite3VdbeHalt(p)==SQLITE_BUSY ){ | |
p->pc = pc; | |
- db->autoCommit = (u8)(1-u.ar.desiredAutoCommit); | |
+ db->autoCommit = (u8)(1-u.as.desiredAutoCommit); | |
p->rc = rc = SQLITE_BUSY; | |
goto vdbe_return; | |
} | |
@@ -66248,8 +67585,8 @@ | |
goto vdbe_return; | |
}else{ | |
sqlite3SetString(&p->zErrMsg, db, | |
- (!u.ar.desiredAutoCommit)?"cannot start a transaction within a transaction":( | |
- (u.ar.iRollback)?"cannot rollback - no transaction is active": | |
+ (!u.as.desiredAutoCommit)?"cannot start a transaction within a transaction":( | |
+ (u.as.iRollback)?"cannot rollback - no transaction is active": | |
"cannot commit - no transaction is active")); | |
rc = SQLITE_ERROR; | |
@@ -66289,16 +67626,16 @@ | |
** If P2 is zero, then a read-lock is obtained on the database file. | |
*/ | |
case OP_Transaction: { | |
-#if 0 /* local variables moved into u.as */ | |
+#if 0 /* local variables moved into u.at */ | |
Btree *pBt; | |
-#endif /* local variables moved into u.as */ | |
+#endif /* local variables moved into u.at */ | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 ); | |
- u.as.pBt = db->aDb[pOp->p1].pBt; | |
+ u.at.pBt = db->aDb[pOp->p1].pBt; | |
- if( u.as.pBt ){ | |
- rc = sqlite3BtreeBeginTrans(u.as.pBt, pOp->p2); | |
+ if( u.at.pBt ){ | |
+ rc = sqlite3BtreeBeginTrans(u.at.pBt, pOp->p2); | |
if( rc==SQLITE_BUSY ){ | |
p->pc = pc; | |
p->rc = rc = SQLITE_BUSY; | |
@@ -66311,7 +67648,7 @@ | |
if( pOp->p2 && p->usesStmtJournal | |
&& (db->autoCommit==0 || db->activeVdbeCnt>1) | |
){ | |
- assert( sqlite3BtreeIsInTrans(u.as.pBt) ); | |
+ assert( sqlite3BtreeIsInTrans(u.at.pBt) ); | |
if( p->iStatement==0 ){ | |
assert( db->nStatement>=0 && db->nSavepoint>=0 ); | |
db->nStatement++; | |
@@ -66320,7 +67657,7 @@ | |
rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, p->iStatement-1); | |
if( rc==SQLITE_OK ){ | |
- rc = sqlite3BtreeBeginStmt(u.as.pBt, p->iStatement); | |
+ rc = sqlite3BtreeBeginStmt(u.at.pBt, p->iStatement); | |
} | |
/* Store the current value of the database handles deferred constraint | |
@@ -66345,21 +67682,21 @@ | |
** executing this instruction. | |
*/ | |
case OP_ReadCookie: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.at */ | |
+#if 0 /* local variables moved into u.au */ | |
int iMeta; | |
int iDb; | |
int iCookie; | |
-#endif /* local variables moved into u.at */ | |
+#endif /* local variables moved into u.au */ | |
- u.at.iDb = pOp->p1; | |
- u.at.iCookie = pOp->p3; | |
+ u.au.iDb = pOp->p1; | |
+ u.au.iCookie = pOp->p3; | |
assert( pOp->p3<SQLITE_N_BTREE_META ); | |
- assert( u.at.iDb>=0 && u.at.iDb<db->nDb ); | |
- assert( db->aDb[u.at.iDb].pBt!=0 ); | |
- assert( (p->btreeMask & (((yDbMask)1)<<u.at.iDb))!=0 ); | |
+ assert( u.au.iDb>=0 && u.au.iDb<db->nDb ); | |
+ assert( db->aDb[u.au.iDb].pBt!=0 ); | |
+ assert( (p->btreeMask & (((yDbMask)1)<<u.au.iDb))!=0 ); | |
- sqlite3BtreeGetMeta(db->aDb[u.at.iDb].pBt, u.at.iCookie, (u32 *)&u.at.iMeta); | |
- pOut->u.i = u.at.iMeta; | |
+ sqlite3BtreeGetMeta(db->aDb[u.au.iDb].pBt, u.au.iCookie, (u32 *)&u.au.iMeta); | |
+ pOut->u.i = u.au.iMeta; | |
break; | |
} | |
@@ -66374,26 +67711,26 @@ | |
** A transaction must be started before executing this opcode. | |
*/ | |
case OP_SetCookie: { /* in3 */ | |
-#if 0 /* local variables moved into u.au */ | |
+#if 0 /* local variables moved into u.av */ | |
Db *pDb; | |
-#endif /* local variables moved into u.au */ | |
+#endif /* local variables moved into u.av */ | |
assert( pOp->p2<SQLITE_N_BTREE_META ); | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 ); | |
- u.au.pDb = &db->aDb[pOp->p1]; | |
- assert( u.au.pDb->pBt!=0 ); | |
+ u.av.pDb = &db->aDb[pOp->p1]; | |
+ assert( u.av.pDb->pBt!=0 ); | |
assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); | |
pIn3 = &aMem[pOp->p3]; | |
sqlite3VdbeMemIntegerify(pIn3); | |
/* See note about index shifting on OP_ReadCookie */ | |
- rc = sqlite3BtreeUpdateMeta(u.au.pDb->pBt, pOp->p2, (int)pIn3->u.i); | |
+ rc = sqlite3BtreeUpdateMeta(u.av.pDb->pBt, pOp->p2, (int)pIn3->u.i); | |
if( pOp->p2==BTREE_SCHEMA_VERSION ){ | |
/* When the schema cookie changes, record the new cookie internally */ | |
- u.au.pDb->pSchema->schema_cookie = (int)pIn3->u.i; | |
+ u.av.pDb->pSchema->schema_cookie = (int)pIn3->u.i; | |
db->flags |= SQLITE_InternChanges; | |
}else if( pOp->p2==BTREE_FILE_FORMAT ){ | |
/* Record changes in the file format */ | |
- u.au.pDb->pSchema->file_format = (u8)pIn3->u.i; | |
+ u.av.pDb->pSchema->file_format = (u8)pIn3->u.i; | |
} | |
if( pOp->p1==1 ){ | |
/* Invalidate all prepared statements whenever the TEMP database | |
@@ -66423,23 +67760,23 @@ | |
** invoked. | |
*/ | |
case OP_VerifyCookie: { | |
-#if 0 /* local variables moved into u.av */ | |
+#if 0 /* local variables moved into u.aw */ | |
int iMeta; | |
int iGen; | |
Btree *pBt; | |
-#endif /* local variables moved into u.av */ | |
+#endif /* local variables moved into u.aw */ | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 ); | |
assert( sqlite3SchemaMutexHeld(db, pOp->p1, 0) ); | |
- u.av.pBt = db->aDb[pOp->p1].pBt; | |
- if( u.av.pBt ){ | |
- sqlite3BtreeGetMeta(u.av.pBt, BTREE_SCHEMA_VERSION, (u32 *)&u.av.iMeta); | |
- u.av.iGen = db->aDb[pOp->p1].pSchema->iGeneration; | |
+ u.aw.pBt = db->aDb[pOp->p1].pBt; | |
+ if( u.aw.pBt ){ | |
+ sqlite3BtreeGetMeta(u.aw.pBt, BTREE_SCHEMA_VERSION, (u32 *)&u.aw.iMeta); | |
+ u.aw.iGen = db->aDb[pOp->p1].pSchema->iGeneration; | |
}else{ | |
- u.av.iGen = u.av.iMeta = 0; | |
+ u.aw.iGen = u.aw.iMeta = 0; | |
} | |
- if( u.av.iMeta!=pOp->p2 || u.av.iGen!=pOp->p3 ){ | |
+ if( u.aw.iMeta!=pOp->p2 || u.aw.iGen!=pOp->p3 ){ | |
sqlite3DbFree(db, p->zErrMsg); | |
p->zErrMsg = sqlite3DbStrDup(db, "database schema has changed"); | |
/* If the schema-cookie from the database file matches the cookie | |
@@ -66455,7 +67792,7 @@ | |
** to be invalidated whenever sqlite3_step() is called from within | |
** a v-table method. | |
*/ | |
- if( db->aDb[pOp->p1].pSchema->schema_cookie!=u.av.iMeta ){ | |
+ if( db->aDb[pOp->p1].pSchema->schema_cookie!=u.aw.iMeta ){ | |
sqlite3ResetInternalSchema(db, pOp->p1); | |
} | |
@@ -66516,7 +67853,7 @@ | |
*/ | |
case OP_OpenRead: | |
case OP_OpenWrite: { | |
-#if 0 /* local variables moved into u.aw */ | |
+#if 0 /* local variables moved into u.ax */ | |
int nField; | |
KeyInfo *pKeyInfo; | |
int p2; | |
@@ -66525,62 +67862,62 @@ | |
Btree *pX; | |
VdbeCursor *pCur; | |
Db *pDb; | |
-#endif /* local variables moved into u.aw */ | |
+#endif /* local variables moved into u.ax */ | |
if( p->expired ){ | |
rc = SQLITE_ABORT; | |
break; | |
} | |
- u.aw.nField = 0; | |
- u.aw.pKeyInfo = 0; | |
- u.aw.p2 = pOp->p2; | |
- u.aw.iDb = pOp->p3; | |
- assert( u.aw.iDb>=0 && u.aw.iDb<db->nDb ); | |
- assert( (p->btreeMask & (((yDbMask)1)<<u.aw.iDb))!=0 ); | |
- u.aw.pDb = &db->aDb[u.aw.iDb]; | |
- u.aw.pX = u.aw.pDb->pBt; | |
- assert( u.aw.pX!=0 ); | |
+ u.ax.nField = 0; | |
+ u.ax.pKeyInfo = 0; | |
+ u.ax.p2 = pOp->p2; | |
+ u.ax.iDb = pOp->p3; | |
+ assert( u.ax.iDb>=0 && u.ax.iDb<db->nDb ); | |
+ assert( (p->btreeMask & (((yDbMask)1)<<u.ax.iDb))!=0 ); | |
+ u.ax.pDb = &db->aDb[u.ax.iDb]; | |
+ u.ax.pX = u.ax.pDb->pBt; | |
+ assert( u.ax.pX!=0 ); | |
if( pOp->opcode==OP_OpenWrite ){ | |
- u.aw.wrFlag = 1; | |
- assert( sqlite3SchemaMutexHeld(db, u.aw.iDb, 0) ); | |
- if( u.aw.pDb->pSchema->file_format < p->minWriteFileFormat ){ | |
- p->minWriteFileFormat = u.aw.pDb->pSchema->file_format; | |
+ u.ax.wrFlag = 1; | |
+ assert( sqlite3SchemaMutexHeld(db, u.ax.iDb, 0) ); | |
+ if( u.ax.pDb->pSchema->file_format < p->minWriteFileFormat ){ | |
+ p->minWriteFileFormat = u.ax.pDb->pSchema->file_format; | |
} | |
}else{ | |
- u.aw.wrFlag = 0; | |
+ u.ax.wrFlag = 0; | |
} | |
if( pOp->p5 ){ | |
- assert( u.aw.p2>0 ); | |
- assert( u.aw.p2<=p->nMem ); | |
- pIn2 = &aMem[u.aw.p2]; | |
+ assert( u.ax.p2>0 ); | |
+ assert( u.ax.p2<=p->nMem ); | |
+ pIn2 = &aMem[u.ax.p2]; | |
assert( memIsValid(pIn2) ); | |
assert( (pIn2->flags & MEM_Int)!=0 ); | |
sqlite3VdbeMemIntegerify(pIn2); | |
- u.aw.p2 = (int)pIn2->u.i; | |
- /* The u.aw.p2 value always comes from a prior OP_CreateTable opcode and | |
- ** that opcode will always set the u.aw.p2 value to 2 or more or else fail. | |
+ u.ax.p2 = (int)pIn2->u.i; | |
+ /* The u.ax.p2 value always comes from a prior OP_CreateTable opcode and | |
+ ** that opcode will always set the u.ax.p2 value to 2 or more or else fail. | |
** If there were a failure, the prepared statement would have halted | |
** before reaching this instruction. */ | |
- if( NEVER(u.aw.p2<2) ) { | |
+ if( NEVER(u.ax.p2<2) ) { | |
rc = SQLITE_CORRUPT_BKPT; | |
goto abort_due_to_error; | |
} | |
} | |
if( pOp->p4type==P4_KEYINFO ){ | |
- u.aw.pKeyInfo = pOp->p4.pKeyInfo; | |
- u.aw.pKeyInfo->enc = ENC(p->db); | |
- u.aw.nField = u.aw.pKeyInfo->nField+1; | |
+ u.ax.pKeyInfo = pOp->p4.pKeyInfo; | |
+ u.ax.pKeyInfo->enc = ENC(p->db); | |
+ u.ax.nField = u.ax.pKeyInfo->nField+1; | |
}else if( pOp->p4type==P4_INT32 ){ | |
- u.aw.nField = pOp->p4.i; | |
+ u.ax.nField = pOp->p4.i; | |
} | |
assert( pOp->p1>=0 ); | |
- u.aw.pCur = allocateCursor(p, pOp->p1, u.aw.nField, u.aw.iDb, 1); | |
- if( u.aw.pCur==0 ) goto no_mem; | |
- u.aw.pCur->nullRow = 1; | |
- u.aw.pCur->isOrdered = 1; | |
- rc = sqlite3BtreeCursor(u.aw.pX, u.aw.p2, u.aw.wrFlag, u.aw.pKeyInfo, u.aw.pCur->pCursor); | |
- u.aw.pCur->pKeyInfo = u.aw.pKeyInfo; | |
+ u.ax.pCur = allocateCursor(p, pOp->p1, u.ax.nField, u.ax.iDb, 1); | |
+ if( u.ax.pCur==0 ) goto no_mem; | |
+ u.ax.pCur->nullRow = 1; | |
+ u.ax.pCur->isOrdered = 1; | |
+ rc = sqlite3BtreeCursor(u.ax.pX, u.ax.p2, u.ax.wrFlag, u.ax.pKeyInfo, u.ax.pCur->pCursor); | |
+ u.ax.pCur->pKeyInfo = u.ax.pKeyInfo; | |
/* Since it performs no memory allocation or IO, the only value that | |
** sqlite3BtreeCursor() may return is SQLITE_OK. */ | |
@@ -66590,8 +67927,8 @@ | |
** SQLite used to check if the root-page flags were sane at this point | |
** and report database corruption if they were not, but this check has | |
** since moved into the btree layer. */ | |
- u.aw.pCur->isTable = pOp->p4type!=P4_KEYINFO; | |
- u.aw.pCur->isIndex = !u.aw.pCur->isTable; | |
+ u.ax.pCur->isTable = pOp->p4type!=P4_KEYINFO; | |
+ u.ax.pCur->isIndex = !u.ax.pCur->isTable; | |
break; | |
} | |
@@ -66627,9 +67964,9 @@ | |
*/ | |
case OP_OpenAutoindex: | |
case OP_OpenEphemeral: { | |
-#if 0 /* local variables moved into u.ax */ | |
+#if 0 /* local variables moved into u.ay */ | |
VdbeCursor *pCx; | |
-#endif /* local variables moved into u.ax */ | |
+#endif /* local variables moved into u.ay */ | |
static const int vfsFlags = | |
SQLITE_OPEN_READWRITE | | |
SQLITE_OPEN_CREATE | | |
@@ -66638,13 +67975,13 @@ | |
SQLITE_OPEN_TRANSIENT_DB; | |
assert( pOp->p1>=0 ); | |
- u.ax.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); | |
- if( u.ax.pCx==0 ) goto no_mem; | |
- u.ax.pCx->nullRow = 1; | |
- rc = sqlite3BtreeOpen(db->pVfs, 0, db, &u.ax.pCx->pBt, | |
+ u.ay.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); | |
+ if( u.ay.pCx==0 ) goto no_mem; | |
+ u.ay.pCx->nullRow = 1; | |
+ rc = sqlite3BtreeOpen(db->pVfs, 0, db, &u.ay.pCx->pBt, | |
BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); | |
if( rc==SQLITE_OK ){ | |
- rc = sqlite3BtreeBeginTrans(u.ax.pCx->pBt, 1); | |
+ rc = sqlite3BtreeBeginTrans(u.ay.pCx->pBt, 1); | |
} | |
if( rc==SQLITE_OK ){ | |
/* If a transient index is required, create it by calling | |
@@ -66655,22 +67992,22 @@ | |
if( pOp->p4.pKeyInfo ){ | |
int pgno; | |
assert( pOp->p4type==P4_KEYINFO ); | |
- rc = sqlite3BtreeCreateTable(u.ax.pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); | |
+ rc = sqlite3BtreeCreateTable(u.ay.pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5); | |
if( rc==SQLITE_OK ){ | |
assert( pgno==MASTER_ROOT+1 ); | |
- rc = sqlite3BtreeCursor(u.ax.pCx->pBt, pgno, 1, | |
- (KeyInfo*)pOp->p4.z, u.ax.pCx->pCursor); | |
- u.ax.pCx->pKeyInfo = pOp->p4.pKeyInfo; | |
- u.ax.pCx->pKeyInfo->enc = ENC(p->db); | |
+ rc = sqlite3BtreeCursor(u.ay.pCx->pBt, pgno, 1, | |
+ (KeyInfo*)pOp->p4.z, u.ay.pCx->pCursor); | |
+ u.ay.pCx->pKeyInfo = pOp->p4.pKeyInfo; | |
+ u.ay.pCx->pKeyInfo->enc = ENC(p->db); | |
} | |
- u.ax.pCx->isTable = 0; | |
+ u.ay.pCx->isTable = 0; | |
}else{ | |
- rc = sqlite3BtreeCursor(u.ax.pCx->pBt, MASTER_ROOT, 1, 0, u.ax.pCx->pCursor); | |
- u.ax.pCx->isTable = 1; | |
+ rc = sqlite3BtreeCursor(u.ay.pCx->pBt, MASTER_ROOT, 1, 0, u.ay.pCx->pCursor); | |
+ u.ay.pCx->isTable = 1; | |
} | |
} | |
- u.ax.pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); | |
- u.ax.pCx->isIndex = !u.ax.pCx->isTable; | |
+ u.ay.pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); | |
+ u.ay.pCx->isIndex = !u.ay.pCx->isTable; | |
break; | |
} | |
@@ -66681,16 +68018,16 @@ | |
** tables using an external merge-sort algorithm. | |
*/ | |
case OP_SorterOpen: { | |
-#if 0 /* local variables moved into u.ay */ | |
+#if 0 /* local variables moved into u.az */ | |
VdbeCursor *pCx; | |
-#endif /* local variables moved into u.ay */ | |
+#endif /* local variables moved into u.az */ | |
#ifndef SQLITE_OMIT_MERGE_SORT | |
- u.ay.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); | |
- if( u.ay.pCx==0 ) goto no_mem; | |
- u.ay.pCx->pKeyInfo = pOp->p4.pKeyInfo; | |
- u.ay.pCx->pKeyInfo->enc = ENC(p->db); | |
- u.ay.pCx->isSorter = 1; | |
- rc = sqlite3VdbeSorterInit(db, u.ay.pCx); | |
+ u.az.pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, 1); | |
+ if( u.az.pCx==0 ) goto no_mem; | |
+ u.az.pCx->pKeyInfo = pOp->p4.pKeyInfo; | |
+ u.az.pCx->pKeyInfo->enc = ENC(p->db); | |
+ u.az.pCx->isSorter = 1; | |
+ rc = sqlite3VdbeSorterInit(db, u.az.pCx); | |
#else | |
pOp->opcode = OP_OpenEphemeral; | |
pc--; | |
@@ -66714,17 +68051,17 @@ | |
** the pseudo-table. | |
*/ | |
case OP_OpenPseudo: { | |
-#if 0 /* local variables moved into u.az */ | |
+#if 0 /* local variables moved into u.ba */ | |
VdbeCursor *pCx; | |
-#endif /* local variables moved into u.az */ | |
+#endif /* local variables moved into u.ba */ | |
assert( pOp->p1>=0 ); | |
- u.az.pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0); | |
- if( u.az.pCx==0 ) goto no_mem; | |
- u.az.pCx->nullRow = 1; | |
- u.az.pCx->pseudoTableReg = pOp->p2; | |
- u.az.pCx->isTable = 1; | |
- u.az.pCx->isIndex = 0; | |
+ u.ba.pCx = allocateCursor(p, pOp->p1, pOp->p3, -1, 0); | |
+ if( u.ba.pCx==0 ) goto no_mem; | |
+ u.ba.pCx->nullRow = 1; | |
+ u.ba.pCx->pseudoTableReg = pOp->p2; | |
+ u.ba.pCx->isTable = 1; | |
+ u.ba.pCx->isIndex = 0; | |
break; | |
} | |
@@ -66796,35 +68133,35 @@ | |
case OP_SeekLe: /* jump, in3 */ | |
case OP_SeekGe: /* jump, in3 */ | |
case OP_SeekGt: { /* jump, in3 */ | |
-#if 0 /* local variables moved into u.ba */ | |
+#if 0 /* local variables moved into u.bb */ | |
int res; | |
int oc; | |
VdbeCursor *pC; | |
UnpackedRecord r; | |
int nField; | |
i64 iKey; /* The rowid we are to seek to */ | |
-#endif /* local variables moved into u.ba */ | |
+#endif /* local variables moved into u.bb */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
assert( pOp->p2!=0 ); | |
- u.ba.pC = p->apCsr[pOp->p1]; | |
- assert( u.ba.pC!=0 ); | |
- assert( u.ba.pC->pseudoTableReg==0 ); | |
+ u.bb.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bb.pC!=0 ); | |
+ assert( u.bb.pC->pseudoTableReg==0 ); | |
assert( OP_SeekLe == OP_SeekLt+1 ); | |
assert( OP_SeekGe == OP_SeekLt+2 ); | |
assert( OP_SeekGt == OP_SeekLt+3 ); | |
- assert( u.ba.pC->isOrdered ); | |
- if( ALWAYS(u.ba.pC->pCursor!=0) ){ | |
- u.ba.oc = pOp->opcode; | |
- u.ba.pC->nullRow = 0; | |
- if( u.ba.pC->isTable ){ | |
+ assert( u.bb.pC->isOrdered ); | |
+ if( ALWAYS(u.bb.pC->pCursor!=0) ){ | |
+ u.bb.oc = pOp->opcode; | |
+ u.bb.pC->nullRow = 0; | |
+ if( u.bb.pC->isTable ){ | |
/* The input value in P3 might be of any type: integer, real, string, | |
** blob, or NULL. But it needs to be an integer before we can do | |
** the seek, so covert it. */ | |
pIn3 = &aMem[pOp->p3]; | |
applyNumericAffinity(pIn3); | |
- u.ba.iKey = sqlite3VdbeIntValue(pIn3); | |
- u.ba.pC->rowidIsValid = 0; | |
+ u.bb.iKey = sqlite3VdbeIntValue(pIn3); | |
+ u.bb.pC->rowidIsValid = 0; | |
/* If the P3 value could not be converted into an integer without | |
** loss of information, then special processing is required... */ | |
@@ -66839,101 +68176,101 @@ | |
** point number. */ | |
assert( (pIn3->flags & MEM_Real)!=0 ); | |
- if( u.ba.iKey==SMALLEST_INT64 && (pIn3->r<(double)u.ba.iKey || pIn3->r>0) ){ | |
+ if( u.bb.iKey==SMALLEST_INT64 && (pIn3->r<(double)u.bb.iKey || pIn3->r>0) ){ | |
/* The P3 value is too large in magnitude to be expressed as an | |
** integer. */ | |
- u.ba.res = 1; | |
+ u.bb.res = 1; | |
if( pIn3->r<0 ){ | |
- if( u.ba.oc>=OP_SeekGe ){ assert( u.ba.oc==OP_SeekGe || u.ba.oc==OP_SeekGt ); | |
- rc = sqlite3BtreeFirst(u.ba.pC->pCursor, &u.ba.res); | |
+ if( u.bb.oc>=OP_SeekGe ){ assert( u.bb.oc==OP_SeekGe || u.bb.oc==OP_SeekGt ); | |
+ rc = sqlite3BtreeFirst(u.bb.pC->pCursor, &u.bb.res); | |
if( rc!=SQLITE_OK ) goto abort_due_to_error; | |
} | |
}else{ | |
- if( u.ba.oc<=OP_SeekLe ){ assert( u.ba.oc==OP_SeekLt || u.ba.oc==OP_SeekLe ); | |
- rc = sqlite3BtreeLast(u.ba.pC->pCursor, &u.ba.res); | |
+ if( u.bb.oc<=OP_SeekLe ){ assert( u.bb.oc==OP_SeekLt || u.bb.oc==OP_SeekLe ); | |
+ rc = sqlite3BtreeLast(u.bb.pC->pCursor, &u.bb.res); | |
if( rc!=SQLITE_OK ) goto abort_due_to_error; | |
} | |
} | |
- if( u.ba.res ){ | |
+ if( u.bb.res ){ | |
pc = pOp->p2 - 1; | |
} | |
break; | |
- }else if( u.ba.oc==OP_SeekLt || u.ba.oc==OP_SeekGe ){ | |
+ }else if( u.bb.oc==OP_SeekLt || u.bb.oc==OP_SeekGe ){ | |
/* Use the ceiling() function to convert real->int */ | |
- if( pIn3->r > (double)u.ba.iKey ) u.ba.iKey++; | |
+ if( pIn3->r > (double)u.bb.iKey ) u.bb.iKey++; | |
}else{ | |
/* Use the floor() function to convert real->int */ | |
- assert( u.ba.oc==OP_SeekLe || u.ba.oc==OP_SeekGt ); | |
- if( pIn3->r < (double)u.ba.iKey ) u.ba.iKey--; | |
+ assert( u.bb.oc==OP_SeekLe || u.bb.oc==OP_SeekGt ); | |
+ if( pIn3->r < (double)u.bb.iKey ) u.bb.iKey--; | |
} | |
} | |
- rc = sqlite3BtreeMovetoUnpacked(u.ba.pC->pCursor, 0, (u64)u.ba.iKey, 0, &u.ba.res); | |
+ rc = sqlite3BtreeMovetoUnpacked(u.bb.pC->pCursor, 0, (u64)u.bb.iKey, 0, &u.bb.res); | |
if( rc!=SQLITE_OK ){ | |
goto abort_due_to_error; | |
} | |
- if( u.ba.res==0 ){ | |
- u.ba.pC->rowidIsValid = 1; | |
- u.ba.pC->lastRowid = u.ba.iKey; | |
+ if( u.bb.res==0 ){ | |
+ u.bb.pC->rowidIsValid = 1; | |
+ u.bb.pC->lastRowid = u.bb.iKey; | |
} | |
}else{ | |
- u.ba.nField = pOp->p4.i; | |
+ u.bb.nField = pOp->p4.i; | |
assert( pOp->p4type==P4_INT32 ); | |
- assert( u.ba.nField>0 ); | |
- u.ba.r.pKeyInfo = u.ba.pC->pKeyInfo; | |
- u.ba.r.nField = (u16)u.ba.nField; | |
+ assert( u.bb.nField>0 ); | |
+ u.bb.r.pKeyInfo = u.bb.pC->pKeyInfo; | |
+ u.bb.r.nField = (u16)u.bb.nField; | |
/* The next line of code computes as follows, only faster: | |
- ** if( u.ba.oc==OP_SeekGt || u.ba.oc==OP_SeekLe ){ | |
- ** u.ba.r.flags = UNPACKED_INCRKEY; | |
+ ** if( u.bb.oc==OP_SeekGt || u.bb.oc==OP_SeekLe ){ | |
+ ** u.bb.r.flags = UNPACKED_INCRKEY; | |
** }else{ | |
- ** u.ba.r.flags = 0; | |
+ ** u.bb.r.flags = 0; | |
** } | |
*/ | |
- u.ba.r.flags = (u16)(UNPACKED_INCRKEY * (1 & (u.ba.oc - OP_SeekLt))); | |
- assert( u.ba.oc!=OP_SeekGt || u.ba.r.flags==UNPACKED_INCRKEY ); | |
- assert( u.ba.oc!=OP_SeekLe || u.ba.r.flags==UNPACKED_INCRKEY ); | |
- assert( u.ba.oc!=OP_SeekGe || u.ba.r.flags==0 ); | |
- assert( u.ba.oc!=OP_SeekLt || u.ba.r.flags==0 ); | |
+ u.bb.r.flags = (u16)(UNPACKED_INCRKEY * (1 & (u.bb.oc - OP_SeekLt))); | |
+ assert( u.bb.oc!=OP_SeekGt || u.bb.r.flags==UNPACKED_INCRKEY ); | |
+ assert( u.bb.oc!=OP_SeekLe || u.bb.r.flags==UNPACKED_INCRKEY ); | |
+ assert( u.bb.oc!=OP_SeekGe || u.bb.r.flags==0 ); | |
+ assert( u.bb.oc!=OP_SeekLt || u.bb.r.flags==0 ); | |
- u.ba.r.aMem = &aMem[pOp->p3]; | |
+ u.bb.r.aMem = &aMem[pOp->p3]; | |
#ifdef SQLITE_DEBUG | |
- { int i; for(i=0; i<u.ba.r.nField; i++) assert( memIsValid(&u.ba.r.aMem[i]) ); } | |
+ { int i; for(i=0; i<u.bb.r.nField; i++) assert( memIsValid(&u.bb.r.aMem[i]) ); } | |
#endif | |
- ExpandBlob(u.ba.r.aMem); | |
- rc = sqlite3BtreeMovetoUnpacked(u.ba.pC->pCursor, &u.ba.r, 0, 0, &u.ba.res); | |
+ ExpandBlob(u.bb.r.aMem); | |
+ rc = sqlite3BtreeMovetoUnpacked(u.bb.pC->pCursor, &u.bb.r, 0, 0, &u.bb.res); | |
if( rc!=SQLITE_OK ){ | |
goto abort_due_to_error; | |
} | |
- u.ba.pC->rowidIsValid = 0; | |
+ u.bb.pC->rowidIsValid = 0; | |
} | |
- u.ba.pC->deferredMoveto = 0; | |
- u.ba.pC->cacheStatus = CACHE_STALE; | |
+ u.bb.pC->deferredMoveto = 0; | |
+ u.bb.pC->cacheStatus = CACHE_STALE; | |
#ifdef SQLITE_TEST | |
sqlite3_search_count++; | |
#endif | |
- if( u.ba.oc>=OP_SeekGe ){ assert( u.ba.oc==OP_SeekGe || u.ba.oc==OP_SeekGt ); | |
- if( u.ba.res<0 || (u.ba.res==0 && u.ba.oc==OP_SeekGt) ){ | |
- rc = sqlite3BtreeNext(u.ba.pC->pCursor, &u.ba.res); | |
+ if( u.bb.oc>=OP_SeekGe ){ assert( u.bb.oc==OP_SeekGe || u.bb.oc==OP_SeekGt ); | |
+ if( u.bb.res<0 || (u.bb.res==0 && u.bb.oc==OP_SeekGt) ){ | |
+ rc = sqlite3BtreeNext(u.bb.pC->pCursor, &u.bb.res); | |
if( rc!=SQLITE_OK ) goto abort_due_to_error; | |
- u.ba.pC->rowidIsValid = 0; | |
+ u.bb.pC->rowidIsValid = 0; | |
}else{ | |
- u.ba.res = 0; | |
+ u.bb.res = 0; | |
} | |
}else{ | |
- assert( u.ba.oc==OP_SeekLt || u.ba.oc==OP_SeekLe ); | |
- if( u.ba.res>0 || (u.ba.res==0 && u.ba.oc==OP_SeekLt) ){ | |
- rc = sqlite3BtreePrevious(u.ba.pC->pCursor, &u.ba.res); | |
+ assert( u.bb.oc==OP_SeekLt || u.bb.oc==OP_SeekLe ); | |
+ if( u.bb.res>0 || (u.bb.res==0 && u.bb.oc==OP_SeekLt) ){ | |
+ rc = sqlite3BtreePrevious(u.bb.pC->pCursor, &u.bb.res); | |
if( rc!=SQLITE_OK ) goto abort_due_to_error; | |
- u.ba.pC->rowidIsValid = 0; | |
+ u.bb.pC->rowidIsValid = 0; | |
}else{ | |
- /* u.ba.res might be negative because the table is empty. Check to | |
+ /* u.bb.res might be negative because the table is empty. Check to | |
** see if this is the case. | |
*/ | |
- u.ba.res = sqlite3BtreeEof(u.ba.pC->pCursor); | |
+ u.bb.res = sqlite3BtreeEof(u.bb.pC->pCursor); | |
} | |
} | |
assert( pOp->p2>0 ); | |
- if( u.ba.res ){ | |
+ if( u.bb.res ){ | |
pc = pOp->p2 - 1; | |
} | |
}else{ | |
@@ -66956,20 +68293,20 @@ | |
** occur, no unnecessary I/O happens. | |
*/ | |
case OP_Seek: { /* in2 */ | |
-#if 0 /* local variables moved into u.bb */ | |
+#if 0 /* local variables moved into u.bc */ | |
VdbeCursor *pC; | |
-#endif /* local variables moved into u.bb */ | |
+#endif /* local variables moved into u.bc */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bb.pC = p->apCsr[pOp->p1]; | |
- assert( u.bb.pC!=0 ); | |
- if( ALWAYS(u.bb.pC->pCursor!=0) ){ | |
- assert( u.bb.pC->isTable ); | |
- u.bb.pC->nullRow = 0; | |
+ u.bc.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bc.pC!=0 ); | |
+ if( ALWAYS(u.bc.pC->pCursor!=0) ){ | |
+ assert( u.bc.pC->isTable ); | |
+ u.bc.pC->nullRow = 0; | |
pIn2 = &aMem[pOp->p2]; | |
- u.bb.pC->movetoTarget = sqlite3VdbeIntValue(pIn2); | |
- u.bb.pC->rowidIsValid = 0; | |
- u.bb.pC->deferredMoveto = 1; | |
+ u.bc.pC->movetoTarget = sqlite3VdbeIntValue(pIn2); | |
+ u.bc.pC->rowidIsValid = 0; | |
+ u.bc.pC->deferredMoveto = 1; | |
} | |
break; | |
} | |
@@ -67001,7 +68338,7 @@ | |
*/ | |
case OP_NotFound: /* jump, in3 */ | |
case OP_Found: { /* jump, in3 */ | |
-#if 0 /* local variables moved into u.bc */ | |
+#if 0 /* local variables moved into u.bd */ | |
int alreadyExists; | |
VdbeCursor *pC; | |
int res; | |
@@ -67009,55 +68346,55 @@ | |
UnpackedRecord *pIdxKey; | |
UnpackedRecord r; | |
char aTempRec[ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*3 + 7]; | |
-#endif /* local variables moved into u.bc */ | |
+#endif /* local variables moved into u.bd */ | |
#ifdef SQLITE_TEST | |
sqlite3_found_count++; | |
#endif | |
- u.bc.alreadyExists = 0; | |
+ u.bd.alreadyExists = 0; | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
assert( pOp->p4type==P4_INT32 ); | |
- u.bc.pC = p->apCsr[pOp->p1]; | |
- assert( u.bc.pC!=0 ); | |
+ u.bd.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bd.pC!=0 ); | |
pIn3 = &aMem[pOp->p3]; | |
- if( ALWAYS(u.bc.pC->pCursor!=0) ){ | |
+ if( ALWAYS(u.bd.pC->pCursor!=0) ){ | |
- assert( u.bc.pC->isTable==0 ); | |
+ assert( u.bd.pC->isTable==0 ); | |
if( pOp->p4.i>0 ){ | |
- u.bc.r.pKeyInfo = u.bc.pC->pKeyInfo; | |
- u.bc.r.nField = (u16)pOp->p4.i; | |
- u.bc.r.aMem = pIn3; | |
+ u.bd.r.pKeyInfo = u.bd.pC->pKeyInfo; | |
+ u.bd.r.nField = (u16)pOp->p4.i; | |
+ u.bd.r.aMem = pIn3; | |
#ifdef SQLITE_DEBUG | |
- { int i; for(i=0; i<u.bc.r.nField; i++) assert( memIsValid(&u.bc.r.aMem[i]) ); } | |
+ { int i; for(i=0; i<u.bd.r.nField; i++) assert( memIsValid(&u.bd.r.aMem[i]) ); } | |
#endif | |
- u.bc.r.flags = UNPACKED_PREFIX_MATCH; | |
- u.bc.pIdxKey = &u.bc.r; | |
+ u.bd.r.flags = UNPACKED_PREFIX_MATCH; | |
+ u.bd.pIdxKey = &u.bd.r; | |
}else{ | |
- u.bc.pIdxKey = sqlite3VdbeAllocUnpackedRecord( | |
- u.bc.pC->pKeyInfo, u.bc.aTempRec, sizeof(u.bc.aTempRec), &u.bc.pFree | |
+ u.bd.pIdxKey = sqlite3VdbeAllocUnpackedRecord( | |
+ u.bd.pC->pKeyInfo, u.bd.aTempRec, sizeof(u.bd.aTempRec), &u.bd.pFree | |
); | |
- if( u.bc.pIdxKey==0 ) goto no_mem; | |
+ if( u.bd.pIdxKey==0 ) goto no_mem; | |
assert( pIn3->flags & MEM_Blob ); | |
assert( (pIn3->flags & MEM_Zero)==0 ); /* zeroblobs already expanded */ | |
- sqlite3VdbeRecordUnpack(u.bc.pC->pKeyInfo, pIn3->n, pIn3->z, u.bc.pIdxKey); | |
- u.bc.pIdxKey->flags |= UNPACKED_PREFIX_MATCH; | |
+ sqlite3VdbeRecordUnpack(u.bd.pC->pKeyInfo, pIn3->n, pIn3->z, u.bd.pIdxKey); | |
+ u.bd.pIdxKey->flags |= UNPACKED_PREFIX_MATCH; | |
} | |
- rc = sqlite3BtreeMovetoUnpacked(u.bc.pC->pCursor, u.bc.pIdxKey, 0, 0, &u.bc.res); | |
+ rc = sqlite3BtreeMovetoUnpacked(u.bd.pC->pCursor, u.bd.pIdxKey, 0, 0, &u.bd.res); | |
if( pOp->p4.i==0 ){ | |
- sqlite3DbFree(db, u.bc.pFree); | |
+ sqlite3DbFree(db, u.bd.pFree); | |
} | |
if( rc!=SQLITE_OK ){ | |
break; | |
} | |
- u.bc.alreadyExists = (u.bc.res==0); | |
- u.bc.pC->deferredMoveto = 0; | |
- u.bc.pC->cacheStatus = CACHE_STALE; | |
+ u.bd.alreadyExists = (u.bd.res==0); | |
+ u.bd.pC->deferredMoveto = 0; | |
+ u.bd.pC->cacheStatus = CACHE_STALE; | |
} | |
if( pOp->opcode==OP_Found ){ | |
- if( u.bc.alreadyExists ) pc = pOp->p2 - 1; | |
+ if( u.bd.alreadyExists ) pc = pOp->p2 - 1; | |
}else{ | |
- if( !u.bc.alreadyExists ) pc = pOp->p2 - 1; | |
+ if( !u.bd.alreadyExists ) pc = pOp->p2 - 1; | |
} | |
break; | |
} | |
@@ -67089,7 +68426,7 @@ | |
** See also: NotFound, NotExists, Found | |
*/ | |
case OP_IsUnique: { /* jump, in3 */ | |
-#if 0 /* local variables moved into u.bd */ | |
+#if 0 /* local variables moved into u.be */ | |
u16 ii; | |
VdbeCursor *pCx; | |
BtCursor *pCrsr; | |
@@ -67097,55 +68434,55 @@ | |
Mem *aMx; | |
UnpackedRecord r; /* B-Tree index search key */ | |
i64 R; /* Rowid stored in register P3 */ | |
-#endif /* local variables moved into u.bd */ | |
+#endif /* local variables moved into u.be */ | |
pIn3 = &aMem[pOp->p3]; | |
- u.bd.aMx = &aMem[pOp->p4.i]; | |
+ u.be.aMx = &aMem[pOp->p4.i]; | |
/* Assert that the values of parameters P1 and P4 are in range. */ | |
assert( pOp->p4type==P4_INT32 ); | |
assert( pOp->p4.i>0 && pOp->p4.i<=p->nMem ); | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
/* Find the index cursor. */ | |
- u.bd.pCx = p->apCsr[pOp->p1]; | |
- assert( u.bd.pCx->deferredMoveto==0 ); | |
- u.bd.pCx->seekResult = 0; | |
- u.bd.pCx->cacheStatus = CACHE_STALE; | |
- u.bd.pCrsr = u.bd.pCx->pCursor; | |
+ u.be.pCx = p->apCsr[pOp->p1]; | |
+ assert( u.be.pCx->deferredMoveto==0 ); | |
+ u.be.pCx->seekResult = 0; | |
+ u.be.pCx->cacheStatus = CACHE_STALE; | |
+ u.be.pCrsr = u.be.pCx->pCursor; | |
/* If any of the values are NULL, take the jump. */ | |
- u.bd.nField = u.bd.pCx->pKeyInfo->nField; | |
- for(u.bd.ii=0; u.bd.ii<u.bd.nField; u.bd.ii++){ | |
- if( u.bd.aMx[u.bd.ii].flags & MEM_Null ){ | |
+ u.be.nField = u.be.pCx->pKeyInfo->nField; | |
+ for(u.be.ii=0; u.be.ii<u.be.nField; u.be.ii++){ | |
+ if( u.be.aMx[u.be.ii].flags & MEM_Null ){ | |
pc = pOp->p2 - 1; | |
- u.bd.pCrsr = 0; | |
+ u.be.pCrsr = 0; | |
break; | |
} | |
} | |
- assert( (u.bd.aMx[u.bd.nField].flags & MEM_Null)==0 ); | |
+ assert( (u.be.aMx[u.be.nField].flags & MEM_Null)==0 ); | |
- if( u.bd.pCrsr!=0 ){ | |
+ if( u.be.pCrsr!=0 ){ | |
/* Populate the index search key. */ | |
- u.bd.r.pKeyInfo = u.bd.pCx->pKeyInfo; | |
- u.bd.r.nField = u.bd.nField + 1; | |
- u.bd.r.flags = UNPACKED_PREFIX_SEARCH; | |
- u.bd.r.aMem = u.bd.aMx; | |
+ u.be.r.pKeyInfo = u.be.pCx->pKeyInfo; | |
+ u.be.r.nField = u.be.nField + 1; | |
+ u.be.r.flags = UNPACKED_PREFIX_SEARCH; | |
+ u.be.r.aMem = u.be.aMx; | |
#ifdef SQLITE_DEBUG | |
- { int i; for(i=0; i<u.bd.r.nField; i++) assert( memIsValid(&u.bd.r.aMem[i]) ); } | |
+ { int i; for(i=0; i<u.be.r.nField; i++) assert( memIsValid(&u.be.r.aMem[i]) ); } | |
#endif | |
- /* Extract the value of u.bd.R from register P3. */ | |
+ /* Extract the value of u.be.R from register P3. */ | |
sqlite3VdbeMemIntegerify(pIn3); | |
- u.bd.R = pIn3->u.i; | |
+ u.be.R = pIn3->u.i; | |
/* Search the B-Tree index. If no conflicting record is found, jump | |
** to P2. Otherwise, copy the rowid of the conflicting record to | |
** register P3 and fall through to the next instruction. */ | |
- rc = sqlite3BtreeMovetoUnpacked(u.bd.pCrsr, &u.bd.r, 0, 0, &u.bd.pCx->seekResult); | |
- if( (u.bd.r.flags & UNPACKED_PREFIX_SEARCH) || u.bd.r.rowid==u.bd.R ){ | |
+ rc = sqlite3BtreeMovetoUnpacked(u.be.pCrsr, &u.be.r, 0, 0, &u.be.pCx->seekResult); | |
+ if( (u.be.r.flags & UNPACKED_PREFIX_SEARCH) || u.be.r.rowid==u.be.R ){ | |
pc = pOp->p2 - 1; | |
}else{ | |
- pIn3->u.i = u.bd.r.rowid; | |
+ pIn3->u.i = u.be.r.rowid; | |
} | |
} | |
break; | |
@@ -67166,42 +68503,42 @@ | |
** See also: Found, NotFound, IsUnique | |
*/ | |
case OP_NotExists: { /* jump, in3 */ | |
-#if 0 /* local variables moved into u.be */ | |
+#if 0 /* local variables moved into u.bf */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
u64 iKey; | |
-#endif /* local variables moved into u.be */ | |
+#endif /* local variables moved into u.bf */ | |
pIn3 = &aMem[pOp->p3]; | |
assert( pIn3->flags & MEM_Int ); | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.be.pC = p->apCsr[pOp->p1]; | |
- assert( u.be.pC!=0 ); | |
- assert( u.be.pC->isTable ); | |
- assert( u.be.pC->pseudoTableReg==0 ); | |
- u.be.pCrsr = u.be.pC->pCursor; | |
- if( ALWAYS(u.be.pCrsr!=0) ){ | |
- u.be.res = 0; | |
- u.be.iKey = pIn3->u.i; | |
- rc = sqlite3BtreeMovetoUnpacked(u.be.pCrsr, 0, u.be.iKey, 0, &u.be.res); | |
- u.be.pC->lastRowid = pIn3->u.i; | |
- u.be.pC->rowidIsValid = u.be.res==0 ?1:0; | |
- u.be.pC->nullRow = 0; | |
- u.be.pC->cacheStatus = CACHE_STALE; | |
- u.be.pC->deferredMoveto = 0; | |
- if( u.be.res!=0 ){ | |
+ u.bf.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bf.pC!=0 ); | |
+ assert( u.bf.pC->isTable ); | |
+ assert( u.bf.pC->pseudoTableReg==0 ); | |
+ u.bf.pCrsr = u.bf.pC->pCursor; | |
+ if( ALWAYS(u.bf.pCrsr!=0) ){ | |
+ u.bf.res = 0; | |
+ u.bf.iKey = pIn3->u.i; | |
+ rc = sqlite3BtreeMovetoUnpacked(u.bf.pCrsr, 0, u.bf.iKey, 0, &u.bf.res); | |
+ u.bf.pC->lastRowid = pIn3->u.i; | |
+ u.bf.pC->rowidIsValid = u.bf.res==0 ?1:0; | |
+ u.bf.pC->nullRow = 0; | |
+ u.bf.pC->cacheStatus = CACHE_STALE; | |
+ u.bf.pC->deferredMoveto = 0; | |
+ if( u.bf.res!=0 ){ | |
pc = pOp->p2 - 1; | |
- assert( u.be.pC->rowidIsValid==0 ); | |
+ assert( u.bf.pC->rowidIsValid==0 ); | |
} | |
- u.be.pC->seekResult = u.be.res; | |
+ u.bf.pC->seekResult = u.bf.res; | |
}else{ | |
/* This happens when an attempt to open a read cursor on the | |
** sqlite_master table returns SQLITE_EMPTY. | |
*/ | |
pc = pOp->p2 - 1; | |
- assert( u.be.pC->rowidIsValid==0 ); | |
- u.be.pC->seekResult = 0; | |
+ assert( u.bf.pC->rowidIsValid==0 ); | |
+ u.bf.pC->seekResult = 0; | |
} | |
break; | |
} | |
@@ -67236,21 +68573,21 @@ | |
** AUTOINCREMENT feature. | |
*/ | |
case OP_NewRowid: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.bf */ | |
+#if 0 /* local variables moved into u.bg */ | |
i64 v; /* The new rowid */ | |
VdbeCursor *pC; /* Cursor of table to get the new rowid */ | |
int res; /* Result of an sqlite3BtreeLast() */ | |
int cnt; /* Counter to limit the number of searches */ | |
Mem *pMem; /* Register holding largest rowid for AUTOINCREMENT */ | |
VdbeFrame *pFrame; /* Root frame of VDBE */ | |
-#endif /* local variables moved into u.bf */ | |
+#endif /* local variables moved into u.bg */ | |
- u.bf.v = 0; | |
- u.bf.res = 0; | |
+ u.bg.v = 0; | |
+ u.bg.res = 0; | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bf.pC = p->apCsr[pOp->p1]; | |
- assert( u.bf.pC!=0 ); | |
- if( NEVER(u.bf.pC->pCursor==0) ){ | |
+ u.bg.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bg.pC!=0 ); | |
+ if( NEVER(u.bg.pC->pCursor==0) ){ | |
/* The zero initialization above is all that is needed */ | |
}else{ | |
/* The next rowid or record number (different terms for the same | |
@@ -67266,7 +68603,7 @@ | |
** succeeded. If the random rowid does exist, we select a new one | |
** and try again, up to 100 times. | |
*/ | |
- assert( u.bf.pC->isTable ); | |
+ assert( u.bg.pC->isTable ); | |
#ifdef SQLITE_32BIT_ROWID | |
# define MAX_ROWID 0x7fffffff | |
@@ -67278,23 +68615,23 @@ | |
# define MAX_ROWID (i64)( (((u64)0x7fffffff)<<32) | (u64)0xffffffff ) | |
#endif | |
- if( !u.bf.pC->useRandomRowid ){ | |
- u.bf.v = sqlite3BtreeGetCachedRowid(u.bf.pC->pCursor); | |
- if( u.bf.v==0 ){ | |
- rc = sqlite3BtreeLast(u.bf.pC->pCursor, &u.bf.res); | |
+ if( !u.bg.pC->useRandomRowid ){ | |
+ u.bg.v = sqlite3BtreeGetCachedRowid(u.bg.pC->pCursor); | |
+ if( u.bg.v==0 ){ | |
+ rc = sqlite3BtreeLast(u.bg.pC->pCursor, &u.bg.res); | |
if( rc!=SQLITE_OK ){ | |
goto abort_due_to_error; | |
} | |
- if( u.bf.res ){ | |
- u.bf.v = 1; /* IMP: R-61914-48074 */ | |
+ if( u.bg.res ){ | |
+ u.bg.v = 1; /* IMP: R-61914-48074 */ | |
}else{ | |
- assert( sqlite3BtreeCursorIsValid(u.bf.pC->pCursor) ); | |
- rc = sqlite3BtreeKeySize(u.bf.pC->pCursor, &u.bf.v); | |
+ assert( sqlite3BtreeCursorIsValid(u.bg.pC->pCursor) ); | |
+ rc = sqlite3BtreeKeySize(u.bg.pC->pCursor, &u.bg.v); | |
assert( rc==SQLITE_OK ); /* Cannot fail following BtreeLast() */ | |
- if( u.bf.v==MAX_ROWID ){ | |
- u.bf.pC->useRandomRowid = 1; | |
+ if( u.bg.v==MAX_ROWID ){ | |
+ u.bg.pC->useRandomRowid = 1; | |
}else{ | |
- u.bf.v++; /* IMP: R-29538-34987 */ | |
+ u.bg.v++; /* IMP: R-29538-34987 */ | |
} | |
} | |
} | |
@@ -67304,35 +68641,35 @@ | |
/* Assert that P3 is a valid memory cell. */ | |
assert( pOp->p3>0 ); | |
if( p->pFrame ){ | |
- for(u.bf.pFrame=p->pFrame; u.bf.pFrame->pParent; u.bf.pFrame=u.bf.pFrame->pParent); | |
+ for(u.bg.pFrame=p->pFrame; u.bg.pFrame->pParent; u.bg.pFrame=u.bg.pFrame->pParent); | |
/* Assert that P3 is a valid memory cell. */ | |
- assert( pOp->p3<=u.bf.pFrame->nMem ); | |
- u.bf.pMem = &u.bf.pFrame->aMem[pOp->p3]; | |
+ assert( pOp->p3<=u.bg.pFrame->nMem ); | |
+ u.bg.pMem = &u.bg.pFrame->aMem[pOp->p3]; | |
}else{ | |
/* Assert that P3 is a valid memory cell. */ | |
assert( pOp->p3<=p->nMem ); | |
- u.bf.pMem = &aMem[pOp->p3]; | |
- memAboutToChange(p, u.bf.pMem); | |
+ u.bg.pMem = &aMem[pOp->p3]; | |
+ memAboutToChange(p, u.bg.pMem); | |
} | |
- assert( memIsValid(u.bf.pMem) ); | |
+ assert( memIsValid(u.bg.pMem) ); | |
- REGISTER_TRACE(pOp->p3, u.bf.pMem); | |
- sqlite3VdbeMemIntegerify(u.bf.pMem); | |
- assert( (u.bf.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ | |
- if( u.bf.pMem->u.i==MAX_ROWID || u.bf.pC->useRandomRowid ){ | |
+ REGISTER_TRACE(pOp->p3, u.bg.pMem); | |
+ sqlite3VdbeMemIntegerify(u.bg.pMem); | |
+ assert( (u.bg.pMem->flags & MEM_Int)!=0 ); /* mem(P3) holds an integer */ | |
+ if( u.bg.pMem->u.i==MAX_ROWID || u.bg.pC->useRandomRowid ){ | |
rc = SQLITE_FULL; /* IMP: R-12275-61338 */ | |
goto abort_due_to_error; | |
} | |
- if( u.bf.v<u.bf.pMem->u.i+1 ){ | |
- u.bf.v = u.bf.pMem->u.i + 1; | |
+ if( u.bg.v<u.bg.pMem->u.i+1 ){ | |
+ u.bg.v = u.bg.pMem->u.i + 1; | |
} | |
- u.bf.pMem->u.i = u.bf.v; | |
+ u.bg.pMem->u.i = u.bg.v; | |
} | |
#endif | |
- sqlite3BtreeSetCachedRowid(u.bf.pC->pCursor, u.bf.v<MAX_ROWID ? u.bf.v+1 : 0); | |
+ sqlite3BtreeSetCachedRowid(u.bg.pC->pCursor, u.bg.v<MAX_ROWID ? u.bg.v+1 : 0); | |
} | |
- if( u.bf.pC->useRandomRowid ){ | |
+ if( u.bg.pC->useRandomRowid ){ | |
/* IMPLEMENTATION-OF: R-07677-41881 If the largest ROWID is equal to the | |
** largest possible integer (9223372036854775807) then the database | |
** engine starts picking positive candidate ROWIDs at random until | |
@@ -67340,35 +68677,35 @@ | |
assert( pOp->p3==0 ); /* We cannot be in random rowid mode if this is | |
** an AUTOINCREMENT table. */ | |
/* on the first attempt, simply do one more than previous */ | |
- u.bf.v = lastRowid; | |
- u.bf.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ | |
- u.bf.v++; /* ensure non-zero */ | |
- u.bf.cnt = 0; | |
- while( ((rc = sqlite3BtreeMovetoUnpacked(u.bf.pC->pCursor, 0, (u64)u.bf.v, | |
- 0, &u.bf.res))==SQLITE_OK) | |
- && (u.bf.res==0) | |
- && (++u.bf.cnt<100)){ | |
+ u.bg.v = lastRowid; | |
+ u.bg.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ | |
+ u.bg.v++; /* ensure non-zero */ | |
+ u.bg.cnt = 0; | |
+ while( ((rc = sqlite3BtreeMovetoUnpacked(u.bg.pC->pCursor, 0, (u64)u.bg.v, | |
+ 0, &u.bg.res))==SQLITE_OK) | |
+ && (u.bg.res==0) | |
+ && (++u.bg.cnt<100)){ | |
/* collision - try another random rowid */ | |
- sqlite3_randomness(sizeof(u.bf.v), &u.bf.v); | |
- if( u.bf.cnt<5 ){ | |
+ sqlite3_randomness(sizeof(u.bg.v), &u.bg.v); | |
+ if( u.bg.cnt<5 ){ | |
/* try "small" random rowids for the initial attempts */ | |
- u.bf.v &= 0xffffff; | |
+ u.bg.v &= 0xffffff; | |
}else{ | |
- u.bf.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ | |
+ u.bg.v &= (MAX_ROWID>>1); /* ensure doesn't go negative */ | |
} | |
- u.bf.v++; /* ensure non-zero */ | |
+ u.bg.v++; /* ensure non-zero */ | |
} | |
- if( rc==SQLITE_OK && u.bf.res==0 ){ | |
+ if( rc==SQLITE_OK && u.bg.res==0 ){ | |
rc = SQLITE_FULL; /* IMP: R-38219-53002 */ | |
goto abort_due_to_error; | |
} | |
- assert( u.bf.v>0 ); /* EV: R-40812-03570 */ | |
+ assert( u.bg.v>0 ); /* EV: R-40812-03570 */ | |
} | |
- u.bf.pC->rowidIsValid = 0; | |
- u.bf.pC->deferredMoveto = 0; | |
- u.bf.pC->cacheStatus = CACHE_STALE; | |
+ u.bg.pC->rowidIsValid = 0; | |
+ u.bg.pC->deferredMoveto = 0; | |
+ u.bg.pC->cacheStatus = CACHE_STALE; | |
} | |
- pOut->u.i = u.bf.v; | |
+ pOut->u.i = u.bg.v; | |
break; | |
} | |
@@ -67418,7 +68755,7 @@ | |
*/ | |
case OP_Insert: | |
case OP_InsertInt: { | |
-#if 0 /* local variables moved into u.bg */ | |
+#if 0 /* local variables moved into u.bh */ | |
Mem *pData; /* MEM cell holding data for the record to be inserted */ | |
Mem *pKey; /* MEM cell holding key for the record */ | |
i64 iKey; /* The integer ROWID or key for the record to be inserted */ | |
@@ -67428,60 +68765,60 @@ | |
const char *zDb; /* database name - used by the update hook */ | |
const char *zTbl; /* Table name - used by the opdate hook */ | |
int op; /* Opcode for update hook: SQLITE_UPDATE or SQLITE_INSERT */ | |
-#endif /* local variables moved into u.bg */ | |
+#endif /* local variables moved into u.bh */ | |
- u.bg.pData = &aMem[pOp->p2]; | |
+ u.bh.pData = &aMem[pOp->p2]; | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- assert( memIsValid(u.bg.pData) ); | |
- u.bg.pC = p->apCsr[pOp->p1]; | |
- assert( u.bg.pC!=0 ); | |
- assert( u.bg.pC->pCursor!=0 ); | |
- assert( u.bg.pC->pseudoTableReg==0 ); | |
- assert( u.bg.pC->isTable ); | |
- REGISTER_TRACE(pOp->p2, u.bg.pData); | |
+ assert( memIsValid(u.bh.pData) ); | |
+ u.bh.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bh.pC!=0 ); | |
+ assert( u.bh.pC->pCursor!=0 ); | |
+ assert( u.bh.pC->pseudoTableReg==0 ); | |
+ assert( u.bh.pC->isTable ); | |
+ REGISTER_TRACE(pOp->p2, u.bh.pData); | |
if( pOp->opcode==OP_Insert ){ | |
- u.bg.pKey = &aMem[pOp->p3]; | |
- assert( u.bg.pKey->flags & MEM_Int ); | |
- assert( memIsValid(u.bg.pKey) ); | |
- REGISTER_TRACE(pOp->p3, u.bg.pKey); | |
- u.bg.iKey = u.bg.pKey->u.i; | |
+ u.bh.pKey = &aMem[pOp->p3]; | |
+ assert( u.bh.pKey->flags & MEM_Int ); | |
+ assert( memIsValid(u.bh.pKey) ); | |
+ REGISTER_TRACE(pOp->p3, u.bh.pKey); | |
+ u.bh.iKey = u.bh.pKey->u.i; | |
}else{ | |
assert( pOp->opcode==OP_InsertInt ); | |
- u.bg.iKey = pOp->p3; | |
+ u.bh.iKey = pOp->p3; | |
} | |
if( pOp->p5 & OPFLAG_NCHANGE ) p->nChange++; | |
- if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = u.bg.iKey; | |
- if( u.bg.pData->flags & MEM_Null ){ | |
- u.bg.pData->z = 0; | |
- u.bg.pData->n = 0; | |
- }else{ | |
- assert( u.bg.pData->flags & (MEM_Blob|MEM_Str) ); | |
- } | |
- u.bg.seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bg.pC->seekResult : 0); | |
- if( u.bg.pData->flags & MEM_Zero ){ | |
- u.bg.nZero = u.bg.pData->u.nZero; | |
- }else{ | |
- u.bg.nZero = 0; | |
- } | |
- sqlite3BtreeSetCachedRowid(u.bg.pC->pCursor, 0); | |
- rc = sqlite3BtreeInsert(u.bg.pC->pCursor, 0, u.bg.iKey, | |
- u.bg.pData->z, u.bg.pData->n, u.bg.nZero, | |
- pOp->p5 & OPFLAG_APPEND, u.bg.seekResult | |
+ if( pOp->p5 & OPFLAG_LASTROWID ) db->lastRowid = lastRowid = u.bh.iKey; | |
+ if( u.bh.pData->flags & MEM_Null ){ | |
+ u.bh.pData->z = 0; | |
+ u.bh.pData->n = 0; | |
+ }else{ | |
+ assert( u.bh.pData->flags & (MEM_Blob|MEM_Str) ); | |
+ } | |
+ u.bh.seekResult = ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bh.pC->seekResult : 0); | |
+ if( u.bh.pData->flags & MEM_Zero ){ | |
+ u.bh.nZero = u.bh.pData->u.nZero; | |
+ }else{ | |
+ u.bh.nZero = 0; | |
+ } | |
+ sqlite3BtreeSetCachedRowid(u.bh.pC->pCursor, 0); | |
+ rc = sqlite3BtreeInsert(u.bh.pC->pCursor, 0, u.bh.iKey, | |
+ u.bh.pData->z, u.bh.pData->n, u.bh.nZero, | |
+ pOp->p5 & OPFLAG_APPEND, u.bh.seekResult | |
); | |
- u.bg.pC->rowidIsValid = 0; | |
- u.bg.pC->deferredMoveto = 0; | |
- u.bg.pC->cacheStatus = CACHE_STALE; | |
+ u.bh.pC->rowidIsValid = 0; | |
+ u.bh.pC->deferredMoveto = 0; | |
+ u.bh.pC->cacheStatus = CACHE_STALE; | |
/* Invoke the update-hook if required. */ | |
if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){ | |
- u.bg.zDb = db->aDb[u.bg.pC->iDb].zName; | |
- u.bg.zTbl = pOp->p4.z; | |
- u.bg.op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); | |
- assert( u.bg.pC->isTable ); | |
- db->xUpdateCallback(db->pUpdateArg, u.bg.op, u.bg.zDb, u.bg.zTbl, u.bg.iKey); | |
- assert( u.bg.pC->iDb>=0 ); | |
+ u.bh.zDb = db->aDb[u.bh.pC->iDb].zName; | |
+ u.bh.zTbl = pOp->p4.z; | |
+ u.bh.op = ((pOp->p5 & OPFLAG_ISUPDATE) ? SQLITE_UPDATE : SQLITE_INSERT); | |
+ assert( u.bh.pC->isTable ); | |
+ db->xUpdateCallback(db->pUpdateArg, u.bh.op, u.bh.zDb, u.bh.zTbl, u.bh.iKey); | |
+ assert( u.bh.pC->iDb>=0 ); | |
} | |
break; | |
} | |
@@ -67507,47 +68844,47 @@ | |
** using OP_NotFound prior to invoking this opcode. | |
*/ | |
case OP_Delete: { | |
-#if 0 /* local variables moved into u.bh */ | |
+#if 0 /* local variables moved into u.bi */ | |
i64 iKey; | |
VdbeCursor *pC; | |
-#endif /* local variables moved into u.bh */ | |
+#endif /* local variables moved into u.bi */ | |
- u.bh.iKey = 0; | |
+ u.bi.iKey = 0; | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bh.pC = p->apCsr[pOp->p1]; | |
- assert( u.bh.pC!=0 ); | |
- assert( u.bh.pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */ | |
+ u.bi.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bi.pC!=0 ); | |
+ assert( u.bi.pC->pCursor!=0 ); /* Only valid for real tables, no pseudotables */ | |
- /* If the update-hook will be invoked, set u.bh.iKey to the rowid of the | |
+ /* If the update-hook will be invoked, set u.bi.iKey to the rowid of the | |
** row being deleted. | |
*/ | |
if( db->xUpdateCallback && pOp->p4.z ){ | |
- assert( u.bh.pC->isTable ); | |
- assert( u.bh.pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */ | |
- u.bh.iKey = u.bh.pC->lastRowid; | |
+ assert( u.bi.pC->isTable ); | |
+ assert( u.bi.pC->rowidIsValid ); /* lastRowid set by previous OP_NotFound */ | |
+ u.bi.iKey = u.bi.pC->lastRowid; | |
} | |
/* The OP_Delete opcode always follows an OP_NotExists or OP_Last or | |
** OP_Column on the same table without any intervening operations that | |
- ** might move or invalidate the cursor. Hence cursor u.bh.pC is always pointing | |
+ ** might move or invalidate the cursor. Hence cursor u.bi.pC is always pointing | |
** to the row to be deleted and the sqlite3VdbeCursorMoveto() operation | |
** below is always a no-op and cannot fail. We will run it anyhow, though, | |
** to guard against future changes to the code generator. | |
**/ | |
- assert( u.bh.pC->deferredMoveto==0 ); | |
- rc = sqlite3VdbeCursorMoveto(u.bh.pC); | |
+ assert( u.bi.pC->deferredMoveto==0 ); | |
+ rc = sqlite3VdbeCursorMoveto(u.bi.pC); | |
if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; | |
- sqlite3BtreeSetCachedRowid(u.bh.pC->pCursor, 0); | |
- rc = sqlite3BtreeDelete(u.bh.pC->pCursor); | |
- u.bh.pC->cacheStatus = CACHE_STALE; | |
+ sqlite3BtreeSetCachedRowid(u.bi.pC->pCursor, 0); | |
+ rc = sqlite3BtreeDelete(u.bi.pC->pCursor); | |
+ u.bi.pC->cacheStatus = CACHE_STALE; | |
/* Invoke the update-hook if required. */ | |
if( rc==SQLITE_OK && db->xUpdateCallback && pOp->p4.z ){ | |
- const char *zDb = db->aDb[u.bh.pC->iDb].zName; | |
+ const char *zDb = db->aDb[u.bi.pC->iDb].zName; | |
const char *zTbl = pOp->p4.z; | |
- db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, u.bh.iKey); | |
- assert( u.bh.pC->iDb>=0 ); | |
+ db->xUpdateCallback(db->pUpdateArg, SQLITE_DELETE, zDb, zTbl, u.bi.iKey); | |
+ assert( u.bi.pC->iDb>=0 ); | |
} | |
if( pOp->p2 & OPFLAG_NCHANGE ) p->nChange++; | |
break; | |
@@ -67573,16 +68910,16 @@ | |
** fall through to the next instruction. Otherwise, jump to instruction P2. | |
*/ | |
case OP_SorterCompare: { | |
-#if 0 /* local variables moved into u.bi */ | |
+#if 0 /* local variables moved into u.bj */ | |
VdbeCursor *pC; | |
int res; | |
-#endif /* local variables moved into u.bi */ | |
+#endif /* local variables moved into u.bj */ | |
- u.bi.pC = p->apCsr[pOp->p1]; | |
- assert( isSorter(u.bi.pC) ); | |
+ u.bj.pC = p->apCsr[pOp->p1]; | |
+ assert( isSorter(u.bj.pC) ); | |
pIn3 = &aMem[pOp->p3]; | |
- rc = sqlite3VdbeSorterCompare(u.bi.pC, pIn3, &u.bi.res); | |
- if( u.bi.res ){ | |
+ rc = sqlite3VdbeSorterCompare(u.bj.pC, pIn3, &u.bj.res); | |
+ if( u.bj.res ){ | |
pc = pOp->p2-1; | |
} | |
break; | |
@@ -67593,14 +68930,14 @@ | |
** Write into register P2 the current sorter data for sorter cursor P1. | |
*/ | |
case OP_SorterData: { | |
-#if 0 /* local variables moved into u.bj */ | |
+#if 0 /* local variables moved into u.bk */ | |
VdbeCursor *pC; | |
-#endif /* local variables moved into u.bj */ | |
+#endif /* local variables moved into u.bk */ | |
#ifndef SQLITE_OMIT_MERGE_SORT | |
pOut = &aMem[pOp->p2]; | |
- u.bj.pC = p->apCsr[pOp->p1]; | |
- assert( u.bj.pC->isSorter ); | |
- rc = sqlite3VdbeSorterRowkey(u.bj.pC, pOut); | |
+ u.bk.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bk.pC->isSorter ); | |
+ rc = sqlite3VdbeSorterRowkey(u.bk.pC, pOut); | |
#else | |
pOp->opcode = OP_RowKey; | |
pc--; | |
@@ -67630,63 +68967,63 @@ | |
*/ | |
case OP_RowKey: | |
case OP_RowData: { | |
-#if 0 /* local variables moved into u.bk */ | |
+#if 0 /* local variables moved into u.bl */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
u32 n; | |
i64 n64; | |
-#endif /* local variables moved into u.bk */ | |
+#endif /* local variables moved into u.bl */ | |
pOut = &aMem[pOp->p2]; | |
memAboutToChange(p, pOut); | |
/* Note that RowKey and RowData are really exactly the same instruction */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bk.pC = p->apCsr[pOp->p1]; | |
- assert( u.bk.pC->isSorter==0 ); | |
- assert( u.bk.pC->isTable || pOp->opcode!=OP_RowData ); | |
- assert( u.bk.pC->isIndex || pOp->opcode==OP_RowData ); | |
- assert( u.bk.pC!=0 ); | |
- assert( u.bk.pC->nullRow==0 ); | |
- assert( u.bk.pC->pseudoTableReg==0 ); | |
- assert( !u.bk.pC->isSorter ); | |
- assert( u.bk.pC->pCursor!=0 ); | |
- u.bk.pCrsr = u.bk.pC->pCursor; | |
- assert( sqlite3BtreeCursorIsValid(u.bk.pCrsr) ); | |
+ u.bl.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bl.pC->isSorter==0 ); | |
+ assert( u.bl.pC->isTable || pOp->opcode!=OP_RowData ); | |
+ assert( u.bl.pC->isIndex || pOp->opcode==OP_RowData ); | |
+ assert( u.bl.pC!=0 ); | |
+ assert( u.bl.pC->nullRow==0 ); | |
+ assert( u.bl.pC->pseudoTableReg==0 ); | |
+ assert( !u.bl.pC->isSorter ); | |
+ assert( u.bl.pC->pCursor!=0 ); | |
+ u.bl.pCrsr = u.bl.pC->pCursor; | |
+ assert( sqlite3BtreeCursorIsValid(u.bl.pCrsr) ); | |
/* The OP_RowKey and OP_RowData opcodes always follow OP_NotExists or | |
** OP_Rewind/Op_Next with no intervening instructions that might invalidate | |
** the cursor. Hence the following sqlite3VdbeCursorMoveto() call is always | |
** a no-op and can never fail. But we leave it in place as a safety. | |
*/ | |
- assert( u.bk.pC->deferredMoveto==0 ); | |
- rc = sqlite3VdbeCursorMoveto(u.bk.pC); | |
+ assert( u.bl.pC->deferredMoveto==0 ); | |
+ rc = sqlite3VdbeCursorMoveto(u.bl.pC); | |
if( NEVER(rc!=SQLITE_OK) ) goto abort_due_to_error; | |
- if( u.bk.pC->isIndex ){ | |
- assert( !u.bk.pC->isTable ); | |
- VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bk.pCrsr, &u.bk.n64); | |
+ if( u.bl.pC->isIndex ){ | |
+ assert( !u.bl.pC->isTable ); | |
+ VVA_ONLY(rc =) sqlite3BtreeKeySize(u.bl.pCrsr, &u.bl.n64); | |
assert( rc==SQLITE_OK ); /* True because of CursorMoveto() call above */ | |
- if( u.bk.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
+ if( u.bl.n64>db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
goto too_big; | |
} | |
- u.bk.n = (u32)u.bk.n64; | |
+ u.bl.n = (u32)u.bl.n64; | |
}else{ | |
- VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bk.pCrsr, &u.bk.n); | |
+ VVA_ONLY(rc =) sqlite3BtreeDataSize(u.bl.pCrsr, &u.bl.n); | |
assert( rc==SQLITE_OK ); /* DataSize() cannot fail */ | |
- if( u.bk.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
+ if( u.bl.n>(u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ | |
goto too_big; | |
} | |
} | |
- if( sqlite3VdbeMemGrow(pOut, u.bk.n, 0) ){ | |
+ if( sqlite3VdbeMemGrow(pOut, u.bl.n, 0) ){ | |
goto no_mem; | |
} | |
- pOut->n = u.bk.n; | |
+ pOut->n = u.bl.n; | |
MemSetTypeFlag(pOut, MEM_Blob); | |
- if( u.bk.pC->isIndex ){ | |
- rc = sqlite3BtreeKey(u.bk.pCrsr, 0, u.bk.n, pOut->z); | |
+ if( u.bl.pC->isIndex ){ | |
+ rc = sqlite3BtreeKey(u.bl.pCrsr, 0, u.bl.n, pOut->z); | |
}else{ | |
- rc = sqlite3BtreeData(u.bk.pCrsr, 0, u.bk.n, pOut->z); | |
+ rc = sqlite3BtreeData(u.bl.pCrsr, 0, u.bl.n, pOut->z); | |
} | |
pOut->enc = SQLITE_UTF8; /* In case the blob is ever cast to text */ | |
UPDATE_MAX_BLOBSIZE(pOut); | |
@@ -67703,42 +69040,42 @@ | |
** one opcode now works for both table types. | |
*/ | |
case OP_Rowid: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.bl */ | |
+#if 0 /* local variables moved into u.bm */ | |
VdbeCursor *pC; | |
i64 v; | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
-#endif /* local variables moved into u.bl */ | |
+#endif /* local variables moved into u.bm */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bl.pC = p->apCsr[pOp->p1]; | |
- assert( u.bl.pC!=0 ); | |
- assert( u.bl.pC->pseudoTableReg==0 ); | |
- if( u.bl.pC->nullRow ){ | |
+ u.bm.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bm.pC!=0 ); | |
+ assert( u.bm.pC->pseudoTableReg==0 ); | |
+ if( u.bm.pC->nullRow ){ | |
pOut->flags = MEM_Null; | |
break; | |
- }else if( u.bl.pC->deferredMoveto ){ | |
- u.bl.v = u.bl.pC->movetoTarget; | |
+ }else if( u.bm.pC->deferredMoveto ){ | |
+ u.bm.v = u.bm.pC->movetoTarget; | |
#ifndef SQLITE_OMIT_VIRTUALTABLE | |
- }else if( u.bl.pC->pVtabCursor ){ | |
- u.bl.pVtab = u.bl.pC->pVtabCursor->pVtab; | |
- u.bl.pModule = u.bl.pVtab->pModule; | |
- assert( u.bl.pModule->xRowid ); | |
- rc = u.bl.pModule->xRowid(u.bl.pC->pVtabCursor, &u.bl.v); | |
- importVtabErrMsg(p, u.bl.pVtab); | |
+ }else if( u.bm.pC->pVtabCursor ){ | |
+ u.bm.pVtab = u.bm.pC->pVtabCursor->pVtab; | |
+ u.bm.pModule = u.bm.pVtab->pModule; | |
+ assert( u.bm.pModule->xRowid ); | |
+ rc = u.bm.pModule->xRowid(u.bm.pC->pVtabCursor, &u.bm.v); | |
+ importVtabErrMsg(p, u.bm.pVtab); | |
#endif /* SQLITE_OMIT_VIRTUALTABLE */ | |
}else{ | |
- assert( u.bl.pC->pCursor!=0 ); | |
- rc = sqlite3VdbeCursorMoveto(u.bl.pC); | |
+ assert( u.bm.pC->pCursor!=0 ); | |
+ rc = sqlite3VdbeCursorMoveto(u.bm.pC); | |
if( rc ) goto abort_due_to_error; | |
- if( u.bl.pC->rowidIsValid ){ | |
- u.bl.v = u.bl.pC->lastRowid; | |
+ if( u.bm.pC->rowidIsValid ){ | |
+ u.bm.v = u.bm.pC->lastRowid; | |
}else{ | |
- rc = sqlite3BtreeKeySize(u.bl.pC->pCursor, &u.bl.v); | |
+ rc = sqlite3BtreeKeySize(u.bm.pC->pCursor, &u.bm.v); | |
assert( rc==SQLITE_OK ); /* Always so because of CursorMoveto() above */ | |
} | |
} | |
- pOut->u.i = u.bl.v; | |
+ pOut->u.i = u.bm.v; | |
break; | |
} | |
@@ -67749,18 +69086,18 @@ | |
** write a NULL. | |
*/ | |
case OP_NullRow: { | |
-#if 0 /* local variables moved into u.bm */ | |
+#if 0 /* local variables moved into u.bn */ | |
VdbeCursor *pC; | |
-#endif /* local variables moved into u.bm */ | |
+#endif /* local variables moved into u.bn */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bm.pC = p->apCsr[pOp->p1]; | |
- assert( u.bm.pC!=0 ); | |
- u.bm.pC->nullRow = 1; | |
- u.bm.pC->rowidIsValid = 0; | |
- assert( u.bm.pC->pCursor || u.bm.pC->pVtabCursor ); | |
- if( u.bm.pC->pCursor ){ | |
- sqlite3BtreeClearCursor(u.bm.pC->pCursor); | |
+ u.bn.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bn.pC!=0 ); | |
+ u.bn.pC->nullRow = 1; | |
+ u.bn.pC->rowidIsValid = 0; | |
+ assert( u.bn.pC->pCursor || u.bn.pC->pVtabCursor ); | |
+ if( u.bn.pC->pCursor ){ | |
+ sqlite3BtreeClearCursor(u.bn.pC->pCursor); | |
} | |
break; | |
} | |
@@ -67774,25 +69111,25 @@ | |
** to the following instruction. | |
*/ | |
case OP_Last: { /* jump */ | |
-#if 0 /* local variables moved into u.bn */ | |
+#if 0 /* local variables moved into u.bo */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
-#endif /* local variables moved into u.bn */ | |
+#endif /* local variables moved into u.bo */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bn.pC = p->apCsr[pOp->p1]; | |
- assert( u.bn.pC!=0 ); | |
- u.bn.pCrsr = u.bn.pC->pCursor; | |
- u.bn.res = 0; | |
- if( ALWAYS(u.bn.pCrsr!=0) ){ | |
- rc = sqlite3BtreeLast(u.bn.pCrsr, &u.bn.res); | |
+ u.bo.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bo.pC!=0 ); | |
+ u.bo.pCrsr = u.bo.pC->pCursor; | |
+ u.bo.res = 0; | |
+ if( ALWAYS(u.bo.pCrsr!=0) ){ | |
+ rc = sqlite3BtreeLast(u.bo.pCrsr, &u.bo.res); | |
} | |
- u.bn.pC->nullRow = (u8)u.bn.res; | |
- u.bn.pC->deferredMoveto = 0; | |
- u.bn.pC->rowidIsValid = 0; | |
- u.bn.pC->cacheStatus = CACHE_STALE; | |
- if( pOp->p2>0 && u.bn.res ){ | |
+ u.bo.pC->nullRow = (u8)u.bo.res; | |
+ u.bo.pC->deferredMoveto = 0; | |
+ u.bo.pC->rowidIsValid = 0; | |
+ u.bo.pC->cacheStatus = CACHE_STALE; | |
+ if( pOp->p2>0 && u.bo.res ){ | |
pc = pOp->p2 - 1; | |
} | |
break; | |
@@ -67832,31 +69169,31 @@ | |
** to the following instruction. | |
*/ | |
case OP_Rewind: { /* jump */ | |
-#if 0 /* local variables moved into u.bo */ | |
+#if 0 /* local variables moved into u.bp */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
-#endif /* local variables moved into u.bo */ | |
+#endif /* local variables moved into u.bp */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bo.pC = p->apCsr[pOp->p1]; | |
- assert( u.bo.pC!=0 ); | |
- assert( u.bo.pC->isSorter==(pOp->opcode==OP_SorterSort) ); | |
- u.bo.res = 1; | |
- if( isSorter(u.bo.pC) ){ | |
- rc = sqlite3VdbeSorterRewind(db, u.bo.pC, &u.bo.res); | |
- }else{ | |
- u.bo.pCrsr = u.bo.pC->pCursor; | |
- assert( u.bo.pCrsr ); | |
- rc = sqlite3BtreeFirst(u.bo.pCrsr, &u.bo.res); | |
- u.bo.pC->atFirst = u.bo.res==0 ?1:0; | |
- u.bo.pC->deferredMoveto = 0; | |
- u.bo.pC->cacheStatus = CACHE_STALE; | |
- u.bo.pC->rowidIsValid = 0; | |
+ u.bp.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bp.pC!=0 ); | |
+ assert( u.bp.pC->isSorter==(pOp->opcode==OP_SorterSort) ); | |
+ u.bp.res = 1; | |
+ if( isSorter(u.bp.pC) ){ | |
+ rc = sqlite3VdbeSorterRewind(db, u.bp.pC, &u.bp.res); | |
+ }else{ | |
+ u.bp.pCrsr = u.bp.pC->pCursor; | |
+ assert( u.bp.pCrsr ); | |
+ rc = sqlite3BtreeFirst(u.bp.pCrsr, &u.bp.res); | |
+ u.bp.pC->atFirst = u.bp.res==0 ?1:0; | |
+ u.bp.pC->deferredMoveto = 0; | |
+ u.bp.pC->cacheStatus = CACHE_STALE; | |
+ u.bp.pC->rowidIsValid = 0; | |
} | |
- u.bo.pC->nullRow = (u8)u.bo.res; | |
+ u.bp.pC->nullRow = (u8)u.bp.res; | |
assert( pOp->p2>0 && pOp->p2<p->nOp ); | |
- if( u.bo.res ){ | |
+ if( u.bp.res ){ | |
pc = pOp->p2 - 1; | |
} | |
break; | |
@@ -67900,40 +69237,40 @@ | |
#endif | |
case OP_Prev: /* jump */ | |
case OP_Next: { /* jump */ | |
-#if 0 /* local variables moved into u.bp */ | |
+#if 0 /* local variables moved into u.bq */ | |
VdbeCursor *pC; | |
int res; | |
-#endif /* local variables moved into u.bp */ | |
+#endif /* local variables moved into u.bq */ | |
CHECK_FOR_INTERRUPT; | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
assert( pOp->p5<=ArraySize(p->aCounter) ); | |
- u.bp.pC = p->apCsr[pOp->p1]; | |
- if( u.bp.pC==0 ){ | |
+ u.bq.pC = p->apCsr[pOp->p1]; | |
+ if( u.bq.pC==0 ){ | |
break; /* See ticket #2273 */ | |
} | |
- assert( u.bp.pC->isSorter==(pOp->opcode==OP_SorterNext) ); | |
- if( isSorter(u.bp.pC) ){ | |
+ assert( u.bq.pC->isSorter==(pOp->opcode==OP_SorterNext) ); | |
+ if( isSorter(u.bq.pC) ){ | |
assert( pOp->opcode==OP_SorterNext ); | |
- rc = sqlite3VdbeSorterNext(db, u.bp.pC, &u.bp.res); | |
+ rc = sqlite3VdbeSorterNext(db, u.bq.pC, &u.bq.res); | |
}else{ | |
- u.bp.res = 1; | |
- assert( u.bp.pC->deferredMoveto==0 ); | |
- assert( u.bp.pC->pCursor ); | |
+ u.bq.res = 1; | |
+ assert( u.bq.pC->deferredMoveto==0 ); | |
+ assert( u.bq.pC->pCursor ); | |
assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); | |
assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); | |
- rc = pOp->p4.xAdvance(u.bp.pC->pCursor, &u.bp.res); | |
+ rc = pOp->p4.xAdvance(u.bq.pC->pCursor, &u.bq.res); | |
} | |
- u.bp.pC->nullRow = (u8)u.bp.res; | |
- u.bp.pC->cacheStatus = CACHE_STALE; | |
- if( u.bp.res==0 ){ | |
+ u.bq.pC->nullRow = (u8)u.bq.res; | |
+ u.bq.pC->cacheStatus = CACHE_STALE; | |
+ if( u.bq.res==0 ){ | |
pc = pOp->p2 - 1; | |
if( pOp->p5 ) p->aCounter[pOp->p5-1]++; | |
#ifdef SQLITE_TEST | |
sqlite3_search_count++; | |
#endif | |
} | |
- u.bp.pC->rowidIsValid = 0; | |
+ u.bq.pC->rowidIsValid = 0; | |
break; | |
} | |
@@ -67954,34 +69291,34 @@ | |
pOp->opcode = OP_IdxInsert; | |
#endif | |
case OP_IdxInsert: { /* in2 */ | |
-#if 0 /* local variables moved into u.bq */ | |
+#if 0 /* local variables moved into u.br */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int nKey; | |
const char *zKey; | |
-#endif /* local variables moved into u.bq */ | |
+#endif /* local variables moved into u.br */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bq.pC = p->apCsr[pOp->p1]; | |
- assert( u.bq.pC!=0 ); | |
- assert( u.bq.pC->isSorter==(pOp->opcode==OP_SorterInsert) ); | |
+ u.br.pC = p->apCsr[pOp->p1]; | |
+ assert( u.br.pC!=0 ); | |
+ assert( u.br.pC->isSorter==(pOp->opcode==OP_SorterInsert) ); | |
pIn2 = &aMem[pOp->p2]; | |
assert( pIn2->flags & MEM_Blob ); | |
- u.bq.pCrsr = u.bq.pC->pCursor; | |
- if( ALWAYS(u.bq.pCrsr!=0) ){ | |
- assert( u.bq.pC->isTable==0 ); | |
+ u.br.pCrsr = u.br.pC->pCursor; | |
+ if( ALWAYS(u.br.pCrsr!=0) ){ | |
+ assert( u.br.pC->isTable==0 ); | |
rc = ExpandBlob(pIn2); | |
if( rc==SQLITE_OK ){ | |
- if( isSorter(u.bq.pC) ){ | |
- rc = sqlite3VdbeSorterWrite(db, u.bq.pC, pIn2); | |
+ if( isSorter(u.br.pC) ){ | |
+ rc = sqlite3VdbeSorterWrite(db, u.br.pC, pIn2); | |
}else{ | |
- u.bq.nKey = pIn2->n; | |
- u.bq.zKey = pIn2->z; | |
- rc = sqlite3BtreeInsert(u.bq.pCrsr, u.bq.zKey, u.bq.nKey, "", 0, 0, pOp->p3, | |
- ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.bq.pC->seekResult : 0) | |
+ u.br.nKey = pIn2->n; | |
+ u.br.zKey = pIn2->z; | |
+ rc = sqlite3BtreeInsert(u.br.pCrsr, u.br.zKey, u.br.nKey, "", 0, 0, pOp->p3, | |
+ ((pOp->p5 & OPFLAG_USESEEKRESULT) ? u.br.pC->seekResult : 0) | |
); | |
- assert( u.bq.pC->deferredMoveto==0 ); | |
- u.bq.pC->cacheStatus = CACHE_STALE; | |
+ assert( u.br.pC->deferredMoveto==0 ); | |
+ u.br.pC->cacheStatus = CACHE_STALE; | |
} | |
} | |
} | |
@@ -67995,33 +69332,33 @@ | |
** index opened by cursor P1. | |
*/ | |
case OP_IdxDelete: { | |
-#if 0 /* local variables moved into u.br */ | |
+#if 0 /* local variables moved into u.bs */ | |
VdbeCursor *pC; | |
BtCursor *pCrsr; | |
int res; | |
UnpackedRecord r; | |
-#endif /* local variables moved into u.br */ | |
+#endif /* local variables moved into u.bs */ | |
assert( pOp->p3>0 ); | |
assert( pOp->p2>0 && pOp->p2+pOp->p3<=p->nMem+1 ); | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.br.pC = p->apCsr[pOp->p1]; | |
- assert( u.br.pC!=0 ); | |
- u.br.pCrsr = u.br.pC->pCursor; | |
- if( ALWAYS(u.br.pCrsr!=0) ){ | |
- u.br.r.pKeyInfo = u.br.pC->pKeyInfo; | |
- u.br.r.nField = (u16)pOp->p3; | |
- u.br.r.flags = 0; | |
- u.br.r.aMem = &aMem[pOp->p2]; | |
+ u.bs.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bs.pC!=0 ); | |
+ u.bs.pCrsr = u.bs.pC->pCursor; | |
+ if( ALWAYS(u.bs.pCrsr!=0) ){ | |
+ u.bs.r.pKeyInfo = u.bs.pC->pKeyInfo; | |
+ u.bs.r.nField = (u16)pOp->p3; | |
+ u.bs.r.flags = 0; | |
+ u.bs.r.aMem = &aMem[pOp->p2]; | |
#ifdef SQLITE_DEBUG | |
- { int i; for(i=0; i<u.br.r.nField; i++) assert( memIsValid(&u.br.r.aMem[i]) ); } | |
+ { int i; for(i=0; i<u.bs.r.nField; i++) assert( memIsValid(&u.bs.r.aMem[i]) ); } | |
#endif | |
- rc = sqlite3BtreeMovetoUnpacked(u.br.pCrsr, &u.br.r, 0, 0, &u.br.res); | |
- if( rc==SQLITE_OK && u.br.res==0 ){ | |
- rc = sqlite3BtreeDelete(u.br.pCrsr); | |
+ rc = sqlite3BtreeMovetoUnpacked(u.bs.pCrsr, &u.bs.r, 0, 0, &u.bs.res); | |
+ if( rc==SQLITE_OK && u.bs.res==0 ){ | |
+ rc = sqlite3BtreeDelete(u.bs.pCrsr); | |
} | |
- assert( u.br.pC->deferredMoveto==0 ); | |
- u.br.pC->cacheStatus = CACHE_STALE; | |
+ assert( u.bs.pC->deferredMoveto==0 ); | |
+ u.bs.pC->cacheStatus = CACHE_STALE; | |
} | |
break; | |
} | |
@@ -68035,28 +69372,28 @@ | |
** See also: Rowid, MakeRecord. | |
*/ | |
case OP_IdxRowid: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.bs */ | |
+#if 0 /* local variables moved into u.bt */ | |
BtCursor *pCrsr; | |
VdbeCursor *pC; | |
i64 rowid; | |
-#endif /* local variables moved into u.bs */ | |
+#endif /* local variables moved into u.bt */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bs.pC = p->apCsr[pOp->p1]; | |
- assert( u.bs.pC!=0 ); | |
- u.bs.pCrsr = u.bs.pC->pCursor; | |
+ u.bt.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bt.pC!=0 ); | |
+ u.bt.pCrsr = u.bt.pC->pCursor; | |
pOut->flags = MEM_Null; | |
- if( ALWAYS(u.bs.pCrsr!=0) ){ | |
- rc = sqlite3VdbeCursorMoveto(u.bs.pC); | |
+ if( ALWAYS(u.bt.pCrsr!=0) ){ | |
+ rc = sqlite3VdbeCursorMoveto(u.bt.pC); | |
if( NEVER(rc) ) goto abort_due_to_error; | |
- assert( u.bs.pC->deferredMoveto==0 ); | |
- assert( u.bs.pC->isTable==0 ); | |
- if( !u.bs.pC->nullRow ){ | |
- rc = sqlite3VdbeIdxRowid(db, u.bs.pCrsr, &u.bs.rowid); | |
+ assert( u.bt.pC->deferredMoveto==0 ); | |
+ assert( u.bt.pC->isTable==0 ); | |
+ if( !u.bt.pC->nullRow ){ | |
+ rc = sqlite3VdbeIdxRowid(db, u.bt.pCrsr, &u.bt.rowid); | |
if( rc!=SQLITE_OK ){ | |
goto abort_due_to_error; | |
} | |
- pOut->u.i = u.bs.rowid; | |
+ pOut->u.i = u.bt.rowid; | |
pOut->flags = MEM_Int; | |
} | |
} | |
@@ -68091,39 +69428,39 @@ | |
*/ | |
case OP_IdxLT: /* jump */ | |
case OP_IdxGE: { /* jump */ | |
-#if 0 /* local variables moved into u.bt */ | |
+#if 0 /* local variables moved into u.bu */ | |
VdbeCursor *pC; | |
int res; | |
UnpackedRecord r; | |
-#endif /* local variables moved into u.bt */ | |
+#endif /* local variables moved into u.bu */ | |
assert( pOp->p1>=0 && pOp->p1<p->nCursor ); | |
- u.bt.pC = p->apCsr[pOp->p1]; | |
- assert( u.bt.pC!=0 ); | |
- assert( u.bt.pC->isOrdered ); | |
- if( ALWAYS(u.bt.pC->pCursor!=0) ){ | |
- assert( u.bt.pC->deferredMoveto==0 ); | |
+ u.bu.pC = p->apCsr[pOp->p1]; | |
+ assert( u.bu.pC!=0 ); | |
+ assert( u.bu.pC->isOrdered ); | |
+ if( ALWAYS(u.bu.pC->pCursor!=0) ){ | |
+ assert( u.bu.pC->deferredMoveto==0 ); | |
assert( pOp->p5==0 || pOp->p5==1 ); | |
assert( pOp->p4type==P4_INT32 ); | |
- u.bt.r.pKeyInfo = u.bt.pC->pKeyInfo; | |
- u.bt.r.nField = (u16)pOp->p4.i; | |
+ u.bu.r.pKeyInfo = u.bu.pC->pKeyInfo; | |
+ u.bu.r.nField = (u16)pOp->p4.i; | |
if( pOp->p5 ){ | |
- u.bt.r.flags = UNPACKED_INCRKEY | UNPACKED_IGNORE_ROWID; | |
+ u.bu.r.flags = UNPACKED_INCRKEY | UNPACKED_PREFIX_MATCH; | |
}else{ | |
- u.bt.r.flags = UNPACKED_IGNORE_ROWID; | |
+ u.bu.r.flags = UNPACKED_PREFIX_MATCH; | |
} | |
- u.bt.r.aMem = &aMem[pOp->p3]; | |
+ u.bu.r.aMem = &aMem[pOp->p3]; | |
#ifdef SQLITE_DEBUG | |
- { int i; for(i=0; i<u.bt.r.nField; i++) assert( memIsValid(&u.bt.r.aMem[i]) ); } | |
+ { int i; for(i=0; i<u.bu.r.nField; i++) assert( memIsValid(&u.bu.r.aMem[i]) ); } | |
#endif | |
- rc = sqlite3VdbeIdxKeyCompare(u.bt.pC, &u.bt.r, &u.bt.res); | |
+ rc = sqlite3VdbeIdxKeyCompare(u.bu.pC, &u.bu.r, &u.bu.res); | |
if( pOp->opcode==OP_IdxLT ){ | |
- u.bt.res = -u.bt.res; | |
+ u.bu.res = -u.bu.res; | |
}else{ | |
assert( pOp->opcode==OP_IdxGE ); | |
- u.bt.res++; | |
+ u.bu.res++; | |
} | |
- if( u.bt.res>0 ){ | |
+ if( u.bu.res>0 ){ | |
pc = pOp->p2 - 1 ; | |
} | |
} | |
@@ -68151,39 +69488,39 @@ | |
** See also: Clear | |
*/ | |
case OP_Destroy: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.bu */ | |
+#if 0 /* local variables moved into u.bv */ | |
int iMoved; | |
int iCnt; | |
Vdbe *pVdbe; | |
int iDb; | |
-#endif /* local variables moved into u.bu */ | |
+#endif /* local variables moved into u.bv */ | |
#ifndef SQLITE_OMIT_VIRTUALTABLE | |
- u.bu.iCnt = 0; | |
- for(u.bu.pVdbe=db->pVdbe; u.bu.pVdbe; u.bu.pVdbe = u.bu.pVdbe->pNext){ | |
- if( u.bu.pVdbe->magic==VDBE_MAGIC_RUN && u.bu.pVdbe->inVtabMethod<2 && u.bu.pVdbe->pc>=0 ){ | |
- u.bu.iCnt++; | |
+ u.bv.iCnt = 0; | |
+ for(u.bv.pVdbe=db->pVdbe; u.bv.pVdbe; u.bv.pVdbe = u.bv.pVdbe->pNext){ | |
+ if( u.bv.pVdbe->magic==VDBE_MAGIC_RUN && u.bv.pVdbe->inVtabMethod<2 && u.bv.pVdbe->pc>=0 ){ | |
+ u.bv.iCnt++; | |
} | |
} | |
#else | |
- u.bu.iCnt = db->activeVdbeCnt; | |
+ u.bv.iCnt = db->activeVdbeCnt; | |
#endif | |
pOut->flags = MEM_Null; | |
- if( u.bu.iCnt>1 ){ | |
+ if( u.bv.iCnt>1 ){ | |
rc = SQLITE_LOCKED; | |
p->errorAction = OE_Abort; | |
}else{ | |
- u.bu.iDb = pOp->p3; | |
- assert( u.bu.iCnt==1 ); | |
- assert( (p->btreeMask & (((yDbMask)1)<<u.bu.iDb))!=0 ); | |
- rc = sqlite3BtreeDropTable(db->aDb[u.bu.iDb].pBt, pOp->p1, &u.bu.iMoved); | |
+ u.bv.iDb = pOp->p3; | |
+ assert( u.bv.iCnt==1 ); | |
+ assert( (p->btreeMask & (((yDbMask)1)<<u.bv.iDb))!=0 ); | |
+ rc = sqlite3BtreeDropTable(db->aDb[u.bv.iDb].pBt, pOp->p1, &u.bv.iMoved); | |
pOut->flags = MEM_Int; | |
- pOut->u.i = u.bu.iMoved; | |
+ pOut->u.i = u.bv.iMoved; | |
#ifndef SQLITE_OMIT_AUTOVACUUM | |
- if( rc==SQLITE_OK && u.bu.iMoved!=0 ){ | |
- sqlite3RootPageMoved(db, u.bu.iDb, u.bu.iMoved, pOp->p1); | |
+ if( rc==SQLITE_OK && u.bv.iMoved!=0 ){ | |
+ sqlite3RootPageMoved(db, u.bv.iDb, u.bv.iMoved, pOp->p1); | |
/* All OP_Destroy operations occur on the same btree */ | |
- assert( resetSchemaOnFault==0 || resetSchemaOnFault==u.bu.iDb+1 ); | |
- resetSchemaOnFault = u.bu.iDb+1; | |
+ assert( resetSchemaOnFault==0 || resetSchemaOnFault==u.bv.iDb+1 ); | |
+ resetSchemaOnFault = u.bv.iDb+1; | |
} | |
#endif | |
} | |
@@ -68209,21 +69546,21 @@ | |
** See also: Destroy | |
*/ | |
case OP_Clear: { | |
-#if 0 /* local variables moved into u.bv */ | |
+#if 0 /* local variables moved into u.bw */ | |
int nChange; | |
-#endif /* local variables moved into u.bv */ | |
+#endif /* local variables moved into u.bw */ | |
- u.bv.nChange = 0; | |
+ u.bw.nChange = 0; | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p2))!=0 ); | |
rc = sqlite3BtreeClearTable( | |
- db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &u.bv.nChange : 0) | |
+ db->aDb[pOp->p2].pBt, pOp->p1, (pOp->p3 ? &u.bw.nChange : 0) | |
); | |
if( pOp->p3 ){ | |
- p->nChange += u.bv.nChange; | |
+ p->nChange += u.bw.nChange; | |
if( pOp->p3>0 ){ | |
assert( memIsValid(&aMem[pOp->p3]) ); | |
memAboutToChange(p, &aMem[pOp->p3]); | |
- aMem[pOp->p3].u.i += u.bv.nChange; | |
+ aMem[pOp->p3].u.i += u.bw.nChange; | |
} | |
} | |
break; | |
@@ -68253,25 +69590,25 @@ | |
*/ | |
case OP_CreateIndex: /* out2-prerelease */ | |
case OP_CreateTable: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.bw */ | |
+#if 0 /* local variables moved into u.bx */ | |
int pgno; | |
int flags; | |
Db *pDb; | |
-#endif /* local variables moved into u.bw */ | |
+#endif /* local variables moved into u.bx */ | |
- u.bw.pgno = 0; | |
+ u.bx.pgno = 0; | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 ); | |
- u.bw.pDb = &db->aDb[pOp->p1]; | |
- assert( u.bw.pDb->pBt!=0 ); | |
+ u.bx.pDb = &db->aDb[pOp->p1]; | |
+ assert( u.bx.pDb->pBt!=0 ); | |
if( pOp->opcode==OP_CreateTable ){ | |
- /* u.bw.flags = BTREE_INTKEY; */ | |
- u.bw.flags = BTREE_INTKEY; | |
+ /* u.bx.flags = BTREE_INTKEY; */ | |
+ u.bx.flags = BTREE_INTKEY; | |
}else{ | |
- u.bw.flags = BTREE_BLOBKEY; | |
+ u.bx.flags = BTREE_BLOBKEY; | |
} | |
- rc = sqlite3BtreeCreateTable(u.bw.pDb->pBt, &u.bw.pgno, u.bw.flags); | |
- pOut->u.i = u.bw.pgno; | |
+ rc = sqlite3BtreeCreateTable(u.bx.pDb->pBt, &u.bx.pgno, u.bx.flags); | |
+ pOut->u.i = u.bx.pgno; | |
break; | |
} | |
@@ -68284,44 +69621,44 @@ | |
** then runs the new virtual machine. It is thus a re-entrant opcode. | |
*/ | |
case OP_ParseSchema: { | |
-#if 0 /* local variables moved into u.bx */ | |
+#if 0 /* local variables moved into u.by */ | |
int iDb; | |
const char *zMaster; | |
char *zSql; | |
InitData initData; | |
-#endif /* local variables moved into u.bx */ | |
+#endif /* local variables moved into u.by */ | |
/* Any prepared statement that invokes this opcode will hold mutexes | |
** on every btree. This is a prerequisite for invoking | |
** sqlite3InitCallback(). | |
*/ | |
#ifdef SQLITE_DEBUG | |
- for(u.bx.iDb=0; u.bx.iDb<db->nDb; u.bx.iDb++){ | |
- assert( u.bx.iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[u.bx.iDb].pBt) ); | |
+ for(u.by.iDb=0; u.by.iDb<db->nDb; u.by.iDb++){ | |
+ assert( u.by.iDb==1 || sqlite3BtreeHoldsMutex(db->aDb[u.by.iDb].pBt) ); | |
} | |
#endif | |
- u.bx.iDb = pOp->p1; | |
- assert( u.bx.iDb>=0 && u.bx.iDb<db->nDb ); | |
- assert( DbHasProperty(db, u.bx.iDb, DB_SchemaLoaded) ); | |
+ u.by.iDb = pOp->p1; | |
+ assert( u.by.iDb>=0 && u.by.iDb<db->nDb ); | |
+ assert( DbHasProperty(db, u.by.iDb, DB_SchemaLoaded) ); | |
/* Used to be a conditional */ { | |
- u.bx.zMaster = SCHEMA_TABLE(u.bx.iDb); | |
- u.bx.initData.db = db; | |
- u.bx.initData.iDb = pOp->p1; | |
- u.bx.initData.pzErrMsg = &p->zErrMsg; | |
- u.bx.zSql = sqlite3MPrintf(db, | |
+ u.by.zMaster = SCHEMA_TABLE(u.by.iDb); | |
+ u.by.initData.db = db; | |
+ u.by.initData.iDb = pOp->p1; | |
+ u.by.initData.pzErrMsg = &p->zErrMsg; | |
+ u.by.zSql = sqlite3MPrintf(db, | |
"SELECT name, rootpage, sql FROM '%q'.%s WHERE %s ORDER BY rowid", | |
- db->aDb[u.bx.iDb].zName, u.bx.zMaster, pOp->p4.z); | |
- if( u.bx.zSql==0 ){ | |
+ db->aDb[u.by.iDb].zName, u.by.zMaster, pOp->p4.z); | |
+ if( u.by.zSql==0 ){ | |
rc = SQLITE_NOMEM; | |
}else{ | |
assert( db->init.busy==0 ); | |
db->init.busy = 1; | |
- u.bx.initData.rc = SQLITE_OK; | |
+ u.by.initData.rc = SQLITE_OK; | |
assert( !db->mallocFailed ); | |
- rc = sqlite3_exec(db, u.bx.zSql, sqlite3InitCallback, &u.bx.initData, 0); | |
- if( rc==SQLITE_OK ) rc = u.bx.initData.rc; | |
- sqlite3DbFree(db, u.bx.zSql); | |
+ rc = sqlite3_exec(db, u.by.zSql, sqlite3InitCallback, &u.by.initData, 0); | |
+ if( rc==SQLITE_OK ) rc = u.by.initData.rc; | |
+ sqlite3DbFree(db, u.by.zSql); | |
db->init.busy = 0; | |
} | |
} | |
@@ -68404,41 +69741,41 @@ | |
** This opcode is used to implement the integrity_check pragma. | |
*/ | |
case OP_IntegrityCk: { | |
-#if 0 /* local variables moved into u.by */ | |
+#if 0 /* local variables moved into u.bz */ | |
int nRoot; /* Number of tables to check. (Number of root pages.) */ | |
int *aRoot; /* Array of rootpage numbers for tables to be checked */ | |
int j; /* Loop counter */ | |
int nErr; /* Number of errors reported */ | |
char *z; /* Text of the error report */ | |
Mem *pnErr; /* Register keeping track of errors remaining */ | |
-#endif /* local variables moved into u.by */ | |
+#endif /* local variables moved into u.bz */ | |
- u.by.nRoot = pOp->p2; | |
- assert( u.by.nRoot>0 ); | |
- u.by.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.by.nRoot+1) ); | |
- if( u.by.aRoot==0 ) goto no_mem; | |
+ u.bz.nRoot = pOp->p2; | |
+ assert( u.bz.nRoot>0 ); | |
+ u.bz.aRoot = sqlite3DbMallocRaw(db, sizeof(int)*(u.bz.nRoot+1) ); | |
+ if( u.bz.aRoot==0 ) goto no_mem; | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
- u.by.pnErr = &aMem[pOp->p3]; | |
- assert( (u.by.pnErr->flags & MEM_Int)!=0 ); | |
- assert( (u.by.pnErr->flags & (MEM_Str|MEM_Blob))==0 ); | |
+ u.bz.pnErr = &aMem[pOp->p3]; | |
+ assert( (u.bz.pnErr->flags & MEM_Int)!=0 ); | |
+ assert( (u.bz.pnErr->flags & (MEM_Str|MEM_Blob))==0 ); | |
pIn1 = &aMem[pOp->p1]; | |
- for(u.by.j=0; u.by.j<u.by.nRoot; u.by.j++){ | |
- u.by.aRoot[u.by.j] = (int)sqlite3VdbeIntValue(&pIn1[u.by.j]); | |
+ for(u.bz.j=0; u.bz.j<u.bz.nRoot; u.bz.j++){ | |
+ u.bz.aRoot[u.bz.j] = (int)sqlite3VdbeIntValue(&pIn1[u.bz.j]); | |
} | |
- u.by.aRoot[u.by.j] = 0; | |
+ u.bz.aRoot[u.bz.j] = 0; | |
assert( pOp->p5<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p5))!=0 ); | |
- u.by.z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, u.by.aRoot, u.by.nRoot, | |
- (int)u.by.pnErr->u.i, &u.by.nErr); | |
- sqlite3DbFree(db, u.by.aRoot); | |
- u.by.pnErr->u.i -= u.by.nErr; | |
+ u.bz.z = sqlite3BtreeIntegrityCheck(db->aDb[pOp->p5].pBt, u.bz.aRoot, u.bz.nRoot, | |
+ (int)u.bz.pnErr->u.i, &u.bz.nErr); | |
+ sqlite3DbFree(db, u.bz.aRoot); | |
+ u.bz.pnErr->u.i -= u.bz.nErr; | |
sqlite3VdbeMemSetNull(pIn1); | |
- if( u.by.nErr==0 ){ | |
- assert( u.by.z==0 ); | |
- }else if( u.by.z==0 ){ | |
+ if( u.bz.nErr==0 ){ | |
+ assert( u.bz.z==0 ); | |
+ }else if( u.bz.z==0 ){ | |
goto no_mem; | |
}else{ | |
- sqlite3VdbeMemSetStr(pIn1, u.by.z, -1, SQLITE_UTF8, sqlite3_free); | |
+ sqlite3VdbeMemSetStr(pIn1, u.bz.z, -1, SQLITE_UTF8, sqlite3_free); | |
} | |
UPDATE_MAX_BLOBSIZE(pIn1); | |
sqlite3VdbeChangeEncoding(pIn1, encoding); | |
@@ -68472,20 +69809,20 @@ | |
** unchanged and jump to instruction P2. | |
*/ | |
case OP_RowSetRead: { /* jump, in1, out3 */ | |
-#if 0 /* local variables moved into u.bz */ | |
+#if 0 /* local variables moved into u.ca */ | |
i64 val; | |
-#endif /* local variables moved into u.bz */ | |
+#endif /* local variables moved into u.ca */ | |
CHECK_FOR_INTERRUPT; | |
pIn1 = &aMem[pOp->p1]; | |
if( (pIn1->flags & MEM_RowSet)==0 | |
- || sqlite3RowSetNext(pIn1->u.pRowSet, &u.bz.val)==0 | |
+ || sqlite3RowSetNext(pIn1->u.pRowSet, &u.ca.val)==0 | |
){ | |
/* The boolean index is empty */ | |
sqlite3VdbeMemSetNull(pIn1); | |
pc = pOp->p2 - 1; | |
}else{ | |
/* A value was pulled from the index */ | |
- sqlite3VdbeMemSetInt64(&aMem[pOp->p3], u.bz.val); | |
+ sqlite3VdbeMemSetInt64(&aMem[pOp->p3], u.ca.val); | |
} | |
break; | |
} | |
@@ -68514,14 +69851,14 @@ | |
** inserted as part of some other set). | |
*/ | |
case OP_RowSetTest: { /* jump, in1, in3 */ | |
-#if 0 /* local variables moved into u.ca */ | |
+#if 0 /* local variables moved into u.cb */ | |
int iSet; | |
int exists; | |
-#endif /* local variables moved into u.ca */ | |
+#endif /* local variables moved into u.cb */ | |
pIn1 = &aMem[pOp->p1]; | |
pIn3 = &aMem[pOp->p3]; | |
- u.ca.iSet = pOp->p4.i; | |
+ u.cb.iSet = pOp->p4.i; | |
assert( pIn3->flags&MEM_Int ); | |
/* If there is anything other than a rowset object in memory cell P1, | |
@@ -68533,17 +69870,17 @@ | |
} | |
assert( pOp->p4type==P4_INT32 ); | |
- assert( u.ca.iSet==-1 || u.ca.iSet>=0 ); | |
- if( u.ca.iSet ){ | |
- u.ca.exists = sqlite3RowSetTest(pIn1->u.pRowSet, | |
- (u8)(u.ca.iSet>=0 ? u.ca.iSet & 0xf : 0xff), | |
+ assert( u.cb.iSet==-1 || u.cb.iSet>=0 ); | |
+ if( u.cb.iSet ){ | |
+ u.cb.exists = sqlite3RowSetTest(pIn1->u.pRowSet, | |
+ (u8)(u.cb.iSet>=0 ? u.cb.iSet & 0xf : 0xff), | |
pIn3->u.i); | |
- if( u.ca.exists ){ | |
+ if( u.cb.exists ){ | |
pc = pOp->p2 - 1; | |
break; | |
} | |
} | |
- if( u.ca.iSet>=0 ){ | |
+ if( u.cb.iSet>=0 ){ | |
sqlite3RowSetInsert(pIn1->u.pRowSet, pIn3->u.i); | |
} | |
break; | |
@@ -68566,7 +69903,7 @@ | |
** P4 is a pointer to the VM containing the trigger program. | |
*/ | |
case OP_Program: { /* jump */ | |
-#if 0 /* local variables moved into u.cb */ | |
+#if 0 /* local variables moved into u.cc */ | |
int nMem; /* Number of memory registers for sub-program */ | |
int nByte; /* Bytes of runtime space required for sub-program */ | |
Mem *pRt; /* Register to allocate runtime space */ | |
@@ -68575,12 +69912,11 @@ | |
VdbeFrame *pFrame; /* New vdbe frame to execute in */ | |
SubProgram *pProgram; /* Sub-program to execute */ | |
void *t; /* Token identifying trigger */ | |
-#endif /* local variables moved into u.cb */ | |
+#endif /* local variables moved into u.cc */ | |
- u.cb.pProgram = pOp->p4.pProgram; | |
- u.cb.pRt = &aMem[pOp->p3]; | |
- assert( memIsValid(u.cb.pRt) ); | |
- assert( u.cb.pProgram->nOp>0 ); | |
+ u.cc.pProgram = pOp->p4.pProgram; | |
+ u.cc.pRt = &aMem[pOp->p3]; | |
+ assert( u.cc.pProgram->nOp>0 ); | |
/* If the p5 flag is clear, then recursive invocation of triggers is | |
** disabled for backwards compatibility (p5 is set if this sub-program | |
@@ -68594,9 +69930,9 @@ | |
** single trigger all have the same value for the SubProgram.token | |
** variable. */ | |
if( pOp->p5 ){ | |
- u.cb.t = u.cb.pProgram->token; | |
- for(u.cb.pFrame=p->pFrame; u.cb.pFrame && u.cb.pFrame->token!=u.cb.t; u.cb.pFrame=u.cb.pFrame->pParent); | |
- if( u.cb.pFrame ) break; | |
+ u.cc.t = u.cc.pProgram->token; | |
+ for(u.cc.pFrame=p->pFrame; u.cc.pFrame && u.cc.pFrame->token!=u.cc.t; u.cc.pFrame=u.cc.pFrame->pParent); | |
+ if( u.cc.pFrame ) break; | |
} | |
if( p->nFrame>=db->aLimit[SQLITE_LIMIT_TRIGGER_DEPTH] ){ | |
@@ -68605,65 +69941,72 @@ | |
break; | |
} | |
- /* Register u.cb.pRt is used to store the memory required to save the state | |
+ /* Register u.cc.pRt is used to store the memory required to save the state | |
** of the current program, and the memory required at runtime to execute | |
- ** the trigger program. If this trigger has been fired before, then u.cb.pRt | |
+ ** the trigger program. If this trigger has been fired before, then u.cc.pRt | |
** is already allocated. Otherwise, it must be initialized. */ | |
- if( (u.cb.pRt->flags&MEM_Frame)==0 ){ | |
+ if( (u.cc.pRt->flags&MEM_Frame)==0 ){ | |
/* SubProgram.nMem is set to the number of memory cells used by the | |
** program stored in SubProgram.aOp. As well as these, one memory | |
** cell is required for each cursor used by the program. Set local | |
- ** variable u.cb.nMem (and later, VdbeFrame.nChildMem) to this value. | |
+ ** variable u.cc.nMem (and later, VdbeFrame.nChildMem) to this value. | |
*/ | |
- u.cb.nMem = u.cb.pProgram->nMem + u.cb.pProgram->nCsr; | |
- u.cb.nByte = ROUND8(sizeof(VdbeFrame)) | |
- + u.cb.nMem * sizeof(Mem) | |
- + u.cb.pProgram->nCsr * sizeof(VdbeCursor *); | |
- u.cb.pFrame = sqlite3DbMallocZero(db, u.cb.nByte); | |
- if( !u.cb.pFrame ){ | |
+ u.cc.nMem = u.cc.pProgram->nMem + u.cc.pProgram->nCsr; | |
+ u.cc.nByte = ROUND8(sizeof(VdbeFrame)) | |
+ + u.cc.nMem * sizeof(Mem) | |
+ + u.cc.pProgram->nCsr * sizeof(VdbeCursor *) | |
+ + u.cc.pProgram->nOnce * sizeof(u8); | |
+ u.cc.pFrame = sqlite3DbMallocZero(db, u.cc.nByte); | |
+ if( !u.cc.pFrame ){ | |
goto no_mem; | |
} | |
- sqlite3VdbeMemRelease(u.cb.pRt); | |
- u.cb.pRt->flags = MEM_Frame; | |
- u.cb.pRt->u.pFrame = u.cb.pFrame; | |
- | |
- u.cb.pFrame->v = p; | |
- u.cb.pFrame->nChildMem = u.cb.nMem; | |
- u.cb.pFrame->nChildCsr = u.cb.pProgram->nCsr; | |
- u.cb.pFrame->pc = pc; | |
- u.cb.pFrame->aMem = p->aMem; | |
- u.cb.pFrame->nMem = p->nMem; | |
- u.cb.pFrame->apCsr = p->apCsr; | |
- u.cb.pFrame->nCursor = p->nCursor; | |
- u.cb.pFrame->aOp = p->aOp; | |
- u.cb.pFrame->nOp = p->nOp; | |
- u.cb.pFrame->token = u.cb.pProgram->token; | |
- | |
- u.cb.pEnd = &VdbeFrameMem(u.cb.pFrame)[u.cb.pFrame->nChildMem]; | |
- for(u.cb.pMem=VdbeFrameMem(u.cb.pFrame); u.cb.pMem!=u.cb.pEnd; u.cb.pMem++){ | |
- u.cb.pMem->flags = MEM_Null; | |
- u.cb.pMem->db = db; | |
- } | |
- }else{ | |
- u.cb.pFrame = u.cb.pRt->u.pFrame; | |
- assert( u.cb.pProgram->nMem+u.cb.pProgram->nCsr==u.cb.pFrame->nChildMem ); | |
- assert( u.cb.pProgram->nCsr==u.cb.pFrame->nChildCsr ); | |
- assert( pc==u.cb.pFrame->pc ); | |
+ sqlite3VdbeMemRelease(u.cc.pRt); | |
+ u.cc.pRt->flags = MEM_Frame; | |
+ u.cc.pRt->u.pFrame = u.cc.pFrame; | |
+ | |
+ u.cc.pFrame->v = p; | |
+ u.cc.pFrame->nChildMem = u.cc.nMem; | |
+ u.cc.pFrame->nChildCsr = u.cc.pProgram->nCsr; | |
+ u.cc.pFrame->pc = pc; | |
+ u.cc.pFrame->aMem = p->aMem; | |
+ u.cc.pFrame->nMem = p->nMem; | |
+ u.cc.pFrame->apCsr = p->apCsr; | |
+ u.cc.pFrame->nCursor = p->nCursor; | |
+ u.cc.pFrame->aOp = p->aOp; | |
+ u.cc.pFrame->nOp = p->nOp; | |
+ u.cc.pFrame->token = u.cc.pProgram->token; | |
+ u.cc.pFrame->aOnceFlag = p->aOnceFlag; | |
+ u.cc.pFrame->nOnceFlag = p->nOnceFlag; | |
+ | |
+ u.cc.pEnd = &VdbeFrameMem(u.cc.pFrame)[u.cc.pFrame->nChildMem]; | |
+ for(u.cc.pMem=VdbeFrameMem(u.cc.pFrame); u.cc.pMem!=u.cc.pEnd; u.cc.pMem++){ | |
+ u.cc.pMem->flags = MEM_Invalid; | |
+ u.cc.pMem->db = db; | |
+ } | |
+ }else{ | |
+ u.cc.pFrame = u.cc.pRt->u.pFrame; | |
+ assert( u.cc.pProgram->nMem+u.cc.pProgram->nCsr==u.cc.pFrame->nChildMem ); | |
+ assert( u.cc.pProgram->nCsr==u.cc.pFrame->nChildCsr ); | |
+ assert( pc==u.cc.pFrame->pc ); | |
} | |
p->nFrame++; | |
- u.cb.pFrame->pParent = p->pFrame; | |
- u.cb.pFrame->lastRowid = lastRowid; | |
- u.cb.pFrame->nChange = p->nChange; | |
+ u.cc.pFrame->pParent = p->pFrame; | |
+ u.cc.pFrame->lastRowid = lastRowid; | |
+ u.cc.pFrame->nChange = p->nChange; | |
p->nChange = 0; | |
- p->pFrame = u.cb.pFrame; | |
- p->aMem = aMem = &VdbeFrameMem(u.cb.pFrame)[-1]; | |
- p->nMem = u.cb.pFrame->nChildMem; | |
- p->nCursor = (u16)u.cb.pFrame->nChildCsr; | |
+ p->pFrame = u.cc.pFrame; | |
+ p->aMem = aMem = &VdbeFrameMem(u.cc.pFrame)[-1]; | |
+ p->nMem = u.cc.pFrame->nChildMem; | |
+ p->nCursor = (u16)u.cc.pFrame->nChildCsr; | |
p->apCsr = (VdbeCursor **)&aMem[p->nMem+1]; | |
- p->aOp = aOp = u.cb.pProgram->aOp; | |
- p->nOp = u.cb.pProgram->nOp; | |
+ p->aOp = aOp = u.cc.pProgram->aOp; | |
+ p->nOp = u.cc.pProgram->nOp; | |
+ p->aOnceFlag = (u8 *)&p->apCsr[p->nCursor]; | |
+ p->nOnceFlag = u.cc.pProgram->nOnce; | |
+ p->nOp = u.cc.pProgram->nOp; | |
pc = -1; | |
+ memset(p->aOnceFlag, 0, p->nOnceFlag); | |
break; | |
} | |
@@ -68681,13 +70024,13 @@ | |
** calling OP_Program instruction. | |
*/ | |
case OP_Param: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.cc */ | |
+#if 0 /* local variables moved into u.cd */ | |
VdbeFrame *pFrame; | |
Mem *pIn; | |
-#endif /* local variables moved into u.cc */ | |
- u.cc.pFrame = p->pFrame; | |
- u.cc.pIn = &u.cc.pFrame->aMem[pOp->p1 + u.cc.pFrame->aOp[u.cc.pFrame->pc].p1]; | |
- sqlite3VdbeMemShallowCopy(pOut, u.cc.pIn, MEM_Ephem); | |
+#endif /* local variables moved into u.cd */ | |
+ u.cd.pFrame = p->pFrame; | |
+ u.cd.pIn = &u.cd.pFrame->aMem[pOp->p1 + u.cd.pFrame->aOp[u.cd.pFrame->pc].p1]; | |
+ sqlite3VdbeMemShallowCopy(pOut, u.cd.pIn, MEM_Ephem); | |
break; | |
} | |
@@ -68743,22 +70086,22 @@ | |
** an integer. | |
*/ | |
case OP_MemMax: { /* in2 */ | |
-#if 0 /* local variables moved into u.cd */ | |
+#if 0 /* local variables moved into u.ce */ | |
Mem *pIn1; | |
VdbeFrame *pFrame; | |
-#endif /* local variables moved into u.cd */ | |
+#endif /* local variables moved into u.ce */ | |
if( p->pFrame ){ | |
- for(u.cd.pFrame=p->pFrame; u.cd.pFrame->pParent; u.cd.pFrame=u.cd.pFrame->pParent); | |
- u.cd.pIn1 = &u.cd.pFrame->aMem[pOp->p1]; | |
+ for(u.ce.pFrame=p->pFrame; u.ce.pFrame->pParent; u.ce.pFrame=u.ce.pFrame->pParent); | |
+ u.ce.pIn1 = &u.ce.pFrame->aMem[pOp->p1]; | |
}else{ | |
- u.cd.pIn1 = &aMem[pOp->p1]; | |
+ u.ce.pIn1 = &aMem[pOp->p1]; | |
} | |
- assert( memIsValid(u.cd.pIn1) ); | |
- sqlite3VdbeMemIntegerify(u.cd.pIn1); | |
+ assert( memIsValid(u.ce.pIn1) ); | |
+ sqlite3VdbeMemIntegerify(u.ce.pIn1); | |
pIn2 = &aMem[pOp->p2]; | |
sqlite3VdbeMemIntegerify(pIn2); | |
- if( u.cd.pIn1->u.i<pIn2->u.i){ | |
- u.cd.pIn1->u.i = pIn2->u.i; | |
+ if( u.ce.pIn1->u.i<pIn2->u.i){ | |
+ u.ce.pIn1->u.i = pIn2->u.i; | |
} | |
break; | |
} | |
@@ -68825,50 +70168,50 @@ | |
** successors. | |
*/ | |
case OP_AggStep: { | |
-#if 0 /* local variables moved into u.ce */ | |
+#if 0 /* local variables moved into u.cf */ | |
int n; | |
int i; | |
Mem *pMem; | |
Mem *pRec; | |
sqlite3_context ctx; | |
sqlite3_value **apVal; | |
-#endif /* local variables moved into u.ce */ | |
+#endif /* local variables moved into u.cf */ | |
- u.ce.n = pOp->p5; | |
- assert( u.ce.n>=0 ); | |
- u.ce.pRec = &aMem[pOp->p2]; | |
- u.ce.apVal = p->apArg; | |
- assert( u.ce.apVal || u.ce.n==0 ); | |
- for(u.ce.i=0; u.ce.i<u.ce.n; u.ce.i++, u.ce.pRec++){ | |
- assert( memIsValid(u.ce.pRec) ); | |
- u.ce.apVal[u.ce.i] = u.ce.pRec; | |
- memAboutToChange(p, u.ce.pRec); | |
- sqlite3VdbeMemStoreType(u.ce.pRec); | |
+ u.cf.n = pOp->p5; | |
+ assert( u.cf.n>=0 ); | |
+ u.cf.pRec = &aMem[pOp->p2]; | |
+ u.cf.apVal = p->apArg; | |
+ assert( u.cf.apVal || u.cf.n==0 ); | |
+ for(u.cf.i=0; u.cf.i<u.cf.n; u.cf.i++, u.cf.pRec++){ | |
+ assert( memIsValid(u.cf.pRec) ); | |
+ u.cf.apVal[u.cf.i] = u.cf.pRec; | |
+ memAboutToChange(p, u.cf.pRec); | |
+ sqlite3VdbeMemStoreType(u.cf.pRec); | |
} | |
- u.ce.ctx.pFunc = pOp->p4.pFunc; | |
+ u.cf.ctx.pFunc = pOp->p4.pFunc; | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
- u.ce.ctx.pMem = u.ce.pMem = &aMem[pOp->p3]; | |
- u.ce.pMem->n++; | |
- u.ce.ctx.s.flags = MEM_Null; | |
- u.ce.ctx.s.z = 0; | |
- u.ce.ctx.s.zMalloc = 0; | |
- u.ce.ctx.s.xDel = 0; | |
- u.ce.ctx.s.db = db; | |
- u.ce.ctx.isError = 0; | |
- u.ce.ctx.pColl = 0; | |
- if( u.ce.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ | |
+ u.cf.ctx.pMem = u.cf.pMem = &aMem[pOp->p3]; | |
+ u.cf.pMem->n++; | |
+ u.cf.ctx.s.flags = MEM_Null; | |
+ u.cf.ctx.s.z = 0; | |
+ u.cf.ctx.s.zMalloc = 0; | |
+ u.cf.ctx.s.xDel = 0; | |
+ u.cf.ctx.s.db = db; | |
+ u.cf.ctx.isError = 0; | |
+ u.cf.ctx.pColl = 0; | |
+ if( u.cf.ctx.pFunc->flags & SQLITE_FUNC_NEEDCOLL ){ | |
assert( pOp>p->aOp ); | |
assert( pOp[-1].p4type==P4_COLLSEQ ); | |
assert( pOp[-1].opcode==OP_CollSeq ); | |
- u.ce.ctx.pColl = pOp[-1].p4.pColl; | |
+ u.cf.ctx.pColl = pOp[-1].p4.pColl; | |
} | |
- (u.ce.ctx.pFunc->xStep)(&u.ce.ctx, u.ce.n, u.ce.apVal); /* IMP: R-24505-23230 */ | |
- if( u.ce.ctx.isError ){ | |
- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ce.ctx.s)); | |
- rc = u.ce.ctx.isError; | |
+ (u.cf.ctx.pFunc->xStep)(&u.cf.ctx, u.cf.n, u.cf.apVal); /* IMP: R-24505-23230 */ | |
+ if( u.cf.ctx.isError ){ | |
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.cf.ctx.s)); | |
+ rc = u.cf.ctx.isError; | |
} | |
- sqlite3VdbeMemRelease(&u.ce.ctx.s); | |
+ sqlite3VdbeMemRelease(&u.cf.ctx.s); | |
break; | |
} | |
@@ -68886,19 +70229,19 @@ | |
** the step function was not previously called. | |
*/ | |
case OP_AggFinal: { | |
-#if 0 /* local variables moved into u.cf */ | |
+#if 0 /* local variables moved into u.cg */ | |
Mem *pMem; | |
-#endif /* local variables moved into u.cf */ | |
+#endif /* local variables moved into u.cg */ | |
assert( pOp->p1>0 && pOp->p1<=p->nMem ); | |
- u.cf.pMem = &aMem[pOp->p1]; | |
- assert( (u.cf.pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); | |
- rc = sqlite3VdbeMemFinalize(u.cf.pMem, pOp->p4.pFunc); | |
+ u.cg.pMem = &aMem[pOp->p1]; | |
+ assert( (u.cg.pMem->flags & ~(MEM_Null|MEM_Agg))==0 ); | |
+ rc = sqlite3VdbeMemFinalize(u.cg.pMem, pOp->p4.pFunc); | |
if( rc ){ | |
- sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.cf.pMem)); | |
+ sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(u.cg.pMem)); | |
} | |
- sqlite3VdbeChangeEncoding(u.cf.pMem, encoding); | |
- UPDATE_MAX_BLOBSIZE(u.cf.pMem); | |
- if( sqlite3VdbeMemTooBig(u.cf.pMem) ){ | |
+ sqlite3VdbeChangeEncoding(u.cg.pMem, encoding); | |
+ UPDATE_MAX_BLOBSIZE(u.cg.pMem); | |
+ if( sqlite3VdbeMemTooBig(u.cg.pMem) ){ | |
goto too_big; | |
} | |
break; | |
@@ -68917,25 +70260,25 @@ | |
** mem[P3+2] are initialized to -1. | |
*/ | |
case OP_Checkpoint: { | |
-#if 0 /* local variables moved into u.cg */ | |
+#if 0 /* local variables moved into u.ch */ | |
int i; /* Loop counter */ | |
int aRes[3]; /* Results */ | |
Mem *pMem; /* Write results here */ | |
-#endif /* local variables moved into u.cg */ | |
+#endif /* local variables moved into u.ch */ | |
- u.cg.aRes[0] = 0; | |
- u.cg.aRes[1] = u.cg.aRes[2] = -1; | |
+ u.ch.aRes[0] = 0; | |
+ u.ch.aRes[1] = u.ch.aRes[2] = -1; | |
assert( pOp->p2==SQLITE_CHECKPOINT_PASSIVE | |
|| pOp->p2==SQLITE_CHECKPOINT_FULL | |
|| pOp->p2==SQLITE_CHECKPOINT_RESTART | |
); | |
- rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &u.cg.aRes[1], &u.cg.aRes[2]); | |
+ rc = sqlite3Checkpoint(db, pOp->p1, pOp->p2, &u.ch.aRes[1], &u.ch.aRes[2]); | |
if( rc==SQLITE_BUSY ){ | |
rc = SQLITE_OK; | |
- u.cg.aRes[0] = 1; | |
+ u.ch.aRes[0] = 1; | |
} | |
- for(u.cg.i=0, u.cg.pMem = &aMem[pOp->p3]; u.cg.i<3; u.cg.i++, u.cg.pMem++){ | |
- sqlite3VdbeMemSetInt64(u.cg.pMem, (i64)u.cg.aRes[u.cg.i]); | |
+ for(u.ch.i=0, u.ch.pMem = &aMem[pOp->p3]; u.ch.i<3; u.ch.i++, u.ch.pMem++){ | |
+ sqlite3VdbeMemSetInt64(u.ch.pMem, (i64)u.ch.aRes[u.ch.i]); | |
} | |
break; | |
}; | |
@@ -68954,91 +70297,91 @@ | |
** Write a string containing the final journal-mode to register P2. | |
*/ | |
case OP_JournalMode: { /* out2-prerelease */ | |
-#if 0 /* local variables moved into u.ch */ | |
+#if 0 /* local variables moved into u.ci */ | |
Btree *pBt; /* Btree to change journal mode of */ | |
Pager *pPager; /* Pager associated with pBt */ | |
int eNew; /* New journal mode */ | |
int eOld; /* The old journal mode */ | |
const char *zFilename; /* Name of database file for pPager */ | |
-#endif /* local variables moved into u.ch */ | |
+#endif /* local variables moved into u.ci */ | |
- u.ch.eNew = pOp->p3; | |
- assert( u.ch.eNew==PAGER_JOURNALMODE_DELETE | |
- || u.ch.eNew==PAGER_JOURNALMODE_TRUNCATE | |
- || u.ch.eNew==PAGER_JOURNALMODE_PERSIST | |
- || u.ch.eNew==PAGER_JOURNALMODE_OFF | |
- || u.ch.eNew==PAGER_JOURNALMODE_MEMORY | |
- || u.ch.eNew==PAGER_JOURNALMODE_WAL | |
- || u.ch.eNew==PAGER_JOURNALMODE_QUERY | |
+ u.ci.eNew = pOp->p3; | |
+ assert( u.ci.eNew==PAGER_JOURNALMODE_DELETE | |
+ || u.ci.eNew==PAGER_JOURNALMODE_TRUNCATE | |
+ || u.ci.eNew==PAGER_JOURNALMODE_PERSIST | |
+ || u.ci.eNew==PAGER_JOURNALMODE_OFF | |
+ || u.ci.eNew==PAGER_JOURNALMODE_MEMORY | |
+ || u.ci.eNew==PAGER_JOURNALMODE_WAL | |
+ || u.ci.eNew==PAGER_JOURNALMODE_QUERY | |
); | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
- u.ch.pBt = db->aDb[pOp->p1].pBt; | |
- u.ch.pPager = sqlite3BtreePager(u.ch.pBt); | |
- u.ch.eOld = sqlite3PagerGetJournalMode(u.ch.pPager); | |
- if( u.ch.eNew==PAGER_JOURNALMODE_QUERY ) u.ch.eNew = u.ch.eOld; | |
- if( !sqlite3PagerOkToChangeJournalMode(u.ch.pPager) ) u.ch.eNew = u.ch.eOld; | |
+ u.ci.pBt = db->aDb[pOp->p1].pBt; | |
+ u.ci.pPager = sqlite3BtreePager(u.ci.pBt); | |
+ u.ci.eOld = sqlite3PagerGetJournalMode(u.ci.pPager); | |
+ if( u.ci.eNew==PAGER_JOURNALMODE_QUERY ) u.ci.eNew = u.ci.eOld; | |
+ if( !sqlite3PagerOkToChangeJournalMode(u.ci.pPager) ) u.ci.eNew = u.ci.eOld; | |
#ifndef SQLITE_OMIT_WAL | |
- u.ch.zFilename = sqlite3PagerFilename(u.ch.pPager); | |
+ u.ci.zFilename = sqlite3PagerFilename(u.ci.pPager); | |
/* Do not allow a transition to journal_mode=WAL for a database | |
** in temporary storage or if the VFS does not support shared memory | |
*/ | |
- if( u.ch.eNew==PAGER_JOURNALMODE_WAL | |
- && (sqlite3Strlen30(u.ch.zFilename)==0 /* Temp file */ | |
- || !sqlite3PagerWalSupported(u.ch.pPager)) /* No shared-memory support */ | |
+ if( u.ci.eNew==PAGER_JOURNALMODE_WAL | |
+ && (sqlite3Strlen30(u.ci.zFilename)==0 /* Temp file */ | |
+ || !sqlite3PagerWalSupported(u.ci.pPager)) /* No shared-memory support */ | |
){ | |
- u.ch.eNew = u.ch.eOld; | |
+ u.ci.eNew = u.ci.eOld; | |
} | |
- if( (u.ch.eNew!=u.ch.eOld) | |
- && (u.ch.eOld==PAGER_JOURNALMODE_WAL || u.ch.eNew==PAGER_JOURNALMODE_WAL) | |
+ if( (u.ci.eNew!=u.ci.eOld) | |
+ && (u.ci.eOld==PAGER_JOURNALMODE_WAL || u.ci.eNew==PAGER_JOURNALMODE_WAL) | |
){ | |
if( !db->autoCommit || db->activeVdbeCnt>1 ){ | |
rc = SQLITE_ERROR; | |
sqlite3SetString(&p->zErrMsg, db, | |
"cannot change %s wal mode from within a transaction", | |
- (u.ch.eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") | |
+ (u.ci.eNew==PAGER_JOURNALMODE_WAL ? "into" : "out of") | |
); | |
break; | |
}else{ | |
- if( u.ch.eOld==PAGER_JOURNALMODE_WAL ){ | |
+ if( u.ci.eOld==PAGER_JOURNALMODE_WAL ){ | |
/* If leaving WAL mode, close the log file. If successful, the call | |
** to PagerCloseWal() checkpoints and deletes the write-ahead-log | |
** file. An EXCLUSIVE lock may still be held on the database file | |
** after a successful return. | |
*/ | |
- rc = sqlite3PagerCloseWal(u.ch.pPager); | |
+ rc = sqlite3PagerCloseWal(u.ci.pPager); | |
if( rc==SQLITE_OK ){ | |
- sqlite3PagerSetJournalMode(u.ch.pPager, u.ch.eNew); | |
+ sqlite3PagerSetJournalMode(u.ci.pPager, u.ci.eNew); | |
} | |
- }else if( u.ch.eOld==PAGER_JOURNALMODE_MEMORY ){ | |
+ }else if( u.ci.eOld==PAGER_JOURNALMODE_MEMORY ){ | |
/* Cannot transition directly from MEMORY to WAL. Use mode OFF | |
** as an intermediate */ | |
- sqlite3PagerSetJournalMode(u.ch.pPager, PAGER_JOURNALMODE_OFF); | |
+ sqlite3PagerSetJournalMode(u.ci.pPager, PAGER_JOURNALMODE_OFF); | |
} | |
/* Open a transaction on the database file. Regardless of the journal | |
** mode, this transaction always uses a rollback journal. | |
*/ | |
- assert( sqlite3BtreeIsInTrans(u.ch.pBt)==0 ); | |
+ assert( sqlite3BtreeIsInTrans(u.ci.pBt)==0 ); | |
if( rc==SQLITE_OK ){ | |
- rc = sqlite3BtreeSetVersion(u.ch.pBt, (u.ch.eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); | |
+ rc = sqlite3BtreeSetVersion(u.ci.pBt, (u.ci.eNew==PAGER_JOURNALMODE_WAL ? 2 : 1)); | |
} | |
} | |
} | |
#endif /* ifndef SQLITE_OMIT_WAL */ | |
if( rc ){ | |
- u.ch.eNew = u.ch.eOld; | |
+ u.ci.eNew = u.ci.eOld; | |
} | |
- u.ch.eNew = sqlite3PagerSetJournalMode(u.ch.pPager, u.ch.eNew); | |
+ u.ci.eNew = sqlite3PagerSetJournalMode(u.ci.pPager, u.ci.eNew); | |
pOut = &aMem[pOp->p2]; | |
pOut->flags = MEM_Str|MEM_Static|MEM_Term; | |
- pOut->z = (char *)sqlite3JournalModename(u.ch.eNew); | |
+ pOut->z = (char *)sqlite3JournalModename(u.ci.eNew); | |
pOut->n = sqlite3Strlen30(pOut->z); | |
pOut->enc = SQLITE_UTF8; | |
sqlite3VdbeChangeEncoding(pOut, encoding); | |
@@ -69067,14 +70410,14 @@ | |
** P2. Otherwise, fall through to the next instruction. | |
*/ | |
case OP_IncrVacuum: { /* jump */ | |
-#if 0 /* local variables moved into u.ci */ | |
+#if 0 /* local variables moved into u.cj */ | |
Btree *pBt; | |
-#endif /* local variables moved into u.ci */ | |
+#endif /* local variables moved into u.cj */ | |
assert( pOp->p1>=0 && pOp->p1<db->nDb ); | |
assert( (p->btreeMask & (((yDbMask)1)<<pOp->p1))!=0 ); | |
- u.ci.pBt = db->aDb[pOp->p1].pBt; | |
- rc = sqlite3BtreeIncrVacuum(u.ci.pBt); | |
+ u.cj.pBt = db->aDb[pOp->p1].pBt; | |
+ rc = sqlite3BtreeIncrVacuum(u.cj.pBt); | |
if( rc==SQLITE_DONE ){ | |
pc = pOp->p2 - 1; | |
rc = SQLITE_OK; | |
@@ -69144,12 +70487,12 @@ | |
** code will be set to SQLITE_LOCKED. | |
*/ | |
case OP_VBegin: { | |
-#if 0 /* local variables moved into u.cj */ | |
+#if 0 /* local variables moved into u.ck */ | |
VTable *pVTab; | |
-#endif /* local variables moved into u.cj */ | |
- u.cj.pVTab = pOp->p4.pVtab; | |
- rc = sqlite3VtabBegin(db, u.cj.pVTab); | |
- if( u.cj.pVTab ) importVtabErrMsg(p, u.cj.pVTab->pVtab); | |
+#endif /* local variables moved into u.ck */ | |
+ u.ck.pVTab = pOp->p4.pVtab; | |
+ rc = sqlite3VtabBegin(db, u.ck.pVTab); | |
+ if( u.ck.pVTab ) importVtabErrMsg(p, u.ck.pVTab->pVtab); | |
break; | |
} | |
#endif /* SQLITE_OMIT_VIRTUALTABLE */ | |
@@ -69188,32 +70531,32 @@ | |
** table and stores that cursor in P1. | |
*/ | |
case OP_VOpen: { | |
-#if 0 /* local variables moved into u.ck */ | |
+#if 0 /* local variables moved into u.cl */ | |
VdbeCursor *pCur; | |
sqlite3_vtab_cursor *pVtabCursor; | |
sqlite3_vtab *pVtab; | |
sqlite3_module *pModule; | |
-#endif /* local variables moved into u.ck */ | |
+#endif /* local variables moved into u.cl */ | |
- u.ck.pCur = 0; | |
- u.ck.pVtabCursor = 0; | |
- u.ck.pVtab = pOp->p4.pVtab->pVtab; | |
- u.ck.pModule = (sqlite3_module *)u.ck.pVtab->pModule; | |
- assert(u.ck.pVtab && u.ck.pModule); | |
- rc = u.ck.pModule->xOpen(u.ck.pVtab, &u.ck.pVtabCursor); | |
- importVtabErrMsg(p, u.ck.pVtab); | |
+ u.cl.pCur = 0; | |
+ u.cl.pVtabCursor = 0; | |
+ u.cl.pVtab = pOp->p4.pVtab->pVtab; | |
+ u.cl.pModule = (sqlite3_module *)u.cl.pVtab->pModule; | |
+ assert(u.cl.pVtab && u.cl.pModule); | |
+ rc = u.cl.pModule->xOpen(u.cl.pVtab, &u.cl.pVtabCursor); | |
+ importVtabErrMsg(p, u.cl.pVtab); | |
if( SQLITE_OK==rc ){ | |
/* Initialize sqlite3_vtab_cursor base class */ | |
- u.ck.pVtabCursor->pVtab = u.ck.pVtab; | |
+ u.cl.pVtabCursor->pVtab = u.cl.pVtab; | |
/* Initialise vdbe cursor object */ | |
- u.ck.pCur = allocateCursor(p, pOp->p1, 0, -1, 0); | |
- if( u.ck.pCur ){ | |
- u.ck.pCur->pVtabCursor = u.ck.pVtabCursor; | |
- u.ck.pCur->pModule = u.ck.pVtabCursor->pVtab->pModule; | |
+ u.cl.pCur = allocateCursor(p, pOp->p1, 0, -1, 0); | |
+ if( u.cl.pCur ){ | |
+ u.cl.pCur->pVtabCursor = u.cl.pVtabCursor; | |
+ u.cl.pCur->pModule = u.cl.pVtabCursor->pVtab->pModule; | |
}else{ | |
db->mallocFailed = 1; | |
- u.ck.pModule->xClose(u.ck.pVtabCursor); | |
+ u.cl.pModule->xClose(u.cl.pVtabCursor); | |
} | |
} | |
break; | |
@@ -69240,7 +70583,7 @@ | |
** A jump is made to P2 if the result set after filtering would be empty. | |
*/ | |
case OP_VFilter: { /* jump */ | |
-#if 0 /* local variables moved into u.cl */ | |
+#if 0 /* local variables moved into u.cm */ | |
int nArg; | |
int iQuery; | |
const sqlite3_module *pModule; | |
@@ -69252,45 +70595,45 @@ | |
int res; | |
int i; | |
Mem **apArg; | |
-#endif /* local variables moved into u.cl */ | |
+#endif /* local variables moved into u.cm */ | |
- u.cl.pQuery = &aMem[pOp->p3]; | |
- u.cl.pArgc = &u.cl.pQuery[1]; | |
- u.cl.pCur = p->apCsr[pOp->p1]; | |
- assert( memIsValid(u.cl.pQuery) ); | |
- REGISTER_TRACE(pOp->p3, u.cl.pQuery); | |
- assert( u.cl.pCur->pVtabCursor ); | |
- u.cl.pVtabCursor = u.cl.pCur->pVtabCursor; | |
- u.cl.pVtab = u.cl.pVtabCursor->pVtab; | |
- u.cl.pModule = u.cl.pVtab->pModule; | |
+ u.cm.pQuery = &aMem[pOp->p3]; | |
+ u.cm.pArgc = &u.cm.pQuery[1]; | |
+ u.cm.pCur = p->apCsr[pOp->p1]; | |
+ assert( memIsValid(u.cm.pQuery) ); | |
+ REGISTER_TRACE(pOp->p3, u.cm.pQuery); | |
+ assert( u.cm.pCur->pVtabCursor ); | |
+ u.cm.pVtabCursor = u.cm.pCur->pVtabCursor; | |
+ u.cm.pVtab = u.cm.pVtabCursor->pVtab; | |
+ u.cm.pModule = u.cm.pVtab->pModule; | |
/* Grab the index number and argc parameters */ | |
- assert( (u.cl.pQuery->flags&MEM_Int)!=0 && u.cl.pArgc->flags==MEM_Int ); | |
- u.cl.nArg = (int)u.cl.pArgc->u.i; | |
- u.cl.iQuery = (int)u.cl.pQuery->u.i; | |
+ assert( (u.cm.pQuery->flags&MEM_Int)!=0 && u.cm.pArgc->flags==MEM_Int ); | |
+ u.cm.nArg = (int)u.cm.pArgc->u.i; | |
+ u.cm.iQuery = (int)u.cm.pQuery->u.i; | |
/* Invoke the xFilter method */ | |
{ | |
- u.cl.res = 0; | |
- u.cl.apArg = p->apArg; | |
- for(u.cl.i = 0; u.cl.i<u.cl.nArg; u.cl.i++){ | |
- u.cl.apArg[u.cl.i] = &u.cl.pArgc[u.cl.i+1]; | |
- sqlite3VdbeMemStoreType(u.cl.apArg[u.cl.i]); | |
+ u.cm.res = 0; | |
+ u.cm.apArg = p->apArg; | |
+ for(u.cm.i = 0; u.cm.i<u.cm.nArg; u.cm.i++){ | |
+ u.cm.apArg[u.cm.i] = &u.cm.pArgc[u.cm.i+1]; | |
+ sqlite3VdbeMemStoreType(u.cm.apArg[u.cm.i]); | |
} | |
p->inVtabMethod = 1; | |
- rc = u.cl.pModule->xFilter(u.cl.pVtabCursor, u.cl.iQuery, pOp->p4.z, u.cl.nArg, u.cl.apArg); | |
+ rc = u.cm.pModule->xFilter(u.cm.pVtabCursor, u.cm.iQuery, pOp->p4.z, u.cm.nArg, u.cm.apArg); | |
p->inVtabMethod = 0; | |
- importVtabErrMsg(p, u.cl.pVtab); | |
+ importVtabErrMsg(p, u.cm.pVtab); | |
if( rc==SQLITE_OK ){ | |
- u.cl.res = u.cl.pModule->xEof(u.cl.pVtabCursor); | |
+ u.cm.res = u.cm.pModule->xEof(u.cm.pVtabCursor); | |
} | |
- if( u.cl.res ){ | |
+ if( u.cm.res ){ | |
pc = pOp->p2 - 1; | |
} | |
} | |
- u.cl.pCur->nullRow = 0; | |
+ u.cm.pCur->nullRow = 0; | |
break; | |
} | |
@@ -69304,51 +70647,51 @@ | |
** P1 cursor is pointing to into register P3. | |
*/ | |
case OP_VColumn: { | |
-#if 0 /* local variables moved into u.cm */ | |
+#if 0 /* local variables moved into u.cn */ | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
Mem *pDest; | |
sqlite3_context sContext; | |
-#endif /* local variables moved into u.cm */ | |
+#endif /* local variables moved into u.cn */ | |
VdbeCursor *pCur = p->apCsr[pOp->p1]; | |
assert( pCur->pVtabCursor ); | |
assert( pOp->p3>0 && pOp->p3<=p->nMem ); | |
- u.cm.pDest = &aMem[pOp->p3]; | |
- memAboutToChange(p, u.cm.pDest); | |
+ u.cn.pDest = &aMem[pOp->p3]; | |
+ memAboutToChange(p, u.cn.pDest); | |
if( pCur->nullRow ){ | |
- sqlite3VdbeMemSetNull(u.cm.pDest); | |
+ sqlite3VdbeMemSetNull(u.cn.pDest); | |
break; | |
} | |
- u.cm.pVtab = pCur->pVtabCursor->pVtab; | |
- u.cm.pModule = u.cm.pVtab->pModule; | |
- assert( u.cm.pModule->xColumn ); | |
- memset(&u.cm.sContext, 0, sizeof(u.cm.sContext)); | |
+ u.cn.pVtab = pCur->pVtabCursor->pVtab; | |
+ u.cn.pModule = u.cn.pVtab->pModule; | |
+ assert( u.cn.pModule->xColumn ); | |
+ memset(&u.cn.sContext, 0, sizeof(u.cn.sContext)); | |
/* The output cell may already have a buffer allocated. Move | |
- ** the current contents to u.cm.sContext.s so in case the user-function | |
+ ** the current contents to u.cn.sContext.s so in case the user-function | |
** can use the already allocated buffer instead of allocating a | |
** new one. | |
*/ | |
- sqlite3VdbeMemMove(&u.cm.sContext.s, u.cm.pDest); | |
- MemSetTypeFlag(&u.cm.sContext.s, MEM_Null); | |
+ sqlite3VdbeMemMove(&u.cn.sContext.s, u.cn.pDest); | |
+ MemSetTypeFlag(&u.cn.sContext.s, MEM_Null); | |
- rc = u.cm.pModule->xColumn(pCur->pVtabCursor, &u.cm.sContext, pOp->p2); | |
- importVtabErrMsg(p, u.cm.pVtab); | |
- if( u.cm.sContext.isError ){ | |
- rc = u.cm.sContext.isError; | |
+ rc = u.cn.pModule->xColumn(pCur->pVtabCursor, &u.cn.sContext, pOp->p2); | |
+ importVtabErrMsg(p, u.cn.pVtab); | |
+ if( u.cn.sContext.isError ){ | |
+ rc = u.cn.sContext.isError; | |
} | |
/* Copy the result of the function to the P3 register. We | |
** do this regardless of whether or not an error occurred to ensure any | |
- ** dynamic allocation in u.cm.sContext.s (a Mem struct) is released. | |
+ ** dynamic allocation in u.cn.sContext.s (a Mem struct) is released. | |
*/ | |
- sqlite3VdbeChangeEncoding(&u.cm.sContext.s, encoding); | |
- sqlite3VdbeMemMove(u.cm.pDest, &u.cm.sContext.s); | |
- REGISTER_TRACE(pOp->p3, u.cm.pDest); | |
- UPDATE_MAX_BLOBSIZE(u.cm.pDest); | |
+ sqlite3VdbeChangeEncoding(&u.cn.sContext.s, encoding); | |
+ sqlite3VdbeMemMove(u.cn.pDest, &u.cn.sContext.s); | |
+ REGISTER_TRACE(pOp->p3, u.cn.pDest); | |
+ UPDATE_MAX_BLOBSIZE(u.cn.pDest); | |
- if( sqlite3VdbeMemTooBig(u.cm.pDest) ){ | |
+ if( sqlite3VdbeMemTooBig(u.cn.pDest) ){ | |
goto too_big; | |
} | |
break; | |
@@ -69363,22 +70706,22 @@ | |
** the end of its result set, then fall through to the next instruction. | |
*/ | |
case OP_VNext: { /* jump */ | |
-#if 0 /* local variables moved into u.cn */ | |
+#if 0 /* local variables moved into u.co */ | |
sqlite3_vtab *pVtab; | |
const sqlite3_module *pModule; | |
int res; | |
VdbeCursor *pCur; | |
-#endif /* local variables moved into u.cn */ | |
+#endif /* local variables moved into u.co */ | |
- u.cn.res = 0; | |
- u.cn.pCur = p->apCsr[pOp->p1]; | |
- assert( u.cn.pCur->pVtabCursor ); | |
- if( u.cn.pCur->nullRow ){ | |
+ u.co.res = 0; | |
+ u.co.pCur = p->apCsr[pOp->p1]; | |
+ assert( u.co.pCur->pVtabCursor ); | |
+ if( u.co.pCur->nullRow ){ | |
break; | |
} | |
- u.cn.pVtab = u.cn.pCur->pVtabCursor->pVtab; | |
- u.cn.pModule = u.cn.pVtab->pModule; | |
- assert( u.cn.pModule->xNext ); | |
+ u.co.pVtab = u.co.pCur->pVtabCursor->pVtab; | |
+ u.co.pModule = u.co.pVtab->pModule; | |
+ assert( u.co.pModule->xNext ); | |
/* Invoke the xNext() method of the module. There is no way for the | |
** underlying implementation to return an error if one occurs during | |
@@ -69387,14 +70730,14 @@ | |
** some other method is next invoked on the save virtual table cursor. | |
*/ | |
p->inVtabMethod = 1; | |
- rc = u.cn.pModule->xNext(u.cn.pCur->pVtabCursor); | |
+ rc = u.co.pModule->xNext(u.co.pCur->pVtabCursor); | |
p->inVtabMethod = 0; | |
- importVtabErrMsg(p, u.cn.pVtab); | |
+ importVtabErrMsg(p, u.co.pVtab); | |
if( rc==SQLITE_OK ){ | |
- u.cn.res = u.cn.pModule->xEof(u.cn.pCur->pVtabCursor); | |
+ u.co.res = u.co.pModule->xEof(u.co.pCur->pVtabCursor); | |
} | |
- if( !u.cn.res ){ | |
+ if( !u.co.res ){ | |
/* If there is data, jump to P2 */ | |
pc = pOp->p2 - 1; | |
} | |
@@ -69410,24 +70753,24 @@ | |
** in register P1 is passed as the zName argument to the xRename method. | |
*/ | |
case OP_VRename: { | |
-#if 0 /* local variables moved into u.co */ | |
+#if 0 /* local variables moved into u.cp */ | |
sqlite3_vtab *pVtab; | |
Mem *pName; | |
-#endif /* local variables moved into u.co */ | |
+#endif /* local variables moved into u.cp */ | |
- u.co.pVtab = pOp->p4.pVtab->pVtab; | |
- u.co.pName = &aMem[pOp->p1]; | |
- assert( u.co.pVtab->pModule->xRename ); | |
- assert( memIsValid(u.co.pName) ); | |
- REGISTER_TRACE(pOp->p1, u.co.pName); | |
- assert( u.co.pName->flags & MEM_Str ); | |
- testcase( u.co.pName->enc==SQLITE_UTF8 ); | |
- testcase( u.co.pName->enc==SQLITE_UTF16BE ); | |
- testcase( u.co.pName->enc==SQLITE_UTF16LE ); | |
- rc = sqlite3VdbeChangeEncoding(u.co.pName, SQLITE_UTF8); | |
+ u.cp.pVtab = pOp->p4.pVtab->pVtab; | |
+ u.cp.pName = &aMem[pOp->p1]; | |
+ assert( u.cp.pVtab->pModule->xRename ); | |
+ assert( memIsValid(u.cp.pName) ); | |
+ REGISTER_TRACE(pOp->p1, u.cp.pName); | |
+ assert( u.cp.pName->flags & MEM_Str ); | |
+ testcase( u.cp.pName->enc==SQLITE_UTF8 ); | |
+ testcase( u.cp.pName->enc==SQLITE_UTF16BE ); | |
+ testcase( u.cp.pName->enc==SQLITE_UTF16LE ); | |
+ rc = sqlite3VdbeChangeEncoding(u.cp.pName, SQLITE_UTF8); | |
if( rc==SQLITE_OK ){ | |
- rc = u.co.pVtab->pModule->xRename(u.co.pVtab, u.co.pName->z); | |
- importVtabErrMsg(p, u.co.pVtab); | |
+ rc = u.cp.pVtab->pModule->xRename(u.cp.pVtab, u.cp.pName->z); | |
+ importVtabErrMsg(p, u.cp.pVtab); | |
p->expired = 0; | |
} | |
break; | |
@@ -69459,7 +70802,7 @@ | |
** is set to the value of the rowid for the row just inserted. | |
*/ | |
case OP_VUpdate: { | |
-#if 0 /* local variables moved into u.cp */ | |
+#if 0 /* local variables moved into u.cq */ | |
sqlite3_vtab *pVtab; | |
sqlite3_module *pModule; | |
int nArg; | |
@@ -69467,33 +70810,33 @@ | |
sqlite_int64 rowid; | |
Mem **apArg; | |
Mem *pX; | |
-#endif /* local variables moved into u.cp */ | |
+#endif /* local variables moved into u.cq */ | |
assert( pOp->p2==1 || pOp->p5==OE_Fail || pOp->p5==OE_Rollback | |
|| pOp->p5==OE_Abort || pOp->p5==OE_Ignore || pOp->p5==OE_Replace | |
); | |
- u.cp.pVtab = pOp->p4.pVtab->pVtab; | |
- u.cp.pModule = (sqlite3_module *)u.cp.pVtab->pModule; | |
- u.cp.nArg = pOp->p2; | |
+ u.cq.pVtab = pOp->p4.pVtab->pVtab; | |
+ u.cq.pModule = (sqlite3_module *)u.cq.pVtab->pModule; | |
+ u.cq.nArg = pOp->p2; | |
assert( pOp->p4type==P4_VTAB ); | |
- if( ALWAYS(u.cp.pModule->xUpdate) ){ | |
+ if( ALWAYS(u.cq.pModule->xUpdate) ){ | |
u8 vtabOnConflict = db->vtabOnConflict; | |
- u.cp.apArg = p->apArg; | |
- u.cp.pX = &aMem[pOp->p3]; | |
- for(u.cp.i=0; u.cp.i<u.cp.nArg; u.cp.i++){ | |
- assert( memIsValid(u.cp.pX) ); | |
- memAboutToChange(p, u.cp.pX); | |
- sqlite3VdbeMemStoreType(u.cp.pX); | |
- u.cp.apArg[u.cp.i] = u.cp.pX; | |
- u.cp.pX++; | |
+ u.cq.apArg = p->apArg; | |
+ u.cq.pX = &aMem[pOp->p3]; | |
+ for(u.cq.i=0; u.cq.i<u.cq.nArg; u.cq.i++){ | |
+ assert( memIsValid(u.cq.pX) ); | |
+ memAboutToChange(p, u.cq.pX); | |
+ sqlite3VdbeMemStoreType(u.cq.pX); | |
+ u.cq.apArg[u.cq.i] = u.cq.pX; | |
+ u.cq.pX++; | |
} | |
db->vtabOnConflict = pOp->p5; | |
- rc = u.cp.pModule->xUpdate(u.cp.pVtab, u.cp.nArg, u.cp.apArg, &u.cp.rowid); | |
+ rc = u.cq.pModule->xUpdate(u.cq.pVtab, u.cq.nArg, u.cq.apArg, &u.cq.rowid); | |
db->vtabOnConflict = vtabOnConflict; | |
- importVtabErrMsg(p, u.cp.pVtab); | |
+ importVtabErrMsg(p, u.cq.pVtab); | |
if( rc==SQLITE_OK && pOp->p1 ){ | |
- assert( u.cp.nArg>1 && u.cp.apArg[0] && (u.cp.apArg[0]->flags&MEM_Null) ); | |
- db->lastRowid = lastRowid = u.cp.rowid; | |
+ assert( u.cq.nArg>1 && u.cq.apArg[0] && (u.cq.apArg[0]->flags&MEM_Null) ); | |
+ db->lastRowid = lastRowid = u.cq.rowid; | |
} | |
if( rc==SQLITE_CONSTRAINT && pOp->p4.pVtab->bConstraint ){ | |
if( pOp->p5==OE_Ignore ){ | |
@@ -69553,21 +70896,21 @@ | |
** the UTF-8 string contained in P4 is emitted on the trace callback. | |
*/ | |
case OP_Trace: { | |
-#if 0 /* local variables moved into u.cq */ | |
+#if 0 /* local variables moved into u.cr */ | |
char *zTrace; | |
char *z; | |
-#endif /* local variables moved into u.cq */ | |
+#endif /* local variables moved into u.cr */ | |
- if( db->xTrace && (u.cq.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ | |
- u.cq.z = sqlite3VdbeExpandSql(p, u.cq.zTrace); | |
- db->xTrace(db->pTraceArg, u.cq.z); | |
- sqlite3DbFree(db, u.cq.z); | |
+ if( db->xTrace && (u.cr.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ | |
+ u.cr.z = sqlite3VdbeExpandSql(p, u.cr.zTrace); | |
+ db->xTrace(db->pTraceArg, u.cr.z); | |
+ sqlite3DbFree(db, u.cr.z); | |
} | |
#ifdef SQLITE_DEBUG | |
if( (db->flags & SQLITE_SqlTrace)!=0 | |
- && (u.cq.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 | |
+ && (u.cr.zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 | |
){ | |
- sqlite3DebugPrintf("SQL-trace: %s\n", u.cq.zTrace); | |
+ sqlite3DebugPrintf("SQL-trace: %s\n", u.cr.zTrace); | |
} | |
#endif /* SQLITE_DEBUG */ | |
break; | |
@@ -72489,7 +73832,7 @@ | |
pE->pColl = pColl; | |
pE->flags |= EP_IntValue | flags; | |
pE->u.iValue = iCol; | |
- pItem->iCol = (u16)iCol; | |
+ pItem->iOrderByCol = (u16)iCol; | |
pItem->done = 1; | |
}else{ | |
moreToDo = 1; | |
@@ -72538,12 +73881,12 @@ | |
pEList = pSelect->pEList; | |
assert( pEList!=0 ); /* sqlite3SelectNew() guarantees this */ | |
for(i=0, pItem=pOrderBy->a; i<pOrderBy->nExpr; i++, pItem++){ | |
- if( pItem->iCol ){ | |
- if( pItem->iCol>pEList->nExpr ){ | |
+ if( pItem->iOrderByCol ){ | |
+ if( pItem->iOrderByCol>pEList->nExpr ){ | |
resolveOutOfRangeError(pParse, zType, i+1, pEList->nExpr); | |
return 1; | |
} | |
- resolveAlias(pParse, pEList, pItem->iCol-1, pItem->pExpr, zType); | |
+ resolveAlias(pParse, pEList, pItem->iOrderByCol-1, pItem->pExpr, zType); | |
} | |
} | |
return 0; | |
@@ -72590,7 +73933,7 @@ | |
** a copy of the iCol-th result-set column. The subsequent call to | |
** sqlite3ResolveOrderGroupBy() will convert the expression to a | |
** copy of the iCol-th result-set expression. */ | |
- pItem->iCol = (u16)iCol; | |
+ pItem->iOrderByCol = (u16)iCol; | |
continue; | |
} | |
if( sqlite3ExprIsInteger(pE, &iCol) ){ | |
@@ -72601,12 +73944,12 @@ | |
resolveOutOfRangeError(pParse, zType, i+1, nResult); | |
return 1; | |
} | |
- pItem->iCol = (u16)iCol; | |
+ pItem->iOrderByCol = (u16)iCol; | |
continue; | |
} | |
/* Otherwise, treat the ORDER BY term as an ordinary expression */ | |
- pItem->iCol = 0; | |
+ pItem->iOrderByCol = 0; | |
if( sqlite3ResolveExprNames(pNC, pE) ){ | |
return 1; | |
} | |
@@ -73785,7 +75128,7 @@ | |
pItem->zSpan = sqlite3DbStrDup(db, pOldItem->zSpan); | |
pItem->sortOrder = pOldItem->sortOrder; | |
pItem->done = 0; | |
- pItem->iCol = pOldItem->iCol; | |
+ pItem->iOrderByCol = pOldItem->iOrderByCol; | |
pItem->iAlias = pOldItem->iAlias; | |
} | |
return pNew; | |
@@ -73855,7 +75198,7 @@ | |
return pNew; | |
} | |
SQLITE_PRIVATE Select *sqlite3SelectDup(sqlite3 *db, Select *p, int flags){ | |
- Select *pNew; | |
+ Select *pNew, *pPrior; | |
if( p==0 ) return 0; | |
pNew = sqlite3DbMallocRaw(db, sizeof(*p) ); | |
if( pNew==0 ) return 0; | |
@@ -73866,7 +75209,9 @@ | |
pNew->pHaving = sqlite3ExprDup(db, p->pHaving, flags); | |
pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, flags); | |
pNew->op = p->op; | |
- pNew->pPrior = sqlite3SelectDup(db, p->pPrior, flags); | |
+ pNew->pPrior = pPrior = sqlite3SelectDup(db, p->pPrior, flags); | |
+ if( pPrior ) pPrior->pNext = pNew; | |
+ pNew->pNext = 0; | |
pNew->pLimit = sqlite3ExprDup(db, p->pLimit, flags); | |
pNew->pOffset = sqlite3ExprDup(db, p->pOffset, flags); | |
pNew->iLimit = 0; | |
@@ -74289,6 +75634,15 @@ | |
#endif /* SQLITE_OMIT_SUBQUERY */ | |
/* | |
+** Code an OP_Once instruction and allocate space for its flag. Return the | |
+** address of the new instruction. | |
+*/ | |
+SQLITE_PRIVATE int sqlite3CodeOnce(Parse *pParse){ | |
+ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ | |
+ return sqlite3VdbeAddOp1(v, OP_Once, pParse->nOnce++); | |
+} | |
+ | |
+/* | |
** This function is used by the implementation of the IN (...) operator. | |
** It's job is to find or create a b-tree structure that may be used | |
** either to test for membership of the (...) set or to iterate through | |
@@ -74348,6 +75702,7 @@ | |
int eType = 0; /* Type of RHS table. IN_INDEX_* */ | |
int iTab = pParse->nTab++; /* Cursor of the RHS table */ | |
int mustBeUnique = (prNotFound==0); /* True if RHS must be unique */ | |
+ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ | |
assert( pX->op==TK_IN ); | |
@@ -74358,7 +75713,6 @@ | |
p = (ExprHasProperty(pX, EP_xIsSelect) ? pX->x.pSelect : 0); | |
if( ALWAYS(pParse->nErr==0) && isCandidateForInOpt(p) ){ | |
sqlite3 *db = pParse->db; /* Database connection */ | |
- Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ | |
Table *pTab; /* Table <table>. */ | |
Expr *pExpr; /* Expression <column> */ | |
int iCol; /* Index of column <column> */ | |
@@ -74383,10 +75737,9 @@ | |
*/ | |
assert(v); | |
if( iCol<0 ){ | |
- int iMem = ++pParse->nMem; | |
int iAddr; | |
- iAddr = sqlite3VdbeAddOp1(v, OP_Once, iMem); | |
+ iAddr = sqlite3CodeOnce(pParse); | |
sqlite3OpenTable(pParse, iTab, iDb, pTab, OP_OpenRead); | |
eType = IN_INDEX_ROWID; | |
@@ -74412,12 +75765,11 @@ | |
&& sqlite3FindCollSeq(db, ENC(db), pIdx->azColl[0], 0)==pReq | |
&& (!mustBeUnique || (pIdx->nColumn==1 && pIdx->onError!=OE_None)) | |
){ | |
- int iMem = ++pParse->nMem; | |
int iAddr; | |
char *pKey; | |
pKey = (char *)sqlite3IndexKeyinfo(pParse, pIdx); | |
- iAddr = sqlite3VdbeAddOp1(v, OP_Once, iMem); | |
+ iAddr = sqlite3CodeOnce(pParse); | |
sqlite3VdbeAddOp4(v, OP_OpenRead, iTab, pIdx->tnum, iDb, | |
pKey,P4_KEYINFO_HANDOFF); | |
@@ -74427,6 +75779,7 @@ | |
sqlite3VdbeJumpHere(v, iAddr); | |
if( prNotFound && !pTab->aCol[iCol].notNull ){ | |
*prNotFound = ++pParse->nMem; | |
+ sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound); | |
} | |
} | |
} | |
@@ -74442,6 +75795,7 @@ | |
eType = IN_INDEX_EPH; | |
if( prNotFound ){ | |
*prNotFound = rMayHaveNull = ++pParse->nMem; | |
+ sqlite3VdbeAddOp2(v, OP_Null, 0, *prNotFound); | |
}else{ | |
testcase( pParse->nQueryLoop>(double)1 ); | |
pParse->nQueryLoop = (double)1; | |
@@ -74514,9 +75868,8 @@ | |
** If all of the above are false, then we can run this code just once | |
** save the results, and reuse the same result on subsequent invocations. | |
*/ | |
- if( !ExprHasAnyProperty(pExpr, EP_VarSelect) && !pParse->pTriggerTab ){ | |
- int mem = ++pParse->nMem; | |
- testAddr = sqlite3VdbeAddOp1(v, OP_Once, mem); | |
+ if( !ExprHasAnyProperty(pExpr, EP_VarSelect) ){ | |
+ testAddr = sqlite3CodeOnce(pParse); | |
} | |
#ifndef SQLITE_OMIT_EXPLAIN | |
@@ -75854,6 +77207,264 @@ | |
return inReg; | |
} | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+/* | |
+** Generate a human-readable explanation of an expression tree. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainExpr(Vdbe *pOut, Expr *pExpr){ | |
+ int op; /* The opcode being coded */ | |
+ const char *zBinOp = 0; /* Binary operator */ | |
+ const char *zUniOp = 0; /* Unary operator */ | |
+ if( pExpr==0 ){ | |
+ op = TK_NULL; | |
+ }else{ | |
+ op = pExpr->op; | |
+ } | |
+ switch( op ){ | |
+ case TK_AGG_COLUMN: { | |
+ sqlite3ExplainPrintf(pOut, "AGG{%d:%d}", | |
+ pExpr->iTable, pExpr->iColumn); | |
+ break; | |
+ } | |
+ case TK_COLUMN: { | |
+ if( pExpr->iTable<0 ){ | |
+ /* This only happens when coding check constraints */ | |
+ sqlite3ExplainPrintf(pOut, "COLUMN(%d)", pExpr->iColumn); | |
+ }else{ | |
+ sqlite3ExplainPrintf(pOut, "{%d:%d}", | |
+ pExpr->iTable, pExpr->iColumn); | |
+ } | |
+ break; | |
+ } | |
+ case TK_INTEGER: { | |
+ if( pExpr->flags & EP_IntValue ){ | |
+ sqlite3ExplainPrintf(pOut, "%d", pExpr->u.iValue); | |
+ }else{ | |
+ sqlite3ExplainPrintf(pOut, "%s", pExpr->u.zToken); | |
+ } | |
+ break; | |
+ } | |
+#ifndef SQLITE_OMIT_FLOATING_POINT | |
+ case TK_FLOAT: { | |
+ sqlite3ExplainPrintf(pOut,"%s", pExpr->u.zToken); | |
+ break; | |
+ } | |
+#endif | |
+ case TK_STRING: { | |
+ sqlite3ExplainPrintf(pOut,"%Q", pExpr->u.zToken); | |
+ break; | |
+ } | |
+ case TK_NULL: { | |
+ sqlite3ExplainPrintf(pOut,"NULL"); | |
+ break; | |
+ } | |
+#ifndef SQLITE_OMIT_BLOB_LITERAL | |
+ case TK_BLOB: { | |
+ sqlite3ExplainPrintf(pOut,"%s", pExpr->u.zToken); | |
+ break; | |
+ } | |
+#endif | |
+ case TK_VARIABLE: { | |
+ sqlite3ExplainPrintf(pOut,"VARIABLE(%s,%d)", | |
+ pExpr->u.zToken, pExpr->iColumn); | |
+ break; | |
+ } | |
+ case TK_REGISTER: { | |
+ sqlite3ExplainPrintf(pOut,"REGISTER(%d)", pExpr->iTable); | |
+ break; | |
+ } | |
+ case TK_AS: { | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ break; | |
+ } | |
+#ifndef SQLITE_OMIT_CAST | |
+ case TK_CAST: { | |
+ /* Expressions of the form: CAST(pLeft AS token) */ | |
+ const char *zAff = "unk"; | |
+ switch( sqlite3AffinityType(pExpr->u.zToken) ){ | |
+ case SQLITE_AFF_TEXT: zAff = "TEXT"; break; | |
+ case SQLITE_AFF_NONE: zAff = "NONE"; break; | |
+ case SQLITE_AFF_NUMERIC: zAff = "NUMERIC"; break; | |
+ case SQLITE_AFF_INTEGER: zAff = "INTEGER"; break; | |
+ case SQLITE_AFF_REAL: zAff = "REAL"; break; | |
+ } | |
+ sqlite3ExplainPrintf(pOut, "CAST-%s(", zAff); | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ sqlite3ExplainPrintf(pOut, ")"); | |
+ break; | |
+ } | |
+#endif /* SQLITE_OMIT_CAST */ | |
+ case TK_LT: zBinOp = "LT"; break; | |
+ case TK_LE: zBinOp = "LE"; break; | |
+ case TK_GT: zBinOp = "GT"; break; | |
+ case TK_GE: zBinOp = "GE"; break; | |
+ case TK_NE: zBinOp = "NE"; break; | |
+ case TK_EQ: zBinOp = "EQ"; break; | |
+ case TK_IS: zBinOp = "IS"; break; | |
+ case TK_ISNOT: zBinOp = "ISNOT"; break; | |
+ case TK_AND: zBinOp = "AND"; break; | |
+ case TK_OR: zBinOp = "OR"; break; | |
+ case TK_PLUS: zBinOp = "ADD"; break; | |
+ case TK_STAR: zBinOp = "MUL"; break; | |
+ case TK_MINUS: zBinOp = "SUB"; break; | |
+ case TK_REM: zBinOp = "REM"; break; | |
+ case TK_BITAND: zBinOp = "BITAND"; break; | |
+ case TK_BITOR: zBinOp = "BITOR"; break; | |
+ case TK_SLASH: zBinOp = "DIV"; break; | |
+ case TK_LSHIFT: zBinOp = "LSHIFT"; break; | |
+ case TK_RSHIFT: zBinOp = "RSHIFT"; break; | |
+ case TK_CONCAT: zBinOp = "CONCAT"; break; | |
+ | |
+ case TK_UMINUS: zUniOp = "UMINUS"; break; | |
+ case TK_UPLUS: zUniOp = "UPLUS"; break; | |
+ case TK_BITNOT: zUniOp = "BITNOT"; break; | |
+ case TK_NOT: zUniOp = "NOT"; break; | |
+ case TK_ISNULL: zUniOp = "ISNULL"; break; | |
+ case TK_NOTNULL: zUniOp = "NOTNULL"; break; | |
+ | |
+ case TK_AGG_FUNCTION: | |
+ case TK_CONST_FUNC: | |
+ case TK_FUNCTION: { | |
+ ExprList *pFarg; /* List of function arguments */ | |
+ if( ExprHasAnyProperty(pExpr, EP_TokenOnly) ){ | |
+ pFarg = 0; | |
+ }else{ | |
+ pFarg = pExpr->x.pList; | |
+ } | |
+ sqlite3ExplainPrintf(pOut, "%sFUNCTION:%s(", | |
+ op==TK_AGG_FUNCTION ? "AGG_" : "", | |
+ pExpr->u.zToken); | |
+ if( pFarg ){ | |
+ sqlite3ExplainExprList(pOut, pFarg); | |
+ } | |
+ sqlite3ExplainPrintf(pOut, ")"); | |
+ break; | |
+ } | |
+#ifndef SQLITE_OMIT_SUBQUERY | |
+ case TK_EXISTS: { | |
+ sqlite3ExplainPrintf(pOut, "EXISTS("); | |
+ sqlite3ExplainSelect(pOut, pExpr->x.pSelect); | |
+ sqlite3ExplainPrintf(pOut,")"); | |
+ break; | |
+ } | |
+ case TK_SELECT: { | |
+ sqlite3ExplainPrintf(pOut, "("); | |
+ sqlite3ExplainSelect(pOut, pExpr->x.pSelect); | |
+ sqlite3ExplainPrintf(pOut, ")"); | |
+ break; | |
+ } | |
+ case TK_IN: { | |
+ sqlite3ExplainPrintf(pOut, "IN("); | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ sqlite3ExplainPrintf(pOut, ","); | |
+ if( ExprHasProperty(pExpr, EP_xIsSelect) ){ | |
+ sqlite3ExplainSelect(pOut, pExpr->x.pSelect); | |
+ }else{ | |
+ sqlite3ExplainExprList(pOut, pExpr->x.pList); | |
+ } | |
+ sqlite3ExplainPrintf(pOut, ")"); | |
+ break; | |
+ } | |
+#endif /* SQLITE_OMIT_SUBQUERY */ | |
+ | |
+ /* | |
+ ** x BETWEEN y AND z | |
+ ** | |
+ ** This is equivalent to | |
+ ** | |
+ ** x>=y AND x<=z | |
+ ** | |
+ ** X is stored in pExpr->pLeft. | |
+ ** Y is stored in pExpr->pList->a[0].pExpr. | |
+ ** Z is stored in pExpr->pList->a[1].pExpr. | |
+ */ | |
+ case TK_BETWEEN: { | |
+ Expr *pX = pExpr->pLeft; | |
+ Expr *pY = pExpr->x.pList->a[0].pExpr; | |
+ Expr *pZ = pExpr->x.pList->a[1].pExpr; | |
+ sqlite3ExplainPrintf(pOut, "BETWEEN("); | |
+ sqlite3ExplainExpr(pOut, pX); | |
+ sqlite3ExplainPrintf(pOut, ","); | |
+ sqlite3ExplainExpr(pOut, pY); | |
+ sqlite3ExplainPrintf(pOut, ","); | |
+ sqlite3ExplainExpr(pOut, pZ); | |
+ sqlite3ExplainPrintf(pOut, ")"); | |
+ break; | |
+ } | |
+ case TK_TRIGGER: { | |
+ /* If the opcode is TK_TRIGGER, then the expression is a reference | |
+ ** to a column in the new.* or old.* pseudo-tables available to | |
+ ** trigger programs. In this case Expr.iTable is set to 1 for the | |
+ ** new.* pseudo-table, or 0 for the old.* pseudo-table. Expr.iColumn | |
+ ** is set to the column of the pseudo-table to read, or to -1 to | |
+ ** read the rowid field. | |
+ */ | |
+ sqlite3ExplainPrintf(pOut, "%s(%d)", | |
+ pExpr->iTable ? "NEW" : "OLD", pExpr->iColumn); | |
+ break; | |
+ } | |
+ case TK_CASE: { | |
+ sqlite3ExplainPrintf(pOut, "CASE("); | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ sqlite3ExplainPrintf(pOut, ","); | |
+ sqlite3ExplainExprList(pOut, pExpr->x.pList); | |
+ break; | |
+ } | |
+#ifndef SQLITE_OMIT_TRIGGER | |
+ case TK_RAISE: { | |
+ const char *zType = "unk"; | |
+ switch( pExpr->affinity ){ | |
+ case OE_Rollback: zType = "rollback"; break; | |
+ case OE_Abort: zType = "abort"; break; | |
+ case OE_Fail: zType = "fail"; break; | |
+ case OE_Ignore: zType = "ignore"; break; | |
+ } | |
+ sqlite3ExplainPrintf(pOut, "RAISE-%s(%s)", zType, pExpr->u.zToken); | |
+ break; | |
+ } | |
+#endif | |
+ } | |
+ if( zBinOp ){ | |
+ sqlite3ExplainPrintf(pOut,"%s(", zBinOp); | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ sqlite3ExplainPrintf(pOut,","); | |
+ sqlite3ExplainExpr(pOut, pExpr->pRight); | |
+ sqlite3ExplainPrintf(pOut,")"); | |
+ }else if( zUniOp ){ | |
+ sqlite3ExplainPrintf(pOut,"%s(", zUniOp); | |
+ sqlite3ExplainExpr(pOut, pExpr->pLeft); | |
+ sqlite3ExplainPrintf(pOut,")"); | |
+ } | |
+} | |
+#endif /* defined(SQLITE_ENABLE_TREE_EXPLAIN) */ | |
+ | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+/* | |
+** Generate a human-readable explanation of an expression list. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ExplainExprList(Vdbe *pOut, ExprList *pList){ | |
+ int i; | |
+ if( pList==0 || pList->nExpr==0 ){ | |
+ sqlite3ExplainPrintf(pOut, "(empty-list)"); | |
+ return; | |
+ }else if( pList->nExpr==1 ){ | |
+ sqlite3ExplainExpr(pOut, pList->a[0].pExpr); | |
+ }else{ | |
+ sqlite3ExplainPush(pOut); | |
+ for(i=0; i<pList->nExpr; i++){ | |
+ sqlite3ExplainPrintf(pOut, "item[%d] = ", i); | |
+ sqlite3ExplainPush(pOut); | |
+ sqlite3ExplainExpr(pOut, pList->a[i].pExpr); | |
+ sqlite3ExplainPop(pOut); | |
+ if( i<pList->nExpr-1 ){ | |
+ sqlite3ExplainNL(pOut); | |
+ } | |
+ } | |
+ sqlite3ExplainPop(pOut); | |
+ } | |
+} | |
+#endif /* SQLITE_DEBUG */ | |
+ | |
/* | |
** Return TRUE if pExpr is an constant expression that is appropriate | |
** for factoring out of a loop. Appropriate expressions are: | |
@@ -76678,6 +78289,14 @@ | |
} | |
} | |
+/* | |
+** Mark all temporary registers as being unavailable for reuse. | |
+*/ | |
+SQLITE_PRIVATE void sqlite3ClearTempRegCache(Parse *pParse){ | |
+ pParse->nTempReg = 0; | |
+ pParse->nRangeReg = 0; | |
+} | |
+ | |
/************** End of expr.c ************************************************/ | |
/************** Begin file alter.c *******************************************/ | |
/* | |
@@ -78038,6 +79657,7 @@ | |
sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumEq); | |
sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumLt); | |
sqlite3VdbeAddOp2(v, OP_Integer, -1, regNumDLt); | |
+ sqlite3VdbeAddOp3(v, OP_Null, 0, regSample, regAccum); | |
sqlite3VdbeAddOp4(v, OP_Function, 1, regCount, regAccum, | |
(char*)&stat3InitFuncdef, P4_FUNCDEF); | |
sqlite3VdbeChangeP5(v, 2); | |
@@ -82102,19 +83722,23 @@ | |
nName = sqlite3Strlen30(zName); | |
nCol = pList->nExpr; | |
pIndex = sqlite3DbMallocZero(db, | |
- sizeof(Index) + /* Index structure */ | |
- sizeof(tRowcnt)*(nCol+1) + /* Index.aiRowEst */ | |
- sizeof(int)*nCol + /* Index.aiColumn */ | |
- sizeof(char *)*nCol + /* Index.azColl */ | |
- sizeof(u8)*nCol + /* Index.aSortOrder */ | |
- nName + 1 + /* Index.zName */ | |
- nExtra /* Collation sequence names */ | |
+ ROUND8(sizeof(Index)) + /* Index structure */ | |
+ ROUND8(sizeof(tRowcnt)*(nCol+1)) + /* Index.aiRowEst */ | |
+ sizeof(char *)*nCol + /* Index.azColl */ | |
+ sizeof(int)*nCol + /* Index.aiColumn */ | |
+ sizeof(u8)*nCol + /* Index.aSortOrder */ | |
+ nName + 1 + /* Index.zName */ | |
+ nExtra /* Collation sequence names */ | |
); | |
if( db->mallocFailed ){ | |
goto exit_create_index; | |
} | |
- pIndex->aiRowEst = (tRowcnt*)(&pIndex[1]); | |
- pIndex->azColl = (char**)(&pIndex->aiRowEst[nCol+1]); | |
+ zExtra = (char*)pIndex; | |
+ pIndex->aiRowEst = (tRowcnt*)&zExtra[ROUND8(sizeof(Index))]; | |
+ pIndex->azColl = (char**) | |
+ ((char*)pIndex->aiRowEst + ROUND8(sizeof(tRowcnt)*nCol+1)); | |
+ assert( EIGHT_BYTE_ALIGNMENT(pIndex->aiRowEst) ); | |
+ assert( EIGHT_BYTE_ALIGNMENT(pIndex->azColl) ); | |
pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]); | |
pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]); | |
pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]); | |
@@ -83868,7 +85492,6 @@ | |
*/ | |
if( pOrderBy && (pLimit == 0) ) { | |
sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on %s", zStmtType); | |
- pParse->parseError = 1; | |
goto limit_where_cleanup_2; | |
} | |
@@ -87248,7 +88871,7 @@ | |
** 'd' INTEGER | |
** 'e' REAL | |
** | |
-** An extra 'b' is appended to the end of the string to cover the | |
+** An extra 'd' is appended to the end of the string to cover the | |
** rowid that appears as the last column in every index. | |
** | |
** Memory for the buffer containing the column index affinity string | |
@@ -87276,7 +88899,7 @@ | |
for(n=0; n<pIdx->nColumn; n++){ | |
pIdx->zColAff[n] = pTab->aCol[pIdx->aiColumn[n]].affinity; | |
} | |
- pIdx->zColAff[n++] = SQLITE_AFF_NONE; | |
+ pIdx->zColAff[n++] = SQLITE_AFF_INTEGER; | |
pIdx->zColAff[n] = 0; | |
} | |
@@ -87440,6 +89063,7 @@ | |
memId = p->regCtr; | |
assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); | |
sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenRead); | |
+ sqlite3VdbeAddOp3(v, OP_Null, 0, memId, memId+1); | |
addr = sqlite3VdbeCurrentAddr(v); | |
sqlite3VdbeAddOp4(v, OP_String8, 0, memId-1, 0, p->pTab->zName, 0); | |
sqlite3VdbeAddOp2(v, OP_Rewind, 0, addr+9); | |
@@ -88307,7 +89931,7 @@ | |
** cause sqlite3_exec() to return immediately | |
** with SQLITE_CONSTRAINT. | |
** | |
-** any FAIL Sqlite_exec() returns immediately with a | |
+** any FAIL Sqlite3_exec() returns immediately with a | |
** return code of SQLITE_CONSTRAINT. The | |
** transaction is not rolled back and any | |
** prior changes are retained. | |
@@ -88779,31 +90403,25 @@ | |
** | |
** INSERT INTO tab1 SELECT * FROM tab2; | |
** | |
-** This optimization is only attempted if | |
-** | |
-** (1) tab1 and tab2 have identical schemas including all the | |
-** same indices and constraints | |
-** | |
-** (2) tab1 and tab2 are different tables | |
-** | |
-** (3) There must be no triggers on tab1 | |
-** | |
-** (4) The result set of the SELECT statement is "*" | |
-** | |
-** (5) The SELECT statement has no WHERE, HAVING, ORDER BY, GROUP BY, | |
-** or LIMIT clause. | |
-** | |
-** (6) The SELECT statement is a simple (not a compound) select that | |
-** contains only tab2 in its FROM clause | |
+** The xfer optimization transfers raw records from tab2 over to tab1. | |
+** Columns are not decoded and reassemblied, which greatly improves | |
+** performance. Raw index records are transferred in the same way. | |
+** | |
+** The xfer optimization is only attempted if tab1 and tab2 are compatible. | |
+** There are lots of rules for determining compatibility - see comments | |
+** embedded in the code for details. | |
+** | |
+** This routine returns TRUE if the optimization is guaranteed to be used. | |
+** Sometimes the xfer optimization will only work if the destination table | |
+** is empty - a factor that can only be determined at run-time. In that | |
+** case, this routine generates code for the xfer optimization but also | |
+** does a test to see if the destination table is empty and jumps over the | |
+** xfer optimization code if the test fails. In that case, this routine | |
+** returns FALSE so that the caller will know to go ahead and generate | |
+** an unoptimized transfer. This routine also returns FALSE if there | |
+** is no chance that the xfer optimization can be applied. | |
** | |
-** This method for implementing the INSERT transfers raw records from | |
-** tab2 over to tab1. The columns are not decoded. Raw records from | |
-** the indices of tab2 are transfered to tab1 as well. In so doing, | |
-** the resulting tab1 has much less fragmentation. | |
-** | |
-** This routine returns TRUE if the optimization is attempted. If any | |
-** of the conditions above fail so that the optimization should not | |
-** be attempted, then this routine returns FALSE. | |
+** This optimization is particularly useful at making VACUUM run faster. | |
*/ | |
static int xferOptimization( | |
Parse *pParse, /* Parser context */ | |
@@ -88840,10 +90458,8 @@ | |
} | |
#endif | |
if( onError==OE_Default ){ | |
- onError = OE_Abort; | |
- } | |
- if( onError!=OE_Abort && onError!=OE_Rollback ){ | |
- return 0; /* Cannot do OR REPLACE or OR IGNORE or OR FAIL */ | |
+ if( pDest->iPKey>=0 ) onError = pDest->keyConf; | |
+ if( onError==OE_Default ) onError = OE_Abort; | |
} | |
assert(pSelect->pSrc); /* allocated even if there is no FROM clause */ | |
if( pSelect->pSrc->nSrc!=1 ){ | |
@@ -88949,16 +90565,12 @@ | |
} | |
#endif | |
if( (pParse->db->flags & SQLITE_CountRows)!=0 ){ | |
- return 0; | |
+ return 0; /* xfer opt does not play well with PRAGMA count_changes */ | |
} | |
- /* If we get this far, it means either: | |
- ** | |
- ** * We can always do the transfer if the table contains an | |
- ** an integer primary key | |
- ** | |
- ** * We can conditionally do the transfer if the destination | |
- ** table is empty. | |
+ /* If we get this far, it means that the xfer optimization is at | |
+ ** least a possibility, though it might only work if the destination | |
+ ** table (tab1) is initially empty. | |
*/ | |
#ifdef SQLITE_TEST | |
sqlite3_xferopt_count++; | |
@@ -88970,16 +90582,23 @@ | |
iDest = pParse->nTab++; | |
regAutoinc = autoIncBegin(pParse, iDbDest, pDest); | |
sqlite3OpenTable(pParse, iDest, iDbDest, pDest, OP_OpenWrite); | |
- if( (pDest->iPKey<0 && pDest->pIndex!=0) || destHasUniqueIdx ){ | |
- /* If tables do not have an INTEGER PRIMARY KEY and there | |
- ** are indices to be copied and the destination is not empty, | |
- ** we have to disallow the transfer optimization because the | |
- ** the rowids might change which will mess up indexing. | |
+ if( (pDest->iPKey<0 && pDest->pIndex!=0) /* (1) */ | |
+ || destHasUniqueIdx /* (2) */ | |
+ || (onError!=OE_Abort && onError!=OE_Rollback) /* (3) */ | |
+ ){ | |
+ /* In some circumstances, we are able to run the xfer optimization | |
+ ** only if the destination table is initially empty. This code makes | |
+ ** that determination. Conditions under which the destination must | |
+ ** be empty: | |
+ ** | |
+ ** (1) There is no INTEGER PRIMARY KEY but there are indices. | |
+ ** (If the destination is not initially empty, the rowid fields | |
+ ** of index entries might need to change.) | |
+ ** | |
+ ** (2) The destination has a unique index. (The xfer optimization | |
+ ** is unable to test uniqueness.) | |
** | |
- ** Or if the destination has a UNIQUE index and is not empty, | |
- ** we also disallow the transfer optimization because we cannot | |
- ** insure that all entries in the union of DEST and SRC will be | |
- ** unique. | |
+ ** (3) onError is something other than OE_Abort and OE_Rollback. | |
*/ | |
addr1 = sqlite3VdbeAddOp2(v, OP_Rewind, iDest, 0); | |
emptyDestTest = sqlite3VdbeAddOp2(v, OP_Goto, 0, 0); | |
@@ -90271,6 +91890,7 @@ | |
SQLITE_PRIVATE void sqlite3AutoLoadExtensions(sqlite3 *db){ | |
int i; | |
int go = 1; | |
+ int rc; | |
int (*xInit)(sqlite3*,char**,const sqlite3_api_routines*); | |
wsdAutoextInit; | |
@@ -90293,8 +91913,8 @@ | |
} | |
sqlite3_mutex_leave(mutex); | |
zErrmsg = 0; | |
- if( xInit && xInit(db, &zErrmsg, &sqlite3Apis) ){ | |
- sqlite3Error(db, SQLITE_ERROR, | |
+ if( xInit && (rc = xInit(db, &zErrmsg, &sqlite3Apis))!=0 ){ | |
+ sqlite3Error(db, rc, | |
"automatic extension loading failed: %s", zErrmsg); | |
go = 0; | |
} | |
@@ -90651,7 +92271,7 @@ | |
goto pragma_out; | |
} | |
-#ifndef SQLITE_OMIT_PAGER_PRAGMAS | |
+#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) && !defined(SQLITE_OMIT_DEPRECATED) | |
/* | |
** PRAGMA [database.]default_cache_size | |
** PRAGMA [database.]default_cache_size=N | |
@@ -90700,7 +92320,9 @@ | |
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); | |
} | |
}else | |
+#endif /* !SQLITE_OMIT_PAGER_PRAGMAS && !SQLITE_OMIT_DEPRECATED */ | |
+#if !defined(SQLITE_OMIT_PAGER_PRAGMAS) | |
/* | |
** PRAGMA [database.]page_size | |
** PRAGMA [database.]page_size=N | |
@@ -90721,7 +92343,7 @@ | |
** buffer that the pager module resizes using sqlite3_realloc(). | |
*/ | |
db->nextPagesize = sqlite3Atoi(zRight); | |
- if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize, -1, 0) ){ | |
+ if( SQLITE_NOMEM==sqlite3BtreeSetPageSize(pBt, db->nextPagesize,-1,0) ){ | |
db->mallocFailed = 1; | |
} | |
} | |
@@ -90761,6 +92383,10 @@ | |
** second form attempts to change this setting. Both | |
** forms return the current setting. | |
** | |
+ ** The absolute value of N is used. This is undocumented and might | |
+ ** change. The only purpose is to provide an easy way to test | |
+ ** the sqlite3AbsInt32() function. | |
+ ** | |
** PRAGMA [database.]page_count | |
** | |
** Return the number of pages in the specified database. | |
@@ -90775,7 +92401,8 @@ | |
if( sqlite3Tolower(zLeft[0])=='p' ){ | |
sqlite3VdbeAddOp2(v, OP_Pagecount, iDb, iReg); | |
}else{ | |
- sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, sqlite3Atoi(zRight)); | |
+ sqlite3VdbeAddOp3(v, OP_MaxPgcnt, iDb, iReg, | |
+ sqlite3AbsInt32(sqlite3Atoi(zRight))); | |
} | |
sqlite3VdbeAddOp2(v, OP_ResultRow, iReg, 1); | |
sqlite3VdbeSetNumCols(v, 1); | |
@@ -90989,14 +92616,11 @@ | |
** PRAGMA [database.]cache_size=N | |
** | |
** The first form reports the current local setting for the | |
- ** page cache size. The local setting can be different from | |
- ** the persistent cache size value that is stored in the database | |
- ** file itself. The value returned is the maximum number of | |
- ** pages in the page cache. The second form sets the local | |
- ** page cache size value. It does not change the persistent | |
- ** cache size stored on the disk so the cache size will revert | |
- ** to its default value when the database is closed and reopened. | |
- ** N should be a positive integer. | |
+ ** page cache size. The second form sets the local | |
+ ** page cache size value. If N is positive then that is the | |
+ ** number of pages in the cache. If N is negative, then the | |
+ ** number of pages is adjusted so that the cache uses -N kibibytes | |
+ ** of memory. | |
*/ | |
if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ | |
if( sqlite3ReadSchema(pParse) ) goto pragma_out; | |
@@ -91004,7 +92628,7 @@ | |
if( !zRight ){ | |
returnSingleInt(pParse, "cache_size", pDb->pSchema->cache_size); | |
}else{ | |
- int size = sqlite3AbsInt32(sqlite3Atoi(zRight)); | |
+ int size = sqlite3Atoi(zRight); | |
pDb->pSchema->cache_size = size; | |
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); | |
} | |
@@ -91096,7 +92720,7 @@ | |
Pager *pPager = sqlite3BtreePager(pDb->pBt); | |
char *proxy_file_path = NULL; | |
sqlite3_file *pFile = sqlite3PagerFile(pPager); | |
- sqlite3OsFileControl(pFile, SQLITE_GET_LOCKPROXYFILE, | |
+ sqlite3OsFileControlHint(pFile, SQLITE_GET_LOCKPROXYFILE, | |
&proxy_file_path); | |
if( proxy_file_path ){ | |
@@ -91739,6 +93363,16 @@ | |
}else | |
#endif | |
+ /* | |
+ ** PRAGMA shrink_memory | |
+ ** | |
+ ** This pragma attempts to free as much memory as possible from the | |
+ ** current database connection. | |
+ */ | |
+ if( sqlite3StrICmp(zLeft, "shrink_memory")==0 ){ | |
+ sqlite3_db_release_memory(db); | |
+ }else | |
+ | |
#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) | |
/* | |
** Report the current state of file logs for all databases | |
@@ -92113,9 +93747,13 @@ | |
pDb->pSchema->enc = ENC(db); | |
if( pDb->pSchema->cache_size==0 ){ | |
+#ifndef SQLITE_OMIT_DEPRECATED | |
size = sqlite3AbsInt32(meta[BTREE_DEFAULT_CACHE_SIZE-1]); | |
if( size==0 ){ size = SQLITE_DEFAULT_CACHE_SIZE; } | |
pDb->pSchema->cache_size = size; | |
+#else | |
+ pDb->pSchema->cache_size = SQLITE_DEFAULT_CACHE_SIZE; | |
+#endif | |
sqlite3BtreeSetCacheSize(pDb->pBt, pDb->pSchema->cache_size); | |
} | |
@@ -94914,8 +96552,8 @@ | |
for(i=1; db->mallocFailed==0 && i<=p->pEList->nExpr; i++){ | |
struct ExprList_item *pItem; | |
for(j=0, pItem=pOrderBy->a; j<nOrderBy; j++, pItem++){ | |
- assert( pItem->iCol>0 ); | |
- if( pItem->iCol==i ) break; | |
+ assert( pItem->iOrderByCol>0 ); | |
+ if( pItem->iOrderByCol==i ) break; | |
} | |
if( j==nOrderBy ){ | |
Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); | |
@@ -94923,7 +96561,7 @@ | |
pNew->flags |= EP_IntValue; | |
pNew->u.iValue = i; | |
pOrderBy = sqlite3ExprListAppend(pParse, pOrderBy, pNew); | |
- pOrderBy->a[nOrderBy++].iCol = (u16)i; | |
+ pOrderBy->a[nOrderBy++].iOrderByCol = (u16)i; | |
} | |
} | |
} | |
@@ -94939,8 +96577,8 @@ | |
if( aPermute ){ | |
struct ExprList_item *pItem; | |
for(i=0, pItem=pOrderBy->a; i<nOrderBy; i++, pItem++){ | |
- assert( pItem->iCol>0 && pItem->iCol<=p->pEList->nExpr ); | |
- aPermute[i] = pItem->iCol - 1; | |
+ assert( pItem->iOrderByCol>0 && pItem->iOrderByCol<=p->pEList->nExpr ); | |
+ aPermute[i] = pItem->iOrderByCol - 1; | |
} | |
pKeyMerge = | |
sqlite3DbMallocRaw(db, sizeof(*pKeyMerge)+nOrderBy*(sizeof(CollSeq*)+1)); | |
@@ -95283,9 +96921,8 @@ | |
#if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) | |
/* | |
-** This routine attempts to flatten subqueries in order to speed | |
-** execution. It returns 1 if it makes changes and 0 if no flattening | |
-** occurs. | |
+** This routine attempts to flatten subqueries as a performance optimization. | |
+** This routine returns 1 if it makes changes and 0 if no flattening occurs. | |
** | |
** To understand the concept of flattening, consider the following | |
** query: | |
@@ -95327,7 +96964,10 @@ | |
** (6) The subquery does not use aggregates or the outer query is not | |
** DISTINCT. | |
** | |
-** (7) The subquery has a FROM clause. | |
+** (7) The subquery has a FROM clause. TODO: For subqueries without | |
+** A FROM clause, consider adding a FROM close with the special | |
+** table sqlite_once that consists of a single row containing a | |
+** single NULL. | |
** | |
** (8) The subquery does not use LIMIT or the outer query is not a join. | |
** | |
@@ -95360,11 +97000,14 @@ | |
** | |
** * is not itself part of a compound select, | |
** * is not an aggregate or DISTINCT query, and | |
-** * has no other tables or sub-selects in the FROM clause. | |
+** * is not a join | |
** | |
** The parent and sub-query may contain WHERE clauses. Subject to | |
** rules (11), (13) and (14), they may also contain ORDER BY, | |
-** LIMIT and OFFSET clauses. | |
+** LIMIT and OFFSET clauses. The subquery cannot use any compound | |
+** operator other than UNION ALL because all the other compound | |
+** operators have an implied DISTINCT which is disallowed by | |
+** restriction (4). | |
** | |
** (18) If the sub-query is a compound select, then all terms of the | |
** ORDER by clause of the parent must be simple references to | |
@@ -95376,7 +97019,7 @@ | |
** (20) If the sub-query is a compound select, then it must not use | |
** an ORDER BY clause. Ticket #3773. We could relax this constraint | |
** somewhat by saying that the terms of the ORDER BY clause must | |
-** appear as unmodified result columns in the outer query. But | |
+** appear as unmodified result columns in the outer query. But we | |
** have other optimizations in mind to deal with that case. | |
** | |
** (21) The subquery does not use LIMIT or the outer query is not | |
@@ -95505,19 +97148,21 @@ | |
for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ | |
testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ); | |
testcase( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))==SF_Aggregate ); | |
+ assert( pSub->pSrc!=0 ); | |
if( (pSub1->selFlags & (SF_Distinct|SF_Aggregate))!=0 | |
|| (pSub1->pPrior && pSub1->op!=TK_ALL) | |
- || NEVER(pSub1->pSrc==0) || pSub1->pSrc->nSrc!=1 | |
+ || pSub1->pSrc->nSrc<1 | |
){ | |
return 0; | |
} | |
+ testcase( pSub1->pSrc->nSrc>1 ); | |
} | |
/* Restriction 18. */ | |
if( p->pOrderBy ){ | |
int ii; | |
for(ii=0; ii<p->pOrderBy->nExpr; ii++){ | |
- if( p->pOrderBy->a[ii].iCol==0 ) return 0; | |
+ if( p->pOrderBy->a[ii].iOrderByCol==0 ) return 0; | |
} | |
} | |
} | |
@@ -96540,12 +98185,11 @@ | |
topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); | |
pItem->addrFillSub = topAddr+1; | |
VdbeNoopComment((v, "materialize %s", pItem->pTab->zName)); | |
- if( pItem->isCorrelated==0 && pParse->pTriggerTab==0 ){ | |
+ if( pItem->isCorrelated==0 ){ | |
/* If the subquery is no correlated and if we are not inside of | |
** a trigger, then we only need to compute the value of the subquery | |
** once. */ | |
- int regOnce = ++pParse->nMem; | |
- onceAddr = sqlite3VdbeAddOp1(v, OP_Once, regOnce); | |
+ onceAddr = sqlite3CodeOnce(pParse); | |
} | |
sqlite3SelectDestInit(&dest, SRT_EphemTab, pItem->iCursor); | |
explainSetInteger(pItem->iSelectId, (u8)pParse->iNextSelectId); | |
@@ -96555,7 +98199,7 @@ | |
retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); | |
VdbeComment((v, "end %s", pItem->pTab->zName)); | |
sqlite3VdbeChangeP1(v, topAddr, retAddr); | |
- | |
+ sqlite3ClearTempRegCache(pParse); | |
} | |
if( /*pParse->nErr ||*/ db->mallocFailed ){ | |
goto select_end; | |
@@ -96850,6 +98494,7 @@ | |
VdbeComment((v, "clear abort flag")); | |
sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); | |
VdbeComment((v, "indicate accumulator empty")); | |
+ sqlite3VdbeAddOp3(v, OP_Null, 0, iAMem, iAMem+pGroupBy->nExpr-1); | |
/* Begin a loop that will extract all source rows in GROUP BY order. | |
** This might involve two separate loops with an OP_Sort in between, or | |
@@ -97189,98 +98834,98 @@ | |
return rc; | |
} | |
-#if defined(SQLITE_DEBUG) | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
/* | |
-******************************************************************************* | |
-** The following code is used for testing and debugging only. The code | |
-** that follows does not appear in normal builds. | |
-** | |
-** These routines are used to print out the content of all or part of a | |
-** parse structures such as Select or Expr. Such printouts are useful | |
-** for helping to understand what is happening inside the code generator | |
-** during the execution of complex SELECT statements. | |
-** | |
-** These routine are not called anywhere from within the normal | |
-** code base. Then are intended to be called from within the debugger | |
-** or from temporary "printf" statements inserted for debugging. | |
+** Generate a human-readable description of a the Select object. | |
*/ | |
-SQLITE_PRIVATE void sqlite3PrintExpr(Expr *p){ | |
- if( !ExprHasProperty(p, EP_IntValue) && p->u.zToken ){ | |
- sqlite3DebugPrintf("(%s", p->u.zToken); | |
- }else{ | |
- sqlite3DebugPrintf("(%d", p->op); | |
- } | |
- if( p->pLeft ){ | |
- sqlite3DebugPrintf(" "); | |
- sqlite3PrintExpr(p->pLeft); | |
- } | |
- if( p->pRight ){ | |
- sqlite3DebugPrintf(" "); | |
- sqlite3PrintExpr(p->pRight); | |
- } | |
- sqlite3DebugPrintf(")"); | |
-} | |
-SQLITE_PRIVATE void sqlite3PrintExprList(ExprList *pList){ | |
- int i; | |
- for(i=0; i<pList->nExpr; i++){ | |
- sqlite3PrintExpr(pList->a[i].pExpr); | |
- if( i<pList->nExpr-1 ){ | |
- sqlite3DebugPrintf(", "); | |
+static void explainOneSelect(Vdbe *pVdbe, Select *p){ | |
+ sqlite3ExplainPrintf(pVdbe, "SELECT "); | |
+ if( p->selFlags & (SF_Distinct|SF_Aggregate) ){ | |
+ if( p->selFlags & SF_Distinct ){ | |
+ sqlite3ExplainPrintf(pVdbe, "DISTINCT "); | |
} | |
+ if( p->selFlags & SF_Aggregate ){ | |
+ sqlite3ExplainPrintf(pVdbe, "agg_flag "); | |
+ } | |
+ sqlite3ExplainNL(pVdbe); | |
+ sqlite3ExplainPrintf(pVdbe, " "); | |
} | |
-} | |
-SQLITE_PRIVATE void sqlite3PrintSelect(Select *p, int indent){ | |
- sqlite3DebugPrintf("%*sSELECT(%p) ", indent, "", p); | |
- sqlite3PrintExprList(p->pEList); | |
- sqlite3DebugPrintf("\n"); | |
- if( p->pSrc ){ | |
- char *zPrefix; | |
+ sqlite3ExplainExprList(pVdbe, p->pEList); | |
+ sqlite3ExplainNL(pVdbe); | |
+ if( p->pSrc && p->pSrc->nSrc ){ | |
int i; | |
- zPrefix = "FROM"; | |
+ sqlite3ExplainPrintf(pVdbe, "FROM "); | |
+ sqlite3ExplainPush(pVdbe); | |
for(i=0; i<p->pSrc->nSrc; i++){ | |
struct SrcList_item *pItem = &p->pSrc->a[i]; | |
- sqlite3DebugPrintf("%*s ", indent+6, zPrefix); | |
- zPrefix = ""; | |
+ sqlite3ExplainPrintf(pVdbe, "{%d,*} = ", pItem->iCursor); | |
if( pItem->pSelect ){ | |
- sqlite3DebugPrintf("(\n"); | |
- sqlite3PrintSelect(pItem->pSelect, indent+10); | |
- sqlite3DebugPrintf("%*s)", indent+8, ""); | |
+ sqlite3ExplainSelect(pVdbe, pItem->pSelect); | |
+ if( pItem->pTab ){ | |
+ sqlite3ExplainPrintf(pVdbe, " (tabname=%s)", pItem->pTab->zName); | |
+ } | |
}else if( pItem->zName ){ | |
- sqlite3DebugPrintf("%s", pItem->zName); | |
- } | |
- if( pItem->pTab ){ | |
- sqlite3DebugPrintf("(table: %s)", pItem->pTab->zName); | |
+ sqlite3ExplainPrintf(pVdbe, "%s", pItem->zName); | |
} | |
if( pItem->zAlias ){ | |
- sqlite3DebugPrintf(" AS %s", pItem->zAlias); | |
+ sqlite3ExplainPrintf(pVdbe, " (AS %s)", pItem->zAlias); | |
} | |
- if( i<p->pSrc->nSrc-1 ){ | |
- sqlite3DebugPrintf(","); | |
+ if( pItem->jointype & JT_LEFT ){ | |
+ sqlite3ExplainPrintf(pVdbe, " LEFT-JOIN"); | |
} | |
- sqlite3DebugPrintf("\n"); | |
+ sqlite3ExplainNL(pVdbe); | |
} | |
+ sqlite3ExplainPop(pVdbe); | |
} | |
if( p->pWhere ){ | |
- sqlite3DebugPrintf("%*s WHERE ", indent, ""); | |
- sqlite3PrintExpr(p->pWhere); | |
- sqlite3DebugPrintf("\n"); | |
+ sqlite3ExplainPrintf(pVdbe, "WHERE "); | |
+ sqlite3ExplainExpr(pVdbe, p->pWhere); | |
+ sqlite3ExplainNL(pVdbe); | |
} | |
if( p->pGroupBy ){ | |
- sqlite3DebugPrintf("%*s GROUP BY ", indent, ""); | |
- sqlite3PrintExprList(p->pGroupBy); | |
- sqlite3DebugPrintf("\n"); | |
+ sqlite3ExplainPrintf(pVdbe, "GROUPBY "); | |
+ sqlite3ExplainExprList(pVdbe, p->pGroupBy); | |
+ sqlite3ExplainNL(pVdbe); | |
} | |
if( p->pHaving ){ | |
- sqlite3DebugPrintf("%*s HAVING ", indent, ""); | |
- sqlite3PrintExpr(p->pHaving); | |
- sqlite3DebugPrintf("\n"); | |
+ sqlite3ExplainPrintf(pVdbe, "HAVING "); | |
+ sqlite3ExplainExpr(pVdbe, p->pHaving); | |
+ sqlite3ExplainNL(pVdbe); | |
} | |
if( p->pOrderBy ){ | |
- sqlite3DebugPrintf("%*s ORDER BY ", indent, ""); | |
- sqlite3PrintExprList(p->pOrderBy); | |
- sqlite3DebugPrintf("\n"); | |
+ sqlite3ExplainPrintf(pVdbe, "ORDERBY "); | |
+ sqlite3ExplainExprList(pVdbe, p->pOrderBy); | |
+ sqlite3ExplainNL(pVdbe); | |
+ } | |
+ if( p->pLimit ){ | |
+ sqlite3ExplainPrintf(pVdbe, "LIMIT "); | |
+ sqlite3ExplainExpr(pVdbe, p->pLimit); | |
+ sqlite3ExplainNL(pVdbe); | |
+ } | |
+ if( p->pOffset ){ | |
+ sqlite3ExplainPrintf(pVdbe, "OFFSET "); | |
+ sqlite3ExplainExpr(pVdbe, p->pOffset); | |
+ sqlite3ExplainNL(pVdbe); | |
+ } | |
+} | |
+SQLITE_PRIVATE void sqlite3ExplainSelect(Vdbe *pVdbe, Select *p){ | |
+ if( p==0 ){ | |
+ sqlite3ExplainPrintf(pVdbe, "(null-select)"); | |
+ return; | |
+ } | |
+ while( p->pPrior ) p = p->pPrior; | |
+ sqlite3ExplainPush(pVdbe); | |
+ while( p ){ | |
+ explainOneSelect(pVdbe, p); | |
+ p = p->pNext; | |
+ if( p==0 ) break; | |
+ sqlite3ExplainNL(pVdbe); | |
+ sqlite3ExplainPrintf(pVdbe, "%s\n", selectOpName(p->op)); | |
} | |
+ sqlite3ExplainPrintf(pVdbe, "END"); | |
+ sqlite3ExplainPop(pVdbe); | |
} | |
+ | |
/* End of the structure debug printing code | |
*****************************************************************************/ | |
#endif /* defined(SQLITE_TEST) || defined(SQLITE_DEBUG) */ | |
@@ -98391,6 +100036,7 @@ | |
} | |
pProgram->nMem = pSubParse->nMem; | |
pProgram->nCsr = pSubParse->nTab; | |
+ pProgram->nOnce = pSubParse->nOnce; | |
pProgram->token = (void *)pTrigger; | |
pPrg->aColmask[0] = pSubParse->oldmask; | |
pPrg->aColmask[1] = pSubParse->newmask; | |
@@ -98738,8 +100384,8 @@ | |
int regRowCount = 0; /* A count of rows changed */ | |
int regOldRowid; /* The old rowid */ | |
int regNewRowid; /* The new rowid */ | |
- int regNew; | |
- int regOld = 0; | |
+ int regNew; /* Content of the NEW.* table in triggers */ | |
+ int regOld = 0; /* Content of OLD.* table in triggers */ | |
int regRowSet = 0; /* Rowset of rows to be updated */ | |
memset(&sContext, 0, sizeof(sContext)); | |
@@ -98888,6 +100534,7 @@ | |
#endif | |
/* Allocate required registers. */ | |
+ regRowSet = ++pParse->nMem; | |
regOldRowid = regNewRowid = ++pParse->nMem; | |
if( pTrigger || hasFK ){ | |
regOld = pParse->nMem + 1; | |
@@ -98922,7 +100569,7 @@ | |
/* Begin the database scan | |
*/ | |
- sqlite3VdbeAddOp2(v, OP_Null, 0, regOldRowid); | |
+ sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); | |
pWInfo = sqlite3WhereBegin( | |
pParse, pTabList, pWhere, 0, 0, WHERE_ONEPASS_DESIRED | |
); | |
@@ -98933,7 +100580,6 @@ | |
*/ | |
sqlite3VdbeAddOp2(v, OP_Rowid, iCur, regOldRowid); | |
if( !okOnePass ){ | |
- regRowSet = ++pParse->nMem; | |
sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); | |
} | |
@@ -99037,9 +100683,10 @@ | |
newmask = sqlite3TriggerColmask( | |
pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError | |
); | |
+ sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1); | |
for(i=0; i<pTab->nCol; i++){ | |
if( i==pTab->iPKey ){ | |
- sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); | |
+ /*sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i);*/ | |
}else{ | |
j = aXRef[i]; | |
if( j>=0 ){ | |
@@ -101302,7 +102949,7 @@ | |
&& pTerm->u.leftColumn==iColumn | |
&& (pTerm->eOperator & op)!=0 | |
){ | |
- if( pIdx && pTerm->eOperator!=WO_ISNULL ){ | |
+ if( iColumn>=0 && pIdx && pTerm->eOperator!=WO_ISNULL ){ | |
Expr *pX = pTerm->pExpr; | |
CollSeq *pColl; | |
char idxaff; | |
@@ -102703,7 +104350,6 @@ | |
int nByte; /* Byte of memory needed for pIdx */ | |
Index *pIdx; /* Object describing the transient index */ | |
Vdbe *v; /* Prepared statement under construction */ | |
- int regIsInit; /* Register set by initialization */ | |
int addrInit; /* Address of the initialization bypass jump */ | |
Table *pTable; /* The table being indexed */ | |
KeyInfo *pKeyinfo; /* Key information for the index */ | |
@@ -102720,8 +104366,7 @@ | |
** transient index on 2nd and subsequent iterations of the loop. */ | |
v = pParse->pVdbe; | |
assert( v!=0 ); | |
- regIsInit = ++pParse->nMem; | |
- addrInit = sqlite3VdbeAddOp1(v, OP_Once, regIsInit); | |
+ addrInit = sqlite3CodeOnce(pParse); | |
/* Count the number of columns that will be added to the index | |
** and used to match WHERE clause constraints */ | |
@@ -103750,10 +105395,24 @@ | |
#endif | |
used |= pTerm->prereqRight; | |
} | |
- | |
- /* Determine the value of rangeDiv */ | |
- if( nEq<pProbe->nColumn && pProbe->bUnordered==0 ){ | |
- int j = pProbe->aiColumn[nEq]; | |
+ | |
+ /* If the index being considered is UNIQUE, and there is an equality | |
+ ** constraint for all columns in the index, then this search will find | |
+ ** at most a single row. In this case set the WHERE_UNIQUE flag to | |
+ ** indicate this to the caller. | |
+ ** | |
+ ** Otherwise, if the search may find more than one row, test to see if | |
+ ** there is a range constraint on indexed column (nEq+1) that can be | |
+ ** optimized using the index. | |
+ */ | |
+ if( nEq==pProbe->nColumn && pProbe->onError!=OE_None ){ | |
+ testcase( wsFlags & WHERE_COLUMN_IN ); | |
+ testcase( wsFlags & WHERE_COLUMN_NULL ); | |
+ if( (wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0 ){ | |
+ wsFlags |= WHERE_UNIQUE; | |
+ } | |
+ }else if( pProbe->bUnordered==0 ){ | |
+ int j = (nEq==pProbe->nColumn ? -1 : pProbe->aiColumn[nEq]); | |
if( findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE|WO_GT|WO_GE, pIdx) ){ | |
WhereTerm *pTop = findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE, pIdx); | |
WhereTerm *pBtm = findTerm(pWC, iCur, j, notReady, WO_GT|WO_GE, pIdx); | |
@@ -103772,12 +105431,6 @@ | |
} | |
wsFlags |= (WHERE_COLUMN_RANGE|WHERE_ROWID_RANGE); | |
} | |
- }else if( pProbe->onError!=OE_None ){ | |
- testcase( wsFlags & WHERE_COLUMN_IN ); | |
- testcase( wsFlags & WHERE_COLUMN_NULL ); | |
- if( (wsFlags & (WHERE_COLUMN_IN|WHERE_COLUMN_NULL))==0 ){ | |
- wsFlags |= WHERE_UNIQUE; | |
- } | |
} | |
/* If there is an ORDER BY clause and the index being considered will | |
@@ -104388,10 +106041,12 @@ | |
j = i; | |
if( pPlan->wsFlags&WHERE_BTM_LIMIT ){ | |
- explainAppendTerm(&txt, i++, aCol[aiColumn[j]].zName, ">"); | |
+ char *z = (j==pIndex->nColumn ) ? "rowid" : aCol[aiColumn[j]].zName; | |
+ explainAppendTerm(&txt, i++, z, ">"); | |
} | |
if( pPlan->wsFlags&WHERE_TOP_LIMIT ){ | |
- explainAppendTerm(&txt, i, aCol[aiColumn[j]].zName, "<"); | |
+ char *z = (j==pIndex->nColumn ) ? "rowid" : aCol[aiColumn[j]].zName; | |
+ explainAppendTerm(&txt, i, z, "<"); | |
} | |
sqlite3StrAccumAppend(&txt, ")", 1); | |
return sqlite3StrAccumFinish(&txt); | |
@@ -104749,7 +106404,7 @@ | |
pIdx = pLevel->plan.u.pIdx; | |
iIdxCur = pLevel->iIdxCur; | |
- k = pIdx->aiColumn[nEq]; /* Column for inequality constraints */ | |
+ k = (nEq==pIdx->nColumn ? -1 : pIdx->aiColumn[nEq]); | |
/* If this loop satisfies a sort order (pOrderBy) request that | |
** was passed to this function to implement a "SELECT min(x) ..." | |
@@ -104795,7 +106450,9 @@ | |
** a forward order scan on a descending index, interchange the | |
** start and end terms (pRangeStart and pRangeEnd). | |
*/ | |
- if( nEq<pIdx->nColumn && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC) ){ | |
+ if( (nEq<pIdx->nColumn && bRev==(pIdx->aSortOrder[nEq]==SQLITE_SO_ASC)) | |
+ || (bRev && pIdx->nColumn==nEq) | |
+ ){ | |
SWAP(WhereTerm *, pRangeEnd, pRangeStart); | |
} | |
@@ -107561,7 +109218,6 @@ | |
UNUSED_PARAMETER(yypMinor); /* Silence some compiler warnings */ | |
sqlite3ErrorMsg(pParse, "parser stack overflow"); | |
- pParse->parseError = 1; | |
sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument var */ | |
} | |
@@ -108284,6 +109940,9 @@ | |
{ | |
SelectDest dest = {SRT_Output, 0, 0, 0, 0}; | |
sqlite3Select(pParse, yymsp[0].minor.yy387, &dest); | |
+ sqlite3ExplainBegin(pParse->pVdbe); | |
+ sqlite3ExplainSelect(pParse->pVdbe, yymsp[0].minor.yy387); | |
+ sqlite3ExplainFinish(pParse->pVdbe); | |
sqlite3SelectDelete(pParse->db, yymsp[0].minor.yy387); | |
} | |
break; | |
@@ -109162,7 +110821,6 @@ | |
UNUSED_PARAMETER(yymajor); /* Silence some compiler warnings */ | |
assert( TOKEN.z[0] ); /* The tokenizer always gives us a token */ | |
sqlite3ErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN); | |
- pParse->parseError = 1; | |
sqlite3ParserARG_STORE; /* Suppress warning about unused %extra_argument variable */ | |
} | |
@@ -109757,7 +111415,7 @@ | |
} | |
case '-': { | |
if( z[1]=='-' ){ | |
- /* IMP: R-15891-05542 -- syntax diagram for comments */ | |
+ /* IMP: R-50417-27976 -- syntax diagram for comments */ | |
for(i=2; (c=z[i])!=0 && c!='\n'; i++){} | |
*tokenType = TK_SPACE; /* IMP: R-22934-25134 */ | |
return i; | |
@@ -109790,7 +111448,7 @@ | |
*tokenType = TK_SLASH; | |
return 1; | |
} | |
- /* IMP: R-15891-05542 -- syntax diagram for comments */ | |
+ /* IMP: R-50417-27976 -- syntax diagram for comments */ | |
for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} | |
if( c ) i++; | |
*tokenType = TK_SPACE; /* IMP: R-22934-25134 */ | |
@@ -110584,8 +112242,8 @@ | |
*/ | |
SQLITE_API int sqlite3_libversion_number(void){ return SQLITE_VERSION_NUMBER; } | |
-/* IMPLEMENTATION-OF: R-54823-41343 The sqlite3_threadsafe() function returns | |
-** zero if and only if SQLite was compiled mutexing code omitted due to | |
+/* IMPLEMENTATION-OF: R-20790-14025 The sqlite3_threadsafe() function returns | |
+** zero if and only if SQLite was compiled with mutexing code omitted due to | |
** the SQLITE_THREADSAFE compile-time option being set to 0. | |
*/ | |
SQLITE_API int sqlite3_threadsafe(void){ return SQLITE_THREADSAFE; } | |
@@ -110774,8 +112432,8 @@ | |
*/ | |
#ifdef SQLITE_EXTRA_INIT | |
if( rc==SQLITE_OK && sqlite3GlobalConfig.isInit ){ | |
- int SQLITE_EXTRA_INIT(void); | |
- rc = SQLITE_EXTRA_INIT(); | |
+ int SQLITE_EXTRA_INIT(const char*); | |
+ rc = SQLITE_EXTRA_INIT(0); | |
} | |
#endif | |
@@ -110792,6 +112450,10 @@ | |
*/ | |
SQLITE_API int sqlite3_shutdown(void){ | |
if( sqlite3GlobalConfig.isInit ){ | |
+#ifdef SQLITE_EXTRA_SHUTDOWN | |
+ void SQLITE_EXTRA_SHUTDOWN(void); | |
+ SQLITE_EXTRA_SHUTDOWN(); | |
+#endif | |
sqlite3_os_end(); | |
sqlite3_reset_auto_extension(); | |
sqlite3GlobalConfig.isInit = 0; | |
@@ -110900,16 +112562,25 @@ | |
} | |
case SQLITE_CONFIG_PCACHE: { | |
- /* Specify an alternative page cache implementation */ | |
- sqlite3GlobalConfig.pcache = *va_arg(ap, sqlite3_pcache_methods*); | |
+ /* no-op */ | |
break; | |
} | |
- | |
case SQLITE_CONFIG_GETPCACHE: { | |
- if( sqlite3GlobalConfig.pcache.xInit==0 ){ | |
+ /* now an error */ | |
+ rc = SQLITE_ERROR; | |
+ break; | |
+ } | |
+ | |
+ case SQLITE_CONFIG_PCACHE2: { | |
+ /* Specify an alternative page cache implementation */ | |
+ sqlite3GlobalConfig.pcache2 = *va_arg(ap, sqlite3_pcache_methods2*); | |
+ break; | |
+ } | |
+ case SQLITE_CONFIG_GETPCACHE2: { | |
+ if( sqlite3GlobalConfig.pcache2.xInit==0 ){ | |
sqlite3PCacheSetDefault(); | |
} | |
- *va_arg(ap, sqlite3_pcache_methods*) = sqlite3GlobalConfig.pcache; | |
+ *va_arg(ap, sqlite3_pcache_methods2*) = sqlite3GlobalConfig.pcache2; | |
break; | |
} | |
@@ -111008,21 +112679,21 @@ | |
if( db->lookaside.bMalloced ){ | |
sqlite3_free(db->lookaside.pStart); | |
} | |
- /* The size of a lookaside slot needs to be larger than a pointer | |
- ** to be useful. | |
+ /* The size of a lookaside slot after ROUNDDOWN8 needs to be larger | |
+ ** than a pointer to be useful. | |
*/ | |
+ sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ | |
if( sz<=(int)sizeof(LookasideSlot*) ) sz = 0; | |
if( cnt<0 ) cnt = 0; | |
if( sz==0 || cnt==0 ){ | |
sz = 0; | |
pStart = 0; | |
}else if( pBuf==0 ){ | |
- sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ | |
sqlite3BeginBenignMalloc(); | |
pStart = sqlite3Malloc( sz*cnt ); /* IMP: R-61949-35727 */ | |
sqlite3EndBenignMalloc(); | |
+ if( pStart ) cnt = sqlite3MallocSize(pStart)/sz; | |
}else{ | |
- sz = ROUNDDOWN8(sz); /* IMP: R-33038-09382 */ | |
pStart = pBuf; | |
} | |
db->lookaside.pStart = pStart; | |
@@ -111057,6 +112728,26 @@ | |
} | |
/* | |
+** Free up as much memory as we can from the given database | |
+** connection. | |
+*/ | |
+SQLITE_API int sqlite3_db_release_memory(sqlite3 *db){ | |
+ int i; | |
+ sqlite3_mutex_enter(db->mutex); | |
+ sqlite3BtreeEnterAll(db); | |
+ for(i=0; i<db->nDb; i++){ | |
+ Btree *pBt = db->aDb[i].pBt; | |
+ if( pBt ){ | |
+ Pager *pPager = sqlite3BtreePager(pBt); | |
+ sqlite3PagerShrink(pPager); | |
+ } | |
+ } | |
+ sqlite3BtreeLeaveAll(db); | |
+ sqlite3_mutex_leave(db->mutex); | |
+ return SQLITE_OK; | |
+} | |
+ | |
+/* | |
** Configuration settings for an individual database connection | |
*/ | |
SQLITE_API int sqlite3_db_config(sqlite3 *db, int op, ...){ | |
@@ -112163,7 +113854,6 @@ | |
sqlite3* db, | |
const char *zName, | |
u8 enc, | |
- u8 collType, | |
void* pCtx, | |
int(*xCompare)(void*,int,const void*,int,const void*), | |
void(*xDel)(void*) | |
@@ -112228,7 +113918,6 @@ | |
pColl->pUser = pCtx; | |
pColl->xDel = xDel; | |
pColl->enc = (u8)(enc2 | (enc & SQLITE_UTF16_ALIGNED)); | |
- pColl->type = collType; | |
sqlite3Error(db, SQLITE_OK, 0); | |
return SQLITE_OK; | |
} | |
@@ -112689,14 +114378,10 @@ | |
** and UTF-16, so add a version for each to avoid any unnecessary | |
** conversions. The only error that can occur here is a malloc() failure. | |
*/ | |
- createCollation(db, "BINARY", SQLITE_UTF8, SQLITE_COLL_BINARY, 0, | |
- binCollFunc, 0); | |
- createCollation(db, "BINARY", SQLITE_UTF16BE, SQLITE_COLL_BINARY, 0, | |
- binCollFunc, 0); | |
- createCollation(db, "BINARY", SQLITE_UTF16LE, SQLITE_COLL_BINARY, 0, | |
- binCollFunc, 0); | |
- createCollation(db, "RTRIM", SQLITE_UTF8, SQLITE_COLL_USER, (void*)1, | |
- binCollFunc, 0); | |
+ createCollation(db, "BINARY", SQLITE_UTF8, 0, binCollFunc, 0); | |
+ createCollation(db, "BINARY", SQLITE_UTF16BE, 0, binCollFunc, 0); | |
+ createCollation(db, "BINARY", SQLITE_UTF16LE, 0, binCollFunc, 0); | |
+ createCollation(db, "RTRIM", SQLITE_UTF8, (void*)1, binCollFunc, 0); | |
if( db->mallocFailed ){ | |
goto opendb_out; | |
} | |
@@ -112704,8 +114389,7 @@ | |
assert( db->pDfltColl!=0 ); | |
/* Also add a UTF-8 case-insensitive collation sequence. */ | |
- createCollation(db, "NOCASE", SQLITE_UTF8, SQLITE_COLL_NOCASE, 0, | |
- nocaseCollatingFunc, 0); | |
+ createCollation(db, "NOCASE", SQLITE_UTF8, 0, nocaseCollatingFunc, 0); | |
/* Parse the filename/URI argument. */ | |
db->openFlags = flags; | |
@@ -112754,10 +114438,13 @@ | |
/* Load automatic extensions - extensions that have been registered | |
** using the sqlite3_automatic_extension() API. | |
*/ | |
- sqlite3AutoLoadExtensions(db); | |
rc = sqlite3_errcode(db); | |
- if( rc!=SQLITE_OK ){ | |
- goto opendb_out; | |
+ if( rc==SQLITE_OK ){ | |
+ sqlite3AutoLoadExtensions(db); | |
+ rc = sqlite3_errcode(db); | |
+ if( rc!=SQLITE_OK ){ | |
+ goto opendb_out; | |
+ } | |
} | |
#ifdef SQLITE_ENABLE_FTS1 | |
@@ -112898,7 +114585,7 @@ | |
int rc; | |
sqlite3_mutex_enter(db->mutex); | |
assert( !db->mallocFailed ); | |
- rc = createCollation(db, zName, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, 0); | |
+ rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, 0); | |
rc = sqlite3ApiExit(db, rc); | |
sqlite3_mutex_leave(db->mutex); | |
return rc; | |
@@ -112918,7 +114605,7 @@ | |
int rc; | |
sqlite3_mutex_enter(db->mutex); | |
assert( !db->mallocFailed ); | |
- rc = createCollation(db, zName, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, xDel); | |
+ rc = createCollation(db, zName, (u8)enc, pCtx, xCompare, xDel); | |
rc = sqlite3ApiExit(db, rc); | |
sqlite3_mutex_leave(db->mutex); | |
return rc; | |
@@ -112941,7 +114628,7 @@ | |
assert( !db->mallocFailed ); | |
zName8 = sqlite3Utf16to8(db, zName, -1, SQLITE_UTF16NATIVE); | |
if( zName8 ){ | |
- rc = createCollation(db, zName8, (u8)enc, SQLITE_COLL_USER, pCtx, xCompare, 0); | |
+ rc = createCollation(db, zName8, (u8)enc, pCtx, xCompare, 0); | |
sqlite3DbFree(db, zName8); | |
} | |
rc = sqlite3ApiExit(db, rc); | |
@@ -113424,15 +115111,6 @@ | |
} | |
#endif | |
- /* sqlite3_test_control(SQLITE_TESTCTRL_PGHDRSZ) | |
- ** | |
- ** Return the size of a pcache header in bytes. | |
- */ | |
- case SQLITE_TESTCTRL_PGHDRSZ: { | |
- rc = sizeof(PgHdr); | |
- break; | |
- } | |
- | |
/* sqlite3_test_control(SQLITE_TESTCTRL_SCRATCHMALLOC, sz, &pNew, pFree); | |
** | |
** Pass pFree into sqlite3ScratchFree(). | |
@@ -113460,6 +115138,22 @@ | |
break; | |
} | |
+#if defined(SQLITE_ENABLE_TREE_EXPLAIN) | |
+ /* sqlite3_test_control(SQLITE_TESTCTRL_EXPLAIN_STMT, | |
+ ** sqlite3_stmt*,const char**); | |
+ ** | |
+ ** If compiled with SQLITE_ENABLE_TREE_EXPLAIN, each sqlite3_stmt holds | |
+ ** a string that describes the optimized parse tree. This test-control | |
+ ** returns a pointer to that string. | |
+ */ | |
+ case SQLITE_TESTCTRL_EXPLAIN_STMT: { | |
+ sqlite3_stmt *pStmt = va_arg(ap, sqlite3_stmt*); | |
+ const char **pzRet = va_arg(ap, const char**); | |
+ *pzRet = sqlite3VdbeExplanation((Vdbe*)pStmt); | |
+ break; | |
+ } | |
+#endif | |
+ | |
} | |
va_end(ap); | |
#endif /* SQLITE_OMIT_BUILTIN_TEST */ | |
@@ -113478,6 +115172,7 @@ | |
** returns a NULL pointer. | |
*/ | |
SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam){ | |
+ if( zFilename==0 ) return 0; | |
zFilename += sqlite3Strlen30(zFilename) + 1; | |
while( zFilename[0] ){ | |
int x = strcmp(zFilename, zParam); | |
@@ -113488,6 +115183,44 @@ | |
return 0; | |
} | |
+/* | |
+** Return a boolean value for a query parameter. | |
+*/ | |
+SQLITE_API int sqlite3_uri_boolean(const char *zFilename, const char *zParam, int bDflt){ | |
+ const char *z = sqlite3_uri_parameter(zFilename, zParam); | |
+ return z ? sqlite3GetBoolean(z) : (bDflt!=0); | |
+} | |
+ | |
+/* | |
+** Return a 64-bit integer value for a query parameter. | |
+*/ | |
+SQLITE_API sqlite3_int64 sqlite3_uri_int64( | |
+ const char *zFilename, /* Filename as passed to xOpen */ | |
+ const char *zParam, /* URI parameter sought */ | |
+ sqlite3_int64 bDflt /* return if parameter is missing */ | |
+){ | |
+ const char *z = sqlite3_uri_parameter(zFilename, zParam); | |
+ sqlite3_int64 v; | |
+ if( z && sqlite3Atoi64(z, &v, sqlite3Strlen30(z), SQLITE_UTF8)==SQLITE_OK ){ | |
+ bDflt = v; | |
+ } | |
+ return bDflt; | |
+} | |
+ | |
+/* | |
+** Return the filename of the database associated with a database | |
+** connection. | |
+*/ | |
+SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName){ | |
+ int i; | |
+ for(i=0; i<db->nDb; i++){ | |
+ if( db->aDb[i].pBt && sqlite3StrICmp(zDbName, db->aDb[i].zName)==0 ){ | |
+ return sqlite3BtreeGetFilename(db->aDb[i].pBt); | |
+ } | |
+ } | |
+ return 0; | |
+} | |
+ | |
/************** End of main.c ************************************************/ | |
/************** Begin file notify.c ******************************************/ | |
/* | |
@@ -115331,6 +117064,7 @@ | |
char *z; | |
va_start(ap, zFormat); | |
z = sqlite3_vmprintf(zFormat, ap); | |
+ va_end(ap); | |
if( z && *pz ){ | |
char *z2 = sqlite3_mprintf("%s%s", *pz, z); | |
sqlite3_free(z); | |
@@ -121598,7 +123332,7 @@ | |
} porter_tokenizer; | |
/* | |
-** Class derived from sqlit3_tokenizer_cursor | |
+** Class derived from sqlite3_tokenizer_cursor | |
*/ | |
typedef struct porter_tokenizer_cursor { | |
sqlite3_tokenizer_cursor base; | |
@@ -124316,7 +126050,6 @@ | |
int nRoot, /* Size of buffer containing root node */ | |
Fts3SegReader **ppReader /* OUT: Allocated Fts3SegReader */ | |
){ | |
- int rc = SQLITE_OK; /* Return code */ | |
Fts3SegReader *pReader; /* Newly allocated SegReader object */ | |
int nExtra = 0; /* Bytes to allocate segment root node */ | |
@@ -124344,13 +126077,8 @@ | |
}else{ | |
pReader->iCurrentBlock = iStartLeaf-1; | |
} | |
- | |
- if( rc==SQLITE_OK ){ | |
- *ppReader = pReader; | |
- }else{ | |
- sqlite3Fts3SegReaderFree(pReader); | |
- } | |
- return rc; | |
+ *ppReader = pReader; | |
+ return SQLITE_OK; | |
} | |
/* | |
@@ -124400,6 +126128,7 @@ | |
Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */ | |
){ | |
Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */ | |
+ Fts3HashElem *pE; /* Iterator variable */ | |
Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */ | |
int nElem = 0; /* Size of array at aElem */ | |
int rc = SQLITE_OK; /* Return Code */ | |
@@ -124408,7 +126137,6 @@ | |
pHash = &p->aIndex[iIndex].hPending; | |
if( bPrefix ){ | |
int nAlloc = 0; /* Size of allocated array at aElem */ | |
- Fts3HashElem *pE = 0; /* Iterator variable */ | |
for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){ | |
char *zKey = (char *)fts3HashKey(pE); | |
@@ -124442,8 +126170,13 @@ | |
}else{ | |
/* The query is a simple term lookup that matches at most one term in | |
- ** the index. All that is required is a straight hash-lookup. */ | |
- Fts3HashElem *pE = fts3HashFindElem(pHash, zTerm, nTerm); | |
+ ** the index. All that is required is a straight hash-lookup. | |
+ ** | |
+ ** Because the stack address of pE may be accessed via the aElem pointer | |
+ ** below, the "Fts3HashElem *pE" must be declared so that it is valid | |
+ ** within this entire function, not just this "else{...}" block. | |
+ */ | |
+ pE = fts3HashFindElem(pHash, zTerm, nTerm); | |
if( pE ){ | |
aElem = &pE; | |
nElem = 1; | |
@@ -129023,7 +130756,7 @@ | |
int nBlob; | |
/* Check that value is actually a blob. */ | |
- if( !sqlite3_value_type(pValue)==SQLITE_BLOB ) return SQLITE_ERROR; | |
+ if( sqlite3_value_type(pValue)!=SQLITE_BLOB ) return SQLITE_ERROR; | |
/* Check that the blob is roughly the right size. */ | |
nBlob = sqlite3_value_bytes(pValue); | |
diff -u -r sqlite-autoconf-3070900/sqlite3.h sqlite-autoconf-3071000/sqlite3.h | |
--- sqlite-autoconf-3070900/sqlite3.h 2011-11-01 05:31:24.000000000 -0700 | |
+++ sqlite-autoconf-3071000/sqlite3.h 2012-01-16 06:04:57.000000000 -0800 | |
@@ -107,9 +107,9 @@ | |
** [sqlite3_libversion_number()], [sqlite3_sourceid()], | |
** [sqlite_version()] and [sqlite_source_id()]. | |
*/ | |
-#define SQLITE_VERSION "3.7.9" | |
-#define SQLITE_VERSION_NUMBER 3007009 | |
-#define SQLITE_SOURCE_ID "2011-11-01 00:52:41 c7c6050ef060877ebe77b41d959e9df13f8c9b5e" | |
+#define SQLITE_VERSION "3.7.10" | |
+#define SQLITE_VERSION_NUMBER 3007010 | |
+#define SQLITE_SOURCE_ID "2012-01-16 13:28:40 ebd01a8deffb5024a5d7494eef800d2366d97204" | |
/* | |
** CAPI3REF: Run-Time Library Version Numbers | |
@@ -177,7 +177,7 @@ | |
** CAPI3REF: Test To See If The Library Is Threadsafe | |
** | |
** ^The sqlite3_threadsafe() function returns zero if and only if | |
-** SQLite was compiled mutexing code omitted due to the | |
+** SQLite was compiled with mutexing code omitted due to the | |
** [SQLITE_THREADSAFE] compile-time option being set to 0. | |
** | |
** SQLite can be compiled with or without mutexes. When | |
@@ -371,7 +371,7 @@ | |
** KEYWORDS: {result code} {result codes} | |
** | |
** Many SQLite functions return an integer result code from the set shown | |
-** here in order to indicates success or failure. | |
+** here in order to indicate success or failure. | |
** | |
** New error codes may be added in future versions of SQLite. | |
** | |
@@ -509,7 +509,11 @@ | |
** first then the size of the file is extended, never the other | |
** way around. The SQLITE_IOCAP_SEQUENTIAL property means that | |
** information is written to disk in the same order as calls | |
-** to xWrite(). | |
+** to xWrite(). The SQLITE_IOCAP_POWERSAFE_OVERWRITE property means that | |
+** after reboot following a crash or power loss, the only bytes in a | |
+** file that were written at the application level might have changed | |
+** and that adjacent bytes, even bytes within the same sector are | |
+** guaranteed to be unchanged. | |
*/ | |
#define SQLITE_IOCAP_ATOMIC 0x00000001 | |
#define SQLITE_IOCAP_ATOMIC512 0x00000002 | |
@@ -523,6 +527,7 @@ | |
#define SQLITE_IOCAP_SAFE_APPEND 0x00000200 | |
#define SQLITE_IOCAP_SEQUENTIAL 0x00000400 | |
#define SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 0x00000800 | |
+#define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 | |
/* | |
** CAPI3REF: File Locking Levels | |
@@ -744,12 +749,12 @@ | |
** | |
** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic | |
** retry counts and intervals for certain disk I/O operations for the | |
-** windows [VFS] in order to work to provide robustness against | |
+** windows [VFS] in order to provide robustness in the presence of | |
** anti-virus programs. By default, the windows VFS will retry file read, | |
** file write, and file delete operations up to 10 times, with a delay | |
** of 25 milliseconds before the first retry and with the delay increasing | |
** by an additional 25 milliseconds with each subsequent retry. This | |
-** opcode allows those to values (10 retries and 25 milliseconds of delay) | |
+** opcode allows these two values (10 retries and 25 milliseconds of delay) | |
** to be adjusted. The values are changed for all database connections | |
** within the same process. The argument is a pointer to an array of two | |
** integers where the first integer i the new retry count and the second | |
@@ -772,22 +777,44 @@ | |
** WAL mode. If the integer is -1, then it is overwritten with the current | |
** WAL persistence setting. | |
** | |
+** ^The [SQLITE_FCNTL_POWERSAFE_OVERWRITE] opcode is used to set or query the | |
+** persistent "powersafe-overwrite" or "PSOW" setting. The PSOW setting | |
+** determines the [SQLITE_IOCAP_POWERSAFE_OVERWRITE] bit of the | |
+** xDeviceCharacteristics methods. The fourth parameter to | |
+** [sqlite3_file_control()] for this opcode should be a pointer to an integer. | |
+** That integer is 0 to disable zero-damage mode or 1 to enable zero-damage | |
+** mode. If the integer is -1, then it is overwritten with the current | |
+** zero-damage mode setting. | |
+** | |
** ^The [SQLITE_FCNTL_OVERWRITE] opcode is invoked by SQLite after opening | |
** a write transaction to indicate that, unless it is rolled back for some | |
** reason, the entire database file will be overwritten by the current | |
** transaction. This is used by VACUUM operations. | |
-*/ | |
-#define SQLITE_FCNTL_LOCKSTATE 1 | |
-#define SQLITE_GET_LOCKPROXYFILE 2 | |
-#define SQLITE_SET_LOCKPROXYFILE 3 | |
-#define SQLITE_LAST_ERRNO 4 | |
-#define SQLITE_FCNTL_SIZE_HINT 5 | |
-#define SQLITE_FCNTL_CHUNK_SIZE 6 | |
-#define SQLITE_FCNTL_FILE_POINTER 7 | |
-#define SQLITE_FCNTL_SYNC_OMITTED 8 | |
-#define SQLITE_FCNTL_WIN32_AV_RETRY 9 | |
-#define SQLITE_FCNTL_PERSIST_WAL 10 | |
-#define SQLITE_FCNTL_OVERWRITE 11 | |
+** | |
+** ^The [SQLITE_FCNTL_VFSNAME] opcode can be used to obtain the names of | |
+** all [VFSes] in the VFS stack. The names are of all VFS shims and the | |
+** final bottom-level VFS are written into memory obtained from | |
+** [sqlite3_malloc()] and the result is stored in the char* variable | |
+** that the fourth parameter of [sqlite3_file_control()] points to. | |
+** The caller is responsible for freeing the memory when done. As with | |
+** all file-control actions, there is no guarantee that this will actually | |
+** do anything. Callers should initialize the char* variable to a NULL | |
+** pointer in case this file-control is not implemented. This file-control | |
+** is intended for diagnostic use only. | |
+*/ | |
+#define SQLITE_FCNTL_LOCKSTATE 1 | |
+#define SQLITE_GET_LOCKPROXYFILE 2 | |
+#define SQLITE_SET_LOCKPROXYFILE 3 | |
+#define SQLITE_LAST_ERRNO 4 | |
+#define SQLITE_FCNTL_SIZE_HINT 5 | |
+#define SQLITE_FCNTL_CHUNK_SIZE 6 | |
+#define SQLITE_FCNTL_FILE_POINTER 7 | |
+#define SQLITE_FCNTL_SYNC_OMITTED 8 | |
+#define SQLITE_FCNTL_WIN32_AV_RETRY 9 | |
+#define SQLITE_FCNTL_PERSIST_WAL 10 | |
+#define SQLITE_FCNTL_OVERWRITE 11 | |
+#define SQLITE_FCNTL_VFSNAME 12 | |
+#define SQLITE_FCNTL_POWERSAFE_OVERWRITE 13 | |
/* | |
** CAPI3REF: Mutex Handle | |
@@ -842,7 +869,7 @@ | |
** from xFullPathname() with an optional suffix added. | |
** ^If a suffix is added to the zFilename parameter, it will | |
** consist of a single "-" character followed by no more than | |
-** 10 alphanumeric and/or "-" characters. | |
+** 11 alphanumeric and/or "-" characters. | |
** ^SQLite further guarantees that | |
** the string will be valid and unchanged until xClose() is | |
** called. Because of the previous sentence, | |
@@ -1373,7 +1400,7 @@ | |
** <dd> ^This option specifies a static memory buffer that SQLite can use for | |
** the database page cache with the default page cache implementation. | |
** This configuration should not be used if an application-define page | |
-** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option. | |
+** cache implementation is loaded using the SQLITE_CONFIG_PCACHE2 option. | |
** There are three arguments to this option: A pointer to 8-byte aligned | |
** memory, the size of each page buffer (sz), and the number of pages (N). | |
** The sz argument should be the size of the largest database page | |
@@ -1442,15 +1469,15 @@ | |
** verb to [sqlite3_db_config()] can be used to change the lookaside | |
** configuration on individual connections.)^ </dd> | |
** | |
-** [[SQLITE_CONFIG_PCACHE]] <dt>SQLITE_CONFIG_PCACHE</dt> | |
+** [[SQLITE_CONFIG_PCACHE2]] <dt>SQLITE_CONFIG_PCACHE2</dt> | |
** <dd> ^(This option takes a single argument which is a pointer to | |
-** an [sqlite3_pcache_methods] object. This object specifies the interface | |
+** an [sqlite3_pcache_methods2] object. This object specifies the interface | |
** to a custom page cache implementation.)^ ^SQLite makes a copy of the | |
** object and uses it for page cache memory allocations.</dd> | |
** | |
-** [[SQLITE_CONFIG_GETPCACHE]] <dt>SQLITE_CONFIG_GETPCACHE</dt> | |
+** [[SQLITE_CONFIG_GETPCACHE2]] <dt>SQLITE_CONFIG_GETPCACHE2</dt> | |
** <dd> ^(This option takes a single argument which is a pointer to an | |
-** [sqlite3_pcache_methods] object. SQLite copies of the current | |
+** [sqlite3_pcache_methods2] object. SQLite copies of the current | |
** page cache implementation into that object.)^ </dd> | |
** | |
** [[SQLITE_CONFIG_LOG]] <dt>SQLITE_CONFIG_LOG</dt> | |
@@ -1483,6 +1510,11 @@ | |
** database connection is opened. By default, URI handling is globally | |
** disabled. The default value may be changed by compiling with the | |
** [SQLITE_USE_URI] symbol defined. | |
+** | |
+** [[SQLITE_CONFIG_PCACHE]] [[SQLITE_CONFIG_GETPCACHE]] | |
+** <dt>SQLITE_CONFIG_PCACHE and SQLITE_CONFNIG_GETPCACHE | |
+** <dd> These options are obsolete and should not be used by new code. | |
+** They are retained for backwards compatibility but are now no-ops. | |
** </dl> | |
*/ | |
#define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ | |
@@ -1498,10 +1530,12 @@ | |
#define SQLITE_CONFIG_GETMUTEX 11 /* sqlite3_mutex_methods* */ | |
/* previously SQLITE_CONFIG_CHUNKALLOC 12 which is now unused. */ | |
#define SQLITE_CONFIG_LOOKASIDE 13 /* int int */ | |
-#define SQLITE_CONFIG_PCACHE 14 /* sqlite3_pcache_methods* */ | |
-#define SQLITE_CONFIG_GETPCACHE 15 /* sqlite3_pcache_methods* */ | |
+#define SQLITE_CONFIG_PCACHE 14 /* no-op */ | |
+#define SQLITE_CONFIG_GETPCACHE 15 /* no-op */ | |
#define SQLITE_CONFIG_LOG 16 /* xFunc, void* */ | |
#define SQLITE_CONFIG_URI 17 /* int */ | |
+#define SQLITE_CONFIG_PCACHE2 18 /* sqlite3_pcache_methods2* */ | |
+#define SQLITE_CONFIG_GETPCACHE2 19 /* sqlite3_pcache_methods2* */ | |
/* | |
** CAPI3REF: Database Connection Configuration Options | |
@@ -1986,7 +2020,7 @@ | |
** All of the usual printf() formatting options apply. In addition, there | |
** is are "%q", "%Q", and "%z" options. | |
** | |
-** ^(The %q option works like %s in that it substitutes a null-terminated | |
+** ^(The %q option works like %s in that it substitutes a nul-terminated | |
** string from the argument list. But %q also doubles every '\'' character. | |
** %q is designed for use inside a string literal.)^ By doubling each '\'' | |
** character it escapes that character and allows it to be inserted into | |
@@ -2594,21 +2628,40 @@ | |
/* | |
** CAPI3REF: Obtain Values For URI Parameters | |
** | |
-** This is a utility routine, useful to VFS implementations, that checks | |
+** These are utility routines, useful to VFS implementations, that check | |
** to see if a database file was a URI that contained a specific query | |
-** parameter, and if so obtains the value of the query parameter. | |
+** parameter, and if so obtains the value of that query parameter. | |
** | |
-** The zFilename argument is the filename pointer passed into the xOpen() | |
-** method of a VFS implementation. The zParam argument is the name of the | |
-** query parameter we seek. This routine returns the value of the zParam | |
-** parameter if it exists. If the parameter does not exist, this routine | |
-** returns a NULL pointer. | |
-** | |
-** If the zFilename argument to this function is not a pointer that SQLite | |
-** passed into the xOpen VFS method, then the behavior of this routine | |
-** is undefined and probably undesirable. | |
+** If F is the database filename pointer passed into the xOpen() method of | |
+** a VFS implementation when the flags parameter to xOpen() has one or | |
+** more of the [SQLITE_OPEN_URI] or [SQLITE_OPEN_MAIN_DB] bits set and | |
+** P is the name of the query parameter, then | |
+** sqlite3_uri_parameter(F,P) returns the value of the P | |
+** parameter if it exists or a NULL pointer if P does not appear as a | |
+** query parameter on F. If P is a query parameter of F | |
+** has no explicit value, then sqlite3_uri_parameter(F,P) returns | |
+** a pointer to an empty string. | |
+** | |
+** The sqlite3_uri_boolean(F,P,B) routine assumes that P is a boolean | |
+** parameter and returns true (1) or false (0) according to the value | |
+** of P. The value of P is true if it is "yes" or "true" or "on" or | |
+** a non-zero number and is false otherwise. If P is not a query parameter | |
+** on F then sqlite3_uri_boolean(F,P,B) returns (B!=0). | |
+** | |
+** The sqlite3_uri_int64(F,P,D) routine converts the value of P into a | |
+** 64-bit signed integer and returns that integer, or D if P does not | |
+** exist. If the value of P is something other than an integer, then | |
+** zero is returned. | |
+** | |
+** If F is a NULL pointer, then sqlite3_uri_parameter(F,P) returns NULL and | |
+** sqlite3_uri_boolean(F,P,B) returns B. If F is not a NULL pointer and | |
+** is not a database file pathname pointer that SQLite passed into the xOpen | |
+** VFS method, then the behavior of this routine is undefined and probably | |
+** undesirable. | |
*/ | |
SQLITE_API const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); | |
+SQLITE_API int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); | |
+SQLITE_API sqlite3_int64 sqlite3_uri_int64(const char*, const char*, sqlite3_int64); | |
/* | |
@@ -2931,6 +2984,25 @@ | |
SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); | |
/* | |
+** CAPI3REF: Determine If A Prepared Statement Has Been Reset | |
+** | |
+** ^The sqlite3_stmt_busy(S) interface returns true (non-zero) if the | |
+** [prepared statement] S has been stepped at least once using | |
+** [sqlite3_step(S)] but has not run to completion and/or has not | |
+** been reset using [sqlite3_reset(S)]. ^The sqlite3_stmt_busy(S) | |
+** interface returns false if S is a NULL pointer. If S is not a | |
+** NULL pointer and is not a pointer to a valid [prepared statement] | |
+** object, then the behavior is undefined and probably undesirable. | |
+** | |
+** This interface can be used in combination [sqlite3_next_stmt()] | |
+** to locate all prepared statements associated with a database | |
+** connection that are in need of being reset. This can be used, | |
+** for example, in diagnostic routines to search for prepared | |
+** statements that are holding a transaction open. | |
+*/ | |
+SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); | |
+ | |
+/* | |
** CAPI3REF: Dynamically Typed Value Object | |
** KEYWORDS: {protected sqlite3_value} {unprotected sqlite3_value} | |
** | |
@@ -3471,7 +3543,7 @@ | |
** bytes in the string, not the number of characters. | |
** | |
** ^Strings returned by sqlite3_column_text() and sqlite3_column_text16(), | |
-** even empty strings, are always zero terminated. ^The return | |
+** even empty strings, are always zero-terminated. ^The return | |
** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer. | |
** | |
** ^The object returned by [sqlite3_column_value()] is an | |
@@ -4372,6 +4444,22 @@ | |
SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); | |
/* | |
+** CAPI3REF: Return The Filename For A Database Connection | |
+** | |
+** ^The sqlite3_db_filename(D,N) interface returns a pointer to a filename | |
+** associated with database N of connection D. ^The main database file | |
+** has the name "main". If there is no attached database N on the database | |
+** connection D, or if database N is a temporary or in-memory database, then | |
+** a NULL pointer is returned. | |
+** | |
+** ^The filename returned by this function is the output of the | |
+** xFullPathname method of the [VFS]. ^In other words, the filename | |
+** will be an absolute pathname, even if the filename used | |
+** to open the database originally was a URI or relative pathname. | |
+*/ | |
+SQLITE_API const char *sqlite3_db_filename(sqlite3 *db, const char *zDbName); | |
+ | |
+/* | |
** CAPI3REF: Find the next prepared statement | |
** | |
** ^This interface returns a pointer to the next [prepared statement] after | |
@@ -4406,13 +4494,15 @@ | |
** on the same [database connection] D, or NULL for | |
** the first call for each function on D. | |
** | |
+** The commit and rollback hook callbacks are not reentrant. | |
** The callback implementation must not do anything that will modify | |
** the database connection that invoked the callback. Any actions | |
** to modify the database connection must be deferred until after the | |
** completion of the [sqlite3_step()] call that triggered the commit | |
** or rollback hook in the first place. | |
-** Note that [sqlite3_prepare_v2()] and [sqlite3_step()] both modify their | |
-** database connections for the meaning of "modify" in this paragraph. | |
+** Note that running any other SQL statements, including SELECT statements, | |
+** or merely calling [sqlite3_prepare_v2()] and [sqlite3_step()] will modify | |
+** the database connections for the meaning of "modify" in this paragraph. | |
** | |
** ^Registering a NULL function disables the callback. | |
** | |
@@ -4525,10 +4615,25 @@ | |
** which might be more or less than the amount requested. | |
** ^The sqlite3_release_memory() routine is a no-op returning zero | |
** if SQLite is not compiled with [SQLITE_ENABLE_MEMORY_MANAGEMENT]. | |
+** | |
+** See also: [sqlite3_db_release_memory()] | |
*/ | |
SQLITE_API int sqlite3_release_memory(int); | |
/* | |
+** CAPI3REF: Free Memory Used By A Database Connection | |
+** | |
+** ^The sqlite3_db_release_memory(D) interface attempts to free as much heap | |
+** memory as possible from database connection D. Unlike the | |
+** [sqlite3_release_memory()] interface, this interface is effect even | |
+** when then [SQLITE_ENABLE_MEMORY_MANAGEMENT] compile-time option is | |
+** omitted. | |
+** | |
+** See also: [sqlite3_release_memory()] | |
+*/ | |
+SQLITE_API int sqlite3_db_release_memory(sqlite3*); | |
+ | |
+/* | |
** CAPI3REF: Impose A Limit On Heap Size | |
** | |
** ^The sqlite3_soft_heap_limit64() interface sets and/or queries the | |
@@ -4542,7 +4647,8 @@ | |
** is advisory only. | |
** | |
** ^The return value from sqlite3_soft_heap_limit64() is the size of | |
-** the soft heap limit prior to the call. ^If the argument N is negative | |
+** the soft heap limit prior to the call, or negative in the case of an | |
+** error. ^If the argument N is negative | |
** then no change is made to the soft heap limit. Hence, the current | |
** size of the soft heap limit can be determined by invoking | |
** sqlite3_soft_heap_limit64() with a negative argument. | |
@@ -4558,7 +4664,7 @@ | |
** [sqlite3_config]([SQLITE_CONFIG_MEMSTATUS],...) start-time option and | |
** the [SQLITE_DEFAULT_MEMSTATUS] compile-time option. | |
** <li> An alternative page cache implementation is specified using | |
-** [sqlite3_config]([SQLITE_CONFIG_PCACHE],...). | |
+** [sqlite3_config]([SQLITE_CONFIG_PCACHE2],...). | |
** <li> The page cache allocates from its own memory pool supplied | |
** by [sqlite3_config]([SQLITE_CONFIG_PAGECACHE],...) rather than | |
** from the heap. | |
@@ -5300,7 +5406,7 @@ | |
** | |
** <ul> | |
** <li> SQLITE_MUTEX_OS2 | |
-** <li> SQLITE_MUTEX_PTHREAD | |
+** <li> SQLITE_MUTEX_PTHREADS | |
** <li> SQLITE_MUTEX_W32 | |
** <li> SQLITE_MUTEX_NOOP | |
** </ul>)^ | |
@@ -5308,7 +5414,7 @@ | |
** ^The SQLITE_MUTEX_NOOP implementation is a set of routines | |
** that does no real locking and is appropriate for use in | |
** a single-threaded application. ^The SQLITE_MUTEX_OS2, | |
-** SQLITE_MUTEX_PTHREAD, and SQLITE_MUTEX_W32 implementations | |
+** SQLITE_MUTEX_PTHREADS, and SQLITE_MUTEX_W32 implementations | |
** are appropriate for use on OS/2, Unix, and Windows. | |
** | |
** ^(If SQLite is compiled with the SQLITE_MUTEX_APPDEF preprocessor | |
@@ -5498,7 +5604,7 @@ | |
** ^These routines should return true if the mutex in their argument | |
** is held or not held, respectively, by the calling thread. | |
** | |
-** ^The implementation is not required to provided versions of these | |
+** ^The implementation is not required to provide versions of these | |
** routines that actually work. If the implementation does not provide working | |
** versions of these routines, it should at least provide stubs that always | |
** return true so that one does not get spurious assertion failures. | |
@@ -5626,9 +5732,9 @@ | |
#define SQLITE_TESTCTRL_RESERVE 14 | |
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15 | |
#define SQLITE_TESTCTRL_ISKEYWORD 16 | |
-#define SQLITE_TESTCTRL_PGHDRSZ 17 | |
-#define SQLITE_TESTCTRL_SCRATCHMALLOC 18 | |
-#define SQLITE_TESTCTRL_LOCALTIME_FAULT 19 | |
+#define SQLITE_TESTCTRL_SCRATCHMALLOC 17 | |
+#define SQLITE_TESTCTRL_LOCALTIME_FAULT 18 | |
+#define SQLITE_TESTCTRL_EXPLAIN_STMT 19 | |
#define SQLITE_TESTCTRL_LAST 19 | |
/* | |
@@ -5931,17 +6037,33 @@ | |
** sqlite3_pcache object except by holding and passing pointers | |
** to the object. | |
** | |
-** See [sqlite3_pcache_methods] for additional information. | |
+** See [sqlite3_pcache_methods2] for additional information. | |
*/ | |
typedef struct sqlite3_pcache sqlite3_pcache; | |
/* | |
+** CAPI3REF: Custom Page Cache Object | |
+** | |
+** The sqlite3_pcache_page object represents a single page in the | |
+** page cache. The page cache will allocate instances of this | |
+** object. Various methods of the page cache use pointers to instances | |
+** of this object as parameters or as their return value. | |
+** | |
+** See [sqlite3_pcache_methods2] for additional information. | |
+*/ | |
+typedef struct sqlite3_pcache_page sqlite3_pcache_page; | |
+struct sqlite3_pcache_page { | |
+ void *pBuf; /* The content of the page */ | |
+ void *pExtra; /* Extra information associated with the page */ | |
+}; | |
+ | |
+/* | |
** CAPI3REF: Application Defined Page Cache. | |
** KEYWORDS: {page cache} | |
** | |
-** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE], ...) interface can | |
+** ^(The [sqlite3_config]([SQLITE_CONFIG_PCACHE2], ...) interface can | |
** register an alternative page cache implementation by passing in an | |
-** instance of the sqlite3_pcache_methods structure.)^ | |
+** instance of the sqlite3_pcache_methods2 structure.)^ | |
** In many applications, most of the heap memory allocated by | |
** SQLite is used for the page cache. | |
** By implementing a | |
@@ -5955,7 +6077,7 @@ | |
** extreme measure that is only needed by the most demanding applications. | |
** The built-in page cache is recommended for most uses. | |
** | |
-** ^(The contents of the sqlite3_pcache_methods structure are copied to an | |
+** ^(The contents of the sqlite3_pcache_methods2 structure are copied to an | |
** internal buffer by SQLite within the call to [sqlite3_config]. Hence | |
** the application may discard the parameter after the call to | |
** [sqlite3_config()] returns.)^ | |
@@ -5964,7 +6086,7 @@ | |
** ^(The xInit() method is called once for each effective | |
** call to [sqlite3_initialize()])^ | |
** (usually only once during the lifetime of the process). ^(The xInit() | |
-** method is passed a copy of the sqlite3_pcache_methods.pArg value.)^ | |
+** method is passed a copy of the sqlite3_pcache_methods2.pArg value.)^ | |
** The intent of the xInit() method is to set up global data structures | |
** required by the custom page cache implementation. | |
** ^(If the xInit() method is NULL, then the | |
@@ -5991,17 +6113,15 @@ | |
** SQLite will typically create one cache instance for each open database file, | |
** though this is not guaranteed. ^The | |
** first parameter, szPage, is the size in bytes of the pages that must | |
-** be allocated by the cache. ^szPage will not be a power of two. ^szPage | |
-** will the page size of the database file that is to be cached plus an | |
-** increment (here called "R") of less than 250. SQLite will use the | |
-** extra R bytes on each page to store metadata about the underlying | |
-** database page on disk. The value of R depends | |
+** be allocated by the cache. ^szPage will always a power of two. ^The | |
+** second parameter szExtra is a number of bytes of extra storage | |
+** associated with each page cache entry. ^The szExtra parameter will | |
+** a number less than 250. SQLite will use the | |
+** extra szExtra bytes on each page to store metadata about the underlying | |
+** database page on disk. The value passed into szExtra depends | |
** on the SQLite version, the target platform, and how SQLite was compiled. | |
-** ^(R is constant for a particular build of SQLite. Except, there are two | |
-** distinct values of R when SQLite is compiled with the proprietary | |
-** ZIPVFS extension.)^ ^The second argument to | |
-** xCreate(), bPurgeable, is true if the cache being created will | |
-** be used to cache database pages of a file stored on disk, or | |
+** ^The third argument to xCreate(), bPurgeable, is true if the cache being | |
+** created will be used to cache database pages of a file stored on disk, or | |
** false if it is used for an in-memory database. The cache implementation | |
** does not have to do anything special based with the value of bPurgeable; | |
** it is purely advisory. ^On a cache where bPurgeable is false, SQLite will | |
@@ -6025,11 +6145,16 @@ | |
** | |
** [[the xFetch() page cache methods]] | |
** The xFetch() method locates a page in the cache and returns a pointer to | |
-** the page, or a NULL pointer. | |
-** A "page", in this context, means a buffer of szPage bytes aligned at an | |
-** 8-byte boundary. The page to be fetched is determined by the key. ^The | |
-** minimum key value is 1. After it has been retrieved using xFetch, the page | |
-** is considered to be "pinned". | |
+** an sqlite3_pcache_page object associated with that page, or a NULL pointer. | |
+** The pBuf element of the returned sqlite3_pcache_page object will be a | |
+** pointer to a buffer of szPage bytes used to store the content of a | |
+** single database page. The pExtra element of sqlite3_pcache_page will be | |
+** a pointer to the szExtra bytes of extra storage that SQLite has requested | |
+** for each entry in the page cache. | |
+** | |
+** The page to be fetched is determined by the key. ^The minimum key value | |
+** is 1. After it has been retrieved using xFetch, the page is considered | |
+** to be "pinned". | |
** | |
** If the requested page is already in the page cache, then the page cache | |
** implementation must return a pointer to the page buffer with its content | |
@@ -6082,8 +6207,37 @@ | |
** ^The xDestroy() method is used to delete a cache allocated by xCreate(). | |
** All resources associated with the specified cache should be freed. ^After | |
** calling the xDestroy() method, SQLite considers the [sqlite3_pcache*] | |
-** handle invalid, and will not use it with any other sqlite3_pcache_methods | |
+** handle invalid, and will not use it with any other sqlite3_pcache_methods2 | |
** functions. | |
+** | |
+** [[the xShrink() page cache method]] | |
+** ^SQLite invokes the xShrink() method when it wants the page cache to | |
+** free up as much of heap memory as possible. The page cache implementation | |
+** is not obligated to free any memory, but well-behaved implementations should | |
+** do their best. | |
+*/ | |
+typedef struct sqlite3_pcache_methods2 sqlite3_pcache_methods2; | |
+struct sqlite3_pcache_methods2 { | |
+ int iVersion; | |
+ void *pArg; | |
+ int (*xInit)(void*); | |
+ void (*xShutdown)(void*); | |
+ sqlite3_pcache *(*xCreate)(int szPage, int szExtra, int bPurgeable); | |
+ void (*xCachesize)(sqlite3_pcache*, int nCachesize); | |
+ int (*xPagecount)(sqlite3_pcache*); | |
+ sqlite3_pcache_page *(*xFetch)(sqlite3_pcache*, unsigned key, int createFlag); | |
+ void (*xUnpin)(sqlite3_pcache*, sqlite3_pcache_page*, int discard); | |
+ void (*xRekey)(sqlite3_pcache*, sqlite3_pcache_page*, | |
+ unsigned oldKey, unsigned newKey); | |
+ void (*xTruncate)(sqlite3_pcache*, unsigned iLimit); | |
+ void (*xDestroy)(sqlite3_pcache*); | |
+ void (*xShrink)(sqlite3_pcache*); | |
+}; | |
+ | |
+/* | |
+** This is the obsolete pcache_methods object that has now been replaced | |
+** by sqlite3_pcache_methods2. This object is not used by SQLite. It is | |
+** retained in the header file for backwards compatibility only. | |
*/ | |
typedef struct sqlite3_pcache_methods sqlite3_pcache_methods; | |
struct sqlite3_pcache_methods { | |
@@ -6100,6 +6254,7 @@ | |
void (*xDestroy)(sqlite3_pcache*); | |
}; | |
+ | |
/* | |
** CAPI3REF: Online Backup Object | |
** | |
Binary files sqlite-autoconf-3070900/sqlite3.o and sqlite-autoconf-3071000/sqlite3.o differ | |
diff -u -r sqlite-autoconf-3070900/sqlite3.pc sqlite-autoconf-3071000/sqlite3.pc | |
--- sqlite-autoconf-3070900/sqlite3.pc 2013-03-29 16:45:44.000000000 -0700 | |
+++ sqlite-autoconf-3071000/sqlite3.pc 2013-03-29 18:33:45.000000000 -0700 | |
@@ -1,13 +1,13 @@ | |
# Package Information for pkg-config | |
-prefix=/opt/sqlite-3070900 | |
+prefix=/opt/sqlite-3071000 | |
exec_prefix=${prefix} | |
libdir=${exec_prefix}/lib | |
includedir=${prefix}/include | |
Name: SQLite | |
Description: SQL database engine | |
-Version: 3.7.9 | |
+Version: 3.7.10 | |
Libs: -L${libdir} -lsqlite3 | |
Libs.private: | |
Cflags: -I${includedir} | |
diff -u -r sqlite-autoconf-3070900/tea/configure sqlite-autoconf-3071000/tea/configure | |
--- sqlite-autoconf-3070900/tea/configure 2011-11-01 05:31:24.000000000 -0700 | |
+++ sqlite-autoconf-3071000/tea/configure 2012-01-16 06:04:57.000000000 -0800 | |
@@ -1,11 +1,11 @@ | |
#! /bin/sh | |
# Guess values for system-dependent variables and create Makefiles. | |
-# Generated by GNU Autoconf 2.65 for sqlite 3.7.9. | |
+# Generated by GNU Autoconf 2.68 for sqlite 3.7.10. | |
# | |
# | |
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, | |
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, | |
-# Inc. | |
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software | |
+# Foundation, Inc. | |
# | |
# | |
# This configure script is free software; the Free Software Foundation | |
@@ -89,6 +89,7 @@ | |
IFS=" "" $as_nl" | |
# Find who we are. Look in the path if we contain no directory separator. | |
+as_myself= | |
case $0 in #(( | |
*[\\/]* ) as_myself=$0 ;; | |
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -214,11 +215,18 @@ | |
# We cannot yet assume a decent shell, so we have to provide a | |
# neutralization value for shells without unset; and this also | |
# works around shells that cannot unset nonexistent variables. | |
+ # Preserve -v and -x to the replacement shell. | |
BASH_ENV=/dev/null | |
ENV=/dev/null | |
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV | |
export CONFIG_SHELL | |
- exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} | |
+ case $- in # (((( | |
+ *v*x* | *x*v* ) as_opts=-vx ;; | |
+ *v* ) as_opts=-v ;; | |
+ *x* ) as_opts=-x ;; | |
+ * ) as_opts= ;; | |
+ esac | |
+ exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"} | |
fi | |
if test x$as_have_required = xno; then : | |
@@ -316,7 +324,7 @@ | |
test -d "$as_dir" && break | |
done | |
test -z "$as_dirs" || eval "mkdir $as_dirs" | |
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" | |
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" | |
} # as_fn_mkdir_p | |
@@ -356,19 +364,19 @@ | |
fi # as_fn_arith | |
-# as_fn_error ERROR [LINENO LOG_FD] | |
-# --------------------------------- | |
+# as_fn_error STATUS ERROR [LINENO LOG_FD] | |
+# ---------------------------------------- | |
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are | |
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the | |
-# script with status $?, using 1 if that was 0. | |
+# script with STATUS, using 1 if that was 0. | |
as_fn_error () | |
{ | |
- as_status=$?; test $as_status -eq 0 && as_status=1 | |
- if test "$3"; then | |
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 | |
+ as_status=$1; test $as_status -eq 0 && as_status=1 | |
+ if test "$4"; then | |
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 | |
fi | |
- $as_echo "$as_me: error: $1" >&2 | |
+ $as_echo "$as_me: error: $2" >&2 | |
as_fn_exit $as_status | |
} # as_fn_error | |
@@ -530,7 +538,7 @@ | |
exec 6>&1 | |
# Name of the host. | |
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, | |
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, | |
# so uname gets run too. | |
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` | |
@@ -549,8 +557,8 @@ | |
# Identity of this package. | |
PACKAGE_NAME='sqlite' | |
PACKAGE_TARNAME='sqlite' | |
-PACKAGE_VERSION='3.7.9' | |
-PACKAGE_STRING='sqlite 3.7.9' | |
+PACKAGE_VERSION='3.7.10' | |
+PACKAGE_STRING='sqlite 3.7.10' | |
PACKAGE_BUGREPORT='' | |
PACKAGE_URL='' | |
@@ -782,8 +790,9 @@ | |
fi | |
case $ac_option in | |
- *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; | |
- *) ac_optarg=yes ;; | |
+ *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; | |
+ *=) ac_optarg= ;; | |
+ *) ac_optarg=yes ;; | |
esac | |
# Accept the important Cygnus configure options, so we can diagnose typos. | |
@@ -828,7 +837,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid feature name: $ac_useropt" | |
+ as_fn_error $? "invalid feature name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -854,7 +863,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid feature name: $ac_useropt" | |
+ as_fn_error $? "invalid feature name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1058,7 +1067,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid package name: $ac_useropt" | |
+ as_fn_error $? "invalid package name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1074,7 +1083,7 @@ | |
ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` | |
# Reject names that are not valid shell variable names. | |
expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && | |
- as_fn_error "invalid package name: $ac_useropt" | |
+ as_fn_error $? "invalid package name: $ac_useropt" | |
ac_useropt_orig=$ac_useropt | |
ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` | |
case $ac_user_opts in | |
@@ -1104,8 +1113,8 @@ | |
| --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) | |
x_libraries=$ac_optarg ;; | |
- -*) as_fn_error "unrecognized option: \`$ac_option' | |
-Try \`$0 --help' for more information." | |
+ -*) as_fn_error $? "unrecognized option: \`$ac_option' | |
+Try \`$0 --help' for more information" | |
;; | |
*=*) | |
@@ -1113,7 +1122,7 @@ | |
# Reject names that are not valid shell variable names. | |
case $ac_envvar in #( | |
'' | [0-9]* | *[!_$as_cr_alnum]* ) | |
- as_fn_error "invalid variable name: \`$ac_envvar'" ;; | |
+ as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; | |
esac | |
eval $ac_envvar=\$ac_optarg | |
export $ac_envvar ;; | |
@@ -1123,7 +1132,7 @@ | |
$as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 | |
expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && | |
$as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 | |
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} | |
+ : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" | |
;; | |
esac | |
@@ -1131,13 +1140,13 @@ | |
if test -n "$ac_prev"; then | |
ac_option=--`echo $ac_prev | sed 's/_/-/g'` | |
- as_fn_error "missing argument to $ac_option" | |
+ as_fn_error $? "missing argument to $ac_option" | |
fi | |
if test -n "$ac_unrecognized_opts"; then | |
case $enable_option_checking in | |
no) ;; | |
- fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; | |
+ fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; | |
*) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; | |
esac | |
fi | |
@@ -1160,7 +1169,7 @@ | |
[\\/$]* | ?:[\\/]* ) continue;; | |
NONE | '' ) case $ac_var in *prefix ) continue;; esac;; | |
esac | |
- as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" | |
+ as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" | |
done | |
# There might be people who depend on the old broken behavior: `$host' | |
@@ -1174,8 +1183,8 @@ | |
if test "x$host_alias" != x; then | |
if test "x$build_alias" = x; then | |
cross_compiling=maybe | |
- $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. | |
- If a cross compiler is detected then cross compile mode will be used." >&2 | |
+ $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host. | |
+ If a cross compiler is detected then cross compile mode will be used" >&2 | |
elif test "x$build_alias" != "x$host_alias"; then | |
cross_compiling=yes | |
fi | |
@@ -1190,9 +1199,9 @@ | |
ac_pwd=`pwd` && test -n "$ac_pwd" && | |
ac_ls_di=`ls -di .` && | |
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || | |
- as_fn_error "working directory cannot be determined" | |
+ as_fn_error $? "working directory cannot be determined" | |
test "X$ac_ls_di" = "X$ac_pwd_ls_di" || | |
- as_fn_error "pwd does not report name of working directory" | |
+ as_fn_error $? "pwd does not report name of working directory" | |
# Find the source files, if location was not specified. | |
@@ -1231,11 +1240,11 @@ | |
fi | |
if test ! -r "$srcdir/$ac_unique_file"; then | |
test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." | |
- as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" | |
+ as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" | |
fi | |
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" | |
ac_abs_confdir=`( | |
- cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" | |
+ cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" | |
pwd)` | |
# When building in place, set srcdir=. | |
if test "$ac_abs_confdir" = "$ac_pwd"; then | |
@@ -1261,7 +1270,7 @@ | |
# Omit some internal or obsolete options to make the list less imposing. | |
# This message is too long to be a string in the A/UX 3.1 sh. | |
cat <<_ACEOF | |
-\`configure' configures sqlite 3.7.9 to adapt to many kinds of systems. | |
+\`configure' configures sqlite 3.7.10 to adapt to many kinds of systems. | |
Usage: $0 [OPTION]... [VAR=VALUE]... | |
@@ -1275,7 +1284,7 @@ | |
--help=short display options specific to this package | |
--help=recursive display the short help of all the included packages | |
-V, --version display version information and exit | |
- -q, --quiet, --silent do not print \`checking...' messages | |
+ -q, --quiet, --silent do not print \`checking ...' messages | |
--cache-file=FILE cache test results in FILE [disabled] | |
-C, --config-cache alias for \`--cache-file=config.cache' | |
-n, --no-create do not create output files | |
@@ -1322,7 +1331,7 @@ | |
if test -n "$ac_init_help"; then | |
case $ac_init_help in | |
- short | recursive ) echo "Configuration of sqlite 3.7.9:";; | |
+ short | recursive ) echo "Configuration of sqlite 3.7.10:";; | |
esac | |
cat <<\_ACEOF | |
@@ -1424,10 +1433,10 @@ | |
test -n "$ac_init_help" && exit $ac_status | |
if $ac_init_version; then | |
cat <<\_ACEOF | |
-sqlite configure 3.7.9 | |
-generated by GNU Autoconf 2.65 | |
+sqlite configure 3.7.10 | |
+generated by GNU Autoconf 2.68 | |
-Copyright (C) 2009 Free Software Foundation, Inc. | |
+Copyright (C) 2010 Free Software Foundation, Inc. | |
This configure script is free software; the Free Software Foundation | |
gives unlimited permission to copy, distribute and modify it. | |
_ACEOF | |
@@ -1471,7 +1480,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_compile | |
@@ -1497,7 +1506,7 @@ | |
mv -f conftest.er1 conftest.err | |
fi | |
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 | |
- test $ac_status = 0; } >/dev/null && { | |
+ test $ac_status = 0; } > conftest.i && { | |
test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || | |
test ! -s conftest.err | |
}; then : | |
@@ -1508,7 +1517,7 @@ | |
ac_retval=1 | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_cpp | |
@@ -1550,7 +1559,7 @@ | |
ac_retval=$ac_status | |
fi | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_run | |
@@ -1564,7 +1573,7 @@ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -1582,7 +1591,7 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_header_compile | |
@@ -1627,7 +1636,7 @@ | |
# interfere with the next link command; also delete a directory that is | |
# left behind by Apple's compiler. We do this before executing the actions. | |
rm -rf conftest.dSYM conftest_ipa8_conftest.oo | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
as_fn_set_status $ac_retval | |
} # ac_fn_c_try_link | |
@@ -1640,7 +1649,7 @@ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -1695,7 +1704,7 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_func | |
@@ -1707,10 +1716,10 @@ | |
ac_fn_c_check_header_mongrel () | |
{ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+ if eval \${$3+:} false; then : | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
fi | |
eval ac_res=\$$3 | |
@@ -1746,7 +1755,7 @@ | |
else | |
ac_header_preproc=no | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 | |
$as_echo "$ac_header_preproc" >&6; } | |
@@ -1773,7 +1782,7 @@ | |
esac | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 | |
$as_echo_n "checking for $2... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
eval "$3=\$ac_header_compiler" | |
@@ -1782,19 +1791,22 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
fi | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_header_mongrel | |
-# ac_fn_c_check_decl LINENO SYMBOL VAR | |
-# ------------------------------------ | |
-# Tests whether SYMBOL is declared, setting cache variable VAR accordingly. | |
+# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES | |
+# --------------------------------------------- | |
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR | |
+# accordingly. | |
ac_fn_c_check_decl () | |
{ | |
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $2 is declared" >&5 | |
-$as_echo_n "checking whether $2 is declared... " >&6; } | |
-if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+ as_decl_name=`echo $2|sed 's/ *(.*//'` | |
+ as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` | |
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 | |
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; } | |
+if eval \${$3+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -1803,8 +1815,12 @@ | |
int | |
main () | |
{ | |
-#ifndef $2 | |
- (void) $2; | |
+#ifndef $as_decl_name | |
+#ifdef __cplusplus | |
+ (void) $as_decl_use; | |
+#else | |
+ (void) $as_decl_name; | |
+#endif | |
#endif | |
; | |
@@ -1821,15 +1837,15 @@ | |
eval ac_res=\$$3 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 | |
$as_echo "$ac_res" >&6; } | |
- eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} | |
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno | |
} # ac_fn_c_check_decl | |
cat >config.log <<_ACEOF | |
This file contains any messages produced by compilers while | |
running configure, to aid debugging if configure makes a mistake. | |
-It was created by sqlite $as_me 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+It was created by sqlite $as_me 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
$ $0 $@ | |
@@ -1939,11 +1955,9 @@ | |
{ | |
echo | |
- cat <<\_ASBOX | |
-## ---------------- ## | |
+ $as_echo "## ---------------- ## | |
## Cache variables. ## | |
-## ---------------- ## | |
-_ASBOX | |
+## ---------------- ##" | |
echo | |
# The following way of writing the cache mishandles newlines in values, | |
( | |
@@ -1977,11 +1991,9 @@ | |
) | |
echo | |
- cat <<\_ASBOX | |
-## ----------------- ## | |
+ $as_echo "## ----------------- ## | |
## Output variables. ## | |
-## ----------------- ## | |
-_ASBOX | |
+## ----------------- ##" | |
echo | |
for ac_var in $ac_subst_vars | |
do | |
@@ -1994,11 +2006,9 @@ | |
echo | |
if test -n "$ac_subst_files"; then | |
- cat <<\_ASBOX | |
-## ------------------- ## | |
+ $as_echo "## ------------------- ## | |
## File substitutions. ## | |
-## ------------------- ## | |
-_ASBOX | |
+## ------------------- ##" | |
echo | |
for ac_var in $ac_subst_files | |
do | |
@@ -2012,11 +2022,9 @@ | |
fi | |
if test -s confdefs.h; then | |
- cat <<\_ASBOX | |
-## ----------- ## | |
+ $as_echo "## ----------- ## | |
## confdefs.h. ## | |
-## ----------- ## | |
-_ASBOX | |
+## ----------- ##" | |
echo | |
cat confdefs.h | |
echo | |
@@ -2071,7 +2079,12 @@ | |
ac_site_file1=NONE | |
ac_site_file2=NONE | |
if test -n "$CONFIG_SITE"; then | |
- ac_site_file1=$CONFIG_SITE | |
+ # We do not want a PATH search for config.site. | |
+ case $CONFIG_SITE in #(( | |
+ -*) ac_site_file1=./$CONFIG_SITE;; | |
+ */*) ac_site_file1=$CONFIG_SITE;; | |
+ *) ac_site_file1=./$CONFIG_SITE;; | |
+ esac | |
elif test "x$prefix" != xNONE; then | |
ac_site_file1=$prefix/share/config.site | |
ac_site_file2=$prefix/etc/config.site | |
@@ -2086,7 +2099,11 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 | |
$as_echo "$as_me: loading site script $ac_site_file" >&6;} | |
sed 's/^/| /' "$ac_site_file" >&5 | |
- . "$ac_site_file" | |
+ . "$ac_site_file" \ | |
+ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
+as_fn_error $? "failed to load site script $ac_site_file | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
done | |
@@ -2162,7 +2179,7 @@ | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 | |
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} | |
- as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 | |
+ as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 | |
fi | |
## -------------------- ## | |
## Main body of script. ## | |
@@ -2190,11 +2207,11 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for correct TEA configuration" >&5 | |
$as_echo_n "checking for correct TEA configuration... " >&6; } | |
if test x"${PACKAGE_NAME}" = x ; then | |
- as_fn_error " | |
+ as_fn_error $? " | |
The PACKAGE_NAME variable must be defined by your TEA configure.in" "$LINENO" 5 | |
fi | |
if test x"3.9" = x ; then | |
- as_fn_error " | |
+ as_fn_error $? " | |
TEA version not specified." "$LINENO" 5 | |
elif test "3.9" != "${TEA_VERSION}" ; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: warning: requested TEA version \"3.9\", have \"${TEA_VERSION}\"" >&5 | |
@@ -2209,7 +2226,7 @@ | |
set dummy cygpath; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CYGPATH+set}" = set; then : | |
+if ${ac_cv_prog_CYGPATH+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CYGPATH"; then | |
@@ -2288,16 +2305,22 @@ | |
ac_aux_dir= | |
for ac_dir in tclconfig "$srcdir"/tclconfig; do | |
- for ac_t in install-sh install.sh shtool; do | |
- if test -f "$ac_dir/$ac_t"; then | |
- ac_aux_dir=$ac_dir | |
- ac_install_sh="$ac_aux_dir/$ac_t -c" | |
- break 2 | |
- fi | |
- done | |
+ if test -f "$ac_dir/install-sh"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/install-sh -c" | |
+ break | |
+ elif test -f "$ac_dir/install.sh"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/install.sh -c" | |
+ break | |
+ elif test -f "$ac_dir/shtool"; then | |
+ ac_aux_dir=$ac_dir | |
+ ac_install_sh="$ac_aux_dir/shtool install -c" | |
+ break | |
+ fi | |
done | |
if test -z "$ac_aux_dir"; then | |
- as_fn_error "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 | |
+ as_fn_error $? "cannot find install-sh, install.sh, or shtool in tclconfig \"$srcdir\"/tclconfig" "$LINENO" 5 | |
fi | |
# These three variables are undocumented and unsupported, | |
@@ -2333,7 +2356,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Tcl configuration" >&5 | |
$as_echo_n "checking for Tcl configuration... " >&6; } | |
- if test "${ac_cv_c_tclconfig+set}" = set; then : | |
+ if ${ac_cv_c_tclconfig+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -2351,7 +2374,7 @@ | |
if test -f "${with_tclconfig}/tclConfig.sh" ; then | |
ac_cv_c_tclconfig="`(cd "${with_tclconfig}"; pwd)`" | |
else | |
- as_fn_error "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 | |
+ as_fn_error $? "${with_tclconfig} directory doesn't contain tclConfig.sh" "$LINENO" 5 | |
fi | |
fi | |
@@ -2450,7 +2473,7 @@ | |
if test x"${ac_cv_c_tclconfig}" = x ; then | |
TCL_BIN_DIR="# no Tcl configs found" | |
- as_fn_error "Can't find Tcl configuration definitions" "$LINENO" 5 | |
+ as_fn_error $? "Can't find Tcl configuration definitions" "$LINENO" 5 | |
else | |
no_tcl= | |
TCL_BIN_DIR="${ac_cv_c_tclconfig}" | |
@@ -2634,7 +2657,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 | |
$as_echo_n "checking for a BSD-compatible install... " >&6; } | |
if test -z "$INSTALL"; then | |
-if test "${ac_cv_path_install+set}" = set; then : | |
+if ${ac_cv_path_install+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -2730,7 +2753,7 @@ | |
set dummy ${ac_tool_prefix}gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -2770,7 +2793,7 @@ | |
set dummy gcc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -2823,7 +2846,7 @@ | |
set dummy ${ac_tool_prefix}cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -2863,7 +2886,7 @@ | |
set dummy cc; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -2922,7 +2945,7 @@ | |
set dummy $ac_tool_prefix$ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_CC+set}" = set; then : | |
+if ${ac_cv_prog_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$CC"; then | |
@@ -2966,7 +2989,7 @@ | |
set dummy $ac_prog; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_CC+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_CC"; then | |
@@ -3020,8 +3043,8 @@ | |
test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "no acceptable C compiler found in \$PATH | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "no acceptable C compiler found in \$PATH | |
+See \`config.log' for more details" "$LINENO" 5; } | |
# Provide some information about the compiler. | |
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 | |
@@ -3135,9 +3158,8 @@ | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-{ as_fn_set_status 77 | |
-as_fn_error "C compiler cannot create executables | |
-See \`config.log' for more details." "$LINENO" 5; }; } | |
+as_fn_error 77 "C compiler cannot create executables | |
+See \`config.log' for more details" "$LINENO" 5; } | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 | |
$as_echo "yes" >&6; } | |
@@ -3179,8 +3201,8 @@ | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot compute suffix of executables: cannot compile and link | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
rm -f conftest conftest$ac_cv_exeext | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 | |
@@ -3237,9 +3259,9 @@ | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot run C compiled programs. | |
+as_fn_error $? "cannot run C compiled programs. | |
If you meant to cross compile, use \`--host'. | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
fi | |
fi | |
@@ -3250,7 +3272,7 @@ | |
ac_clean_files=$ac_clean_files_save | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 | |
$as_echo_n "checking for suffix of object files... " >&6; } | |
-if test "${ac_cv_objext+set}" = set; then : | |
+if ${ac_cv_objext+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -3290,8 +3312,8 @@ | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "cannot compute suffix of object files: cannot compile | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "cannot compute suffix of object files: cannot compile | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
rm -f conftest.$ac_cv_objext conftest.$ac_ext | |
fi | |
@@ -3301,7 +3323,7 @@ | |
ac_objext=$OBJEXT | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 | |
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } | |
-if test "${ac_cv_c_compiler_gnu+set}" = set; then : | |
+if ${ac_cv_c_compiler_gnu+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -3338,7 +3360,7 @@ | |
ac_save_CFLAGS=$CFLAGS | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 | |
$as_echo_n "checking whether $CC accepts -g... " >&6; } | |
-if test "${ac_cv_prog_cc_g+set}" = set; then : | |
+if ${ac_cv_prog_cc_g+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_save_c_werror_flag=$ac_c_werror_flag | |
@@ -3416,7 +3438,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 | |
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } | |
-if test "${ac_cv_prog_cc_c89+set}" = set; then : | |
+if ${ac_cv_prog_cc_c89+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_cv_prog_cc_c89=no | |
@@ -3523,7 +3545,7 @@ | |
CPP= | |
fi | |
if test -z "$CPP"; then | |
- if test "${ac_cv_prog_CPP+set}" = set; then : | |
+ if ${ac_cv_prog_CPP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
# Double quotes because CPP needs to be expanded | |
@@ -3553,7 +3575,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -3569,11 +3591,11 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
break | |
fi | |
@@ -3612,7 +3634,7 @@ | |
# Broken: fails on valid input. | |
continue | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
# OK, works on sane cases. Now check whether nonexistent headers | |
# can be detected and how. | |
@@ -3628,18 +3650,18 @@ | |
ac_preproc_ok=: | |
break | |
fi | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.err conftest.i conftest.$ac_ext | |
done | |
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. | |
-rm -f conftest.err conftest.$ac_ext | |
+rm -f conftest.i conftest.err conftest.$ac_ext | |
if $ac_preproc_ok; then : | |
else | |
{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 | |
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} | |
-as_fn_error "C preprocessor \"$CPP\" fails sanity check | |
-See \`config.log' for more details." "$LINENO" 5; } | |
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check | |
+See \`config.log' for more details" "$LINENO" 5; } | |
fi | |
ac_ext=c | |
@@ -3659,7 +3681,7 @@ | |
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } | |
set x ${MAKE-make} | |
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` | |
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : | |
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat >conftest.make <<\_ACEOF | |
@@ -3667,7 +3689,7 @@ | |
all: | |
@echo '@@@%%%=$(MAKE)=@@@%%%' | |
_ACEOF | |
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us. | |
+# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. | |
case `${MAKE-make} -f conftest.make 2>/dev/null` in | |
*@@@%%%=?*=@@@%%%*) | |
eval ac_cv_prog_make_${ac_make}_set=yes;; | |
@@ -3696,7 +3718,7 @@ | |
set dummy ${ac_tool_prefix}ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$RANLIB"; then | |
@@ -3736,7 +3758,7 @@ | |
set dummy ranlib; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then : | |
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$ac_ct_RANLIB"; then | |
@@ -3795,7 +3817,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 | |
$as_echo_n "checking for grep that handles long lines and -e... " >&6; } | |
-if test "${ac_cv_path_GREP+set}" = set; then : | |
+if ${ac_cv_path_GREP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -z "$GREP"; then | |
@@ -3844,7 +3866,7 @@ | |
done | |
IFS=$as_save_IFS | |
if test -z "$ac_cv_path_GREP"; then | |
- as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
+ as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
fi | |
else | |
ac_cv_path_GREP=$GREP | |
@@ -3858,7 +3880,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 | |
$as_echo_n "checking for egrep... " >&6; } | |
-if test "${ac_cv_path_EGREP+set}" = set; then : | |
+if ${ac_cv_path_EGREP+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 | |
@@ -3910,7 +3932,7 @@ | |
done | |
IFS=$as_save_IFS | |
if test -z "$ac_cv_path_EGREP"; then | |
- as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
+ as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 | |
fi | |
else | |
ac_cv_path_EGREP=$EGREP | |
@@ -3925,7 +3947,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 | |
$as_echo_n "checking for ANSI C header files... " >&6; } | |
-if test "${ac_cv_header_stdc+set}" = set; then : | |
+if ${ac_cv_header_stdc+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -4042,8 +4064,7 @@ | |
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` | |
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default | |
" | |
-eval as_val=\$$as_ac_Header | |
- if test "x$as_val" = x""yes; then : | |
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : | |
cat >>confdefs.h <<_ACEOF | |
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 | |
_ACEOF | |
@@ -4065,7 +4086,7 @@ | |
if test -z "$no_pipe" -a -n "$GCC"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the compiler understands -pipe" >&5 | |
$as_echo_n "checking if the compiler understands -pipe... " >&6; } | |
-if test "${tcl_cv_cc_pipe+set}" = set; then : | |
+if ${tcl_cv_cc_pipe+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -4102,7 +4123,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 | |
$as_echo_n "checking whether byte ordering is bigendian... " >&6; } | |
-if test "${ac_cv_c_bigendian+set}" = set; then : | |
+if ${ac_cv_c_bigendian+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_cv_c_bigendian=unknown | |
@@ -4320,7 +4341,7 @@ | |
;; #( | |
*) | |
- as_fn_error "unknown endianness | |
+ as_fn_error $? "unknown endianness | |
presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; | |
esac | |
@@ -4334,7 +4355,7 @@ | |
#-------------------------------------------------------------------- | |
ac_fn_c_check_func "$LINENO" "sin" "ac_cv_func_sin" | |
-if test "x$ac_cv_func_sin" = x""yes; then : | |
+if test "x$ac_cv_func_sin" = xyes; then : | |
MATH_LIBS="" | |
else | |
MATH_LIBS="-lm" | |
@@ -4342,7 +4363,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lieee" >&5 | |
$as_echo_n "checking for main in -lieee... " >&6; } | |
-if test "${ac_cv_lib_ieee_main+set}" = set; then : | |
+if ${ac_cv_lib_ieee_main+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -4370,7 +4391,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ieee_main" >&5 | |
$as_echo "$ac_cv_lib_ieee_main" >&6; } | |
-if test "x$ac_cv_lib_ieee_main" = x""yes; then : | |
+if test "x$ac_cv_lib_ieee_main" = xyes; then : | |
MATH_LIBS="-lieee $MATH_LIBS" | |
fi | |
@@ -4382,7 +4403,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -linet" >&5 | |
$as_echo_n "checking for main in -linet... " >&6; } | |
-if test "${ac_cv_lib_inet_main+set}" = set; then : | |
+if ${ac_cv_lib_inet_main+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -4410,12 +4431,12 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_inet_main" >&5 | |
$as_echo "$ac_cv_lib_inet_main" >&6; } | |
-if test "x$ac_cv_lib_inet_main" = x""yes; then : | |
+if test "x$ac_cv_lib_inet_main" = xyes; then : | |
LIBS="$LIBS -linet" | |
fi | |
ac_fn_c_check_header_mongrel "$LINENO" "net/errno.h" "ac_cv_header_net_errno_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_net_errno_h" = x""yes; then : | |
+if test "x$ac_cv_header_net_errno_h" = xyes; then : | |
$as_echo "#define HAVE_NET_ERRNO_H 1" >>confdefs.h | |
@@ -4444,7 +4465,7 @@ | |
tcl_checkBoth=0 | |
ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" | |
-if test "x$ac_cv_func_connect" = x""yes; then : | |
+if test "x$ac_cv_func_connect" = xyes; then : | |
tcl_checkSocket=0 | |
else | |
tcl_checkSocket=1 | |
@@ -4452,12 +4473,12 @@ | |
if test "$tcl_checkSocket" = 1; then | |
ac_fn_c_check_func "$LINENO" "setsockopt" "ac_cv_func_setsockopt" | |
-if test "x$ac_cv_func_setsockopt" = x""yes; then : | |
+if test "x$ac_cv_func_setsockopt" = xyes; then : | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for setsockopt in -lsocket" >&5 | |
$as_echo_n "checking for setsockopt in -lsocket... " >&6; } | |
-if test "${ac_cv_lib_socket_setsockopt+set}" = set; then : | |
+if ${ac_cv_lib_socket_setsockopt+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -4491,7 +4512,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_setsockopt" >&5 | |
$as_echo "$ac_cv_lib_socket_setsockopt" >&6; } | |
-if test "x$ac_cv_lib_socket_setsockopt" = x""yes; then : | |
+if test "x$ac_cv_lib_socket_setsockopt" = xyes; then : | |
LIBS="$LIBS -lsocket" | |
else | |
tcl_checkBoth=1 | |
@@ -4504,7 +4525,7 @@ | |
tk_oldLibs=$LIBS | |
LIBS="$LIBS -lsocket -lnsl" | |
ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" | |
-if test "x$ac_cv_func_accept" = x""yes; then : | |
+if test "x$ac_cv_func_accept" = xyes; then : | |
tcl_checkNsl=0 | |
else | |
LIBS=$tk_oldLibs | |
@@ -4512,12 +4533,12 @@ | |
fi | |
ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" | |
-if test "x$ac_cv_func_gethostbyname" = x""yes; then : | |
+if test "x$ac_cv_func_gethostbyname" = xyes; then : | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 | |
$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } | |
-if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then : | |
+if ${ac_cv_lib_nsl_gethostbyname+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -4551,7 +4572,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 | |
$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } | |
-if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then : | |
+if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : | |
LIBS="$LIBS -lnsl" | |
fi | |
@@ -4568,7 +4589,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dirent.h" >&5 | |
$as_echo_n "checking dirent.h... " >&6; } | |
-if test "${tcl_cv_dirent_h+set}" = set; then : | |
+if ${tcl_cv_dirent_h+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -4621,7 +4642,7 @@ | |
# TEA specific: | |
ac_fn_c_check_header_mongrel "$LINENO" "errno.h" "ac_cv_header_errno_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_errno_h" = x""yes; then : | |
+if test "x$ac_cv_header_errno_h" = xyes; then : | |
else | |
@@ -4631,7 +4652,7 @@ | |
ac_fn_c_check_header_mongrel "$LINENO" "float.h" "ac_cv_header_float_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_float_h" = x""yes; then : | |
+if test "x$ac_cv_header_float_h" = xyes; then : | |
else | |
@@ -4641,7 +4662,7 @@ | |
ac_fn_c_check_header_mongrel "$LINENO" "values.h" "ac_cv_header_values_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_values_h" = x""yes; then : | |
+if test "x$ac_cv_header_values_h" = xyes; then : | |
else | |
@@ -4651,7 +4672,7 @@ | |
ac_fn_c_check_header_mongrel "$LINENO" "limits.h" "ac_cv_header_limits_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_limits_h" = x""yes; then : | |
+if test "x$ac_cv_header_limits_h" = xyes; then : | |
$as_echo "#define HAVE_LIMITS_H 1" >>confdefs.h | |
@@ -4663,7 +4684,7 @@ | |
ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_stdlib_h" = x""yes; then : | |
+if test "x$ac_cv_header_stdlib_h" = xyes; then : | |
tcl_ok=1 | |
else | |
tcl_ok=0 | |
@@ -4715,7 +4736,7 @@ | |
fi | |
ac_fn_c_check_header_mongrel "$LINENO" "string.h" "ac_cv_header_string_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_string_h" = x""yes; then : | |
+if test "x$ac_cv_header_string_h" = xyes; then : | |
tcl_ok=1 | |
else | |
tcl_ok=0 | |
@@ -4759,7 +4780,7 @@ | |
fi | |
ac_fn_c_check_header_mongrel "$LINENO" "sys/wait.h" "ac_cv_header_sys_wait_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_sys_wait_h" = x""yes; then : | |
+if test "x$ac_cv_header_sys_wait_h" = xyes; then : | |
else | |
@@ -4769,7 +4790,7 @@ | |
ac_fn_c_check_header_mongrel "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_dlfcn_h" = x""yes; then : | |
+if test "x$ac_cv_header_dlfcn_h" = xyes; then : | |
else | |
@@ -4783,7 +4804,7 @@ | |
for ac_header in sys/param.h | |
do : | |
ac_fn_c_check_header_mongrel "$LINENO" "sys/param.h" "ac_cv_header_sys_param_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_sys_param_h" = x""yes; then : | |
+if test "x$ac_cv_header_sys_param_h" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_SYS_PARAM_H 1 | |
_ACEOF | |
@@ -4827,7 +4848,7 @@ | |
-a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ | |
-a ! -f "${srcdir}/macosx/$i" \ | |
; then | |
- as_fn_error "could not find source file '$i'" "$LINENO" 5 | |
+ as_fn_error $? "could not find source file '$i'" "$LINENO" 5 | |
fi | |
PKG_SOURCES="$PKG_SOURCES $i" | |
# this assumes it is in a VPATH dir | |
@@ -4850,7 +4871,7 @@ | |
for i in $vars; do | |
# check for existence, be strict because it is installed | |
if test ! -f "${srcdir}/$i" ; then | |
- as_fn_error "could not find header file '${srcdir}/$i'" "$LINENO" 5 | |
+ as_fn_error $? "could not find header file '${srcdir}/$i'" "$LINENO" 5 | |
fi | |
PKG_HEADERS="$PKG_HEADERS $i" | |
done | |
@@ -4887,7 +4908,7 @@ | |
-a ! -f "${srcdir}/win/$i" -a ! -f "${srcdir}/unix/$i" \ | |
-a ! -f "${srcdir}/macosx/$i" \ | |
; then | |
- as_fn_error "could not find stub source file '$i'" "$LINENO" 5 | |
+ as_fn_error $? "could not find stub source file '$i'" "$LINENO" 5 | |
fi | |
PKG_STUB_SOURCES="$PKG_STUB_SOURCES $i" | |
# this assumes it is in a VPATH dir | |
@@ -4908,7 +4929,7 @@ | |
for i in $vars; do | |
# check for existence, be strict because it is installed | |
if test ! -f "${srcdir}/$i" ; then | |
- as_fn_error "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 | |
+ as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5 | |
fi | |
PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i" | |
done | |
@@ -4932,10 +4953,10 @@ | |
if test x$with_system_sqlite != xno; then | |
ac_fn_c_check_header_mongrel "$LINENO" "sqlite3.h" "ac_cv_header_sqlite3_h" "$ac_includes_default" | |
-if test "x$ac_cv_header_sqlite3_h" = x""yes; then : | |
+if test "x$ac_cv_header_sqlite3_h" = xyes; then : | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sqlite3_initialize in -lsqlite3" >&5 | |
$as_echo_n "checking for sqlite3_initialize in -lsqlite3... " >&6; } | |
-if test "${ac_cv_lib_sqlite3_sqlite3_initialize+set}" = set; then : | |
+if ${ac_cv_lib_sqlite3_sqlite3_initialize+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -4969,7 +4990,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sqlite3_sqlite3_initialize" >&5 | |
$as_echo "$ac_cv_lib_sqlite3_sqlite3_initialize" >&6; } | |
-if test "x$ac_cv_lib_sqlite3_sqlite3_initialize" = x""yes; then : | |
+if test "x$ac_cv_lib_sqlite3_sqlite3_initialize" = xyes; then : | |
$as_echo "#define USE_SYSTEM_SQLITE 1" >>confdefs.h | |
LIBS="$LIBS -lsqlite3" | |
@@ -5000,7 +5021,7 @@ | |
fi | |
- if test "${ac_cv_c_tclh+set}" = set; then : | |
+ if ${ac_cv_c_tclh+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -5010,7 +5031,7 @@ | |
if test -f "${with_tclinclude}/tcl.h" ; then | |
ac_cv_c_tclh=${with_tclinclude} | |
else | |
- as_fn_error "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 | |
+ as_fn_error $? "${with_tclinclude} directory does not contain tcl.h" "$LINENO" 5 | |
fi | |
else | |
list="" | |
@@ -5059,7 +5080,7 @@ | |
# Print a message based on how we determined the include path | |
if test x"${ac_cv_c_tclh}" = x ; then | |
- as_fn_error "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 | |
+ as_fn_error $? "tcl.h not found. Please specify its location with --with-tclinclude" "$LINENO" 5 | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ac_cv_c_tclh}" >&5 | |
$as_echo "${ac_cv_c_tclh}" >&6; } | |
@@ -5124,7 +5145,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthread" >&5 | |
$as_echo_n "checking for pthread_mutex_init in -lpthread... " >&6; } | |
-if test "${ac_cv_lib_pthread_pthread_mutex_init+set}" = set; then : | |
+if ${ac_cv_lib_pthread_pthread_mutex_init+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -5158,7 +5179,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_mutex_init" >&5 | |
$as_echo "$ac_cv_lib_pthread_pthread_mutex_init" >&6; } | |
-if test "x$ac_cv_lib_pthread_pthread_mutex_init" = x""yes; then : | |
+if test "x$ac_cv_lib_pthread_pthread_mutex_init" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -5172,7 +5193,7 @@ | |
# exist, like AIX 4.2. [Bug: 4359] | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __pthread_mutex_init in -lpthread" >&5 | |
$as_echo_n "checking for __pthread_mutex_init in -lpthread... " >&6; } | |
-if test "${ac_cv_lib_pthread___pthread_mutex_init+set}" = set; then : | |
+if ${ac_cv_lib_pthread___pthread_mutex_init+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -5206,7 +5227,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread___pthread_mutex_init" >&5 | |
$as_echo "$ac_cv_lib_pthread___pthread_mutex_init" >&6; } | |
-if test "x$ac_cv_lib_pthread___pthread_mutex_init" = x""yes; then : | |
+if test "x$ac_cv_lib_pthread___pthread_mutex_init" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -5220,7 +5241,7 @@ | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lpthreads" >&5 | |
$as_echo_n "checking for pthread_mutex_init in -lpthreads... " >&6; } | |
-if test "${ac_cv_lib_pthreads_pthread_mutex_init+set}" = set; then : | |
+if ${ac_cv_lib_pthreads_pthread_mutex_init+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -5254,7 +5275,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthreads_pthread_mutex_init" >&5 | |
$as_echo "$ac_cv_lib_pthreads_pthread_mutex_init" >&6; } | |
-if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = x""yes; then : | |
+if test "x$ac_cv_lib_pthreads_pthread_mutex_init" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -5266,7 +5287,7 @@ | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc" >&5 | |
$as_echo_n "checking for pthread_mutex_init in -lc... " >&6; } | |
-if test "${ac_cv_lib_c_pthread_mutex_init+set}" = set; then : | |
+if ${ac_cv_lib_c_pthread_mutex_init+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -5300,7 +5321,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_pthread_mutex_init" >&5 | |
$as_echo "$ac_cv_lib_c_pthread_mutex_init" >&6; } | |
-if test "x$ac_cv_lib_c_pthread_mutex_init" = x""yes; then : | |
+if test "x$ac_cv_lib_c_pthread_mutex_init" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -5309,7 +5330,7 @@ | |
if test "$tcl_ok" = "no"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_mutex_init in -lc_r" >&5 | |
$as_echo_n "checking for pthread_mutex_init in -lc_r... " >&6; } | |
-if test "${ac_cv_lib_c_r_pthread_mutex_init+set}" = set; then : | |
+if ${ac_cv_lib_c_r_pthread_mutex_init+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -5343,7 +5364,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_c_r_pthread_mutex_init" >&5 | |
$as_echo "$ac_cv_lib_c_r_pthread_mutex_init" >&6; } | |
-if test "x$ac_cv_lib_c_r_pthread_mutex_init" = x""yes; then : | |
+if test "x$ac_cv_lib_c_r_pthread_mutex_init" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -5512,7 +5533,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler supports visibility \"hidden\"" >&5 | |
$as_echo_n "checking if compiler supports visibility \"hidden\"... " >&6; } | |
-if test "${tcl_cv_cc_visibility_hidden+set}" = set; then : | |
+if ${tcl_cv_cc_visibility_hidden+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -5587,7 +5608,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking system version" >&5 | |
$as_echo_n "checking system version... " >&6; } | |
-if test "${tcl_cv_sys_version+set}" = set; then : | |
+if ${tcl_cv_sys_version+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -5648,7 +5669,7 @@ | |
set dummy ar; ac_word=$2 | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 | |
$as_echo_n "checking for $ac_word... " >&6; } | |
-if test "${ac_cv_prog_AR+set}" = set; then : | |
+if ${ac_cv_prog_AR+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
if test -n "$AR"; then | |
@@ -5726,10 +5747,10 @@ | |
if test "$doWince" != "no" ; then | |
if test "$do64bit" != "no" ; then | |
- as_fn_error "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 | |
+ as_fn_error $? "Windows/CE and 64-bit builds incompatible" "$LINENO" 5 | |
fi | |
if test "$GCC" = "yes" ; then | |
- as_fn_error "Windows/CE and GCC builds incompatible" "$LINENO" 5 | |
+ as_fn_error $? "Windows/CE and GCC builds incompatible" "$LINENO" 5 | |
fi | |
# First, look for one uninstalled. | |
@@ -5746,7 +5767,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for Windows/CE celib directory" >&5 | |
$as_echo_n "checking for Windows/CE celib directory... " >&6; } | |
- if test "${ac_cv_c_celibconfig+set}" = set; then : | |
+ if ${ac_cv_c_celibconfig+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -5755,7 +5776,7 @@ | |
if test -d "${with_celibconfig}/inc" ; then | |
ac_cv_c_celibconfig=`(cd ${with_celibconfig}; pwd)` | |
else | |
- as_fn_error "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 | |
+ as_fn_error $? "${with_celibconfig} directory doesn't contain inc directory" "$LINENO" 5 | |
fi | |
fi | |
@@ -5781,7 +5802,7 @@ | |
fi | |
if test x"${ac_cv_c_celibconfig}" = x ; then | |
- as_fn_error "Cannot find celib support library directory" "$LINENO" 5 | |
+ as_fn_error $? "Cannot find celib support library directory" "$LINENO" 5 | |
else | |
no_celib= | |
CELIB_DIR=${ac_cv_c_celibconfig} | |
@@ -5829,7 +5850,7 @@ | |
SDKROOT=`echo "$SDKROOT" | sed -e 's!\\\!/!g'` | |
if test ! -d "${SDKROOT}/${OSVERSION}/${PLATFORM}/Lib/${TARGETCPU}" \ | |
-o ! -d "${WCEROOT}/EVC/${OSVERSION}/bin"; then | |
- as_fn_error "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 | |
+ as_fn_error $? "could not find PocketPC SDK or target compiler to enable WinCE mode $CEVERSION,$TARGETCPU,$ARCH,$PLATFORM" "$LINENO" 5 | |
doWince="no" | |
else | |
# We could PATH_NOSPACE these, but that's not important, | |
@@ -6043,7 +6064,7 @@ | |
#----------------------------------------------------------- | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lbind" >&5 | |
$as_echo_n "checking for inet_ntoa in -lbind... " >&6; } | |
-if test "${ac_cv_lib_bind_inet_ntoa+set}" = set; then : | |
+if ${ac_cv_lib_bind_inet_ntoa+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -6077,7 +6098,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bind_inet_ntoa" >&5 | |
$as_echo "$ac_cv_lib_bind_inet_ntoa" >&6; } | |
-if test "x$ac_cv_lib_bind_inet_ntoa" = x""yes; then : | |
+if test "x$ac_cv_lib_bind_inet_ntoa" = xyes; then : | |
LIBS="$LIBS -lbind -lsocket" | |
fi | |
@@ -6105,7 +6126,7 @@ | |
SHLIB_LD='${CC} -shared ${CFLAGS} ${LDFLAGS}' | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_ntoa in -lnetwork" >&5 | |
$as_echo_n "checking for inet_ntoa in -lnetwork... " >&6; } | |
-if test "${ac_cv_lib_network_inet_ntoa+set}" = set; then : | |
+if ${ac_cv_lib_network_inet_ntoa+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -6139,7 +6160,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_network_inet_ntoa" >&5 | |
$as_echo "$ac_cv_lib_network_inet_ntoa" >&6; } | |
-if test "x$ac_cv_lib_network_inet_ntoa" = x""yes; then : | |
+if test "x$ac_cv_lib_network_inet_ntoa" = xyes; then : | |
LIBS="$LIBS -lnetwork" | |
fi | |
@@ -6168,7 +6189,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 | |
$as_echo_n "checking for shl_load in -ldld... " >&6; } | |
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then : | |
+if ${ac_cv_lib_dld_shl_load+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
ac_check_lib_save_LIBS=$LIBS | |
@@ -6202,7 +6223,7 @@ | |
fi | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 | |
$as_echo "$ac_cv_lib_dld_shl_load" >&6; } | |
-if test "x$ac_cv_lib_dld_shl_load" = x""yes; then : | |
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then : | |
tcl_ok=yes | |
else | |
tcl_ok=no | |
@@ -6343,7 +6364,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -m64 flag" >&5 | |
$as_echo_n "checking if compiler accepts -m64 flag... " >&6; } | |
-if test "${tcl_cv_cc_m64+set}" = set; then : | |
+if ${tcl_cv_cc_m64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6427,7 +6448,7 @@ | |
SHARED_LIB_SUFFIX='${TCL_TRIM_DOTS}.so.${SHLIB_VERSION}' | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ELF" >&5 | |
$as_echo_n "checking for ELF... " >&6; } | |
-if test "${tcl_cv_ld_elf+set}" = set; then : | |
+if ${tcl_cv_ld_elf+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6541,7 +6562,7 @@ | |
ppc) | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch ppc64 flag" >&5 | |
$as_echo_n "checking if compiler accepts -arch ppc64 flag... " >&6; } | |
-if test "${tcl_cv_cc_arch_ppc64+set}" = set; then : | |
+if ${tcl_cv_cc_arch_ppc64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6578,7 +6599,7 @@ | |
i386) | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler accepts -arch x86_64 flag" >&5 | |
$as_echo_n "checking if compiler accepts -arch x86_64 flag... " >&6; } | |
-if test "${tcl_cv_cc_arch_x86_64+set}" = set; then : | |
+if ${tcl_cv_cc_arch_x86_64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6631,7 +6652,7 @@ | |
SHLIB_LD='${CC} -dynamiclib ${CFLAGS} ${LDFLAGS_DEFAULT}' | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -single_module flag" >&5 | |
$as_echo_n "checking if ld accepts -single_module flag... " >&6; } | |
-if test "${tcl_cv_ld_single_module+set}" = set; then : | |
+if ${tcl_cv_ld_single_module+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6677,7 +6698,7 @@ | |
LDFLAGS="$LDFLAGS -headerpad_max_install_names" | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if ld accepts -search_paths_first flag" >&5 | |
$as_echo_n "checking if ld accepts -search_paths_first flag... " >&6; } | |
-if test "${tcl_cv_ld_search_paths_first+set}" = set; then : | |
+if ${tcl_cv_ld_search_paths_first+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6729,7 +6750,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit X11" >&5 | |
$as_echo_n "checking for 64-bit X11... " >&6; } | |
-if test "${tcl_cv_lib_x11_64+set}" = set; then : | |
+if ${tcl_cv_lib_x11_64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -6768,7 +6789,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit Tk" >&5 | |
$as_echo_n "checking for 64-bit Tk... " >&6; } | |
-if test "${tcl_cv_lib_tk_64+set}" = set; then : | |
+if ${tcl_cv_lib_tk_64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7133,7 +7154,7 @@ | |
$as_echo_n "checking for required early compiler flags... " >&6; } | |
tcl_flags="" | |
- if test "${tcl_cv_flag__isoc99_source+set}" = set; then : | |
+ if ${tcl_cv_flag__isoc99_source+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -7180,7 +7201,7 @@ | |
fi | |
- if test "${tcl_cv_flag__largefile64_source+set}" = set; then : | |
+ if ${tcl_cv_flag__largefile64_source+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -7227,7 +7248,7 @@ | |
fi | |
- if test "${tcl_cv_flag__largefile_source64+set}" = set; then : | |
+ if ${tcl_cv_flag__largefile_source64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
cat confdefs.h - <<_ACEOF >conftest.$ac_ext | |
@@ -7284,7 +7305,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit integer type" >&5 | |
$as_echo_n "checking for 64-bit integer type... " >&6; } | |
- if test "${tcl_cv_type_64bit+set}" = set; then : | |
+ if ${tcl_cv_type_64bit+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7353,7 +7374,7 @@ | |
# Now check for auxiliary declarations | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct dirent64" >&5 | |
$as_echo_n "checking for struct dirent64... " >&6; } | |
-if test "${tcl_cv_struct_dirent64+set}" = set; then : | |
+if ${tcl_cv_struct_dirent64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7386,7 +7407,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for struct stat64" >&5 | |
$as_echo_n "checking for struct stat64... " >&6; } | |
-if test "${tcl_cv_struct_stat64+set}" = set; then : | |
+if ${tcl_cv_struct_stat64+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7421,8 +7442,7 @@ | |
do : | |
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` | |
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" | |
-eval as_val=\$$as_ac_var | |
- if test "x$as_val" = x""yes; then : | |
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then : | |
cat >>confdefs.h <<_ACEOF | |
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 | |
_ACEOF | |
@@ -7432,7 +7452,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for off64_t" >&5 | |
$as_echo_n "checking for off64_t... " >&6; } | |
- if test "${tcl_cv_type_off64_t+set}" = set; then : | |
+ if ${tcl_cv_type_off64_t+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7544,7 +7564,7 @@ | |
#-------------------------------------------------------------------- | |
ac_fn_c_check_func "$LINENO" "fdatasync" "ac_cv_func_fdatasync" | |
-if test "x$ac_cv_func_fdatasync" = x""yes; then : | |
+if test "x$ac_cv_func_fdatasync" = xyes; then : | |
else | |
$as_echo "#define fdatasync fsync" >>confdefs.h | |
@@ -7553,7 +7573,7 @@ | |
ac_fn_c_check_decl "$LINENO" "strerror_r" "ac_cv_have_decl_strerror_r" "$ac_includes_default" | |
-if test "x$ac_cv_have_decl_strerror_r" = x""yes; then : | |
+if test "x$ac_cv_have_decl_strerror_r" = xyes; then : | |
ac_have_decl=1 | |
else | |
ac_have_decl=0 | |
@@ -7566,7 +7586,7 @@ | |
for ac_func in strerror_r | |
do : | |
ac_fn_c_check_func "$LINENO" "strerror_r" "ac_cv_func_strerror_r" | |
-if test "x$ac_cv_func_strerror_r" = x""yes; then : | |
+if test "x$ac_cv_func_strerror_r" = xyes; then : | |
cat >>confdefs.h <<_ACEOF | |
#define HAVE_STRERROR_R 1 | |
_ACEOF | |
@@ -7576,7 +7596,7 @@ | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether strerror_r returns char *" >&5 | |
$as_echo_n "checking whether strerror_r returns char *... " >&6; } | |
-if test "${ac_cv_func_strerror_r_char_p+set}" = set; then : | |
+if ${ac_cv_func_strerror_r_char_p+:} false; then : | |
$as_echo_n "(cached) " >&6 | |
else | |
@@ -7839,10 +7859,21 @@ | |
:end' >>confcache | |
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else | |
if test -w "$cache_file"; then | |
- test "x$cache_file" != "x/dev/null" && | |
+ if test "x$cache_file" != "x/dev/null"; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 | |
$as_echo "$as_me: updating cache $cache_file" >&6;} | |
- cat confcache >$cache_file | |
+ if test ! -f "$cache_file" || test -h "$cache_file"; then | |
+ cat confcache >"$cache_file" | |
+ else | |
+ case $cache_file in #( | |
+ */* | ?:*) | |
+ mv -f confcache "$cache_file"$$ && | |
+ mv -f "$cache_file"$$ "$cache_file" ;; #( | |
+ *) | |
+ mv -f confcache "$cache_file" ;; | |
+ esac | |
+ fi | |
+ fi | |
else | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 | |
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} | |
@@ -7894,6 +7925,7 @@ | |
ac_libobjs= | |
ac_ltlibobjs= | |
+U= | |
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue | |
# 1. Remove the extension, and $U if already installed. | |
ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' | |
@@ -7911,7 +7943,7 @@ | |
CFLAGS="${CFLAGS} ${CPPFLAGS}"; CPPFLAGS="" | |
-: ${CONFIG_STATUS=./config.status} | |
+: "${CONFIG_STATUS=./config.status}" | |
ac_write_fail=0 | |
ac_clean_files_save=$ac_clean_files | |
ac_clean_files="$ac_clean_files $CONFIG_STATUS" | |
@@ -8012,6 +8044,7 @@ | |
IFS=" "" $as_nl" | |
# Find who we are. Look in the path if we contain no directory separator. | |
+as_myself= | |
case $0 in #(( | |
*[\\/]* ) as_myself=$0 ;; | |
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR | |
@@ -8057,19 +8090,19 @@ | |
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH | |
-# as_fn_error ERROR [LINENO LOG_FD] | |
-# --------------------------------- | |
+# as_fn_error STATUS ERROR [LINENO LOG_FD] | |
+# ---------------------------------------- | |
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are | |
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the | |
-# script with status $?, using 1 if that was 0. | |
+# script with STATUS, using 1 if that was 0. | |
as_fn_error () | |
{ | |
- as_status=$?; test $as_status -eq 0 && as_status=1 | |
- if test "$3"; then | |
- as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
- $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 | |
+ as_status=$1; test $as_status -eq 0 && as_status=1 | |
+ if test "$4"; then | |
+ as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack | |
+ $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 | |
fi | |
- $as_echo "$as_me: error: $1" >&2 | |
+ $as_echo "$as_me: error: $2" >&2 | |
as_fn_exit $as_status | |
} # as_fn_error | |
@@ -8265,7 +8298,7 @@ | |
test -d "$as_dir" && break | |
done | |
test -z "$as_dirs" || eval "mkdir $as_dirs" | |
- } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" | |
+ } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" | |
} # as_fn_mkdir_p | |
@@ -8318,8 +8351,8 @@ | |
# report actual input values of CONFIG_FILES etc. instead of their | |
# values after options handling. | |
ac_log=" | |
-This file was extended by sqlite $as_me 3.7.9, which was | |
-generated by GNU Autoconf 2.65. Invocation command line was | |
+This file was extended by sqlite $as_me 3.7.10, which was | |
+generated by GNU Autoconf 2.68. Invocation command line was | |
CONFIG_FILES = $CONFIG_FILES | |
CONFIG_HEADERS = $CONFIG_HEADERS | |
@@ -8371,11 +8404,11 @@ | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" | |
ac_cs_version="\\ | |
-sqlite config.status 3.7.9 | |
-configured by $0, generated by GNU Autoconf 2.65, | |
+sqlite config.status 3.7.10 | |
+configured by $0, generated by GNU Autoconf 2.68, | |
with options \\"\$ac_cs_config\\" | |
-Copyright (C) 2009 Free Software Foundation, Inc. | |
+Copyright (C) 2010 Free Software Foundation, Inc. | |
This config.status script is free software; the Free Software Foundation | |
gives unlimited permission to copy, distribute and modify it." | |
@@ -8391,11 +8424,16 @@ | |
while test $# != 0 | |
do | |
case $1 in | |
- --*=*) | |
+ --*=?*) | |
ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` | |
ac_shift=: | |
;; | |
+ --*=) | |
+ ac_option=`expr "X$1" : 'X\([^=]*\)='` | |
+ ac_optarg= | |
+ ac_shift=: | |
+ ;; | |
*) | |
ac_option=$1 | |
ac_optarg=$2 | |
@@ -8417,6 +8455,7 @@ | |
$ac_shift | |
case $ac_optarg in | |
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; | |
+ '') as_fn_error $? "missing file argument" ;; | |
esac | |
as_fn_append CONFIG_FILES " '$ac_optarg'" | |
ac_need_defaults=false;; | |
@@ -8427,7 +8466,7 @@ | |
ac_cs_silent=: ;; | |
# This is an error. | |
- -*) as_fn_error "unrecognized option: \`$1' | |
+ -*) as_fn_error $? "unrecognized option: \`$1' | |
Try \`$0 --help' for more information." ;; | |
*) as_fn_append ac_config_targets " $1" | |
@@ -8479,7 +8518,7 @@ | |
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; | |
"pkgIndex.tcl") CONFIG_FILES="$CONFIG_FILES pkgIndex.tcl" ;; | |
- *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
+ *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; | |
esac | |
done | |
@@ -8500,9 +8539,10 @@ | |
# after its creation but before its name has been assigned to `$tmp'. | |
$debug || | |
{ | |
- tmp= | |
+ tmp= ac_tmp= | |
trap 'exit_status=$? | |
- { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status | |
+ : "${ac_tmp:=$tmp}" | |
+ { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status | |
' 0 | |
trap 'as_fn_exit 1' 1 2 13 15 | |
} | |
@@ -8510,12 +8550,13 @@ | |
{ | |
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && | |
- test -n "$tmp" && test -d "$tmp" | |
+ test -d "$tmp" | |
} || | |
{ | |
tmp=./conf$$-$RANDOM | |
(umask 077 && mkdir "$tmp") | |
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 | |
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 | |
+ac_tmp=$tmp | |
# Set up the scripts for CONFIG_FILES section. | |
# No need to generate them if there are no CONFIG_FILES. | |
@@ -8532,12 +8573,12 @@ | |
fi | |
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null` | |
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then | |
- ac_cs_awk_cr='\r' | |
+ ac_cs_awk_cr='\\r' | |
else | |
ac_cs_awk_cr=$ac_cr | |
fi | |
-echo 'BEGIN {' >"$tmp/subs1.awk" && | |
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" && | |
_ACEOF | |
@@ -8546,18 +8587,18 @@ | |
echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && | |
echo "_ACEOF" | |
} >conf$$subs.sh || | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` | |
ac_delim='%!_!# ' | |
for ac_last_try in false false false false false :; do | |
. ./conf$$subs.sh || | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` | |
if test $ac_delim_n = $ac_delim_num; then | |
break | |
elif $ac_last_try; then | |
- as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 | |
else | |
ac_delim="$ac_delim!$ac_delim _$ac_delim!! " | |
fi | |
@@ -8565,7 +8606,7 @@ | |
rm -f conf$$subs.sh | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
-cat >>"\$tmp/subs1.awk" <<\\_ACAWK && | |
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && | |
_ACEOF | |
sed -n ' | |
h | |
@@ -8613,7 +8654,7 @@ | |
rm -f conf$$subs.awk | |
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 | |
_ACAWK | |
-cat >>"\$tmp/subs1.awk" <<_ACAWK && | |
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && | |
for (key in S) S_is_set[key] = 1 | |
FS = "" | |
@@ -8645,21 +8686,29 @@ | |
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" | |
else | |
cat | |
-fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ | |
- || as_fn_error "could not setup config files machinery" "$LINENO" 5 | |
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ | |
+ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 | |
_ACEOF | |
-# VPATH may cause trouble with some makes, so we remove $(srcdir), | |
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and | |
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir), | |
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and | |
# trailing colons and then remove the whole line if VPATH becomes empty | |
# (actually we leave an empty line to preserve line numbers). | |
if test "x$srcdir" = x.; then | |
- ac_vpsub='/^[ ]*VPATH[ ]*=/{ | |
-s/:*\$(srcdir):*/:/ | |
-s/:*\${srcdir}:*/:/ | |
-s/:*@srcdir@:*/:/ | |
-s/^\([^=]*=[ ]*\):*/\1/ | |
+ ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ | |
+h | |
+s/// | |
+s/^/:/ | |
+s/[ ]*$/:/ | |
+s/:\$(srcdir):/:/g | |
+s/:\${srcdir}:/:/g | |
+s/:@srcdir@:/:/g | |
+s/^:*// | |
s/:*$// | |
+x | |
+s/\(=[ ]*\).*/\1/ | |
+G | |
+s/\n// | |
s/^[^=]*=[ ]*$// | |
}' | |
fi | |
@@ -8677,7 +8726,7 @@ | |
esac | |
case $ac_mode$ac_tag in | |
:[FHL]*:*);; | |
- :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
+ :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; | |
:[FH]-) ac_tag=-:-;; | |
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;; | |
esac | |
@@ -8696,7 +8745,7 @@ | |
for ac_f | |
do | |
case $ac_f in | |
- -) ac_f="$tmp/stdin";; | |
+ -) ac_f="$ac_tmp/stdin";; | |
*) # Look for the file first in the build tree, then in the source tree | |
# (if the path is not absolute). The absolute path cannot be DOS-style, | |
# because $ac_f cannot contain `:'. | |
@@ -8705,7 +8754,7 @@ | |
[\\/$]*) false;; | |
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; | |
esac || | |
- as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
+ as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; | |
esac | |
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac | |
as_fn_append ac_file_inputs " '$ac_f'" | |
@@ -8731,8 +8780,8 @@ | |
esac | |
case $ac_tag in | |
- *:-:* | *:-) cat >"$tmp/stdin" \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; | |
+ *:-:* | *:-) cat >"$ac_tmp/stdin" \ | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; | |
esac | |
;; | |
esac | |
@@ -8862,23 +8911,24 @@ | |
s&@INSTALL@&$ac_INSTALL&;t t | |
$ac_datarootdir_hack | |
" | |
-eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ | |
+ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && | |
- { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && | |
- { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && | |
+ { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && | |
+ { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ | |
+ "$ac_tmp/out"`; test -z "$ac_out"; } && | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&5 | |
+which seems to be undefined. Please make sure it is defined" >&5 | |
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' | |
-which seems to be undefined. Please make sure it is defined." >&2;} | |
+which seems to be undefined. Please make sure it is defined" >&2;} | |
- rm -f "$tmp/stdin" | |
+ rm -f "$ac_tmp/stdin" | |
case $ac_file in | |
- -) cat "$tmp/out" && rm -f "$tmp/out";; | |
- *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; | |
+ -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; | |
+ *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; | |
esac \ | |
- || as_fn_error "could not create $ac_file" "$LINENO" 5 | |
+ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 | |
;; | |
@@ -8893,7 +8943,7 @@ | |
ac_clean_files=$ac_clean_files_save | |
test $ac_write_fail = 0 || | |
- as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 | |
+ as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 | |
# configure is writing to config.log, and then calls config.status. | |
@@ -8914,7 +8964,7 @@ | |
exec 5>>config.log | |
# Use ||, not &&, to avoid exiting from the if with $? = 1, which | |
# would make configure fail if this is the last instruction. | |
- $ac_cs_success || as_fn_exit $? | |
+ $ac_cs_success || as_fn_exit 1 | |
fi | |
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then | |
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 | |
diff -u -r sqlite-autoconf-3070900/tea/configure.in sqlite-autoconf-3071000/tea/configure.in | |
--- sqlite-autoconf-3070900/tea/configure.in 2011-11-01 05:31:23.000000000 -0700 | |
+++ sqlite-autoconf-3071000/tea/configure.in 2012-01-16 06:04:56.000000000 -0800 | |
@@ -19,7 +19,7 @@ | |
# so you can encode the package version directly into the source files. | |
#----------------------------------------------------------------------- | |
-AC_INIT([sqlite], [3.7.9]) | |
+AC_INIT([sqlite], [3.7.10]) | |
#-------------------------------------------------------------------- | |
# Call TEA_INIT as the first TEA_ macro to set up initial vars. | |
diff -u -r sqlite-autoconf-3070900/tea/generic/tclsqlite3.c sqlite-autoconf-3071000/tea/generic/tclsqlite3.c | |
--- sqlite-autoconf-3070900/tea/generic/tclsqlite3.c 2011-11-01 05:31:23.000000000 -0700 | |
+++ sqlite-autoconf-3071000/tea/generic/tclsqlite3.c 2012-01-16 06:04:56.000000000 -0800 | |
@@ -3006,6 +3006,14 @@ | |
}else{ | |
flags &= ~SQLITE_OPEN_FULLMUTEX; | |
} | |
+ }else if( strcmp(zArg, "-uri")==0 ){ | |
+ int b; | |
+ if( Tcl_GetBooleanFromObj(interp, objv[i+1], &b) ) return TCL_ERROR; | |
+ if( b ){ | |
+ flags |= SQLITE_OPEN_URI; | |
+ }else{ | |
+ flags &= ~SQLITE_OPEN_URI; | |
+ } | |
}else{ | |
Tcl_AppendResult(interp, "unknown option: ", zArg, (char*)0); | |
return TCL_ERROR; | |
@@ -3014,7 +3022,7 @@ | |
if( objc<3 || (objc&1)!=1 ){ | |
Tcl_WrongNumArgs(interp, 1, objv, | |
"HANDLE FILENAME ?-vfs VFSNAME? ?-readonly BOOLEAN? ?-create BOOLEAN?" | |
- " ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN?" | |
+ " ?-nomutex BOOLEAN? ?-fullmutex BOOLEAN? ?-uri BOOLEAN?" | |
#ifdef SQLITE_HAS_CODEC | |
" ?-key CODECKEY?" | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment