mirror of https://github.com/stella-emu/stella.git
Updated httplib, libpng and sqlite libs to latest releases.
This commit is contained in:
parent
3458da8445
commit
498af52ca2
|
@ -8,7 +8,7 @@
|
|||
#ifndef CPPHTTPLIB_HTTPLIB_H
|
||||
#define CPPHTTPLIB_HTTPLIB_H
|
||||
|
||||
#define CPPHTTPLIB_VERSION "0.11.2"
|
||||
#define CPPHTTPLIB_VERSION "0.11.3"
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
|
@ -172,7 +172,9 @@ using socket_t = SOCKET;
|
|||
#else // not _WIN32
|
||||
|
||||
#include <arpa/inet.h>
|
||||
#ifndef _AIX
|
||||
#include <ifaddrs.h>
|
||||
#endif
|
||||
#include <net/if.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
|
@ -558,10 +560,9 @@ public:
|
|||
{
|
||||
std::unique_lock<std::mutex> lock(mutex_);
|
||||
shutdown_ = true;
|
||||
cond_.notify_all();
|
||||
}
|
||||
|
||||
cond_.notify_all();
|
||||
|
||||
// Join...
|
||||
for (auto &t : threads_) {
|
||||
t.join();
|
||||
|
@ -901,6 +902,7 @@ public:
|
|||
Result Head(const std::string &path, const Headers &headers);
|
||||
|
||||
Result Post(const std::string &path);
|
||||
Result Post(const std::string &path, const Headers &headers);
|
||||
Result Post(const std::string &path, const char *body, size_t content_length,
|
||||
const std::string &content_type);
|
||||
Result Post(const std::string &path, const Headers &headers, const char *body,
|
||||
|
@ -1262,6 +1264,7 @@ public:
|
|||
Result Head(const std::string &path, const Headers &headers);
|
||||
|
||||
Result Post(const std::string &path);
|
||||
Result Post(const std::string &path, const Headers &headers);
|
||||
Result Post(const std::string &path, const char *body, size_t content_length,
|
||||
const std::string &content_type);
|
||||
Result Post(const std::string &path, const Headers &headers, const char *body,
|
||||
|
@ -1533,7 +1536,7 @@ inline void duration_to_sec_and_usec(const T &duration, U callback) {
|
|||
auto usec = std::chrono::duration_cast<std::chrono::microseconds>(
|
||||
duration - std::chrono::seconds(sec))
|
||||
.count();
|
||||
callback(sec, usec);
|
||||
callback(static_cast<time_t>(sec), static_cast<time_t>(usec));
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
|
@ -2600,6 +2603,9 @@ socket_t create_socket(const std::string &host, const std::string &ip, int port,
|
|||
hints.ai_addrlen = static_cast<socklen_t>(
|
||||
sizeof(addr) - sizeof(addr.sun_path) + addrlen);
|
||||
|
||||
fcntl(sock, F_SETFD, FD_CLOEXEC);
|
||||
if (socket_options) { socket_options(sock); }
|
||||
|
||||
if (!bind_or_connect(sock, hints)) {
|
||||
close_socket(sock);
|
||||
sock = INVALID_SOCKET;
|
||||
|
@ -2720,7 +2726,7 @@ inline bool bind_ip_address(socket_t sock, const std::string &host) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if !defined _WIN32 && !defined ANDROID
|
||||
#if !defined _WIN32 && !defined ANDROID && !defined _AIX
|
||||
#define USE_IF2IP
|
||||
#endif
|
||||
|
||||
|
@ -2870,6 +2876,24 @@ inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) {
|
|||
|
||||
if (!getpeername(sock, reinterpret_cast<struct sockaddr *>(&addr),
|
||||
&addr_len)) {
|
||||
#ifndef _WIN32
|
||||
if (addr.ss_family == AF_UNIX) {
|
||||
#if defined(__linux__)
|
||||
struct ucred ucred;
|
||||
socklen_t len = sizeof(ucred);
|
||||
if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) {
|
||||
port = ucred.pid;
|
||||
}
|
||||
#elif defined(SOL_LOCAL) && defined(SO_PEERPID) // __APPLE__
|
||||
pid_t pid;
|
||||
socklen_t len = sizeof(pid);
|
||||
if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) {
|
||||
port = pid;
|
||||
}
|
||||
#endif
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
get_remote_ip_and_port(addr, addr_len, ip, port);
|
||||
}
|
||||
}
|
||||
|
@ -4723,7 +4747,7 @@ inline bool SocketStream::is_readable() const {
|
|||
|
||||
inline bool SocketStream::is_writable() const {
|
||||
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
|
||||
is_socket_alive(sock_);
|
||||
is_socket_alive(sock_);
|
||||
}
|
||||
|
||||
inline ssize_t SocketStream::read(char *ptr, size_t size) {
|
||||
|
@ -5831,7 +5855,16 @@ Server::process_request(Stream &strm, bool close_connection,
|
|||
routed = true;
|
||||
} else {
|
||||
res.status = 500;
|
||||
res.set_header("EXCEPTION_WHAT", e.what());
|
||||
std::string val;
|
||||
auto s = e.what();
|
||||
for (size_t i = 0; s[i]; i++) {
|
||||
switch (s[i]) {
|
||||
case '\r': val += "\\r"; break;
|
||||
case '\n': val += "\\n"; break;
|
||||
default: val += s[i]; break;
|
||||
}
|
||||
}
|
||||
res.set_header("EXCEPTION_WHAT", val);
|
||||
}
|
||||
} catch (...) {
|
||||
if (exception_handler_) {
|
||||
|
@ -6730,6 +6763,11 @@ inline Result ClientImpl::Post(const std::string &path) {
|
|||
return Post(path, std::string(), std::string());
|
||||
}
|
||||
|
||||
inline Result ClientImpl::Post(const std::string &path,
|
||||
const Headers &headers) {
|
||||
return Post(path, headers, nullptr, 0, std::string());
|
||||
}
|
||||
|
||||
inline Result ClientImpl::Post(const std::string &path, const char *body,
|
||||
size_t content_length,
|
||||
const std::string &content_type) {
|
||||
|
@ -7347,7 +7385,7 @@ inline bool SSLSocketStream::is_readable() const {
|
|||
|
||||
inline bool SSLSocketStream::is_writable() const {
|
||||
return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 &&
|
||||
is_socket_alive(sock_);
|
||||
is_socket_alive(sock_);
|
||||
}
|
||||
|
||||
inline ssize_t SSLSocketStream::read(char *ptr, size_t size) {
|
||||
|
@ -8053,6 +8091,9 @@ inline Result Client::Head(const std::string &path, const Headers &headers) {
|
|||
}
|
||||
|
||||
inline Result Client::Post(const std::string &path) { return cli_->Post(path); }
|
||||
inline Result Client::Post(const std::string &path, const Headers &headers) {
|
||||
return cli_->Post(path, headers);
|
||||
}
|
||||
inline Result Client::Post(const std::string &path, const char *body,
|
||||
size_t content_length,
|
||||
const std::string &content_type) {
|
||||
|
@ -8383,4 +8424,8 @@ inline SSL_CTX *Client::ssl_context() const {
|
|||
|
||||
} // namespace httplib
|
||||
|
||||
#if defined(_WIN32) && defined(CPPHTTPLIB_USE_POLL)
|
||||
#undef poll
|
||||
#endif
|
||||
|
||||
#endif // CPPHTTPLIB_HTTPLIB_H
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* png.c - location for general purpose libpng functions
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -14,7 +14,7 @@
|
|||
#include "pngpriv.h"
|
||||
|
||||
/* Generate a compiler error if there is an old png.h in the search path. */
|
||||
typedef png_libpng_version_1_6_38 Your_png_h_is_not_version_1_6_38;
|
||||
typedef png_libpng_version_1_6_39 Your_png_h_is_not_version_1_6_39;
|
||||
|
||||
#ifdef __GNUC__
|
||||
/* The version tests may need to be added to, but the problem warning has
|
||||
|
@ -815,8 +815,8 @@ png_get_copyright(png_const_structrp png_ptr)
|
|||
return PNG_STRING_COPYRIGHT
|
||||
#else
|
||||
return PNG_STRING_NEWLINE \
|
||||
"libpng version 1.6.38" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 2018-2023 Cosmin Truta" PNG_STRING_NEWLINE \
|
||||
"libpng version 1.6.39" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 2018-2022 Cosmin Truta" PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \
|
||||
PNG_STRING_NEWLINE \
|
||||
"Copyright (c) 1996-1997 Andreas Dilger" PNG_STRING_NEWLINE \
|
||||
|
@ -2710,7 +2710,7 @@ png_check_IHDR(png_const_structrp png_ptr,
|
|||
|
||||
int /* PRIVATE */
|
||||
png_check_fp_number(png_const_charp string, size_t size, int *statep,
|
||||
png_size_tp whereami)
|
||||
size_t *whereami)
|
||||
{
|
||||
int state = *statep;
|
||||
size_t i = *whereami;
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
/* png.h - header file for PNG reference library
|
||||
*
|
||||
* libpng version 1.6.38 - September 14, 2022
|
||||
* libpng version 1.6.39 - November 20, 2022
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -15,7 +15,7 @@
|
|||
* libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger
|
||||
* libpng versions 0.97, January 1998, through 1.6.35, July 2018:
|
||||
* Glenn Randers-Pehrson
|
||||
* libpng versions 1.6.36, December 2018, through 1.6.38, September 2022:
|
||||
* libpng versions 1.6.36, December 2018, through 1.6.39, November 2022:
|
||||
* Cosmin Truta
|
||||
* See also "Contributing Authors", below.
|
||||
*/
|
||||
|
@ -27,8 +27,8 @@
|
|||
* PNG Reference Library License version 2
|
||||
* ---------------------------------------
|
||||
*
|
||||
* * Copyright (c) 1995-2023 The PNG Reference Library Authors.
|
||||
* * Copyright (c) 2018-2023 Cosmin Truta.
|
||||
* * Copyright (c) 1995-2022 The PNG Reference Library Authors.
|
||||
* * Copyright (c) 2018-2022 Cosmin Truta.
|
||||
* * Copyright (c) 2000-2002, 2004, 2006-2018 Glenn Randers-Pehrson.
|
||||
* * Copyright (c) 1996-1997 Andreas Dilger.
|
||||
* * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -239,7 +239,7 @@
|
|||
* ...
|
||||
* 1.5.30 15 10530 15.so.15.30[.0]
|
||||
* ...
|
||||
* 1.6.38 16 10638 16.so.16.38[.0]
|
||||
* 1.6.39 16 10639 16.so.16.39[.0]
|
||||
*
|
||||
* Henceforth the source version will match the shared-library major and
|
||||
* minor numbers; the shared-library major version number will be used for
|
||||
|
@ -278,8 +278,8 @@
|
|||
*/
|
||||
|
||||
/* Version information for png.h - this should match the version in png.c */
|
||||
#define PNG_LIBPNG_VER_STRING "1.6.38"
|
||||
#define PNG_HEADER_VERSION_STRING " libpng version 1.6.38 - September 14, 2022\n"
|
||||
#define PNG_LIBPNG_VER_STRING "1.6.39"
|
||||
#define PNG_HEADER_VERSION_STRING " libpng version 1.6.39 - November 20, 2022\n"
|
||||
|
||||
#define PNG_LIBPNG_VER_SONUM 16
|
||||
#define PNG_LIBPNG_VER_DLLNUM 16
|
||||
|
@ -287,7 +287,7 @@
|
|||
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
|
||||
#define PNG_LIBPNG_VER_MAJOR 1
|
||||
#define PNG_LIBPNG_VER_MINOR 6
|
||||
#define PNG_LIBPNG_VER_RELEASE 38
|
||||
#define PNG_LIBPNG_VER_RELEASE 39
|
||||
|
||||
/* This should be zero for a public release, or non-zero for a
|
||||
* development version. [Deprecated]
|
||||
|
@ -318,7 +318,7 @@
|
|||
* From version 1.0.1 it is:
|
||||
* XXYYZZ, where XX=major, YY=minor, ZZ=release
|
||||
*/
|
||||
#define PNG_LIBPNG_VER 10638 /* 1.6.38 */
|
||||
#define PNG_LIBPNG_VER 10639 /* 1.6.39 */
|
||||
|
||||
/* Library configuration: these options cannot be changed after
|
||||
* the library has been built.
|
||||
|
@ -428,7 +428,7 @@ extern "C" {
|
|||
/* This triggers a compiler error in png.c, if png.c and png.h
|
||||
* do not agree upon the version number.
|
||||
*/
|
||||
typedef char* png_libpng_version_1_6_38;
|
||||
typedef char* png_libpng_version_1_6_39;
|
||||
|
||||
/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info.
|
||||
*
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
|
||||
/* pngconf.h - machine-configurable file for libpng
|
||||
*
|
||||
* libpng version 1.6.38
|
||||
* libpng version 1.6.39
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/* pnglibconf.h - library build configuration */
|
||||
|
||||
/* libpng version 1.6.37 */
|
||||
/* libpng version 1.6.39 */
|
||||
|
||||
/* Copyright (c) 2018-2019 Cosmin Truta */
|
||||
/* Copyright (c) 2018-2022 Cosmin Truta */
|
||||
/* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */
|
||||
|
||||
/* This code is released under the libpng license. */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngpriv.h - private declarations for use inside libpng
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -1946,7 +1946,7 @@ PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr,
|
|||
* the problem character.) This has not been tested within libpng.
|
||||
*/
|
||||
PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string,
|
||||
size_t size, int *statep, png_size_tp whereami),PNG_EMPTY);
|
||||
size_t size, int *statep, size_t *whereami),PNG_EMPTY);
|
||||
|
||||
/* This is the same but it checks a complete string and returns true
|
||||
* only if it just contains a floating point number. As of 1.5.4 this
|
||||
|
|
|
@ -3762,13 +3762,13 @@ png_image_read_direct(png_voidp argument)
|
|||
mode = PNG_ALPHA_PNG;
|
||||
output_gamma = PNG_DEFAULT_sRGB;
|
||||
}
|
||||
|
||||
|
||||
if ((change & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0)
|
||||
{
|
||||
mode = PNG_ALPHA_OPTIMIZED;
|
||||
change &= ~PNG_FORMAT_FLAG_ASSOCIATED_ALPHA;
|
||||
}
|
||||
|
||||
|
||||
/* If 'do_local_background' is set check for the presence of gamma
|
||||
* correction; this is part of the work-round for the libpng bug
|
||||
* described above.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngrutil.c - utilities to read a PNG file
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -3186,7 +3186,7 @@ png_check_chunk_length(png_const_structrp png_ptr, png_uint_32 length)
|
|||
{
|
||||
png_debug2(0," length = %lu, limit = %lu",
|
||||
(unsigned long)length,(unsigned long)limit);
|
||||
png_chunk_error(png_ptr, "chunk data is too large");
|
||||
png_benign_error(png_ptr, "chunk data is too large");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngset.c - storage of image information into info struct
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngstruct.h - header file for PNG reference library
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngwrite.c - general routines to write a PNG file
|
||||
*
|
||||
* Copyright (c) 2018-2023 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -75,10 +75,10 @@ write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr,
|
|||
* library. If you have a new chunk to add, make a function to write it,
|
||||
* and put it in the correct location here. If you want the chunk written
|
||||
* after the image data, put it in png_write_end(). I strongly encourage
|
||||
* you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing
|
||||
* the chunk, as that will keep the code from breaking if you want to just
|
||||
* write a plain PNG file. If you have long comments, I suggest writing
|
||||
* them in png_write_end(), and compressing them.
|
||||
* you to supply a PNG_INFO_<chunk> flag, and check info_ptr->valid before
|
||||
* writing the chunk, as that will keep the code from breaking if you want
|
||||
* to just write a plain PNG file. If you have long comments, I suggest
|
||||
* writing them in png_write_end(), and compressing them.
|
||||
*/
|
||||
void PNGAPI
|
||||
png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
|
||||
/* pngwutil.c - utilities to write a PNG file
|
||||
*
|
||||
* Copyright (c) 2018 Cosmin Truta
|
||||
* Copyright (c) 2018-2022 Cosmin Truta
|
||||
* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson
|
||||
* Copyright (c) 1996-1997 Andreas Dilger
|
||||
* Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.
|
||||
|
@ -1747,7 +1747,7 @@ png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0,
|
|||
{
|
||||
png_uint_32 purpose_len;
|
||||
size_t units_len, total_len;
|
||||
png_size_tp params_len;
|
||||
size_t *params_len;
|
||||
png_byte buf[10];
|
||||
png_byte new_purpose[80];
|
||||
int i;
|
||||
|
@ -1769,7 +1769,7 @@ png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0,
|
|||
png_debug1(3, "pCAL units length = %d", (int)units_len);
|
||||
total_len = purpose_len + units_len + 10;
|
||||
|
||||
params_len = (png_size_tp)png_malloc(png_ptr,
|
||||
params_len = (size_t *)png_malloc(png_ptr,
|
||||
(png_alloc_size_t)((png_alloc_size_t)nparams * (sizeof (size_t))));
|
||||
|
||||
/* Find the length of each parameter, making sure we don't count the
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
** This file is an amalgamation of many separate C source files from SQLite
|
||||
** version 3.40.0. By combining all the individual C code files into this
|
||||
** version 3.40.1. 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
|
||||
|
@ -452,9 +452,9 @@ extern "C" {
|
|||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||
** [sqlite_version()] and [sqlite_source_id()].
|
||||
*/
|
||||
#define SQLITE_VERSION "3.40.0"
|
||||
#define SQLITE_VERSION_NUMBER 3040000
|
||||
#define SQLITE_SOURCE_ID "2022-11-16 12:10:08 89c459e766ea7e9165d0beeb124708b955a4950d0f4792f457465d71b158d318"
|
||||
#define SQLITE_VERSION "3.40.1"
|
||||
#define SQLITE_VERSION_NUMBER 3040001
|
||||
#define SQLITE_SOURCE_ID "2022-12-28 14:03:47 df5c253c0b3dd24916e4ec7cf77d3db5294cc9fd45ae7b9c5e82ad8197f38a24"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
|
@ -1498,6 +1498,12 @@ struct sqlite3_io_methods {
|
|||
**
|
||||
** <li>[[SQLITE_FCNTL_CKSM_FILE]]
|
||||
** Used by the cksmvfs VFS module only.
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_RESET_CACHE]]
|
||||
** If there is currently no transaction open on the database, and the
|
||||
** database is not a temp db, then this file-control purges the contents
|
||||
** of the in-memory page cache. If there is an open transaction, or if
|
||||
** the db is a temp-db, it is a no-op, not an error.
|
||||
** </ul>
|
||||
*/
|
||||
#define SQLITE_FCNTL_LOCKSTATE 1
|
||||
|
@ -1540,6 +1546,7 @@ struct sqlite3_io_methods {
|
|||
#define SQLITE_FCNTL_CKPT_START 39
|
||||
#define SQLITE_FCNTL_EXTERNAL_READER 40
|
||||
#define SQLITE_FCNTL_CKSM_FILE 41
|
||||
#define SQLITE_FCNTL_RESET_CACHE 42
|
||||
|
||||
/* deprecated names */
|
||||
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
|
||||
|
@ -15714,6 +15721,8 @@ SQLITE_PRIVATE int sqlite3BtreeCheckpoint(Btree*, int, int *, int *);
|
|||
|
||||
SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor*, BtCursor*, i64);
|
||||
|
||||
SQLITE_PRIVATE void sqlite3BtreeClearCache(Btree*);
|
||||
|
||||
/*
|
||||
** If we are not using shared cache, then there is no need to
|
||||
** use mutexes to access the BtShared structures. So make the
|
||||
|
@ -17982,7 +17991,7 @@ struct UnpackedRecord {
|
|||
** is *not* available in the index. Thus the expression
|
||||
** "colUsed & colNotIdxed" will be non-zero if the index is not a
|
||||
** covering index. The most significant bit of of colNotIdxed will always
|
||||
** be true (note-20231022-a). If a column beyond the 63rd column of the
|
||||
** be true (note-20221022-a). If a column beyond the 63rd column of the
|
||||
** table is used, the "colUsed & colNotIdxed" test will always be non-zero
|
||||
** and we have to assume either that the index is not covering, or use
|
||||
** an alternative (slower) algorithm to determine whether or not
|
||||
|
@ -27290,9 +27299,13 @@ static int memsys5Roundup(int n){
|
|||
if( n<=mem5.szAtom ) return mem5.szAtom;
|
||||
return mem5.szAtom*2;
|
||||
}
|
||||
if( n>0x40000000 ) return 0;
|
||||
if( n>0x10000000 ){
|
||||
if( n>0x40000000 ) return 0;
|
||||
if( n>0x20000000 ) return 0x40000000;
|
||||
return 0x20000000;
|
||||
}
|
||||
for(iFullSz=mem5.szAtom*8; iFullSz<n; iFullSz *= 4);
|
||||
if( (iFullSz/2)>=n ) return iFullSz/2;
|
||||
if( (iFullSz/2)>=(i64)n ) return iFullSz/2;
|
||||
return iFullSz;
|
||||
}
|
||||
|
||||
|
@ -37338,6 +37351,9 @@ static int robust_open(const char *z, int f, mode_t m){
|
|||
break;
|
||||
}
|
||||
if( fd>=SQLITE_MINIMUM_FILE_DESCRIPTOR ) break;
|
||||
if( (f & (O_EXCL|O_CREAT))==(O_EXCL|O_CREAT) ){
|
||||
(void)osUnlink(z);
|
||||
}
|
||||
osClose(fd);
|
||||
sqlite3_log(SQLITE_WARNING,
|
||||
"attempt to open \"%s\" as file descriptor %d", z, fd);
|
||||
|
@ -51071,6 +51087,7 @@ static int memdbTruncate(sqlite3_file*, sqlite3_int64 size);
|
|||
static int memdbSync(sqlite3_file*, int flags);
|
||||
static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize);
|
||||
static int memdbLock(sqlite3_file*, int);
|
||||
static int memdbUnlock(sqlite3_file*, int);
|
||||
/* static int memdbCheckReservedLock(sqlite3_file*, int *pResOut);// not used */
|
||||
static int memdbFileControl(sqlite3_file*, int op, void *pArg);
|
||||
/* static int memdbSectorSize(sqlite3_file*); // not used */
|
||||
|
@ -51129,7 +51146,7 @@ static const sqlite3_io_methods memdb_io_methods = {
|
|||
memdbSync, /* xSync */
|
||||
memdbFileSize, /* xFileSize */
|
||||
memdbLock, /* xLock */
|
||||
memdbLock, /* xUnlock - same as xLock in this case */
|
||||
memdbUnlock, /* xUnlock */
|
||||
0, /* memdbCheckReservedLock, */ /* xCheckReservedLock */
|
||||
memdbFileControl, /* xFileControl */
|
||||
0, /* memdbSectorSize,*/ /* xSectorSize */
|
||||
|
@ -51330,41 +51347,83 @@ static int memdbLock(sqlite3_file *pFile, int eLock){
|
|||
MemFile *pThis = (MemFile*)pFile;
|
||||
MemStore *p = pThis->pStore;
|
||||
int rc = SQLITE_OK;
|
||||
if( eLock==pThis->eLock ) return SQLITE_OK;
|
||||
if( eLock<=pThis->eLock ) return SQLITE_OK;
|
||||
memdbEnter(p);
|
||||
if( eLock>SQLITE_LOCK_SHARED ){
|
||||
if( p->mFlags & SQLITE_DESERIALIZE_READONLY ){
|
||||
rc = SQLITE_READONLY;
|
||||
}else if( pThis->eLock<=SQLITE_LOCK_SHARED ){
|
||||
if( p->nWrLock ){
|
||||
rc = SQLITE_BUSY;
|
||||
}else{
|
||||
p->nWrLock = 1;
|
||||
|
||||
assert( p->nWrLock==0 || p->nWrLock==1 );
|
||||
assert( pThis->eLock<=SQLITE_LOCK_SHARED || p->nWrLock==1 );
|
||||
assert( pThis->eLock==SQLITE_LOCK_NONE || p->nRdLock>=1 );
|
||||
|
||||
if( eLock>SQLITE_LOCK_SHARED && (p->mFlags & SQLITE_DESERIALIZE_READONLY) ){
|
||||
rc = SQLITE_READONLY;
|
||||
}else{
|
||||
switch( eLock ){
|
||||
case SQLITE_LOCK_SHARED: {
|
||||
assert( pThis->eLock==SQLITE_LOCK_NONE );
|
||||
if( p->nWrLock>0 ){
|
||||
rc = SQLITE_BUSY;
|
||||
}else{
|
||||
p->nRdLock++;
|
||||
}
|
||||
break;
|
||||
};
|
||||
|
||||
case SQLITE_LOCK_RESERVED:
|
||||
case SQLITE_LOCK_PENDING: {
|
||||
assert( pThis->eLock>=SQLITE_LOCK_SHARED );
|
||||
if( ALWAYS(pThis->eLock==SQLITE_LOCK_SHARED) ){
|
||||
if( p->nWrLock>0 ){
|
||||
rc = SQLITE_BUSY;
|
||||
}else{
|
||||
p->nWrLock = 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default: {
|
||||
assert( eLock==SQLITE_LOCK_EXCLUSIVE );
|
||||
assert( pThis->eLock>=SQLITE_LOCK_SHARED );
|
||||
if( p->nRdLock>1 ){
|
||||
rc = SQLITE_BUSY;
|
||||
}else if( pThis->eLock==SQLITE_LOCK_SHARED ){
|
||||
p->nWrLock = 1;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}else if( eLock==SQLITE_LOCK_SHARED ){
|
||||
if( pThis->eLock > SQLITE_LOCK_SHARED ){
|
||||
assert( p->nWrLock==1 );
|
||||
p->nWrLock = 0;
|
||||
}else if( p->nWrLock ){
|
||||
rc = SQLITE_BUSY;
|
||||
}else{
|
||||
p->nRdLock++;
|
||||
}
|
||||
}else{
|
||||
assert( eLock==SQLITE_LOCK_NONE );
|
||||
if( pThis->eLock>SQLITE_LOCK_SHARED ){
|
||||
assert( p->nWrLock==1 );
|
||||
p->nWrLock = 0;
|
||||
}
|
||||
assert( p->nRdLock>0 );
|
||||
p->nRdLock--;
|
||||
}
|
||||
if( rc==SQLITE_OK ) pThis->eLock = eLock;
|
||||
memdbLeave(p);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Unlock an memdb-file.
|
||||
*/
|
||||
static int memdbUnlock(sqlite3_file *pFile, int eLock){
|
||||
MemFile *pThis = (MemFile*)pFile;
|
||||
MemStore *p = pThis->pStore;
|
||||
if( eLock>=pThis->eLock ) return SQLITE_OK;
|
||||
memdbEnter(p);
|
||||
|
||||
assert( eLock==SQLITE_LOCK_SHARED || eLock==SQLITE_LOCK_NONE );
|
||||
if( eLock==SQLITE_LOCK_SHARED ){
|
||||
if( ALWAYS(pThis->eLock>SQLITE_LOCK_SHARED) ){
|
||||
p->nWrLock--;
|
||||
}
|
||||
}else{
|
||||
if( pThis->eLock>SQLITE_LOCK_SHARED ){
|
||||
p->nWrLock--;
|
||||
}
|
||||
p->nRdLock--;
|
||||
}
|
||||
|
||||
pThis->eLock = eLock;
|
||||
memdbLeave(p);
|
||||
return SQLITE_OK;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/*
|
||||
** This interface is only used for crash recovery, which does not
|
||||
|
@ -51472,7 +51531,7 @@ static int memdbOpen(
|
|||
|
||||
memset(pFile, 0, sizeof(*pFile));
|
||||
szName = sqlite3Strlen30(zName);
|
||||
if( szName>1 && zName[0]=='/' ){
|
||||
if( szName>1 && (zName[0]=='/' || zName[0]=='\\') ){
|
||||
int i;
|
||||
#ifndef SQLITE_MUTEX_OMIT
|
||||
sqlite3_mutex *pVfsMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_VFS1);
|
||||
|
@ -51819,6 +51878,13 @@ end_deserialize:
|
|||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return true if the VFS is the memvfs.
|
||||
*/
|
||||
SQLITE_PRIVATE int sqlite3IsMemdb(const sqlite3_vfs *pVfs){
|
||||
return pVfs==&memdb_vfs;
|
||||
}
|
||||
|
||||
/*
|
||||
** This routine is called when the extension is loaded.
|
||||
** Register the new VFS.
|
||||
|
@ -79147,6 +79213,17 @@ SQLITE_PRIVATE int sqlite3BtreeIsReadonly(Btree *p){
|
|||
*/
|
||||
SQLITE_PRIVATE int sqlite3HeaderSizeBtree(void){ return ROUND8(sizeof(MemPage)); }
|
||||
|
||||
/*
|
||||
** If no transaction is active and the database is not a temp-db, clear
|
||||
** the in-memory pager cache.
|
||||
*/
|
||||
SQLITE_PRIVATE void sqlite3BtreeClearCache(Btree *p){
|
||||
BtShared *pBt = p->pBt;
|
||||
if( pBt->inTransaction==TRANS_NONE ){
|
||||
sqlite3PagerClearCache(pBt->pPager);
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(SQLITE_OMIT_SHARED_CACHE)
|
||||
/*
|
||||
** Return true if the Btree passed as the only argument is sharable.
|
||||
|
@ -83386,7 +83463,7 @@ SQLITE_PRIVATE void sqlite3VdbeAppendP4(Vdbe *p, void *pP4, int n){
|
|||
if( p->db->mallocFailed ){
|
||||
freeP4(p->db, n, pP4);
|
||||
}else{
|
||||
assert( pP4!=0 );
|
||||
assert( pP4!=0 || n==P4_DYNAMIC );
|
||||
assert( p->nOp>0 );
|
||||
pOp = &p->aOp[p->nOp-1];
|
||||
assert( pOp->p4type==P4_NOTUSED );
|
||||
|
@ -88082,7 +88159,7 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){
|
|||
/* Setting minWriteFileFormat to 254 is a signal to the OP_Init and
|
||||
** OP_Trace opcodes to *not* perform SQLITE_TRACE_STMT because it has
|
||||
** already been done once on a prior invocation that failed due to
|
||||
** SQLITE_SCHEMA. tag-20230401a */
|
||||
** SQLITE_SCHEMA. tag-20220401a */
|
||||
v->minWriteFileFormat = 254;
|
||||
}
|
||||
assert( v->expired==0 );
|
||||
|
@ -90633,7 +90710,7 @@ case OP_Gosub: { /* jump */
|
|||
** formatter in the CLI will indent all opcodes from the P2 opcode up
|
||||
** to be not including the current Return. P2 should be the first opcode
|
||||
** in the subroutine from which this opcode is returning. Thus the P2
|
||||
** value is a byte-code indentation hint. See tag-20230407a in
|
||||
** value is a byte-code indentation hint. See tag-20220407a in
|
||||
** wherecode.c and shell.c.
|
||||
*/
|
||||
case OP_Return: { /* in1 */
|
||||
|
@ -98200,7 +98277,7 @@ case OP_Init: { /* jump */
|
|||
|
||||
#ifndef SQLITE_OMIT_TRACE
|
||||
if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0
|
||||
&& p->minWriteFileFormat!=254 /* tag-20230401a */
|
||||
&& p->minWriteFileFormat!=254 /* tag-20220401a */
|
||||
&& (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0
|
||||
){
|
||||
#ifndef SQLITE_OMIT_DEPRECATED
|
||||
|
@ -118960,7 +119037,7 @@ static void recomputeColumnsNotIndexed(Index *pIdx){
|
|||
}
|
||||
}
|
||||
pIdx->colNotIdxed = ~m;
|
||||
assert( (pIdx->colNotIdxed>>63)==1 ); /* See note-20231022-a */
|
||||
assert( (pIdx->colNotIdxed>>63)==1 ); /* See note-20221022-a */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -132298,7 +132375,7 @@ static const sqlite3_api_routines sqlite3Apis = {
|
|||
#endif
|
||||
sqlite3_db_name,
|
||||
/* Version 3.40.0 and later */
|
||||
sqlite3_value_type
|
||||
sqlite3_value_encoding
|
||||
};
|
||||
|
||||
/* True if x is the directory separator character
|
||||
|
@ -145439,7 +145516,7 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){
|
|||
if( pTrig->pTabSchema==pTab->pSchema
|
||||
&& pTrig->table
|
||||
&& 0==sqlite3StrICmp(pTrig->table, pTab->zName)
|
||||
&& pTrig->pTabSchema!=pTmpSchema
|
||||
&& (pTrig->pTabSchema!=pTmpSchema || pTrig->bReturning)
|
||||
){
|
||||
pTrig->pNext = pList;
|
||||
pList = pTrig;
|
||||
|
@ -153153,7 +153230,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|||
** in the subquery might be resolved to index-references for the index on
|
||||
** the OR branch in which the subroutine is coded. But if the subroutine
|
||||
** is invoked from a different OR branch that uses a different index, such
|
||||
** index-references will not work. tag-20230303a
|
||||
** index-references will not work. tag-20220303a
|
||||
** https://sqlite.org/forum/forumpost/36937b197273d403
|
||||
*/
|
||||
if( pWC->nTerm>1 ){
|
||||
|
@ -153168,7 +153245,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|||
continue;
|
||||
}
|
||||
if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
|
||||
if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20230303a */
|
||||
if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */
|
||||
pExpr = sqlite3ExprDup(db, pExpr, 0);
|
||||
pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
|
||||
}
|
||||
|
@ -153337,7 +153414,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|||
** loop to point to this spot, which is the top of the next containing
|
||||
** loop. The byte-code formatter will use that P2 value as a hint to
|
||||
** indent everything in between the this point and the final OP_Return.
|
||||
** See tag-20230407a in vdbe.c and shell.c */
|
||||
** See tag-20220407a in vdbe.c and shell.c */
|
||||
assert( pLevel->op==OP_Return );
|
||||
pLevel->p2 = sqlite3VdbeCurrentAddr(v);
|
||||
|
||||
|
@ -153406,7 +153483,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|||
if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ){
|
||||
if( !ExprHasProperty(pE,EP_OuterON|EP_InnerON) ){
|
||||
/* Defer processing WHERE clause constraints until after outer
|
||||
** join processing. tag-20230513a */
|
||||
** join processing. tag-20220513a */
|
||||
continue;
|
||||
}else if( (pTabItem->fg.jointype & JT_LEFT)==JT_LEFT
|
||||
&& !ExprHasProperty(pE,EP_OuterON) ){
|
||||
|
@ -153577,7 +153654,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
|
|||
/* WHERE clause constraints must be deferred until after outer join
|
||||
** row elimination has completed, since WHERE clause constraints apply
|
||||
** to the results of the OUTER JOIN. The following loop generates the
|
||||
** appropriate WHERE clause constraint checks. tag-20230513a.
|
||||
** appropriate WHERE clause constraint checks. tag-20220513a.
|
||||
*/
|
||||
code_outer_join_constraints:
|
||||
for(pTerm=pWC->a, j=0; j<pWC->nBase; j++, pTerm++){
|
||||
|
@ -155096,7 +155173,7 @@ static void exprAnalyze(
|
|||
** This is only required if at least one side of the comparison operation
|
||||
** is not a sub-select.
|
||||
**
|
||||
** tag-20230128a
|
||||
** tag-20220128a
|
||||
*/
|
||||
if( (pExpr->op==TK_EQ || pExpr->op==TK_IS)
|
||||
&& (nLeft = sqlite3ExprVectorSize(pExpr->pLeft))>1
|
||||
|
@ -155318,7 +155395,7 @@ SQLITE_PRIVATE void SQLITE_NOINLINE sqlite3WhereAddLimit(WhereClause *pWC, Selec
|
|||
for(ii=0; ii<pWC->nTerm; ii++){
|
||||
if( pWC->a[ii].wtFlags & TERM_CODED ){
|
||||
/* This term is a vector operation that has been decomposed into
|
||||
** other, subsequent terms. It can be ignored. See tag-20230128a */
|
||||
** other, subsequent terms. It can be ignored. See tag-20220128a */
|
||||
assert( pWC->a[ii].wtFlags & TERM_VIRTUAL );
|
||||
assert( pWC->a[ii].eOperator==WO_ROWVAL );
|
||||
continue;
|
||||
|
@ -155623,7 +155700,7 @@ SQLITE_PRIVATE int sqlite3WhereIsDistinct(WhereInfo *pWInfo){
|
|||
** block sorting is required.
|
||||
*/
|
||||
SQLITE_PRIVATE int sqlite3WhereIsOrdered(WhereInfo *pWInfo){
|
||||
return pWInfo->nOBSat;
|
||||
return pWInfo->nOBSat<0 ? 0 : pWInfo->nOBSat;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -174531,7 +174608,7 @@ SQLITE_API int sqlite3_overload_function(
|
|||
rc = sqlite3FindFunction(db, zName, nArg, SQLITE_UTF8, 0)!=0;
|
||||
sqlite3_mutex_leave(db->mutex);
|
||||
if( rc ) return SQLITE_OK;
|
||||
zCopy = sqlite3_mprintf(zName);
|
||||
zCopy = sqlite3_mprintf("%s", zName);
|
||||
if( zCopy==0 ) return SQLITE_NOMEM;
|
||||
return sqlite3_create_function_v2(db, zName, nArg, SQLITE_UTF8,
|
||||
zCopy, sqlite3InvalidFunction, 0, 0, sqlite3_free);
|
||||
|
@ -176363,6 +176440,9 @@ SQLITE_API int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, vo
|
|||
sqlite3BtreeSetPageSize(pBtree, 0, iNew, 0);
|
||||
}
|
||||
rc = SQLITE_OK;
|
||||
}else if( op==SQLITE_FCNTL_RESET_CACHE ){
|
||||
sqlite3BtreeClearCache(pBtree);
|
||||
rc = SQLITE_OK;
|
||||
}else{
|
||||
int nSave = db->busyHandler.nBusy;
|
||||
rc = sqlite3OsFileControl(fd, op, pArg);
|
||||
|
@ -217778,6 +217858,22 @@ static int sessionChangesetNextOne(
|
|||
if( p->op==SQLITE_INSERT ) p->op = SQLITE_DELETE;
|
||||
else if( p->op==SQLITE_DELETE ) p->op = SQLITE_INSERT;
|
||||
}
|
||||
|
||||
/* If this is an UPDATE that is part of a changeset, then check that
|
||||
** there are no fields in the old.* record that are not (a) PK fields,
|
||||
** or (b) also present in the new.* record.
|
||||
**
|
||||
** Such records are technically corrupt, but the rebaser was at one
|
||||
** point generating them. Under most circumstances this is benign, but
|
||||
** can cause spurious SQLITE_RANGE errors when applying the changeset. */
|
||||
if( p->bPatchset==0 && p->op==SQLITE_UPDATE){
|
||||
for(i=0; i<p->nCol; i++){
|
||||
if( p->abPK[i]==0 && p->apValue[i+p->nCol]==0 ){
|
||||
sqlite3ValueFree(p->apValue[i]);
|
||||
p->apValue[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return SQLITE_ROW;
|
||||
|
@ -219974,7 +220070,7 @@ static void sessionAppendPartialUpdate(
|
|||
if( !pIter->abPK[i] && a1[0] ) bData = 1;
|
||||
memcpy(pOut, a1, n1);
|
||||
pOut += n1;
|
||||
}else if( a2[0]!=0xFF ){
|
||||
}else if( a2[0]!=0xFF && a1[0] ){
|
||||
bData = 1;
|
||||
memcpy(pOut, a2, n2);
|
||||
pOut += n2;
|
||||
|
@ -236004,7 +236100,7 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){
|
|||
break;
|
||||
|
||||
case FTS5_SYNC:
|
||||
assert( p->ts.eState==1 );
|
||||
assert( p->ts.eState==1 || p->ts.eState==2 );
|
||||
p->ts.eState = 2;
|
||||
break;
|
||||
|
||||
|
@ -236019,21 +236115,21 @@ static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){
|
|||
break;
|
||||
|
||||
case FTS5_SAVEPOINT:
|
||||
assert( p->ts.eState==1 );
|
||||
assert( p->ts.eState>=1 );
|
||||
assert( iSavepoint>=0 );
|
||||
assert( iSavepoint>=p->ts.iSavepoint );
|
||||
p->ts.iSavepoint = iSavepoint;
|
||||
break;
|
||||
|
||||
case FTS5_RELEASE:
|
||||
assert( p->ts.eState==1 );
|
||||
assert( p->ts.eState>=1 );
|
||||
assert( iSavepoint>=0 );
|
||||
assert( iSavepoint<=p->ts.iSavepoint );
|
||||
p->ts.iSavepoint = iSavepoint-1;
|
||||
break;
|
||||
|
||||
case FTS5_ROLLBACKTO:
|
||||
assert( p->ts.eState==1 );
|
||||
assert( p->ts.eState>=1 );
|
||||
assert( iSavepoint>=-1 );
|
||||
/* The following assert() can fail if another vtab strikes an error
|
||||
** within an xSavepoint() call then SQLite calls xRollbackTo() - without
|
||||
|
@ -237369,7 +237465,7 @@ static int fts5UpdateMethod(
|
|||
int rc = SQLITE_OK; /* Return code */
|
||||
|
||||
/* A transaction must be open when this is called. */
|
||||
assert( pTab->ts.eState==1 );
|
||||
assert( pTab->ts.eState==1 || pTab->ts.eState==2 );
|
||||
|
||||
assert( pVtab->zErrMsg==0 );
|
||||
assert( nArg==1 || nArg==(2+pConfig->nCol+2) );
|
||||
|
@ -238537,7 +238633,7 @@ static void fts5SourceIdFunc(
|
|||
){
|
||||
assert( nArg==0 );
|
||||
UNUSED_PARAM2(nArg, apUnused);
|
||||
sqlite3_result_text(pCtx, "fts5: 2022-11-16 12:10:08 89c459e766ea7e9165d0beeb124708b955a4950d0f4792f457465d71b158d318", -1, SQLITE_TRANSIENT);
|
||||
sqlite3_result_text(pCtx, "fts5: 2022-12-28 14:03:47 df5c253c0b3dd24916e4ec7cf77d3db5294cc9fd45ae7b9c5e82ad8197f38a24", -1, SQLITE_TRANSIENT);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -146,9 +146,9 @@ extern "C" {
|
|||
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
||||
** [sqlite_version()] and [sqlite_source_id()].
|
||||
*/
|
||||
#define SQLITE_VERSION "3.40.0"
|
||||
#define SQLITE_VERSION_NUMBER 3040000
|
||||
#define SQLITE_SOURCE_ID "2022-11-16 12:10:08 89c459e766ea7e9165d0beeb124708b955a4950d0f4792f457465d71b158d318"
|
||||
#define SQLITE_VERSION "3.40.1"
|
||||
#define SQLITE_VERSION_NUMBER 3040001
|
||||
#define SQLITE_SOURCE_ID "2022-12-28 14:03:47 df5c253c0b3dd24916e4ec7cf77d3db5294cc9fd45ae7b9c5e82ad8197f38a24"
|
||||
|
||||
/*
|
||||
** CAPI3REF: Run-Time Library Version Numbers
|
||||
|
@ -1192,6 +1192,12 @@ struct sqlite3_io_methods {
|
|||
**
|
||||
** <li>[[SQLITE_FCNTL_CKSM_FILE]]
|
||||
** Used by the cksmvfs VFS module only.
|
||||
**
|
||||
** <li>[[SQLITE_FCNTL_RESET_CACHE]]
|
||||
** If there is currently no transaction open on the database, and the
|
||||
** database is not a temp db, then this file-control purges the contents
|
||||
** of the in-memory page cache. If there is an open transaction, or if
|
||||
** the db is a temp-db, it is a no-op, not an error.
|
||||
** </ul>
|
||||
*/
|
||||
#define SQLITE_FCNTL_LOCKSTATE 1
|
||||
|
@ -1234,6 +1240,7 @@ struct sqlite3_io_methods {
|
|||
#define SQLITE_FCNTL_CKPT_START 39
|
||||
#define SQLITE_FCNTL_EXTERNAL_READER 40
|
||||
#define SQLITE_FCNTL_CKSM_FILE 41
|
||||
#define SQLITE_FCNTL_RESET_CACHE 42
|
||||
|
||||
/* deprecated names */
|
||||
#define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE
|
||||
|
|
Loading…
Reference in New Issue