From 27f84976dae3e4a7d64f56c48f67c88848727d11 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 20:11:31 -0230 Subject: [PATCH 1/9] Fix minor warning: parameter mirrors instance variables. --- src/debugger/TimerMap.hxx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/debugger/TimerMap.hxx b/src/debugger/TimerMap.hxx index 23d10aaeb..159ed16e8 100644 --- a/src/debugger/TimerMap.hxx +++ b/src/debugger/TimerMap.hxx @@ -92,10 +92,10 @@ class TimerMap : from{c_from}, to{c_to}, mirrors{c_mirrors}, anyBank{c_anyBank} {} Timer(uInt16 fromAddr, uInt16 toAddr, uInt8 fromBank, uInt8 toBank, - bool mirrors = false, bool anyBank = false) + bool c_mirrors = false, bool c_anyBank = false) { Timer(TimerPoint(fromAddr, fromBank), TimerPoint(fromAddr, fromBank), - mirrors, anyBank); + c_mirrors, c_anyBank); } Timer(const TimerPoint& tp, bool c_mirrors = false, bool c_anyBank = false) @@ -106,9 +106,9 @@ class TimerMap isPartial = true; } - Timer(uInt16 addr, uInt8 bank, bool mirrors = false, bool anyBank = false) + Timer(uInt16 addr, uInt8 bank, bool c_mirrors = false, bool c_anyBank = false) { - Timer(TimerPoint(addr, bank), mirrors, anyBank); + Timer(TimerPoint(addr, bank), c_mirrors, c_anyBank); } #if 0 // unused From edc82b3888e0ff98cf6031947e2cb95fb5fe4181 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 20:33:59 -0230 Subject: [PATCH 2/9] Suggested fixes from clang-tidy. --- src/debugger/DebuggerParser.cxx | 4 ++-- src/debugger/TimerMap.cxx | 12 ++++++------ src/debugger/TimerMap.hxx | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/debugger/DebuggerParser.cxx b/src/debugger/DebuggerParser.cxx index d88558c38..c3055697f 100644 --- a/src/debugger/DebuggerParser.cxx +++ b/src/debugger/DebuggerParser.cxx @@ -2342,7 +2342,7 @@ void DebuggerParser::executeTimer() for(uInt32 i = 0; i < argCount; ++i) { - if(static_cast(args[i]) >= std::max(0x80u, romBankCount - 1)) + if(static_cast(args[i]) >= std::max(0x80U, romBankCount - 1)) { if(numAddrs == 2) { @@ -2367,7 +2367,7 @@ void DebuggerParser::executeTimer() } } - uInt32 idx; + uInt32 idx = 0; if(numAddrs < 2) { idx = debugger.m6502().addTimer(addr[0], bank[0], mirrors, anyBank); diff --git a/src/debugger/TimerMap.cxx b/src/debugger/TimerMap.cxx index 9c4d8b022..ae01126a2 100644 --- a/src/debugger/TimerMap.cxx +++ b/src/debugger/TimerMap.cxx @@ -84,8 +84,8 @@ uInt32 TimerMap::add(uInt16 addr, uInt8 bank, bool mirrors, bool anyBank) // complete a partial timer: Timer& tmPartial = myList[idx]; TimerPoint tpFrom = tmPartial.from; - bool oldMirrors = tmPartial.mirrors; - bool oldAnyBank = tmPartial.anyBank; + const bool oldMirrors = tmPartial.mirrors; + const bool oldAnyBank = tmPartial.anyBank; tmPartial.setTo(tp, mirrors, anyBank); toKey(tp, tmPartial.mirrors, tmPartial.anyBank); @@ -153,8 +153,8 @@ void TimerMap::clear() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void TimerMap::reset() { - for(auto it = myList.begin(); it != myList.end(); ++it) - it->reset(); + for(auto& it: myList) + it.reset(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -163,7 +163,7 @@ void TimerMap::update(uInt16 addr, uInt8 bank, const uInt64 cycles) if((addr & ADDRESS_MASK) != addr) { // 13 bit timerpoint - TimerPoint tp(addr & ADDRESS_MASK, bank); + const TimerPoint tp(addr & ADDRESS_MASK, bank); // Find address in from and to maps const auto from = myFromMap.equal_range(tp); @@ -178,7 +178,7 @@ void TimerMap::update(uInt16 addr, uInt8 bank, const uInt64 cycles) } // 16 bit timerpoint - TimerPoint tp(addr, bank); + const TimerPoint tp(addr, bank); // Find address in from and to maps const auto from = myFromMap.equal_range(tp); diff --git a/src/debugger/TimerMap.hxx b/src/debugger/TimerMap.hxx index 159ed16e8..bd466dd95 100644 --- a/src/debugger/TimerMap.hxx +++ b/src/debugger/TimerMap.hxx @@ -207,7 +207,7 @@ class TimerMap const uInt64 cycles); private: - void toKey(TimerPoint& tp, bool mirrors, bool anyBank); + static void toKey(TimerPoint& tp, bool mirrors, bool anyBank); private: using TimerList = std::deque; // makes sure that the element pointers do NOT change From c8192955b33cb8afc5221547949798654f4856b3 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 22:15:53 -0230 Subject: [PATCH 3/9] Updated JSON lib to latest version. --- src/lib/json/json.hxx | 2813 +++++++++++++++++++++++++++++------------ 1 file changed, 1995 insertions(+), 818 deletions(-) diff --git a/src/lib/json/json.hxx b/src/lib/json/json.hxx index 5993ce32a..4d1a37ad7 100644 --- a/src/lib/json/json.hxx +++ b/src/lib/json/json.hxx @@ -1,31 +1,10 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 3.10.5 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Licensed under the MIT License . -SPDX-License-Identifier: MIT -Copyright (c) 2013-2022 Niels Lohmann . - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT /****************************************************************************\ * Note on documentation: The source files contain links to the online * @@ -33,24 +12,12 @@ SOFTWARE. * contains the most recent documentation and should also be applicable to * * previous versions; documentation for deprecated functions is not * * removed, but marked deprecated. See "Generate documentation" section in * - * file docs/README.md. * + * file docs/README.md. * \****************************************************************************/ #ifndef INCLUDE_NLOHMANN_JSON_HPP_ #define INCLUDE_NLOHMANN_JSON_HPP_ -#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK - #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) - #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 10 || NLOHMANN_JSON_VERSION_PATCH != 5 - #warning "Already included a different version of the library!" - #endif - #endif -#endif - -#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_MINOR 10 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_PATCH 5 // NOLINT(modernize-macro-to-enum) - #include // all_of, find, for_each #include // nullptr_t, ptrdiff_t, size_t #include // hash, less @@ -66,12 +33,129 @@ SOFTWARE. #include // vector // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + -#include #include +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// This file contains all macro definitions affecting or depending on the ABI + +#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK + #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) + #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2 + #warning "Already included a different version of the library!" + #endif + #endif +#endif + +#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) +#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum) + +#ifndef JSON_DIAGNOSTICS + #define JSON_DIAGNOSTICS 0 +#endif + +#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 +#endif + +#if JSON_DIAGNOSTICS + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag +#else + #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS +#endif + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp +#else + #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION + #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 +#endif + +// Construct the namespace ABI tags component +#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b +#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ + NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) + +#define NLOHMANN_JSON_ABI_TAGS \ + NLOHMANN_JSON_ABI_TAGS_CONCAT( \ + NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ + NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) + +// Construct the namespace version component +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ + _v ## major ## _ ## minor ## _ ## patch +#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) + +#if NLOHMANN_JSON_NAMESPACE_NO_VERSION +#define NLOHMANN_JSON_NAMESPACE_VERSION +#else +#define NLOHMANN_JSON_NAMESPACE_VERSION \ + NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ + NLOHMANN_JSON_VERSION_MINOR, \ + NLOHMANN_JSON_VERSION_PATCH) +#endif + +// Combine namespace components +#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b +#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ + NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) + +#ifndef NLOHMANN_JSON_NAMESPACE +#define NLOHMANN_JSON_NAMESPACE \ + nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN +#define NLOHMANN_JSON_NAMESPACE_BEGIN \ + namespace nlohmann \ + { \ + inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ + NLOHMANN_JSON_ABI_TAGS, \ + NLOHMANN_JSON_NAMESPACE_VERSION) \ + { +#endif + +#ifndef NLOHMANN_JSON_NAMESPACE_END +#define NLOHMANN_JSON_NAMESPACE_END \ + } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ + } // namespace nlohmann +#endif + // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // transform @@ -87,6 +171,14 @@ SOFTWARE. #include // valarray // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // nullptr_t @@ -96,6 +188,14 @@ SOFTWARE. #include // vector // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // array @@ -103,101 +203,130 @@ SOFTWARE. #include // uint8_t #include // string -namespace nlohmann -{ -namespace detail -{ -/////////////////////////// -// JSON type enumeration // -/////////////////////////// - -/*! -@brief the JSON type enumeration - -This enumeration collects the different JSON types. It is internally used to -distinguish the stored values, and the functions @ref basic_json::is_null(), -@ref basic_json::is_object(), @ref basic_json::is_array(), -@ref basic_json::is_string(), @ref basic_json::is_boolean(), -@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), -@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), -@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and -@ref basic_json::is_structured() rely on it. - -@note There are three enumeration entries (number_integer, number_unsigned, and -number_float), because the library distinguishes these three types for numbers: -@ref basic_json::number_unsigned_t is used for unsigned integers, -@ref basic_json::number_integer_t is used for signed integers, and -@ref basic_json::number_float_t is used for floating-point numbers or to -approximate integers which do not fit in the limits of their respective type. - -@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON -value with the default value for a given type - -@since version 1.0.0 -*/ -enum class value_t : std::uint8_t -{ - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (signed integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - binary, ///< binary array (ordered collection of bytes) - discarded ///< discarded by the parser callback function -}; - -/*! -@brief comparison operator for JSON types - -Returns an ordering that is similar to Python: -- order: null < boolean < number < object < array < string < binary -- furthermore, each type is not smaller than itself -- discarded values are not comparable -- binary is represented as a b"" string in python and directly comparable to a - string; however, making a binary array directly comparable with a string would - be surprising behavior in a JSON file. - -@since version 1.0.0 -*/ -inline bool operator<(const value_t lhs, const value_t rhs) noexcept -{ - static constexpr std::array order = {{ - 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, - 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, - 6 /* binary */ - } - }; - - const auto l_index = static_cast(lhs); - const auto r_index = static_cast(rhs); - return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; -} -} // namespace detail -} // namespace nlohmann - -// #include - - // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // declval, pair +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +#include + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +template struct make_void +{ + using type = void; +}; +template using void_t = typename make_void::type; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ + +// https://en.cppreference.com/w/cpp/experimental/is_detected +struct nonesuch +{ + nonesuch() = delete; + ~nonesuch() = delete; + nonesuch(nonesuch const&) = delete; + nonesuch(nonesuch const&&) = delete; + void operator=(nonesuch const&) = delete; + void operator=(nonesuch&&) = delete; +}; + +template class Op, + class... Args> +struct detector +{ + using value_t = std::false_type; + using type = Default; +}; + +template class Op, class... Args> +struct detector>, Op, Args...> +{ + using value_t = std::true_type; + using type = Op; +}; + +template class Op, class... Args> +using is_detected = typename detector::value_t; + +template class Op, class... Args> +struct is_detected_lazy : is_detected { }; + +template class Op, class... Args> +using detected_t = typename detector::type; + +template class Op, class... Args> +using detected_or = detector; + +template class Op, class... Args> +using detected_or_t = typename detected_or::type; + +template class Op, class... Args> +using is_detected_exact = std::is_same>; + +template class Op, class... Args> +using is_detected_convertible = + std::is_convertible, To>; + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson +// SPDX-License-Identifier: MIT + /* Hedley - https://nemequ.github.io/hedley * Created by Evan Nemerson - * - * To the extent possible under law, the author(s) have dedicated all - * copyright and related and neighboring rights to this software to - * the public domain worldwide. This software is distributed without - * any warranty. - * - * For details, see . - * SPDX-License-Identifier: CC0-1.0 */ #if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) @@ -2231,87 +2360,13 @@ JSON_HEDLEY_DIAGNOSTIC_POP #endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ -// #include - -#include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template struct make_void -{ - using type = void; -}; -template using void_t = typename make_void::type; -} // namespace detail -} // namespace nlohmann - - -// https://en.cppreference.com/w/cpp/experimental/is_detected -namespace nlohmann -{ -namespace detail -{ -struct nonesuch -{ - nonesuch() = delete; - ~nonesuch() = delete; - nonesuch(nonesuch const&) = delete; - nonesuch(nonesuch const&&) = delete; - void operator=(nonesuch const&) = delete; - void operator=(nonesuch&&) = delete; -}; - -template class Op, - class... Args> -struct detector -{ - using value_t = std::false_type; - using type = Default; -}; - -template class Op, class... Args> -struct detector>, Op, Args...> -{ - using value_t = std::true_type; - using type = Op; -}; - -template class Op, class... Args> -using is_detected = typename detector::value_t; - -template class Op, class... Args> -struct is_detected_lazy : is_detected { }; - -template class Op, class... Args> -using detected_t = typename detector::type; - -template class Op, class... Args> -using detected_or = detector; - -template class Op, class... Args> -using detected_or_t = typename detected_or::type; - -template class Op, class... Args> -using is_detected_exact = std::is_same>; - -template class Op, class... Args> -using is_detected_convertible = - std::is_convertible, To>; -} // namespace detail -} // namespace nlohmann - - -// This file contains all internal macro definitions +// This file contains all internal macro definitions (except those affecting ABI) // You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them +// #include + + // exclude unsupported compilers #if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) #if defined(__clang__) @@ -2342,6 +2397,12 @@ using is_detected_convertible = #define JSON_HAS_CPP_11 #endif +#ifdef __has_include + #if __has_include() + #include + #endif +#endif + #if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) #ifdef JSON_HAS_CPP_17 #if defined(__cpp_lib_filesystem) @@ -2403,14 +2464,31 @@ using is_detected_convertible = #endif #ifndef JSON_HAS_THREE_WAY_COMPARISON - #if defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L \ - && defined(__cpp_impl_three_way_comparison)&& __cpp_impl_three_way_comparison >= 201907L + #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ + && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L #define JSON_HAS_THREE_WAY_COMPARISON 1 #else #define JSON_HAS_THREE_WAY_COMPARISON 0 #endif #endif +#ifndef JSON_HAS_RANGES + // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error + #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 + #define JSON_HAS_RANGES 0 + #elif defined(__cpp_lib_ranges) + #define JSON_HAS_RANGES 1 + #else + #define JSON_HAS_RANGES 0 + #endif +#endif + +#ifdef JSON_HAS_CPP_17 + #define JSON_INLINE_VARIABLE inline +#else + #define JSON_INLINE_VARIABLE +#endif + #if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] #else @@ -2731,13 +2809,132 @@ using is_detected_convertible = #define JSON_EXPLICIT explicit #endif -#ifndef JSON_DIAGNOSTICS - #define JSON_DIAGNOSTICS 0 +#ifndef JSON_DISABLE_ENUM_SERIALIZATION + #define JSON_DISABLE_ENUM_SERIALIZATION 0 #endif +#ifndef JSON_USE_GLOBAL_UDLS + #define JSON_USE_GLOBAL_UDLS 1 +#endif -namespace nlohmann +#if JSON_HAS_THREE_WAY_COMPARISON + #include // partial_ordering +#endif + +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail { + +/////////////////////////// +// JSON type enumeration // +/////////////////////////// + +/*! +@brief the JSON type enumeration + +This enumeration collects the different JSON types. It is internally used to +distinguish the stored values, and the functions @ref basic_json::is_null(), +@ref basic_json::is_object(), @ref basic_json::is_array(), +@ref basic_json::is_string(), @ref basic_json::is_boolean(), +@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), +@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), +@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and +@ref basic_json::is_structured() rely on it. + +@note There are three enumeration entries (number_integer, number_unsigned, and +number_float), because the library distinguishes these three types for numbers: +@ref basic_json::number_unsigned_t is used for unsigned integers, +@ref basic_json::number_integer_t is used for signed integers, and +@ref basic_json::number_float_t is used for floating-point numbers or to +approximate integers which do not fit in the limits of their respective type. + +@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON +value with the default value for a given type + +@since version 1.0.0 +*/ +enum class value_t : std::uint8_t +{ + null, ///< null value + object, ///< object (unordered set of name/value pairs) + array, ///< array (ordered collection of values) + string, ///< string value + boolean, ///< boolean value + number_integer, ///< number value (signed integer) + number_unsigned, ///< number value (unsigned integer) + number_float, ///< number value (floating-point) + binary, ///< binary array (ordered collection of bytes) + discarded ///< discarded by the parser callback function +}; + +/*! +@brief comparison operator for JSON types + +Returns an ordering that is similar to Python: +- order: null < boolean < number < object < array < string < binary +- furthermore, each type is not smaller than itself +- discarded values are not comparable +- binary is represented as a b"" string in python and directly comparable to a + string; however, making a binary array directly comparable with a string would + be surprising behavior in a JSON file. + +@since version 1.0.0 +*/ +#if JSON_HAS_THREE_WAY_COMPARISON + inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* +#else + inline bool operator<(const value_t lhs, const value_t rhs) noexcept +#endif +{ + static constexpr std::array order = {{ + 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, + 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, + 6 /* binary */ + } + }; + + const auto l_index = static_cast(lhs); + const auto r_index = static_cast(rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + if (l_index < order.size() && r_index < order.size()) + { + return order[l_index] <=> order[r_index]; // *NOPAD* + } + return std::partial_ordering::unordered; +#else + return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; +#endif +} + +// GCC selects the built-in operator< over an operator rewritten from +// a user-defined spaceship operator +// Clang, MSVC, and ICC select the rewritten candidate +// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) +#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) +inline bool operator<(const value_t lhs, const value_t rhs) noexcept +{ + return std::is_lt(lhs <=> rhs); // *NOPAD* +} +#endif + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -2795,18 +2992,29 @@ static void unescape(StringType& s) replace_substring(s, StringType{"~0"}, StringType{"~"}); } -} // namespace detail -} // namespace nlohmann +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // size_t -namespace nlohmann -{ +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /// struct to capture the start position of the current token struct position_t { @@ -2824,14 +3032,24 @@ struct position_t } }; -} // namespace detail -} // namespace nlohmann +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-FileCopyrightText: 2018 The Abseil Authors +// SPDX-License-Identifier: MIT + +#include // array #include // size_t #include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type #include // index_sequence, make_index_sequence, index_sequence_for @@ -2839,8 +3057,7 @@ struct position_t // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -2977,20 +3194,32 @@ template<> struct priority_tag<0> {}; template struct static_const { - static constexpr T value{}; + static JSON_INLINE_VARIABLE constexpr T value{}; }; #ifndef JSON_HAS_CPP_17 - template - constexpr T static_const::value; // NOLINT(readability-redundant-declaration) - + constexpr T static_const::value; #endif +template +inline constexpr std::array make_array(Args&& ... args) +{ + return std::array {{static_cast(std::forward(args))...}}; +} + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // numeric_limits @@ -2998,23 +3227,30 @@ struct static_const #include // declval #include // tuple -// #include - - // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // random_access_iterator_tag +// #include + // #include // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + template struct iterator_types {}; @@ -3053,104 +3289,135 @@ struct iterator_traits::value>> using pointer = T*; using reference = T&; }; -} // namespace detail -} // namespace nlohmann + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END + +// #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN + NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); -} // namespace nlohmann + +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN + NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); -} // namespace nlohmann + +NLOHMANN_JSON_NAMESPACE_END // #include // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ -#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ + #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ -#include // int64_t, uint64_t -#include // map -#include // allocator -#include // string -#include // vector + #include // int64_t, uint64_t + #include // map + #include // allocator + #include // string + #include // vector -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -namespace nlohmann -{ -/*! -@brief default JSONSerializer template argument + // #include -This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) -for serialization. -*/ -template -struct adl_serializer; -/// a class to store JSON values -/// @sa https://json.nlohmann.me/api/basic_json/ -template class ObjectType = - std::map, - template class ArrayType = std::vector, - class StringType = std::string, class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = - adl_serializer, - class BinaryType = std::vector> -class basic_json; + /*! + @brief namespace for Niels Lohmann + @see https://github.com/nlohmann + @since version 1.0.0 + */ + NLOHMANN_JSON_NAMESPACE_BEGIN -/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document -/// @sa https://json.nlohmann.me/api/json_pointer/ -template -class json_pointer; + /*! + @brief default JSONSerializer template argument -/*! -@brief default specialization -@sa https://json.nlohmann.me/api/json/ -*/ -using json = basic_json<>; + This serializer ignores the template arguments and uses ADL + ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) + for serialization. + */ + template + struct adl_serializer; -/// @brief a minimal map-like container that preserves insertion order -/// @sa https://json.nlohmann.me/api/ordered_map/ -template -struct ordered_map; + /// a class to store JSON values + /// @sa https://json.nlohmann.me/api/basic_json/ + template class ObjectType = + std::map, + template class ArrayType = std::vector, + class StringType = std::string, class BooleanType = bool, + class NumberIntegerType = std::int64_t, + class NumberUnsignedType = std::uint64_t, + class NumberFloatType = double, + template class AllocatorType = std::allocator, + template class JSONSerializer = + adl_serializer, + class BinaryType = std::vector> + class basic_json; -/// @brief specialization that maintains the insertion order of object keys -/// @sa https://json.nlohmann.me/api/ordered_json/ -using ordered_json = basic_json; + /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document + /// @sa https://json.nlohmann.me/api/json_pointer/ + template + class json_pointer; -} // namespace nlohmann + /*! + @brief default specialization + @sa https://json.nlohmann.me/api/json/ + */ + using json = basic_json<>; + + /// @brief a minimal map-like container that preserves insertion order + /// @sa https://json.nlohmann.me/api/ordered_map/ + template + struct ordered_map; + + /// @brief specialization that maintains the insertion order of object keys + /// @sa https://json.nlohmann.me/api/ordered_json/ + using ordered_json = basic_json; + + NLOHMANN_JSON_NAMESPACE_END #endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN /*! @brief detail namespace with internal helper functions @@ -3161,6 +3428,7 @@ implementations of some @ref basic_json methods, and meta-programming helpers. */ namespace detail { + ///////////// // helpers // ///////////// @@ -3318,7 +3586,7 @@ template struct conjunction : std::true_type { }; template struct conjunction : B { }; template struct conjunction -: std::conditional, B>::type {}; +: std::conditional(B::value), conjunction, B>::type {}; // https://en.cppreference.com/w/cpp/types/negation template struct negation : std::integral_constant < bool, !B::value > { }; @@ -3490,8 +3758,10 @@ struct is_constructible_string_type #endif static constexpr auto value = - is_constructible::value; + conjunction < + is_constructible, + is_detected_exact>::value; }; template @@ -3639,16 +3909,23 @@ decltype(std::declval()(std::declval(), std::declval())), decltype(std::declval()(std::declval(), std::declval())) >> : std::true_type {}; -// checks if BasicJsonType::object_t::key_type and KeyType are comparable using Compare functor -template -using is_key_type_comparable = typename is_comparable < - typename BasicJsonType::object_comparator_t, - const key_type_t&, - KeyType >::type; - template using detect_is_transparent = typename T::is_transparent; +// type trait to check if KeyType can be used as object key (without a BasicJsonType) +// see is_usable_as_basic_json_key_type below +template> +using is_usable_as_key_type = typename std::conditional < + is_comparable::value + && !(ExcludeObjectKeyType && std::is_same::value) + && (!RequireTransparentComparator + || is_detected ::value) + && !is_json_pointer::value, + std::true_type, + std::false_type >::type; + // type trait to check if KeyType can be used as object key // true if: // - KeyType is comparable with BasicJsonType::object_t::key_type @@ -3657,17 +3934,13 @@ using detect_is_transparent = typename T::is_transparent; // - KeyType is not a JSON iterator or json_pointer template> -using is_usable_as_key_type = typename std::conditional < - is_key_type_comparable::value - && !(ExcludeObjectKeyType && std::is_same::value) - && (!RequireTransparentComparator || is_detected < - detect_is_transparent, - typename BasicJsonType::object_comparator_t >::value) - && !is_json_iterator_of::value - && !is_json_pointer::value, - std::true_type, - std::false_type >::type; +using is_usable_as_basic_json_key_type = typename std::conditional < + is_usable_as_key_type::value + && !is_json_iterator_of::value, + std::true_type, + std::false_type >::type; template using detect_erase_with_key_type = decltype(std::declval().erase(std::declval())); @@ -3712,10 +3985,165 @@ T conditional_static_cast(U value) return value; } +template +using all_integral = conjunction...>; + +template +using all_signed = conjunction...>; + +template +using all_unsigned = conjunction...>; + +// there's a disjunction trait in another PR; replace when merged +template +using same_sign = std::integral_constant < bool, + all_signed::value || all_unsigned::value >; + +template +using never_out_of_range = std::integral_constant < bool, + (std::is_signed::value && (sizeof(T) < sizeof(OfType))) + || (same_sign::value && sizeof(OfType) == sizeof(T)) >; + +template::value, + bool TSigned = std::is_signed::value> +struct value_in_range_of_impl2; + +template +struct value_in_range_of_impl2 +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type::type; + return static_cast(val) <= static_cast((std::numeric_limits::max)()); + } +}; + +template +struct value_in_range_of_impl2 +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type::type; + return static_cast(val) <= static_cast((std::numeric_limits::max)()); + } +}; + +template +struct value_in_range_of_impl2 +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type::type; + return val >= 0 && static_cast(val) <= static_cast((std::numeric_limits::max)()); + } +}; + + +template +struct value_in_range_of_impl2 +{ + static constexpr bool test(T val) + { + using CommonType = typename std::common_type::type; + return static_cast(val) >= static_cast((std::numeric_limits::min)()) + && static_cast(val) <= static_cast((std::numeric_limits::max)()); + } +}; + +template::value, + typename = detail::enable_if_t::value>> +struct value_in_range_of_impl1; + +template +struct value_in_range_of_impl1 +{ + static constexpr bool test(T val) + { + return value_in_range_of_impl2::test(val); + } +}; + +template +struct value_in_range_of_impl1 +{ + static constexpr bool test(T /*val*/) + { + return true; + } +}; + +template +inline constexpr bool value_in_range_of(T val) +{ + return value_in_range_of_impl1::test(val); +} + +template +using bool_constant = std::integral_constant; + +/////////////////////////////////////////////////////////////////////////////// +// is_c_string +/////////////////////////////////////////////////////////////////////////////// + +namespace impl +{ + +template +inline constexpr bool is_c_string() +{ + using TUnExt = typename std::remove_extent::type; + using TUnCVExt = typename std::remove_cv::type; + using TUnPtr = typename std::remove_pointer::type; + using TUnCVPtr = typename std::remove_cv::type; + return + (std::is_array::value && std::is_same::value) + || (std::is_pointer::value && std::is_same::value); +} + +} // namespace impl + +// checks whether T is a [cv] char */[cv] char[] C string +template +struct is_c_string : bool_constant()> {}; + +template +using is_c_string_uncvref = is_c_string>; + +/////////////////////////////////////////////////////////////////////////////// +// is_transparent +/////////////////////////////////////////////////////////////////////////////// + +namespace impl +{ + +template +inline constexpr bool is_transparent() +{ + return is_detected::value; +} + +} // namespace impl + +// checks whether T has a member named is_transparent +template +struct is_transparent : bool_constant()> {}; + +/////////////////////////////////////////////////////////////////////////////// + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // strlen @@ -3727,8 +4155,7 @@ T conditional_static_cast(U value) // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -3855,15 +4282,15 @@ inline OutStringType concat(Args && ... args) return str; } -} // namespace detail -} // namespace nlohmann +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + //////////////// // exceptions // //////////////// @@ -4089,23 +4516,67 @@ class other_error : public exception }; } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT -namespace nlohmann -{ + +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + // dispatching helper struct template struct identity_tag {}; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END + +// #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + + + +// #include + + +#if JSON_HAS_EXPERIMENTAL_FILESYSTEM +#include +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::experimental::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#elif JSON_HAS_FILESYSTEM +#include +NLOHMANN_JSON_NAMESPACE_BEGIN +namespace detail +{ +namespace std_fs = std::filesystem; +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END +#endif // #include @@ -4114,26 +4585,12 @@ template struct identity_tag {}; // #include -#if JSON_HAS_EXPERIMENTAL_FILESYSTEM -#include -namespace nlohmann::detail -{ -namespace std_fs = std::experimental::filesystem; -} // namespace nlohmann::detail -#elif JSON_HAS_FILESYSTEM -#include -namespace nlohmann::detail -{ -namespace std_fs = std::filesystem; -} // namespace nlohmann::detail -#endif - -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + template -void from_json(const BasicJsonType& j, typename std::nullptr_t& n) +inline void from_json(const BasicJsonType& j, typename std::nullptr_t& n) { if (JSON_HEDLEY_UNLIKELY(!j.is_null())) { @@ -4180,7 +4637,7 @@ void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) } template -void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) { if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) { @@ -4190,7 +4647,7 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) } template -void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) { if (JSON_HEDLEY_UNLIKELY(!j.is_string())) { @@ -4203,9 +4660,10 @@ template < typename BasicJsonType, typename StringType, enable_if_t < std::is_assignable::value + && is_detected_exact::value && !std::is_same::value && !is_json_ref::value, int > = 0 > -void from_json(const BasicJsonType& j, StringType& s) +inline void from_json(const BasicJsonType& j, StringType& s) { if (JSON_HEDLEY_UNLIKELY(!j.is_string())) { @@ -4216,36 +4674,38 @@ void from_json(const BasicJsonType& j, StringType& s) } template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) { get_arithmetic_value(j, val); } template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) { get_arithmetic_value(j, val); } template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) { get_arithmetic_value(j, val); } +#if !JSON_DISABLE_ENUM_SERIALIZATION template::value, int> = 0> -void from_json(const BasicJsonType& j, EnumType& e) +inline void from_json(const BasicJsonType& j, EnumType& e) { typename std::underlying_type::type val; get_arithmetic_value(j, val); e = static_cast(val); } +#endif // JSON_DISABLE_ENUM_SERIALIZATION // forward_list doesn't have an insert method template::value, int> = 0> -void from_json(const BasicJsonType& j, std::forward_list& l) +inline void from_json(const BasicJsonType& j, std::forward_list& l) { if (JSON_HEDLEY_UNLIKELY(!j.is_array())) { @@ -4262,7 +4722,7 @@ void from_json(const BasicJsonType& j, std::forward_list& l) // valarray doesn't have an insert method template::value, int> = 0> -void from_json(const BasicJsonType& j, std::valarray& l) +inline void from_json(const BasicJsonType& j, std::valarray& l) { if (JSON_HEDLEY_UNLIKELY(!j.is_array())) { @@ -4287,7 +4747,7 @@ auto from_json(const BasicJsonType& j, T (&arr)[N]) // NOLINT(cppcoreguidelines } template -void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) +inline void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) { arr = *j.template get_ptr(); } @@ -4331,8 +4791,8 @@ template::value, int> = 0> -void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, - priority_tag<0> /*unused*/) +inline void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, + priority_tag<0> /*unused*/) { using std::end; @@ -4389,7 +4849,7 @@ auto from_json(BasicJsonType&& j, identity_tag> tag) } template -void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) +inline void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) { if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) { @@ -4401,7 +4861,7 @@ void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) template::value, int> = 0> -void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) +inline void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) { if (JSON_HEDLEY_UNLIKELY(!j.is_object())) { @@ -4433,7 +4893,7 @@ template < typename BasicJsonType, typename ArithmeticType, !std::is_same::value&& !std::is_same::value, int > = 0 > -void from_json(const BasicJsonType& j, ArithmeticType& val) +inline void from_json(const BasicJsonType& j, ArithmeticType& val) { switch (static_cast(j)) { @@ -4483,7 +4943,7 @@ std::pair from_json_tuple_impl(BasicJsonType&& j, identity_tag -void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) +inline void from_json_tuple_impl(BasicJsonType&& j, std::pair& p, priority_tag<1> /*unused*/) { p = from_json_tuple_impl(std::forward(j), identity_tag> {}, priority_tag<0> {}); } @@ -4495,7 +4955,7 @@ std::tuple from_json_tuple_impl(BasicJsonType&& j, identity_tag -void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) +inline void from_json_tuple_impl(BasicJsonType&& j, std::tuple& t, priority_tag<3> /*unused*/) { t = from_json_tuple_impl_base(std::forward(j), index_sequence_for {}); } @@ -4515,7 +4975,7 @@ auto from_json(BasicJsonType&& j, TupleRelated&& t) template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, typename = enable_if_t < !std::is_constructible < typename BasicJsonType::string_t, Key >::value >> -void from_json(const BasicJsonType& j, std::map& m) +inline void from_json(const BasicJsonType& j, std::map& m) { if (JSON_HEDLEY_UNLIKELY(!j.is_array())) { @@ -4535,7 +4995,7 @@ void from_json(const BasicJsonType& j, std::map& template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, typename = enable_if_t < !std::is_constructible < typename BasicJsonType::string_t, Key >::value >> -void from_json(const BasicJsonType& j, std::unordered_map& m) +inline void from_json(const BasicJsonType& j, std::unordered_map& m) { if (JSON_HEDLEY_UNLIKELY(!j.is_array())) { @@ -4554,7 +5014,7 @@ void from_json(const BasicJsonType& j, std::unordered_map -void from_json(const BasicJsonType& j, std_fs::path& p) +inline void from_json(const BasicJsonType& j, std_fs::path& p) { if (JSON_HEDLEY_UNLIKELY(!j.is_string())) { @@ -4574,18 +5034,33 @@ struct from_json_fn return from_json(j, std::forward(val)); } }; + } // namespace detail +#ifndef JSON_HAS_CPP_17 /// namespace to hold default `from_json` function /// to see why this is required: /// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) { -constexpr const auto& from_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) -} // namespace -} // namespace nlohmann +#endif +JSON_INLINE_VARIABLE constexpr const auto& from_json = // NOLINT(misc-definitions-in-headers) + detail::static_const::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // copy @@ -4597,9 +5072,15 @@ constexpr const auto& from_json = detail::static_const::va #include // valarray #include // vector -// #include - // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // size_t @@ -4608,15 +5089,21 @@ constexpr const auto& from_json = detail::static_const::va #include // tuple_size, get, tuple_element #include // move +#if JSON_HAS_RANGES + #include // enable_borrowed_range +#endif + +// #include + // #include // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + template void int_to_string( string_type& target, std::size_t value ) { @@ -4629,14 +5116,14 @@ template class iteration_proxy_value public: using difference_type = std::ptrdiff_t; using value_type = iteration_proxy_value; - using pointer = value_type * ; - using reference = value_type & ; + using pointer = value_type *; + using reference = value_type &; using iterator_category = std::input_iterator_tag; using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; private: /// the iterator - IteratorType anchor; + IteratorType anchor{}; /// an index for arrays (used to create key names) std::size_t array_index = 0; /// last stringified array index @@ -4644,15 +5131,30 @@ template class iteration_proxy_value /// a string representation of the array index mutable string_type array_index_str = "0"; /// an empty string (to return a reference for primitive values) - const string_type empty_str{}; + string_type empty_str{}; public: - explicit iteration_proxy_value(IteratorType it) noexcept + explicit iteration_proxy_value() = default; + explicit iteration_proxy_value(IteratorType it, std::size_t array_index_ = 0) + noexcept(std::is_nothrow_move_constructible::value + && std::is_nothrow_default_constructible::value) : anchor(std::move(it)) + , array_index(array_index_) {} + iteration_proxy_value(iteration_proxy_value const&) = default; + iteration_proxy_value& operator=(iteration_proxy_value const&) = default; + // older GCCs are a bit fussy and require explicit noexcept specifiers on defaulted functions + iteration_proxy_value(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_constructible::value + && std::is_nothrow_move_constructible::value) = default; + iteration_proxy_value& operator=(iteration_proxy_value&&) + noexcept(std::is_nothrow_move_assignable::value + && std::is_nothrow_move_assignable::value) = default; + ~iteration_proxy_value() = default; + /// dereference operator (needed for range-based for) - iteration_proxy_value& operator*() + const iteration_proxy_value& operator*() const { return *this; } @@ -4666,6 +5168,14 @@ template class iteration_proxy_value return *this; } + iteration_proxy_value operator++(int)& // NOLINT(cert-dcl21-cpp) + { + auto tmp = iteration_proxy_value(anchor, array_index); + ++anchor; + ++array_index; + return tmp; + } + /// equality operator (needed for InputIterator) bool operator==(const iteration_proxy_value& o) const { @@ -4726,25 +5236,34 @@ template class iteration_proxy { private: /// the container to iterate - typename IteratorType::reference container; + typename IteratorType::pointer container = nullptr; public: + explicit iteration_proxy() = default; + /// construct iteration proxy from a container explicit iteration_proxy(typename IteratorType::reference cont) noexcept - : container(cont) {} + : container(&cont) {} + + iteration_proxy(iteration_proxy const&) = default; + iteration_proxy& operator=(iteration_proxy const&) = default; + iteration_proxy(iteration_proxy&&) noexcept = default; + iteration_proxy& operator=(iteration_proxy&&) noexcept = default; + ~iteration_proxy() = default; /// return iterator begin (needed for range-based for) - iteration_proxy_value begin() noexcept + iteration_proxy_value begin() const noexcept { - return iteration_proxy_value(container.begin()); + return iteration_proxy_value(container->begin()); } /// return iterator end (needed for range-based for) - iteration_proxy_value end() noexcept + iteration_proxy_value end() const noexcept { - return iteration_proxy_value(container.end()); + return iteration_proxy_value(container->end()); } }; + // Structured Bindings Support // For further reference see https://blog.tartanllama.xyz/structured-bindings/ // And see https://github.com/nlohmann/json/pull/1391 @@ -4761,8 +5280,9 @@ auto get(const nlohmann::detail::iteration_proxy_value& i) -> decl { return i.value(); } + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // The Addition to the STD Namespace is required to add // Structured Bindings Support to the iteration_proxy_value class @@ -4770,6 +5290,7 @@ auto get(const nlohmann::detail::iteration_proxy_value& i) -> decl // And see https://github.com/nlohmann/json/pull/1391 namespace std { + #if defined(__clang__) // Fix: https://github.com/nlohmann/json/issues/1401 #pragma clang diagnostic push @@ -4790,33 +5311,29 @@ class tuple_element> #if defined(__clang__) #pragma clang diagnostic pop #endif -} // namespace std + +} // namespace std + +#if JSON_HAS_RANGES + template + inline constexpr bool ::std::ranges::enable_borrowed_range<::nlohmann::detail::iteration_proxy> = true; +#endif + +// #include // #include +// #include + // #include // #include -#if JSON_HAS_EXPERIMENTAL_FILESYSTEM -#include -namespace nlohmann::detail -{ -namespace std_fs = std::experimental::filesystem; -} // namespace nlohmann::detail -#elif JSON_HAS_FILESYSTEM -#include -namespace nlohmann::detail -{ -namespace std_fs = std::filesystem; -} // namespace nlohmann::detail -#endif - -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + ////////////////// // constructors // ////////////////// @@ -5051,55 +5568,70 @@ struct external_constructor template::value, int> = 0> -void to_json(BasicJsonType& j, T b) noexcept +inline void to_json(BasicJsonType& j, T b) noexcept { external_constructor::construct(j, b); } +template < typename BasicJsonType, typename BoolRef, + enable_if_t < + ((std::is_same::reference, BoolRef>::value + && !std::is_same ::reference, typename BasicJsonType::boolean_t&>::value) + || (std::is_same::const_reference, BoolRef>::value + && !std::is_same ::const_reference>, + typename BasicJsonType::boolean_t >::value)) + && std::is_convertible::value, int > = 0 > +inline void to_json(BasicJsonType& j, const BoolRef& b) noexcept +{ + external_constructor::construct(j, static_cast(b)); +} + template::value, int> = 0> -void to_json(BasicJsonType& j, const CompatibleString& s) +inline void to_json(BasicJsonType& j, const CompatibleString& s) { external_constructor::construct(j, s); } template -void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) +inline void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) { external_constructor::construct(j, std::move(s)); } template::value, int> = 0> -void to_json(BasicJsonType& j, FloatType val) noexcept +inline void to_json(BasicJsonType& j, FloatType val) noexcept { external_constructor::construct(j, static_cast(val)); } template::value, int> = 0> -void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept +inline void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept { external_constructor::construct(j, static_cast(val)); } template::value, int> = 0> -void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept +inline void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept { external_constructor::construct(j, static_cast(val)); } +#if !JSON_DISABLE_ENUM_SERIALIZATION template::value, int> = 0> -void to_json(BasicJsonType& j, EnumType e) noexcept +inline void to_json(BasicJsonType& j, EnumType e) noexcept { using underlying_type = typename std::underlying_type::type; external_constructor::construct(j, static_cast(e)); } +#endif // JSON_DISABLE_ENUM_SERIALIZATION template -void to_json(BasicJsonType& j, const std::vector& e) +inline void to_json(BasicJsonType& j, const std::vector& e) { external_constructor::construct(j, e); } @@ -5112,39 +5644,39 @@ template < typename BasicJsonType, typename CompatibleArrayType, !std::is_same::value&& !is_basic_json::value, int > = 0 > -void to_json(BasicJsonType& j, const CompatibleArrayType& arr) +inline void to_json(BasicJsonType& j, const CompatibleArrayType& arr) { external_constructor::construct(j, arr); } template -void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) +inline void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) { external_constructor::construct(j, bin); } template::value, int> = 0> -void to_json(BasicJsonType& j, const std::valarray& arr) +inline void to_json(BasicJsonType& j, const std::valarray& arr) { external_constructor::construct(j, std::move(arr)); } template -void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) +inline void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) { external_constructor::construct(j, std::move(arr)); } template < typename BasicJsonType, typename CompatibleObjectType, enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > -void to_json(BasicJsonType& j, const CompatibleObjectType& obj) +inline void to_json(BasicJsonType& j, const CompatibleObjectType& obj) { external_constructor::construct(j, obj); } template -void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) +inline void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) { external_constructor::construct(j, std::move(obj)); } @@ -5154,13 +5686,13 @@ template < enable_if_t < !std::is_constructible::value, // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) int > = 0 > -void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) +inline void to_json(BasicJsonType& j, const T(&arr)[N]) // NOLINT(cppcoreguidelines-avoid-c-arrays,hicpp-avoid-c-arrays,modernize-avoid-c-arrays) { external_constructor::construct(j, arr); } template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > -void to_json(BasicJsonType& j, const std::pair& p) +inline void to_json(BasicJsonType& j, const std::pair& p) { j = { p.first, p.second }; } @@ -5168,26 +5700,26 @@ void to_json(BasicJsonType& j, const std::pair& p) // for https://github.com/nlohmann/json/pull/1134 template>::value, int> = 0> -void to_json(BasicJsonType& j, const T& b) +inline void to_json(BasicJsonType& j, const T& b) { j = { {b.key(), b.value()} }; } template -void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) +inline void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) { j = { std::get(t)... }; } template::value, int > = 0> -void to_json(BasicJsonType& j, const T& t) +inline void to_json(BasicJsonType& j, const T& t) { to_json_tuple_impl(j, t, make_index_sequence::value> {}); } #if JSON_HAS_FILESYSTEM || JSON_HAS_EXPERIMENTAL_FILESYSTEM template -void to_json(BasicJsonType& j, const std_fs::path& p) +inline void to_json(BasicJsonType& j, const std_fs::path& p) { j = p.string(); } @@ -5204,22 +5736,25 @@ struct to_json_fn }; } // namespace detail +#ifndef JSON_HAS_CPP_17 /// namespace to hold default `to_json` function /// to see why this is required: /// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html namespace // NOLINT(cert-dcl59-cpp,fuchsia-header-anon-namespaces,google-build-namespaces) { -constexpr const auto& to_json = detail::static_const::value; // NOLINT(misc-definitions-in-headers) -} // namespace -} // namespace nlohmann +#endif +JSON_INLINE_VARIABLE constexpr const auto& to_json = // NOLINT(misc-definitions-in-headers) + detail::static_const::value; +#ifndef JSON_HAS_CPP_17 +} // namespace +#endif + +NLOHMANN_JSON_NAMESPACE_END // #include -// #include - -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN /// @sa https://json.nlohmann.me/api/adl_serializer/ template @@ -5255,17 +5790,28 @@ struct adl_serializer ::nlohmann::to_json(j, std::forward(val)); } }; -} // namespace nlohmann + +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // uint8_t, uint64_t #include // tie #include // move -namespace nlohmann -{ +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN /// @brief an internal type for a backed binary type /// @sa https://json.nlohmann.me/api/byte_container_with_subtype/ @@ -5351,7 +5897,7 @@ class byte_container_with_subtype : public BinaryType bool m_has_subtype = false; }; -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include @@ -5360,19 +5906,26 @@ class byte_container_with_subtype : public BinaryType // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // uint8_t #include // size_t #include // hash -// #include +// #include // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -5483,9 +6036,17 @@ std::size_t hash(const BasicJsonType& j) } } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // generate_n @@ -5500,11 +6061,18 @@ std::size_t hash(const BasicJsonType& j) #include // char_traits, string #include // make_pair, move #include // vector -#include // map // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // array @@ -5527,10 +6095,10 @@ std::size_t hash(const BasicJsonType& j) // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /// the supported input formats enum class input_format_t { json, cbor, msgpack, ubjson, bson, bjdata }; @@ -5551,7 +6119,9 @@ class file_input_adapter JSON_HEDLEY_NON_NULL(2) explicit file_input_adapter(std::FILE* f) noexcept : m_file(f) - {} + { + JSON_ASSERT(m_file != nullptr); + } // make class move-only file_input_adapter(const file_input_adapter&) = delete; @@ -5909,7 +6479,7 @@ struct container_input_adapter_factory< ContainerType, } }; -} // namespace container_input_adapter_factory_impl +} // namespace container_input_adapter_factory_impl template typename container_input_adapter_factory_impl::container_input_adapter_factory::adapter_type input_adapter(const ContainerType& container) @@ -5988,10 +6558,19 @@ class span_input_adapter private: contiguous_bytes_input_adapter ia; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include @@ -6006,8 +6585,7 @@ class span_input_adapter // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN /*! @brief SAX interface @@ -6713,11 +7291,19 @@ class json_sax_acceptor return false; } }; -} // namespace detail -} // namespace nlohmann +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // array @@ -6737,10 +7323,10 @@ class json_sax_acceptor // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /////////// // lexer // /////////// @@ -8342,27 +8928,38 @@ scan_number_done: /// the decimal point const char_int_type decimal_point_char = '.'; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // size_t #include // declval #include // string +// #include + // #include // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + template using null_function_t = decltype(std::declval().null()); @@ -8497,8 +9094,9 @@ struct is_sax_static_asserts "Missing/invalid function: bool parse_error(std::size_t, const " "std::string&, const exception&)"); }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include @@ -8507,8 +9105,7 @@ struct is_sax_static_asserts // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -9101,7 +9698,8 @@ class binary_reader case 0x95: case 0x96: case 0x97: - return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); + return get_cbor_array( + conditional_static_cast(static_cast(current) & 0x1Fu), tag_handler); case 0x98: // array (one-byte uint8_t for n follows) { @@ -9118,13 +9716,13 @@ class binary_reader case 0x9A: // array (four-byte uint32_t for n follow) { std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast(len), tag_handler); } case 0x9B: // array (eight-byte uint64_t for n follow) { std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(detail::conditional_static_cast(len), tag_handler); + return get_number(input_format_t::cbor, len) && get_cbor_array(conditional_static_cast(len), tag_handler); } case 0x9F: // array (indefinite length) @@ -9155,7 +9753,7 @@ class binary_reader case 0xB5: case 0xB6: case 0xB7: - return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); + return get_cbor_object(conditional_static_cast(static_cast(current) & 0x1Fu), tag_handler); case 0xB8: // map (one-byte uint8_t for n follows) { @@ -9172,13 +9770,13 @@ class binary_reader case 0xBA: // map (four-byte uint32_t for n follow) { std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast(len), tag_handler); } case 0xBB: // map (eight-byte uint64_t for n follow) { std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(detail::conditional_static_cast(len), tag_handler); + return get_number(input_format_t::cbor, len) && get_cbor_object(conditional_static_cast(len), tag_handler); } case 0xBF: // map (indefinite length) @@ -9825,7 +10423,7 @@ class binary_reader case 0x8D: case 0x8E: case 0x8F: - return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); + return get_msgpack_object(conditional_static_cast(static_cast(current) & 0x0Fu)); // fixarray case 0x90: @@ -9844,7 +10442,7 @@ class binary_reader case 0x9D: case 0x9E: case 0x9F: - return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); + return get_msgpack_array(conditional_static_cast(static_cast(current) & 0x0Fu)); // fixstr case 0xA0: @@ -9981,7 +10579,7 @@ class binary_reader case 0xDD: // array 32 { std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); + return get_number(input_format_t::msgpack, len) && get_msgpack_array(conditional_static_cast(len)); } case 0xDE: // map 16 @@ -9993,7 +10591,7 @@ class binary_reader case 0xDF: // map 32 { std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); + return get_number(input_format_t::msgpack, len) && get_msgpack_object(conditional_static_cast(len)); } // negative fixint @@ -10421,14 +11019,14 @@ class binary_reader { std::pair size_and_type; size_t dimlen = 0; - bool inside_ndarray = true; + bool no_ndarray = true; - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, inside_ndarray))) + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type, no_ndarray))) { return false; } - if (size_and_type.first != string_t::npos) + if (size_and_type.first != npos) { if (size_and_type.second != 0) { @@ -10436,7 +11034,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, inside_ndarray, size_and_type.second))) + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, size_and_type.second))) { return false; } @@ -10448,7 +11046,7 @@ class binary_reader { for (std::size_t i = 0; i < size_and_type.first; ++i) { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, inside_ndarray))) + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray))) { return false; } @@ -10460,7 +11058,7 @@ class binary_reader { while (current != ']') { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, inside_ndarray, current))) + if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_value(dimlen, no_ndarray, current))) { return false; } @@ -10473,12 +11071,16 @@ class binary_reader /*! @param[out] result determined size - @param[in,out] inside_ndarray whether the parser is parsing an ND array dimensional vector + @param[in,out] is_ndarray for input, `true` means already inside an ndarray vector + or ndarray dimension is not allowed; `false` means ndarray + is allowed; for output, `true` means an ndarray is found; + is_ndarray can only return `true` when its initial value + is `false` @param[in] prefix type marker if already read, otherwise set to 0 @return whether size determination completed */ - bool get_ubjson_size_value(std::size_t& result, bool& inside_ndarray, char_int_type prefix = 0) + bool get_ubjson_size_value(std::size_t& result, bool& is_ndarray, char_int_type prefix = 0) { if (prefix == 0) { @@ -10558,6 +11160,11 @@ class binary_reader return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "count in an optimized container must be positive", "size"), nullptr)); } + if (!value_in_range_of(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } result = static_cast(number); return true; } @@ -10588,7 +11195,7 @@ class binary_reader { return false; } - result = static_cast(number); + result = conditional_static_cast(number); return true; } @@ -10603,6 +11210,11 @@ class binary_reader { return false; } + if (!value_in_range_of(number)) + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, + exception_message(input_format, "integer value overflow", "size"), nullptr)); + } result = detail::conditional_static_cast(number); return true; } @@ -10613,9 +11225,9 @@ class binary_reader { break; } - if (inside_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array + if (is_ndarray) // ndarray dimensional vector can only contain integers, and can not embed another array { - return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimention vector can only contain integers", "size"), nullptr)); + return sax->parse_error(chars_read, get_token_string(), parse_error::create(113, chars_read, exception_message(input_format, "ndarray dimentional vector is not allowed", "size"), nullptr)); } std::vector dim; if (JSON_HEDLEY_UNLIKELY(!get_ubjson_ndarray_size(dim))) @@ -10647,12 +11259,16 @@ class binary_reader for (auto i : dim) { result *= i; - if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(static_cast(i)))) + if (result == 0 || result == npos) // because dim elements shall not have zeros, result = 0 means overflow happened; it also can't be npos as it is used to initialize size in get_ubjson_size_type() + { + return sax->parse_error(chars_read, get_token_string(), out_of_range::create(408, exception_message(input_format, "excessive ndarray size caused overflow", "size"), nullptr)); + } + if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(static_cast(i)))) { return false; } } - inside_ndarray = true; + is_ndarray = true; return sax->end_array(); } result = 0; @@ -10689,7 +11305,7 @@ class binary_reader */ bool get_ubjson_size_type(std::pair& result, bool inside_ndarray = false) { - result.first = string_t::npos; // size + result.first = npos; // size result.second = 0; // type bool is_ndarray = false; @@ -10697,10 +11313,9 @@ class binary_reader if (current == '$') { - std::vector bjdx = {'[', '{', 'S', 'H', 'T', 'F', 'N', 'Z'}; // excluded markers in bjdata optimized type - result.second = get(); // must not ignore 'N', because 'N' maybe the type - if (JSON_HEDLEY_UNLIKELY( input_format == input_format_t::bjdata && std::find(bjdx.begin(), bjdx.end(), result.second) != bjdx.end() )) + if (input_format == input_format_t::bjdata + && JSON_HEDLEY_UNLIKELY(std::binary_search(bjd_optimized_type_markers.begin(), bjd_optimized_type_markers.end(), result.second))) { auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, @@ -10949,23 +11564,23 @@ class binary_reader // if bit-8 of size_and_type.second is set to 1, encode bjdata ndarray as an object in JData annotated array format (https://github.com/NeuroJSON/jdata): // {"_ArrayType_" : "typeid", "_ArraySize_" : [n1, n2, ...], "_ArrayData_" : [v1, v2, ...]} - if (input_format == input_format_t::bjdata && size_and_type.first != string_t::npos && (size_and_type.second & (1 << 8)) != 0) + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) { - std::map bjdtype = {{'U', "uint8"}, {'i', "int8"}, {'u', "uint16"}, {'I', "int16"}, - {'m', "uint32"}, {'l', "int32"}, {'M', "uint64"}, {'L', "int64"}, {'d', "single"}, {'D', "double"}, {'C', "char"} - }; - size_and_type.second &= ~(static_cast(1) << 8); // use bit 8 to indicate ndarray, here we remove the bit to restore the type marker - + auto it = std::lower_bound(bjd_types_map.begin(), bjd_types_map.end(), size_and_type.second, [](const bjd_type & p, char_int_type t) + { + return p.first < t; + }); string_t key = "_ArrayType_"; - if (JSON_HEDLEY_UNLIKELY(bjdtype.count(size_and_type.second) == 0)) + if (JSON_HEDLEY_UNLIKELY(it == bjd_types_map.end() || it->first != size_and_type.second)) { auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format, "invalid byte: 0x" + last_token, "type"), nullptr)); } - if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(bjdtype[size_and_type.second]) )) + string_t type = it->second; // sax->string() takes a reference + if (JSON_HEDLEY_UNLIKELY(!sax->key(key) || !sax->string(type))) { return false; } @@ -10992,7 +11607,7 @@ class binary_reader return (sax->end_array() && sax->end_object()); } - if (size_and_type.first != string_t::npos) + if (size_and_type.first != npos) { if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) { @@ -11055,7 +11670,7 @@ class binary_reader } // do not accept ND-array size in objects in BJData - if (input_format == input_format_t::bjdata && size_and_type.first != string_t::npos && (size_and_type.second & (1 << 8)) != 0) + if (input_format == input_format_t::bjdata && size_and_type.first != npos && (size_and_type.second & (1 << 8)) != 0) { auto last_token = get_token_string(); return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, @@ -11063,7 +11678,7 @@ class binary_reader } string_t key; - if (size_and_type.first != string_t::npos) + if (size_and_type.first != npos) { if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) { @@ -11133,8 +11748,8 @@ class binary_reader { // get size of following number string std::size_t size{}; - bool inside_ndarray = false; - auto res = get_ubjson_size_value(size, inside_ndarray); + bool no_ndarray = true; + auto res = get_ubjson_size_value(size, no_ndarray); if (JSON_HEDLEY_UNLIKELY(!res)) { return res; @@ -11407,6 +12022,8 @@ class binary_reader } private: + static JSON_INLINE_VARIABLE constexpr std::size_t npos = static_cast(-1); + /// input adapter InputAdapterType ia; @@ -11424,15 +12041,61 @@ class binary_reader /// the SAX parser json_sax_t* sax = nullptr; + + // excluded markers in bjdata optimized type +#define JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ \ + make_array('F', 'H', 'N', 'S', 'T', 'Z', '[', '{') + +#define JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ \ + make_array( \ + bjd_type{'C', "char"}, \ + bjd_type{'D', "double"}, \ + bjd_type{'I', "int16"}, \ + bjd_type{'L', "int64"}, \ + bjd_type{'M', "uint64"}, \ + bjd_type{'U', "uint8"}, \ + bjd_type{'d', "single"}, \ + bjd_type{'i', "int8"}, \ + bjd_type{'l', "int32"}, \ + bjd_type{'m', "uint32"}, \ + bjd_type{'u', "uint16"}) + + JSON_PRIVATE_UNLESS_TESTED: + // lookup tables + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_) bjd_optimized_type_markers = + JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_; + + using bjd_type = std::pair; + // NOLINTNEXTLINE(cppcoreguidelines-non-private-member-variables-in-classes) + const decltype(JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_) bjd_types_map = + JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_; + +#undef JSON_BINARY_READER_MAKE_BJD_OPTIMIZED_TYPE_MARKERS_ +#undef JSON_BINARY_READER_MAKE_BJD_TYPES_MAP_ }; + +#ifndef JSON_HAS_CPP_17 + template + constexpr std::size_t binary_reader::npos; +#endif + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // isfinite @@ -11459,8 +12122,7 @@ class binary_reader // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { //////////// @@ -11940,12 +12602,30 @@ class parser }; } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + +// #include + // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // ptrdiff_t @@ -11954,10 +12634,10 @@ class parser // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /* @brief an iterator for primitive JSON types @@ -12068,14 +12748,15 @@ class primitive_iterator_t return *this; } }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /*! @brief an iterator value @@ -12091,10 +12772,19 @@ template struct internal_iterator /// generic iterator for all other types primitive_iterator_t primitive_iterator {}; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next @@ -12115,10 +12805,10 @@ template struct internal_iterator // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + // forward declare, to be able to friend it later on template class iteration_proxy; template class iteration_proxy_value; @@ -12155,9 +12845,12 @@ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-speci // make sure BasicJsonType is basic_json or const basic_json static_assert(is_basic_json::type>::value, "iter_impl only accepts (const) basic_json"); + // superficial check for the LegacyBidirectionalIterator named requirement + static_assert(std::is_base_of::value + && std::is_base_of::iterator_category>::value, + "basic_json iterator assumes array and object type iterators satisfy the LegacyBidirectionalIterator named requirement."); public: - /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. /// The C++ Standard has never required user-defined iterators to derive from std::iterator. /// A user-defined iterator should provide publicly accessible typedefs named @@ -12839,22 +13532,34 @@ class iter_impl // NOLINT(cppcoreguidelines-special-member-functions,hicpp-speci /// the actual iterator of the associated instance internal_iterator::type> m_it {}; }; -} // namespace detail -} // namespace nlohmann + +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // ptrdiff_t #include // reverse_iterator #include // declval -namespace nlohmann -{ +// #include + + +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + ////////////////////// // reverse_iterator // ////////////////////// @@ -12962,18 +13667,30 @@ class json_reverse_iterator : public std::reverse_iterator return it.operator * (); } }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // all_of #include // isdigit #include // errno, ERANGE #include // strtoull +#ifndef JSON_NO_IO + #include // ostream +#endif // JSON_NO_IO #include // max #include // accumulate #include // string @@ -12991,8 +13708,7 @@ class json_reverse_iterator : public std::reverse_iterator // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document /// @sa https://json.nlohmann.me/api/json_pointer/ @@ -13042,11 +13758,22 @@ class json_pointer /// @brief return a string representation of the JSON pointer /// @sa https://json.nlohmann.me/api/json_pointer/operator_string/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, to_string()) operator string_t() const { return to_string(); } +#ifndef JSON_NO_IO + /// @brief write string representation of the JSON pointer to stream + /// @sa https://json.nlohmann.me/api/basic_json/operator_ltlt/ + friend std::ostream& operator<<(std::ostream& o, const json_pointer& ptr) + { + o << ptr.to_string(); + return o; + } +#endif + /// @brief append another JSON pointer at the end of this JSON pointer /// @sa https://json.nlohmann.me/api/json_pointer/operator_slasheq/ json_pointer& operator/=(const json_pointer& ptr) @@ -13800,71 +14527,170 @@ class json_pointer return result; } - /*! - @brief compares two JSON pointers for equality + public: +#if JSON_HAS_THREE_WAY_COMPARISON + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + bool operator==(const json_pointer& rhs) const noexcept + { + return reference_tokens == rhs.reference_tokens; + } - @param[in] lhs JSON pointer to compare - @param[in] rhs JSON pointer to compare - @return whether @a lhs is equal to @a rhs + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer)) + bool operator==(const string_t& rhs) const + { + return *this == json_pointer(rhs); + } - @complexity Linear in the length of the JSON pointer - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - */ + /// @brief 3-way compares two JSON pointers + template + std::strong_ordering operator<=>(const json_pointer& rhs) const noexcept // *NOPAD* + { + return reference_tokens <=> rhs.reference_tokens; // *NOPAD* + } +#else + /// @brief compares two JSON pointers for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ template // NOLINTNEXTLINE(readability-redundant-declaration) - friend bool operator==(json_pointer const& lhs, - json_pointer const& rhs) noexcept; + friend bool operator==(const json_pointer& lhs, + const json_pointer& rhs) noexcept; - /*! - @brief compares two JSON pointers for inequality + /// @brief compares JSON pointer and string for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const json_pointer& lhs, + const StringType& rhs); - @param[in] lhs JSON pointer to compare - @param[in] rhs JSON pointer to compare - @return whether @a lhs is not equal @a rhs + /// @brief compares string and JSON pointer for equality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_eq/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator==(const StringType& lhs, + const json_pointer& rhs); - @complexity Linear in the length of the JSON pointer - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - */ + /// @brief compares two JSON pointers for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ template // NOLINTNEXTLINE(readability-redundant-declaration) - friend bool operator!=(json_pointer const& lhs, - json_pointer const& rhs) noexcept; + friend bool operator!=(const json_pointer& lhs, + const json_pointer& rhs) noexcept; + /// @brief compares JSON pointer and string for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const json_pointer& lhs, + const StringType& rhs); + + /// @brief compares string and JSON pointer for inequality + /// @sa https://json.nlohmann.me/api/json_pointer/operator_ne/ + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator!=(const StringType& lhs, + const json_pointer& rhs); + + /// @brief compares two JSON pointer for less-than + template + // NOLINTNEXTLINE(readability-redundant-declaration) + friend bool operator<(const json_pointer& lhs, + const json_pointer& rhs) noexcept; +#endif + + private: /// the reference tokens std::vector reference_tokens; }; +#if !JSON_HAS_THREE_WAY_COMPARISON // functions cannot be defined inside class due to ODR violations template -inline bool operator==(json_pointer const& lhs, - json_pointer const& rhs) noexcept +inline bool operator==(const json_pointer& lhs, + const json_pointer& rhs) noexcept { return lhs.reference_tokens == rhs.reference_tokens; } +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const json_pointer& lhs, + const StringType& rhs) +{ + return lhs == json_pointer(rhs); +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator==(json_pointer, json_pointer)) +inline bool operator==(const StringType& lhs, + const json_pointer& rhs) +{ + return json_pointer(lhs) == rhs; +} + template -inline bool operator!=(json_pointer const& lhs, - json_pointer const& rhs) noexcept +inline bool operator!=(const json_pointer& lhs, + const json_pointer& rhs) noexcept { return !(lhs == rhs); } -} // namespace nlohmann + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const json_pointer& lhs, + const StringType& rhs) +{ + return !(lhs == rhs); +} + +template::string_t> +JSON_HEDLEY_DEPRECATED_FOR(3.11.2, operator!=(json_pointer, json_pointer)) +inline bool operator!=(const StringType& lhs, + const json_pointer& rhs) +{ + return !(lhs == rhs); +} + +template +inline bool operator<(const json_pointer& lhs, + const json_pointer& rhs) noexcept +{ + return lhs.reference_tokens < rhs.reference_tokens; +} +#endif + +NLOHMANN_JSON_NAMESPACE_END // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include #include +// #include + // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + template class json_ref { @@ -13920,8 +14746,9 @@ class json_ref mutable value_type owned_value = nullptr; value_type const* value_ref = nullptr; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include @@ -13934,6 +14761,14 @@ class json_ref // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // reverse @@ -13952,6 +14787,14 @@ class json_ref // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // copy @@ -13969,10 +14812,10 @@ class json_ref // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /// abstract output adapter interface template struct output_adapter_protocol { @@ -14008,7 +14851,7 @@ class output_vector_adapter : public output_adapter_protocol JSON_HEDLEY_NON_NULL(2) void write_characters(const CharType* s, std::size_t length) override { - std::copy(s, s + length, std::back_inserter(v)); + v.insert(v.end(), s, s + length); } private: @@ -14089,16 +14932,17 @@ class output_adapter private: output_adapter_t oa = nullptr; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /////////////////// // binary writer // /////////////////// @@ -15904,12 +16748,22 @@ class binary_writer /// the output output_adapter_t oa = nullptr; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2008-2009 Björn Hoehrmann +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // reverse, remove, fill, find, none_of @@ -15926,6 +16780,15 @@ class binary_writer #include // move // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2009 Florian Loitsch +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // array @@ -15938,8 +16801,7 @@ class binary_writer // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { @@ -16968,7 +17830,7 @@ inline char* format_buffer(char* buf, int len, int decimal_exponent, return append_exponent(buf, n - 1); } -} // namespace dtoa_impl +} // namespace dtoa_impl /*! @brief generates a decimal representation of the floating-point number value in [first, last). @@ -17035,8 +17897,8 @@ char* to_chars(char* first, const char* last, FloatType value) return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); } -} // namespace detail -} // namespace nlohmann +} // namespace detail +NLOHMANN_JSON_NAMESPACE_END // #include @@ -17053,10 +17915,10 @@ char* to_chars(char* first, const char* last, FloatType value) // #include -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN namespace detail { + /////////////////// // serialization // /////////////////// @@ -18005,14 +18867,23 @@ class serializer /// error_handler how to react on decoding errors const error_handler_t error_handler; }; + } // namespace detail -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END // #include // #include // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #include // equal_to, less @@ -18026,9 +18897,10 @@ class serializer // #include +// #include -namespace nlohmann -{ + +NLOHMANN_JSON_NAMESPACE_BEGIN /// ordered_map: a minimal map-like container that preserves insertion order /// for use within nlohmann::basic_json @@ -18068,21 +18940,50 @@ template , return {it, false}; } } - Container::emplace_back(key, t); - return {--this->end(), true}; + Container::emplace_back(key, std::forward(t)); + return {std::prev(this->end()), true}; } - T& operator[](const Key& key) + template::value, int> = 0> + std::pair emplace(KeyType && key, T && t) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return {it, false}; + } + } + Container::emplace_back(std::forward(key), std::forward(t)); + return {std::prev(this->end()), true}; + } + + T& operator[](const key_type& key) { return emplace(key, T{}).first->second; } - const T& operator[](const Key& key) const + template::value, int> = 0> + T & operator[](KeyType && key) + { + return emplace(std::forward(key), T{}).first->second; + } + + const T& operator[](const key_type& key) const { return at(key); } - T& at(const Key& key) + template::value, int> = 0> + const T & operator[](KeyType && key) const + { + return at(std::forward(key)); + } + + T& at(const key_type& key) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18095,7 +18996,9 @@ template , JSON_THROW(std::out_of_range("key not found")); } - const T& at(const Key& key) const + template::value, int> = 0> + T & at(KeyType && key) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18108,7 +19011,56 @@ template , JSON_THROW(std::out_of_range("key not found")); } - size_type erase(const Key& key) + const T& at(const key_type& key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + template::value, int> = 0> + const T & at(KeyType && key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it->second; + } + } + + JSON_THROW(std::out_of_range("key not found")); + } + + size_type erase(const key_type& key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + // Since we cannot move const Keys, re-construct them in place + for (auto next = it; ++next != this->end(); ++it) + { + it->~value_type(); // Destroy but keep allocation + new (&*it) value_type{std::move(*next)}; + } + Container::pop_back(); + return 1; + } + } + return 0; + } + + template::value, int> = 0> + size_type erase(KeyType && key) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18134,6 +19086,11 @@ template , iterator erase(iterator first, iterator last) { + if (first == last) + { + return first; + } + const auto elements_affected = std::distance(first, last); const auto offset = std::distance(Container::begin(), first); @@ -18180,7 +19137,7 @@ template , return Container::begin() + offset; } - size_type count(const Key& key) const + size_type count(const key_type& key) const { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18192,7 +19149,21 @@ template , return 0; } - iterator find(const Key& key) + template::value, int> = 0> + size_type count(KeyType && key) const + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return 1; + } + } + return 0; + } + + iterator find(const key_type& key) { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18204,7 +19175,21 @@ template , return Container::end(); } - const_iterator find(const Key& key) const + template::value, int> = 0> + iterator find(KeyType && key) + { + for (auto it = this->begin(); it != this->end(); ++it) + { + if (m_compare(it->first, key)) + { + return it; + } + } + return Container::end(); + } + + const_iterator find(const key_type& key) const { for (auto it = this->begin(); it != this->end(); ++it) { @@ -18251,7 +19236,7 @@ private: JSON_NO_UNIQUE_ADDRESS key_compare m_compare = key_compare(); }; -} // namespace nlohmann +NLOHMANN_JSON_NAMESPACE_END #if defined(JSON_HAS_CPP_17) @@ -18264,8 +19249,7 @@ private: @see https://github.com/nlohmann @since version 1.0.0 */ -namespace nlohmann -{ +NLOHMANN_JSON_NAMESPACE_BEGIN /*! @brief a class to store JSON values @@ -18708,7 +19692,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec object = nullptr; // silence warning, see #821 if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) { - JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.10.5", nullptr)); // LCOV_EXCL_LINE + JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.11.2", nullptr)); // LCOV_EXCL_LINE } break; } @@ -19076,6 +20060,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec default: // LCOV_EXCL_LINE JSON_ASSERT(false); // NOLINT(cert-dcl03-c,hicpp-static-assert,misc-static-assert) LCOV_EXCL_LINE } + JSON_ASSERT(m_type == val.type()); set_parents(); assert_invariant(); } @@ -20065,7 +21050,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec detail::negation>, detail::negation>, detail::negation>>, - #if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) detail::negation>, #endif @@ -20182,7 +21166,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief access specified object element with bounds checking /// @sa https://json.nlohmann.me/api/basic_json/at/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> reference at(KeyType && key) { // at only works for objects @@ -20220,7 +21204,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief access specified object element with bounds checking /// @sa https://json.nlohmann.me/api/basic_json/at/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> const_reference at(KeyType && key) const { // at only works for objects @@ -20350,7 +21334,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template::value, int > = 0 > + detail::is_usable_as_basic_json_key_type::value, int > = 0 > reference operator[](KeyType && key) { // implicitly convert null value to an empty object @@ -20374,7 +21358,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief access specified object element /// @sa https://json.nlohmann.me/api/basic_json/operator%5B%5D/ template::value, int > = 0 > + detail::is_usable_as_basic_json_key_type::value, int > = 0 > const_reference operator[](KeyType && key) const { // const operator[] only works for objects @@ -20388,14 +21372,24 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec JSON_THROW(type_error::create(305, detail::concat("cannot use operator[] with a string argument with ", type_name()), this)); } + private: + template + using is_comparable_with_object_key = detail::is_comparable < + object_comparator_t, const typename object_t::key_type&, KeyType >; + + template + using value_return_type = std::conditional < + detail::is_c_string_uncvref::value, + string_t, typename std::decay::type >; + + public: /// @brief access specified object element with default value /// @sa https://json.nlohmann.me/api/basic_json/value/ - // this is the value(const typename object_t::key_type&) overload - template < class KeyType, class ValueType, detail::enable_if_t < - std::is_same::value + template < class ValueType, detail::enable_if_t < + !detail::is_transparent::value && detail::is_getable::value - && !std::is_same::value, int > = 0 > - typename std::decay::type value(const KeyType& key, ValueType && default_value) const + && !std::is_same>::value, int > = 0 > + ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const { // value only works for objects if (JSON_HEDLEY_LIKELY(is_object())) @@ -20404,7 +21398,32 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec const auto it = find(key); if (it != end()) { - return it->template get::type>(); + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class ReturnType = typename value_return_type::type, + detail::enable_if_t < + !detail::is_transparent::value + && detail::is_getable::value + && !std::is_same>::value, int > = 0 > + ReturnType value(const typename object_t::key_type& key, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(key); + if (it != end()) + { + return it->template get(); } return std::forward(default_value); @@ -20415,36 +21434,13 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief access specified object element with default value /// @sa https://json.nlohmann.me/api/basic_json/value/ - /// overload for a default value of type const char* - string_t value(const typename object_t::key_type& key, const char* default_value) const - { - return value(key, string_t(default_value)); - } - - // these two functions, in conjunction with value(const KeyType &, ValueType &&), - // resolve an ambiguity that would otherwise occur between the json_pointer and - // typename object_t::key_type & overloads - template < class ValueType, detail::enable_if_t < - detail::is_getable::value - && !std::is_same::value, int > = 0 > - typename std::decay::type value(const char* key, ValueType && default_value) const - { - return value(typename object_t::key_type(key), std::forward(default_value)); - } - - string_t value(const char* key, const char* default_value) const - { - return value(typename object_t::key_type(key), string_t(default_value)); - } - - /// @brief access specified object element with default value - /// @sa https://json.nlohmann.me/api/basic_json/value/ - /// using std::is_convertible in a std::enable_if will fail when using explicit conversions - template < class KeyType, class ValueType, detail::enable_if_t < - detail::is_getable::value - && !std::is_same::value - && detail::is_usable_as_key_type::value, int > = 0 > - typename std::decay::type value(KeyType && key, ValueType && default_value) const + template < class ValueType, class KeyType, detail::enable_if_t < + detail::is_transparent::value + && !detail::is_json_pointer::value + && is_comparable_with_object_key::value + && detail::is_getable::value + && !std::is_same>::value, int > = 0 > + ValueType value(KeyType && key, const ValueType& default_value) const { // value only works for objects if (JSON_HEDLEY_LIKELY(is_object())) @@ -20453,7 +21449,34 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec const auto it = find(std::forward(key)); if (it != end()) { - return it->template get::type>(); + return it->template get(); + } + + return default_value; + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class KeyType, class ReturnType = typename value_return_type::type, + detail::enable_if_t < + detail::is_transparent::value + && !detail::is_json_pointer::value + && is_comparable_with_object_key::value + && detail::is_getable::value + && !std::is_same>::value, int > = 0 > + ReturnType value(KeyType && key, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if key is found, return value and given default value otherwise + const auto it = find(std::forward(key)); + if (it != end()) + { + return it->template get(); } return std::forward(default_value); @@ -20462,20 +21485,11 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); } - /// @brief access specified object element with default value - /// @sa https://json.nlohmann.me/api/basic_json/value/ - /// overload for a default value of type const char* - template < class KeyType, detail::enable_if_t < - !detail::is_json_pointer::value, int > = 0 > - string_t value(KeyType && key, const char* default_value) const - { - return value(std::forward(key), string_t(default_value)); - } - /// @brief access specified object element via JSON Pointer with default value /// @sa https://json.nlohmann.me/api/basic_json/value/ template < class ValueType, detail::enable_if_t < - detail::is_getable::value, int> = 0 > + detail::is_getable::value + && !std::is_same>::value, int > = 0 > ValueType value(const json_pointer& ptr, const ValueType& default_value) const { // value only works for objects @@ -20495,29 +21509,50 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); } + /// @brief access specified object element via JSON Pointer with default value + /// @sa https://json.nlohmann.me/api/basic_json/value/ + template < class ValueType, class ReturnType = typename value_return_type::type, + detail::enable_if_t < + detail::is_getable::value + && !std::is_same>::value, int > = 0 > + ReturnType value(const json_pointer& ptr, ValueType && default_value) const + { + // value only works for objects + if (JSON_HEDLEY_LIKELY(is_object())) + { + // if pointer resolves a value, return it or use default value + JSON_TRY + { + return ptr.get_checked(this).template get(); + } + JSON_INTERNAL_CATCH (out_of_range&) + { + return std::forward(default_value); + } + } + + JSON_THROW(type_error::create(306, detail::concat("cannot use value() with ", type_name()), this)); + } + template < class ValueType, class BasicJsonType, detail::enable_if_t < - detail::is_getable::value, int> = 0 > + detail::is_basic_json::value + && detail::is_getable::value + && !std::is_same>::value, int > = 0 > JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) // NOLINT(readability/alt_tokens) ValueType value(const ::nlohmann::json_pointer& ptr, const ValueType& default_value) const { return value(ptr.convert(), default_value); } - /// @brief access specified object element via JSON Pointer with default value - /// @sa https://json.nlohmann.me/api/basic_json/value/ - /// overload for a default value of type const char* - JSON_HEDLEY_NON_NULL(3) - string_t value(const json_pointer& ptr, const char* default_value) const - { - return value(ptr, string_t(default_value)); - } - - template + template < class ValueType, class BasicJsonType, class ReturnType = typename value_return_type::type, + detail::enable_if_t < + detail::is_basic_json::value + && detail::is_getable::value + && !std::is_same>::value, int > = 0 > JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) // NOLINT(readability/alt_tokens) - JSON_HEDLEY_NON_NULL(3) - string_t value(const typename ::nlohmann::json_pointer& ptr, const char* default_value) const + ReturnType value(const ::nlohmann::json_pointer& ptr, ValueType && default_value) const { - return value(ptr.convert(), default_value); + return value(ptr.convert(), std::forward(default_value)); } /// @brief access the first element @@ -20742,7 +21777,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief remove element from a JSON object given a key /// @sa https://json.nlohmann.me/api/basic_json/erase/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> size_type erase(KeyType && key) { return erase_internal(std::forward(key)); @@ -20809,7 +21844,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief find an element in a JSON object /// @sa https://json.nlohmann.me/api/basic_json/find/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> iterator find(KeyType && key) { auto result = end(); @@ -20825,7 +21860,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief find an element in a JSON object /// @sa https://json.nlohmann.me/api/basic_json/find/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> const_iterator find(KeyType && key) const { auto result = cend(); @@ -20849,7 +21884,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief returns the number of occurrences of a key in a JSON object /// @sa https://json.nlohmann.me/api/basic_json/count/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> size_type count(KeyType && key) const { // return 0 for all nonobject types @@ -20866,7 +21901,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @brief check the existence of an element in a JSON object /// @sa https://json.nlohmann.me/api/basic_json/contains/ template::value, int> = 0> + detail::is_usable_as_basic_json_key_type::value, int> = 0> bool contains(KeyType && key) const { return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); @@ -20879,9 +21914,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec return ptr.contains(this); } - template + template::value, int> = 0> JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) // NOLINT(readability/alt_tokens) - bool contains(const typename ::nlohmann::json_pointer ptr) const + bool contains(const typename ::nlohmann::json_pointer& ptr) const { return ptr.contains(this); } @@ -21628,11 +22663,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // swap only works for arrays if (JSON_HEDLEY_LIKELY(is_array())) { - std::swap(*(m_value.array), other); + using std::swap; + swap(*(m_value.array), other); } else { - JSON_THROW(type_error::create(310, detail::concat("cannot use swap() with ", type_name()), this)); + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(array_t&) with ", type_name()), this)); } } @@ -21643,11 +22679,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // swap only works for objects if (JSON_HEDLEY_LIKELY(is_object())) { - std::swap(*(m_value.object), other); + using std::swap; + swap(*(m_value.object), other); } else { - JSON_THROW(type_error::create(310, detail::concat("cannot use swap() with ", type_name()), this)); + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(object_t&) with ", type_name()), this)); } } @@ -21658,11 +22695,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // swap only works for strings if (JSON_HEDLEY_LIKELY(is_string())) { - std::swap(*(m_value.string), other); + using std::swap; + swap(*(m_value.string), other); } else { - JSON_THROW(type_error::create(310, detail::concat("cannot use swap() with ", type_name()), this)); + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(string_t&) with ", type_name()), this)); } } @@ -21673,11 +22711,12 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // swap only works for strings if (JSON_HEDLEY_LIKELY(is_binary())) { - std::swap(*(m_value.binary), other); + using std::swap; + swap(*(m_value.binary), other); } else { - JSON_THROW(type_error::create(310, detail::concat("cannot use swap() with ", type_name()), this)); + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t&) with ", type_name()), this)); } } @@ -21688,17 +22727,17 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // swap only works for strings if (JSON_HEDLEY_LIKELY(is_binary())) { - std::swap(*(m_value.binary), other); + using std::swap; + swap(*(m_value.binary), other); } else { - JSON_THROW(type_error::create(310, detail::concat("cannot use swap() with ", type_name()), this)); + JSON_THROW(type_error::create(310, detail::concat("cannot use swap(binary_t::container_type&) with ", type_name()), this)); } } /// @} - public: ////////////////////////////////////////// // lexicographical comparison operators // ////////////////////////////////////////// @@ -21706,6 +22745,212 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @name lexicographical comparison operators /// @{ + // note parentheses around operands are necessary; see + // https://github.com/nlohmann/json/issues/1530 +#define JSON_IMPLEMENT_OPERATOR(op, null_result, unordered_result, default_result) \ + const auto lhs_type = lhs.type(); \ + const auto rhs_type = rhs.type(); \ + \ + if (lhs_type == rhs_type) /* NOLINT(readability/braces) */ \ + { \ + switch (lhs_type) \ + { \ + case value_t::array: \ + return (*lhs.m_value.array) op (*rhs.m_value.array); \ + \ + case value_t::object: \ + return (*lhs.m_value.object) op (*rhs.m_value.object); \ + \ + case value_t::null: \ + return (null_result); \ + \ + case value_t::string: \ + return (*lhs.m_value.string) op (*rhs.m_value.string); \ + \ + case value_t::boolean: \ + return (lhs.m_value.boolean) op (rhs.m_value.boolean); \ + \ + case value_t::number_integer: \ + return (lhs.m_value.number_integer) op (rhs.m_value.number_integer); \ + \ + case value_t::number_unsigned: \ + return (lhs.m_value.number_unsigned) op (rhs.m_value.number_unsigned); \ + \ + case value_t::number_float: \ + return (lhs.m_value.number_float) op (rhs.m_value.number_float); \ + \ + case value_t::binary: \ + return (*lhs.m_value.binary) op (*rhs.m_value.binary); \ + \ + case value_t::discarded: \ + default: \ + return (unordered_result); \ + } \ + } \ + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) \ + { \ + return static_cast(lhs.m_value.number_integer) op rhs.m_value.number_float; \ + } \ + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) \ + { \ + return lhs.m_value.number_float op static_cast(rhs.m_value.number_integer); \ + } \ + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) \ + { \ + return static_cast(lhs.m_value.number_unsigned) op rhs.m_value.number_float; \ + } \ + else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) \ + { \ + return lhs.m_value.number_float op static_cast(rhs.m_value.number_unsigned); \ + } \ + else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) \ + { \ + return static_cast(lhs.m_value.number_unsigned) op rhs.m_value.number_integer; \ + } \ + else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) \ + { \ + return lhs.m_value.number_integer op static_cast(rhs.m_value.number_unsigned); \ + } \ + else if(compares_unordered(lhs, rhs))\ + {\ + return (unordered_result);\ + }\ + \ + return (default_result); + + JSON_PRIVATE_UNLESS_TESTED: + // returns true if: + // - any operand is NaN and the other operand is of number type + // - any operand is discarded + // in legacy mode, discarded values are considered ordered if + // an operation is computed as an odd number of inverses of others + static bool compares_unordered(const_reference lhs, const_reference rhs, bool inverse = false) noexcept + { + if ((lhs.is_number_float() && std::isnan(lhs.m_value.number_float) && rhs.is_number()) + || (rhs.is_number_float() && std::isnan(rhs.m_value.number_float) && lhs.is_number())) + { + return true; + } +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + return (lhs.is_discarded() || rhs.is_discarded()) && !inverse; +#else + static_cast(inverse); + return lhs.is_discarded() || rhs.is_discarded(); +#endif + } + + private: + bool compares_unordered(const_reference rhs, bool inverse = false) const noexcept + { + return compares_unordered(*this, rhs, inverse); + } + + public: +#if JSON_HAS_THREE_WAY_COMPARISON + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + bool operator==(const_reference rhs) const noexcept + { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wfloat-equal" +#endif + const_reference lhs = *this; + JSON_IMPLEMENT_OPERATOR( ==, true, false, false) +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + } + + /// @brief comparison: equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ + template + requires std::is_scalar_v + bool operator==(ScalarType rhs) const noexcept + { + return *this == basic_json(rhs); + } + + /// @brief comparison: not equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ + bool operator!=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !operator==(rhs); + } + + /// @brief comparison: 3-way + /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/ + std::partial_ordering operator<=>(const_reference rhs) const noexcept // *NOPAD* + { + const_reference lhs = *this; + // default_result is used if we cannot compare values. In that case, + // we compare types. + JSON_IMPLEMENT_OPERATOR(<=>, // *NOPAD* + std::partial_ordering::equivalent, + std::partial_ordering::unordered, + lhs_type <=> rhs_type) // *NOPAD* + } + + /// @brief comparison: 3-way + /// @sa https://json.nlohmann.me/api/basic_json/operator_spaceship/ + template + requires std::is_scalar_v + std::partial_ordering operator<=>(ScalarType rhs) const noexcept // *NOPAD* + { + return *this <=> basic_json(rhs); // *NOPAD* + } + +#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON + // all operators that are computed as an odd number of inverses of others + // need to be overloaded to emulate the legacy comparison behavior + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON) + bool operator<=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !(rhs < *this); + } + + /// @brief comparison: less than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ + template + requires std::is_scalar_v + bool operator<=(ScalarType rhs) const noexcept + { + return *this <= basic_json(rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + JSON_HEDLEY_DEPRECATED_FOR(3.11.0, undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON) + bool operator>=(const_reference rhs) const noexcept + { + if (compares_unordered(rhs, true)) + { + return false; + } + return !(*this < rhs); + } + + /// @brief comparison: greater than or equal + /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ + template + requires std::is_scalar_v + bool operator>=(ScalarType rhs) const noexcept + { + return *this >= basic_json(rhs); + } +#endif +#else /// @brief comparison: equal /// @sa https://json.nlohmann.me/api/basic_json/operator_eq/ friend bool operator==(const_reference lhs, const_reference rhs) noexcept @@ -21714,71 +22959,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wfloat-equal" #endif - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - return *lhs.m_value.array == *rhs.m_value.array; - - case value_t::object: - return *lhs.m_value.object == *rhs.m_value.object; - - case value_t::null: - return true; - - case value_t::string: - return *lhs.m_value.string == *rhs.m_value.string; - - case value_t::boolean: - return lhs.m_value.boolean == rhs.m_value.boolean; - - case value_t::number_integer: - return lhs.m_value.number_integer == rhs.m_value.number_integer; - - case value_t::number_unsigned: - return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; - - case value_t::number_float: - return lhs.m_value.number_float == rhs.m_value.number_float; - - case value_t::binary: - return *lhs.m_value.binary == *rhs.m_value.binary; - - case value_t::discarded: - default: - return false; - } - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); - } - - return false; + JSON_IMPLEMENT_OPERATOR( ==, true, false, false) #ifdef __GNUC__ #pragma GCC diagnostic pop #endif @@ -21806,6 +22987,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @sa https://json.nlohmann.me/api/basic_json/operator_ne/ friend bool operator!=(const_reference lhs, const_reference rhs) noexcept { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } return !(lhs == rhs); } @@ -21831,76 +23016,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @sa https://json.nlohmann.me/api/basic_json/operator_lt/ friend bool operator<(const_reference lhs, const_reference rhs) noexcept { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - // note parentheses are necessary, see - // https://github.com/nlohmann/json/issues/1530 - return (*lhs.m_value.array) < (*rhs.m_value.array); - - case value_t::object: - return (*lhs.m_value.object) < (*rhs.m_value.object); - - case value_t::null: - return false; - - case value_t::string: - return (*lhs.m_value.string) < (*rhs.m_value.string); - - case value_t::boolean: - return (lhs.m_value.boolean) < (rhs.m_value.boolean); - - case value_t::number_integer: - return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); - - case value_t::number_unsigned: - return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); - - case value_t::number_float: - return (lhs.m_value.number_float) < (rhs.m_value.number_float); - - case value_t::binary: - return (*lhs.m_value.binary) < (*rhs.m_value.binary); - - case value_t::discarded: - default: - return false; - } - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; - } - - // We only reach this line if we cannot compare values. In that case, + // default_result is used if we cannot compare values. In that case, // we compare types. Note we have to call the operator explicitly, // because MSVC has problems otherwise. - return operator<(lhs_type, rhs_type); + JSON_IMPLEMENT_OPERATOR( <, false, false, operator<(lhs_type, rhs_type)) } /// @brief comparison: less than @@ -21925,6 +23044,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @sa https://json.nlohmann.me/api/basic_json/operator_le/ friend bool operator<=(const_reference lhs, const_reference rhs) noexcept { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } return !(rhs < lhs); } @@ -21950,6 +23073,11 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @sa https://json.nlohmann.me/api/basic_json/operator_gt/ friend bool operator>(const_reference lhs, const_reference rhs) noexcept { + // double inverse + if (compares_unordered(lhs, rhs)) + { + return false; + } return !(lhs <= rhs); } @@ -21975,6 +23103,10 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @sa https://json.nlohmann.me/api/basic_json/operator_ge/ friend bool operator>=(const_reference lhs, const_reference rhs) noexcept { + if (compares_unordered(lhs, rhs, true)) + { + return false; + } return !(lhs < rhs); } @@ -21995,6 +23127,9 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec { return basic_json(lhs) >= rhs; } +#endif + +#undef JSON_IMPLEMENT_OPERATOR /// @} @@ -22660,7 +23795,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec return ptr.get_checked(this); } - template + template::value, int> = 0> JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) // NOLINT(readability/alt_tokens) reference at(const ::nlohmann::json_pointer& ptr) { @@ -22674,7 +23809,7 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec return ptr.get_checked(this); } - template + template::value, int> = 0> JSON_HEDLEY_DEPRECATED_FOR(3.11.0, basic_json::json_pointer or nlohmann::json_pointer) // NOLINT(readability/alt_tokens) const_reference at(const ::nlohmann::json_pointer& ptr) const { @@ -22706,13 +23841,11 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec /// @name JSON Patch functions /// @{ - /// @brief applies a JSON patch + /// @brief applies a JSON patch in-place without copying the object /// @sa https://json.nlohmann.me/api/basic_json/patch/ - basic_json patch(const basic_json& json_patch) const + void patch_inplace(const basic_json& json_patch) { - // make a working copy to apply the patch to - basic_json result = *this; - + basic_json& result = *this; // the valid JSON Patch operations enum class patch_operations {add, remove, replace, move, copy, test, invalid}; @@ -22766,7 +23899,8 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec // get reference to parent of JSON pointer ptr const auto last_path = ptr.back(); ptr.pop_back(); - basic_json& parent = result[ptr]; + // parent must exist when performing patch add per RFC6902 specs + basic_json& parent = result.at(ptr); switch (parent.m_type) { @@ -22976,7 +24110,14 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec } } } + } + /// @brief applies a JSON patch to a copy of the current object + /// @sa https://json.nlohmann.me/api/basic_json/patch/ + basic_json patch(const basic_json& json_patch) const + { + basic_json result = *this; + result.patch_inplace(json_patch); return result; } @@ -23114,7 +24255,6 @@ class basic_json // NOLINT(cppcoreguidelines-special-member-functions,hicpp-spec return result; } - /// @} //////////////////////////////// @@ -23163,7 +24303,30 @@ std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) return j.dump(); } -} // namespace nlohmann +inline namespace literals +{ +inline namespace json_literals +{ + +/// @brief user-defined string literal for JSON values +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json operator "" _json(const char* s, std::size_t n) +{ + return nlohmann::json::parse(s, s + n); +} + +/// @brief user-defined string literal for JSON pointer +/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ +JSON_HEDLEY_NON_NULL(1) +inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) +{ + return nlohmann::json::json_pointer(std::string(s, n)); +} + +} // namespace json_literals +} // namespace literals +NLOHMANN_JSON_NAMESPACE_END /////////////////////// // nonmember support // @@ -23191,10 +24354,14 @@ struct less< ::nlohmann::detail::value_t> // do not remove the space after '<', @brief compare two value_t enum values @since version 3.0.0 */ - bool operator()(nlohmann::detail::value_t lhs, - nlohmann::detail::value_t rhs) const noexcept + bool operator()(::nlohmann::detail::value_t lhs, + ::nlohmann::detail::value_t rhs) const noexcept { - return nlohmann::detail::operator<(lhs, rhs); +#if JSON_HAS_THREE_WAY_COMPARISON + return std::is_lt(lhs <=> rhs); // *NOPAD* +#else + return ::nlohmann::detail::operator<(lhs, rhs); +#endif } }; @@ -23213,25 +24380,22 @@ inline void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL& j1, nlohmann::NLOHMANN_BASIC #endif -} // namespace std +} // namespace std -/// @brief user-defined string literal for JSON values -/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json/ -JSON_HEDLEY_NON_NULL(1) -inline nlohmann::json operator "" _json(const char* s, std::size_t n) -{ - return nlohmann::json::parse(s, s + n); -} - -/// @brief user-defined string literal for JSON pointer -/// @sa https://json.nlohmann.me/api/basic_json/operator_literal_json_pointer/ -JSON_HEDLEY_NON_NULL(1) -inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) -{ - return nlohmann::json::json_pointer(std::string(s, n)); -} +#if JSON_USE_GLOBAL_UDLS + using nlohmann::literals::json_literals::operator "" _json; // NOLINT(misc-unused-using-decls,google-global-names-in-headers) + using nlohmann::literals::json_literals::operator "" _json_pointer; //NOLINT(misc-unused-using-decls,google-global-names-in-headers) +#endif // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + // restore clang diagnostic settings @@ -23248,7 +24412,10 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std #undef NLOHMANN_BASIC_JSON_TPL #undef JSON_EXPLICIT #undef NLOHMANN_CAN_CALL_STD_FUNC_IMPL +#undef JSON_INLINE_VARIABLE #undef JSON_NO_UNIQUE_ADDRESS +#undef JSON_DISABLE_ENUM_SERIALIZATION +#undef JSON_USE_GLOBAL_UDLS #ifndef JSON_TEST_KEEP_MACROS #undef JSON_CATCH @@ -23260,9 +24427,19 @@ inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std #undef JSON_HAS_FILESYSTEM #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM #undef JSON_HAS_THREE_WAY_COMPARISON + #undef JSON_HAS_RANGES + #undef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON #endif // #include +// __ _____ _____ _____ +// __| | __| | | | JSON for Modern C++ +// | | |__ | | | | | | version 3.11.2 +// |_____|_____|_____|_|___| https://github.com/nlohmann/json +// +// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann +// SPDX-License-Identifier: MIT + #undef JSON_HEDLEY_ALWAYS_INLINE From 3ed08681efbcdb283fbf3c52b20a36626dcb4797 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 22:22:48 -0230 Subject: [PATCH 4/9] Updated PNG lib to latest version. --- src/lib/libpng/png.c | 14 ++++---- src/lib/libpng/png.h | 26 +++++++-------- src/lib/libpng/pngconf.h | 14 ++++---- src/lib/libpng/pngget.c | 14 ++++---- src/lib/libpng/pngpriv.h | 65 ++++++++++++++++---------------------- src/lib/libpng/pngread.c | 3 -- src/lib/libpng/pngrtran.c | 2 +- src/lib/libpng/pngrutil.c | 36 ++++++++++----------- src/lib/libpng/pngset.c | 13 +++++--- src/lib/libpng/pngstruct.h | 12 +------ src/lib/libpng/pngwrite.c | 12 ++++++- 11 files changed, 101 insertions(+), 110 deletions(-) diff --git a/src/lib/libpng/png.c b/src/lib/libpng/png.c index 757c755f9..fc0956426 100644 --- a/src/lib/libpng/png.c +++ b/src/lib/libpng/png.c @@ -1,7 +1,7 @@ /* png.c - location for general purpose libpng functions * - * Copyright (c) 2018-2019 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_37 Your_png_h_is_not_version_1_6_37; +typedef png_libpng_version_1_6_38 Your_png_h_is_not_version_1_6_38; #ifdef __GNUC__ /* The version tests may need to be added to, but the problem warning has @@ -720,7 +720,7 @@ png_init_io(png_structrp png_ptr, png_FILE_p fp) * * Where UNSIGNED_MAX is the appropriate maximum unsigned value, so when the * negative integral value is added the result will be an unsigned value - * correspnding to the 2's complement representation. + * corresponding to the 2's complement representation. */ void PNGAPI png_save_int_32(png_bytep buf, png_int_32 i) @@ -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.37" PNG_STRING_NEWLINE \ - "Copyright (c) 2018-2019 Cosmin Truta" PNG_STRING_NEWLINE \ + "libpng version 1.6.38" 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 \ @@ -1843,12 +1843,12 @@ png_icc_profile_error(png_const_structrp png_ptr, png_colorspacerp colorspace, # ifdef PNG_WARNINGS_SUPPORTED else { - char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114*/ + char number[PNG_NUMBER_BUFFER_SIZE]; /* +24 = 114 */ pos = png_safecat(message, (sizeof message), pos, png_format_number(number, number+(sizeof number), PNG_NUMBER_FORMAT_x, value)); - pos = png_safecat(message, (sizeof message), pos, "h: "); /*+2 = 116*/ + pos = png_safecat(message, (sizeof message), pos, "h: "); /* +2 = 116 */ } # endif /* The 'reason' is an arbitrary message, allow +79 maximum 195 */ diff --git a/src/lib/libpng/png.h b/src/lib/libpng/png.h index bf8a3dfa9..5fb494fb1 100644 --- a/src/lib/libpng/png.h +++ b/src/lib/libpng/png.h @@ -1,9 +1,9 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.37 - April 14, 2019 + * libpng version 1.6.38 - September 14, 2022 * - * Copyright (c) 2018-2019 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.37, April 2019: + * libpng versions 1.6.36, December 2018, through 1.6.38, September 2022: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -27,8 +27,8 @@ * PNG Reference Library License version 2 * --------------------------------------- * - * * Copyright (c) 1995-2020 The PNG Reference Library Authors. - * * Copyright (c) 2018-2019 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.37 16 10637 16.so.16.37[.0] + * 1.6.38 16 10638 16.so.16.38[.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.37" -#define PNG_HEADER_VERSION_STRING " libpng version 1.6.37 - April 14, 2019\n" +#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_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 37 +#define PNG_LIBPNG_VER_RELEASE 38 /* 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 10637 /* 1.6.37 */ +#define PNG_LIBPNG_VER 10638 /* 1.6.38 */ /* 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_37; +typedef char* png_libpng_version_1_6_38; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * @@ -1446,7 +1446,7 @@ PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, * mainly useful for testing, as the defaults should work with most users. * Those users who are tight on memory or want faster performance at the * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. + * header file (zlib.h) for an explanation of the compression functions. */ /* Set the filtering method(s) used by libpng. Currently, the only valid @@ -1501,7 +1501,7 @@ PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 * (0 - no compression, 9 - "maximal" compression). Note that tests have * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, + * for PNG images, and do considerably fewer calculations. In the future, * these values may not correspond directly to the zlib compression levels. */ #ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED diff --git a/src/lib/libpng/pngconf.h b/src/lib/libpng/pngconf.h index b5f468ae5..89d28f83a 100644 --- a/src/lib/libpng/pngconf.h +++ b/src/lib/libpng/pngconf.h @@ -1,9 +1,9 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.37 + * libpng version 1.6.38 * - * Copyright (c) 2018-2019 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. @@ -180,8 +180,8 @@ * compiler-specific macros to the values required to change the calling * conventions of the various functions. */ -#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ + defined(__CYGWIN__) /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or * MinGW on any architecture currently supported by Windows. Also includes * Watcom builds but these need special treatment because they are not @@ -230,7 +230,7 @@ * the type. */ # ifndef PNG_EXPORT_TYPE -# define PNG_EXPORT_TYPE(name) name PNG_IMPEXP +# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP # endif # define PNG_DLL_EXPORT __export # else /* newer compiler */ @@ -450,7 +450,7 @@ # define PNG_FP_EXPORT(ordinal, type, name, args)\ PNG_EXPORT(ordinal, type, name, args); # else /* No floating point APIs */ -# define PNG_FP_EXPORT(ordinal, name, name, args) +# define PNG_FP_EXPORT(ordinal, type, name, args) # endif #endif #ifndef PNG_FIXED_EXPORT /* A fixed point API. */ @@ -458,7 +458,7 @@ # define PNG_FIXED_EXPORT(ordinal, type, name, args)\ PNG_EXPORT(ordinal, type, name, args); # else /* No fixed point APIs */ -# define PNG_FIXED_EXPORT(ordinal, name, name, args) +# define PNG_FIXED_EXPORT(ordinal, type, name, args) # endif #endif diff --git a/src/lib/libpng/pngget.c b/src/lib/libpng/pngget.c index 5abf1efd9..e44933c0d 100644 --- a/src/lib/libpng/pngget.c +++ b/src/lib/libpng/pngget.c @@ -1151,7 +1151,7 @@ png_get_unknown_chunks(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED png_byte PNGAPI -png_get_rgb_to_gray_status (png_const_structrp png_ptr) +png_get_rgb_to_gray_status(png_const_structrp png_ptr) { return (png_byte)(png_ptr ? png_ptr->rgb_to_gray_status : 0); } @@ -1192,27 +1192,27 @@ png_get_compression_buffer_size(png_const_structrp png_ptr) /* These functions were added to libpng 1.2.6 and were enabled * by default in libpng-1.4.0 */ png_uint_32 PNGAPI -png_get_user_width_max (png_const_structrp png_ptr) +png_get_user_width_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_width_max : 0); } png_uint_32 PNGAPI -png_get_user_height_max (png_const_structrp png_ptr) +png_get_user_height_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_height_max : 0); } /* This function was added to libpng 1.4.0 */ png_uint_32 PNGAPI -png_get_chunk_cache_max (png_const_structrp png_ptr) +png_get_chunk_cache_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_cache_max : 0); } /* This function was added to libpng 1.4.1 */ png_alloc_size_t PNGAPI -png_get_chunk_malloc_max (png_const_structrp png_ptr) +png_get_chunk_malloc_max(png_const_structrp png_ptr) { return (png_ptr ? png_ptr->user_chunk_malloc_max : 0); } @@ -1221,13 +1221,13 @@ png_get_chunk_malloc_max (png_const_structrp png_ptr) /* These functions were added to libpng 1.4.0 */ #ifdef PNG_IO_STATE_SUPPORTED png_uint_32 PNGAPI -png_get_io_state (png_const_structrp png_ptr) +png_get_io_state(png_const_structrp png_ptr) { return png_ptr->io_state; } png_uint_32 PNGAPI -png_get_io_chunk_type (png_const_structrp png_ptr) +png_get_io_chunk_type(png_const_structrp png_ptr) { return png_ptr->chunk_name; } diff --git a/src/lib/libpng/pngpriv.h b/src/lib/libpng/pngpriv.h index 583c26f9b..2e426cf47 100644 --- a/src/lib/libpng/pngpriv.h +++ b/src/lib/libpng/pngpriv.h @@ -1,7 +1,7 @@ /* pngpriv.h - private declarations for use inside libpng * - * Copyright (c) 2018-2019 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. @@ -174,7 +174,7 @@ # else /* !defined __ARM_NEON__ */ /* The 'intrinsics' code simply won't compile without this -mfpu=neon: */ -# if !defined(__aarch64__) +# if !defined(__aarch64__) && !defined(_M_ARM64) /* The assembler code currently does not work on ARM64 */ # define PNG_ARM_NEON_IMPLEMENTATION 2 # endif /* __aarch64__ */ @@ -185,6 +185,8 @@ /* Use the intrinsics code by default. */ # define PNG_ARM_NEON_IMPLEMENTATION 1 # endif +#else /* PNG_ARM_NEON_OPT == 0 */ +# define PNG_ARM_NEON_IMPLEMENTATION 0 #endif /* PNG_ARM_NEON_OPT > 0 */ #ifndef PNG_MIPS_MSA_OPT @@ -263,11 +265,15 @@ # ifndef PNG_MIPS_MSA_IMPLEMENTATION # define PNG_MIPS_MSA_IMPLEMENTATION 1 # endif +#else +# define PNG_MIPS_MSA_IMPLEMENTATION 0 #endif /* PNG_MIPS_MSA_OPT > 0 */ #if PNG_POWERPC_VSX_OPT > 0 # define PNG_FILTER_OPTIMIZATIONS png_init_filter_functions_vsx # define PNG_POWERPC_VSX_IMPLEMENTATION 1 +#else +# define PNG_POWERPC_VSX_IMPLEMENTATION 0 #endif @@ -492,16 +498,7 @@ static_cast(static_cast(value)) #else # define png_voidcast(type, value) (value) -# ifdef _WIN64 -# ifdef __GNUC__ - typedef unsigned long long png_ptruint; -# else - typedef unsigned __int64 png_ptruint; -# endif -# else - typedef unsigned long png_ptruint; -# endif -# define png_constcast(type, value) ((type)(png_ptruint)(const void*)(value)) +# define png_constcast(type, value) ((type)(void*)(const void*)(value)) # define png_aligncast(type, value) ((void*)(value)) # define png_aligncastconst(type, value) ((const void*)(value)) #endif /* __cplusplus */ @@ -543,9 +540,8 @@ # include #endif -#if defined(WIN32) || defined(_Windows) || defined(_WINDOWS) || \ - defined(_WIN32) || defined(__WIN32__) -# include /* defines _WINDOWS_ macro */ +#if defined(_WIN32) || defined(__WIN32__) || defined(__NT__) +# include #endif #endif /* PNG_VERSION_INFO_ONLY */ @@ -554,24 +550,20 @@ * functions that are passed far data must be model-independent. */ -/* Memory model/platform independent fns */ +/* Platform-independent functions */ #ifndef PNG_ABORT -# ifdef _WINDOWS_ -# define PNG_ABORT() ExitProcess(0) -# else -# define PNG_ABORT() abort() -# endif +# define PNG_ABORT() abort() #endif /* These macros may need to be architecture dependent. */ -#define PNG_ALIGN_NONE 0 /* do not use data alignment */ -#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ +#define PNG_ALIGN_NONE 0 /* do not use data alignment */ +#define PNG_ALIGN_ALWAYS 1 /* assume unaligned accesses are OK */ #ifdef offsetof -# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ +# define PNG_ALIGN_OFFSET 2 /* use offsetof to determine alignment */ #else # define PNG_ALIGN_OFFSET -1 /* prevent the use of this */ #endif -#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ +#define PNG_ALIGN_SIZE 3 /* use sizeof to determine alignment */ #ifndef PNG_ALIGN_TYPE /* Default to using aligned access optimizations and requiring alignment to a @@ -585,26 +577,25 @@ /* This is used because in some compiler implementations non-aligned * structure members are supported, so the offsetof approach below fails. * Set PNG_ALIGN_SIZE=0 for compiler combinations where unaligned access - * is good for performance. Do not do this unless you have tested the result - * and understand it. + * is good for performance. Do not do this unless you have tested the + * result and understand it. */ -# define png_alignof(type) (sizeof (type)) +# define png_alignof(type) (sizeof(type)) #else # if PNG_ALIGN_TYPE == PNG_ALIGN_OFFSET -# define png_alignof(type) offsetof(struct{char c; type t;}, t) +# define png_alignof(type) offsetof(struct{char c; type t;}, t) # else -# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS -# define png_alignof(type) (1) -# endif - /* Else leave png_alignof undefined to prevent use thereof */ +# if PNG_ALIGN_TYPE == PNG_ALIGN_ALWAYS +# define png_alignof(type) 1 +# endif + /* Else leave png_alignof undefined to prevent use thereof */ # endif #endif -/* This implicitly assumes alignment is always to a power of 2. */ +/* This implicitly assumes alignment is always a multiple of 2. */ #ifdef png_alignof -# define png_isaligned(ptr, type)\ - (((type)((const char*)ptr-(const char*)0) & \ - (type)(png_alignof(type)-1)) == 0) +# define png_isaligned(ptr, type) \ + (((type)(size_t)((const void*)(ptr)) & (type)(png_alignof(type)-1)) == 0) #else # define png_isaligned(ptr, type) 0 #endif diff --git a/src/lib/libpng/pngread.c b/src/lib/libpng/pngread.c index 8fa7d9f16..5ab922403 100644 --- a/src/lib/libpng/pngread.c +++ b/src/lib/libpng/pngread.c @@ -3452,7 +3452,6 @@ png_image_read_background(png_voidp argument) for (pass = 0; pass < passes; ++pass) { - png_bytep row = png_voidcast(png_bytep, display->first_row); unsigned int startx, stepx, stepy; png_uint_32 y; @@ -3557,8 +3556,6 @@ png_image_read_background(png_voidp argument) inrow += 2; /* gray and alpha channel */ } - - row += display->row_bytes; } } } diff --git a/src/lib/libpng/pngrtran.c b/src/lib/libpng/pngrtran.c index 9a8fad9f4..238f5afe7 100644 --- a/src/lib/libpng/pngrtran.c +++ b/src/lib/libpng/pngrtran.c @@ -21,7 +21,7 @@ #ifdef PNG_ARM_NEON_IMPLEMENTATION # if PNG_ARM_NEON_IMPLEMENTATION == 1 # define PNG_ARM_NEON_INTRINSICS_AVAILABLE -# if defined(_MSC_VER) && defined(_M_ARM64) +# if defined(_MSC_VER) && !defined(__clang__) && defined(_M_ARM64) # include # else # include diff --git a/src/lib/libpng/pngrutil.c b/src/lib/libpng/pngrutil.c index d5fa08c39..ca060dd15 100644 --- a/src/lib/libpng/pngrutil.c +++ b/src/lib/libpng/pngrutil.c @@ -1,7 +1,7 @@ /* pngrutil.c - utilities to read 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. @@ -301,7 +301,6 @@ png_read_buffer(png_structrp png_ptr, png_alloc_size_t new_size, int warn) if (buffer != NULL && new_size > png_ptr->read_buffer_size) { - png_ptr->read_buffer = NULL; png_ptr->read_buffer = NULL; png_ptr->read_buffer_size = 0; png_free(png_ptr, buffer); @@ -2076,21 +2075,22 @@ png_handle_eXIf(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) png_byte buf[1]; png_crc_read(png_ptr, buf, 1); info_ptr->eXIf_buf[i] = buf[0]; - if (i == 1 && buf[0] != 'M' && buf[0] != 'I' - && info_ptr->eXIf_buf[0] != buf[0]) + if (i == 1) { - png_crc_finish(png_ptr, length); - png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); - png_free(png_ptr, info_ptr->eXIf_buf); - info_ptr->eXIf_buf = NULL; - return; + if ((buf[0] != 'M' && buf[0] != 'I') || + (info_ptr->eXIf_buf[0] != buf[0])) + { + png_crc_finish(png_ptr, length - 2); + png_chunk_benign_error(png_ptr, "incorrect byte-order specifier"); + png_free(png_ptr, info_ptr->eXIf_buf); + info_ptr->eXIf_buf = NULL; + return; + } } } - if (png_crc_finish(png_ptr, 0) != 0) - return; - - png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); + if (png_crc_finish(png_ptr, 0) == 0) + png_set_eXIf_1(png_ptr, info_ptr, length, info_ptr->eXIf_buf); png_free(png_ptr, info_ptr->eXIf_buf); info_ptr->eXIf_buf = NULL; @@ -2126,8 +2126,9 @@ png_handle_hIST(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length) num = length / 2 ; - if (num != (unsigned int) png_ptr->num_palette || - num > (unsigned int) PNG_MAX_PALETTE_LENGTH) + if (length != num * 2 || + num != (unsigned int)png_ptr->num_palette || + num > (unsigned int)PNG_MAX_PALETTE_LENGTH) { png_crc_finish(png_ptr, length); png_chunk_benign_error(png_ptr, "invalid"); @@ -4621,14 +4622,13 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) */ { png_bytep temp = png_ptr->big_row_buf + 32; - int extra = (int)((temp - (png_bytep)0) & 0x0f); + size_t extra = (size_t)temp & 0x0f; png_ptr->row_buf = temp - extra - 1/*filter byte*/; temp = png_ptr->big_prev_row + 32; - extra = (int)((temp - (png_bytep)0) & 0x0f); + extra = (size_t)temp & 0x0f; png_ptr->prev_row = temp - extra - 1/*filter byte*/; } - #else /* Use 31 bytes of padding before and 17 bytes after row_buf. */ png_ptr->row_buf = png_ptr->big_row_buf + 31; diff --git a/src/lib/libpng/pngset.c b/src/lib/libpng/pngset.c index ec75dbe36..8c372cf41 100644 --- a/src/lib/libpng/pngset.c +++ b/src/lib/libpng/pngset.c @@ -1,7 +1,7 @@ /* pngset.c - storage of image information into info struct * - * Copyright (c) 2018 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. @@ -1019,6 +1019,9 @@ png_set_tRNS(png_structrp png_ptr, png_inforp info_ptr, info_ptr->trans_alpha = png_voidcast(png_bytep, png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH)); memcpy(info_ptr->trans_alpha, trans_alpha, (size_t)num_trans); + + info_ptr->valid |= PNG_INFO_tRNS; + info_ptr->free_me |= PNG_FREE_TRNS; } png_ptr->trans_alpha = info_ptr->trans_alpha; } @@ -1326,7 +1329,7 @@ png_set_unknown_chunk_location(png_const_structrp png_ptr, png_inforp info_ptr, #ifdef PNG_MNG_FEATURES_SUPPORTED png_uint_32 PNGAPI -png_permit_mng_features (png_structrp png_ptr, png_uint_32 mng_features) +png_permit_mng_features(png_structrp png_ptr, png_uint_32 mng_features) { png_debug(1, "in png_permit_mng_features"); @@ -1633,7 +1636,7 @@ png_set_invalid(png_const_structrp png_ptr, png_inforp info_ptr, int mask) #ifdef PNG_SET_USER_LIMITS_SUPPORTED /* This function was added to libpng 1.2.6 */ void PNGAPI -png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, +png_set_user_limits(png_structrp png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max) { /* Images with dimensions larger than these limits will be @@ -1649,7 +1652,7 @@ png_set_user_limits (png_structrp png_ptr, png_uint_32 user_width_max, /* This function was added to libpng 1.4.0 */ void PNGAPI -png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) +png_set_chunk_cache_max(png_structrp png_ptr, png_uint_32 user_chunk_cache_max) { if (png_ptr != NULL) png_ptr->user_chunk_cache_max = user_chunk_cache_max; @@ -1657,7 +1660,7 @@ png_set_chunk_cache_max (png_structrp png_ptr, png_uint_32 user_chunk_cache_max) /* This function was added to libpng 1.4.1 */ void PNGAPI -png_set_chunk_malloc_max (png_structrp png_ptr, +png_set_chunk_malloc_max(png_structrp png_ptr, png_alloc_size_t user_chunk_malloc_max) { if (png_ptr != NULL) diff --git a/src/lib/libpng/pngstruct.h b/src/lib/libpng/pngstruct.h index 8bdc7ce46..e591d94d5 100644 --- a/src/lib/libpng/pngstruct.h +++ b/src/lib/libpng/pngstruct.h @@ -1,7 +1,7 @@ /* pngstruct.h - header file for PNG reference library * - * Copyright (c) 2018-2019 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. @@ -334,18 +334,8 @@ struct png_struct_def size_t current_buffer_size; /* amount of data now in current_buffer */ int process_mode; /* what push library is currently doing */ int cur_palette; /* current push library palette index */ - #endif /* PROGRESSIVE_READ */ -#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) -/* For the Borland special 64K segment handler */ - png_bytepp offset_table_ptr; - png_bytep offset_table; - png_uint_16 offset_table_number; - png_uint_16 offset_table_count; - png_uint_16 offset_table_count_free; -#endif - #ifdef PNG_READ_QUANTIZE_SUPPORTED png_bytep palette_lookup; /* lookup table for quantizing */ png_bytep quantize_index; /* index translation for palette files */ diff --git a/src/lib/libpng/pngwrite.c b/src/lib/libpng/pngwrite.c index 59377a4dd..06c45d16a 100644 --- a/src/lib/libpng/pngwrite.c +++ b/src/lib/libpng/pngwrite.c @@ -1,7 +1,7 @@ /* pngwrite.c - general routines to write a PNG file * - * Copyright (c) 2018-2019 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. @@ -489,6 +489,16 @@ png_convert_from_time_t(png_timep ptime, time_t ttime) png_debug(1, "in png_convert_from_time_t"); tbuf = gmtime(&ttime); + if (tbuf == NULL) + { + /* TODO: add a safe function which takes a png_ptr argument and raises + * a png_error if the ttime argument is invalid and the call to gmtime + * fails as a consequence. + */ + memset(ptime, 0, sizeof(*ptime)); + return; + } + png_convert_from_struct_tm(ptime, tbuf); } #endif From ae75b94f23d7bd3328c52e1eca40525fa3794745 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 22:26:35 -0230 Subject: [PATCH 5/9] Updated httplib to latest version. --- src/lib/httplib/httplib.h | 1597 ++++++++++++++++++++----------------- 1 file changed, 880 insertions(+), 717 deletions(-) diff --git a/src/lib/httplib/httplib.h b/src/lib/httplib/httplib.h index 04a552f0a..d380af0c0 100644 --- a/src/lib/httplib/httplib.h +++ b/src/lib/httplib/httplib.h @@ -8,7 +8,7 @@ #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.10.7" +#define CPPHTTPLIB_VERSION "0.11.2" /* * Configuration @@ -70,10 +70,18 @@ #define CPPHTTPLIB_REDIRECT_MAX_COUNT 20 #endif +#ifndef CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT +#define CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT 1024 +#endif + #ifndef CPPHTTPLIB_PAYLOAD_MAX_LENGTH #define CPPHTTPLIB_PAYLOAD_MAX_LENGTH ((std::numeric_limits::max)()) #endif +#ifndef CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH +#define CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH 8192 +#endif + #ifndef CPPHTTPLIB_TCP_NODELAY #define CPPHTTPLIB_TCP_NODELAY false #endif @@ -119,14 +127,16 @@ #endif //_CRT_NONSTDC_NO_DEPRECATE #if defined(_MSC_VER) +#if _MSC_VER < 1900 +#error Sorry, Visual Studio versions prior to 2015 are not supported +#endif + +#pragma comment(lib, "ws2_32.lib") + #ifdef _WIN64 using ssize_t = __int64; #else -using ssize_t = int; -#endif - -#if _MSC_VER < 1900 -#define snprintf _snprintf_s +using ssize_t = long; #endif #endif // _MSC_VER @@ -150,10 +160,6 @@ using ssize_t = int; #define WSA_FLAG_NO_HANDLE_INHERIT 0x80 #endif -#ifdef _MSC_VER -#pragma comment(lib, "ws2_32.lib") -#endif - #ifndef strcasecmp #define strcasecmp _stricmp #endif // strcasecmp @@ -166,7 +172,6 @@ using socket_t = SOCKET; #else // not _WIN32 #include -#include #include #include #include @@ -182,6 +187,7 @@ using socket_t = SOCKET; #include #include #include +#include #include using socket_t = int; @@ -197,6 +203,7 @@ using socket_t = int; #include #include #include +#include #include #include #include @@ -425,22 +432,21 @@ struct Request { const SSL *ssl = nullptr; #endif - bool has_header(const char *key) const; - std::string get_header_value(const char *key, size_t id = 0) const; + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, size_t id = 0) const; template - T get_header_value(const char *key, size_t id = 0) const; - size_t get_header_value_count(const char *key) const; - void set_header(const char *key, const char *val); - void set_header(const char *key, const std::string &val); + T get_header_value(const std::string &key, size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); - bool has_param(const char *key) const; - std::string get_param_value(const char *key, size_t id = 0) const; - size_t get_param_value_count(const char *key) const; + bool has_param(const std::string &key) const; + std::string get_param_value(const std::string &key, size_t id = 0) const; + size_t get_param_value_count(const std::string &key) const; bool is_multipart_form_data() const; - bool has_file(const char *key) const; - MultipartFormData get_file_value(const char *key) const; + bool has_file(const std::string &key) const; + MultipartFormData get_file_value(const std::string &key) const; // private members... size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; @@ -458,29 +464,27 @@ struct Response { std::string body; std::string location; // Redirect location - bool has_header(const char *key) const; - std::string get_header_value(const char *key, size_t id = 0) const; + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, size_t id = 0) const; template - T get_header_value(const char *key, size_t id = 0) const; - size_t get_header_value_count(const char *key) const; - void set_header(const char *key, const char *val); - void set_header(const char *key, const std::string &val); + T get_header_value(const std::string &key, size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); - void set_redirect(const char *url, int status = 302); void set_redirect(const std::string &url, int status = 302); - void set_content(const char *s, size_t n, const char *content_type); - void set_content(const std::string &s, const char *content_type); + void set_content(const char *s, size_t n, const std::string &content_type); + void set_content(const std::string &s, const std::string &content_type); void set_content_provider( - size_t length, const char *content_type, ContentProvider provider, + size_t length, const std::string &content_type, ContentProvider provider, ContentProviderResourceReleaser resource_releaser = nullptr); void set_content_provider( - const char *content_type, ContentProviderWithoutLength provider, + const std::string &content_type, ContentProviderWithoutLength provider, ContentProviderResourceReleaser resource_releaser = nullptr); void set_chunked_content_provider( - const char *content_type, ContentProviderWithoutLength provider, + const std::string &content_type, ContentProviderWithoutLength provider, ContentProviderResourceReleaser resource_releaser = nullptr); Response() = default; @@ -612,7 +616,7 @@ public: using Handler = std::function; using ExceptionHandler = - std::function; + std::function; enum class HandlerResponse { Handled, @@ -649,8 +653,8 @@ public: bool set_mount_point(const std::string &mount_point, const std::string &dir, Headers headers = Headers()); bool remove_mount_point(const std::string &mount_point); - Server &set_file_extension_and_mimetype_mapping(const char *ext, - const char *mime); + Server &set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime); Server &set_file_request_handler(Handler handler); Server &set_error_handler(HandlerWithResponse handler); @@ -685,11 +689,11 @@ public: Server &set_payload_max_length(size_t length); - bool bind_to_port(const char *host, int port, int socket_flags = 0); - int bind_to_any_port(const char *host, int socket_flags = 0); + bool bind_to_port(const std::string &host, int port, int socket_flags = 0); + int bind_to_any_port(const std::string &host, int socket_flags = 0); bool listen_after_bind(); - bool listen(const char *host, int port, int socket_flags = 0); + bool listen(const std::string &host, int port, int socket_flags = 0); bool is_running() const; void stop(); @@ -717,9 +721,10 @@ private: using HandlersForContentReader = std::vector>; - socket_t create_server_socket(const char *host, int port, int socket_flags, + socket_t create_server_socket(const std::string &host, int port, + int socket_flags, SocketOptions socket_options) const; - int bind_internal(const char *host, int port, int socket_flags); + int bind_internal(const std::string &host, int port, int socket_flags); bool listen_internal(); bool routing(Request &req, Response &res, Stream &strm); @@ -833,11 +838,12 @@ public: Error error() const { return err_; } // Request Headers - bool has_request_header(const char *key) const; - std::string get_request_header_value(const char *key, size_t id = 0) const; + bool has_request_header(const std::string &key) const; + std::string get_request_header_value(const std::string &key, + size_t id = 0) const; template - T get_request_header_value(const char *key, size_t id = 0) const; - size_t get_request_header_value_count(const char *key) const; + T get_request_header_value(const std::string &key, size_t id = 0) const; + size_t get_request_header_value_count(const std::string &key) const; private: std::unique_ptr res_; @@ -859,124 +865,145 @@ public: virtual bool is_valid() const; - Result Get(const char *path); - Result Get(const char *path, const Headers &headers); - Result Get(const char *path, Progress progress); - Result Get(const char *path, const Headers &headers, Progress progress); - Result Get(const char *path, ContentReceiver content_receiver); - Result Get(const char *path, const Headers &headers, - ContentReceiver content_receiver); - Result Get(const char *path, ContentReceiver content_receiver, + Result Get(const std::string &path); + Result Get(const std::string &path, const Headers &headers); + Result Get(const std::string &path, Progress progress); + Result Get(const std::string &path, const Headers &headers, Progress progress); - Result Get(const char *path, const Headers &headers, - ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, ResponseHandler response_handler, + Result Get(const std::string &path, ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver); - Result Get(const char *path, const Headers &headers, + Result Get(const std::string &path, ContentReceiver content_receiver, + Progress progress); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver); - Result Get(const char *path, ResponseHandler response_handler, + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, const Headers &headers, + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, const Params ¶ms, const Headers &headers, + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ContentReceiver content_receiver, Progress progress = nullptr); - Result Get(const char *path, const Params ¶ms, const Headers &headers, + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress = nullptr); - Result Get(const char *path, const Params ¶ms, const Headers &headers, - ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress = nullptr); - Result Head(const char *path); - Result Head(const char *path, const Headers &headers); + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); - Result Post(const char *path); - Result Post(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Post(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Post(const char *path, const std::string &body, - const char *content_type); - Result Post(const char *path, const Headers &headers, const std::string &body, - const char *content_type); - Result Post(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Post(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Post(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Post(const char *path, const Headers &headers, + Result Post(const std::string &path); + 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, + size_t content_length, const std::string &content_type); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Post(const char *path, const Params ¶ms); - Result Post(const char *path, const Headers &headers, const Params ¶ms); - Result Post(const char *path, const MultipartFormDataItems &items); - Result Post(const char *path, const Headers &headers, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Post(const std::string &path, const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items); - Result Post(const char *path, const Headers &headers, + Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items, const std::string &boundary); - Result Put(const char *path); - Result Put(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Put(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Put(const char *path, const std::string &body, - const char *content_type); - Result Put(const char *path, const Headers &headers, const std::string &body, - const char *content_type); - Result Put(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Put(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Put(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Put(const char *path, const Headers &headers, + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Put(const std::string &path, size_t content_length, + ContentProvider content_provider, const std::string &content_type); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Put(const char *path, const Params ¶ms); - Result Put(const char *path, const Headers &headers, const Params ¶ms); + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Put(const std::string &path, const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); - Result Patch(const char *path); - Result Patch(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Patch(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Patch(const char *path, const std::string &body, - const char *content_type); - Result Patch(const char *path, const Headers &headers, - const std::string &body, const char *content_type); - Result Patch(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Patch(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Patch(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Patch(const char *path, const Headers &headers, + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); - Result Delete(const char *path); - Result Delete(const char *path, const Headers &headers); - Result Delete(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Delete(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Delete(const char *path, const std::string &body, - const char *content_type); - Result Delete(const char *path, const Headers &headers, - const std::string &body, const char *content_type); + Result Delete(const std::string &path); + Result Delete(const std::string &path, const Headers &headers); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); - Result Options(const char *path); - Result Options(const char *path, const Headers &headers); + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); bool send(Request &req, Response &res, Error &error); Result send(const Request &req); size_t is_socket_open() const; + socket_t socket() const; + void stop(); void set_hostname_addr_map(std::map addr_map); @@ -1000,10 +1027,11 @@ public: template void set_write_timeout(const std::chrono::duration &duration); - void set_basic_auth(const char *username, const char *password); - void set_bearer_token_auth(const char *token); + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_digest_auth(const char *username, const char *password); + void set_digest_auth(const std::string &username, + const std::string &password); #endif void set_keep_alive(bool on); @@ -1015,18 +1043,20 @@ public: void set_decompress(bool on); - void set_interface(const char *intf); + void set_interface(const std::string &intf); - void set_proxy(const char *host, int port); - void set_proxy_basic_auth(const char *username, const char *password); - void set_proxy_bearer_token_auth(const char *token); + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_proxy_digest_auth(const char *username, const char *password); + void set_proxy_digest_auth(const std::string &username, + const std::string &password); #endif #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_ca_cert_path(const char *ca_cert_file_path, - const char *ca_cert_dir_path = nullptr); + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); void set_ca_cert_store(X509_STORE *ca_cert_store); #endif @@ -1156,16 +1186,16 @@ private: bool handle_request(Stream &strm, Request &req, Response &res, bool close_connection, Error &error); std::unique_ptr send_with_content_provider( - Request &req, - // const char *method, const char *path, const Headers &headers, - const char *body, size_t content_length, ContentProvider content_provider, + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const char *content_type, Error &error); + const std::string &content_type, Error &error); Result send_with_content_provider( - const char *method, const char *path, const Headers &headers, - const char *body, size_t content_length, ContentProvider content_provider, + const std::string &method, const std::string &path, + const Headers &headers, const char *body, size_t content_length, + ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const char *content_type); + const std::string &content_type); std::string adjust_host_string(const std::string &host) const; @@ -1196,122 +1226,143 @@ public: bool is_valid() const; - Result Get(const char *path); - Result Get(const char *path, const Headers &headers); - Result Get(const char *path, Progress progress); - Result Get(const char *path, const Headers &headers, Progress progress); - Result Get(const char *path, ContentReceiver content_receiver); - Result Get(const char *path, const Headers &headers, - ContentReceiver content_receiver); - Result Get(const char *path, ContentReceiver content_receiver, + Result Get(const std::string &path); + Result Get(const std::string &path, const Headers &headers); + Result Get(const std::string &path, Progress progress); + Result Get(const std::string &path, const Headers &headers, Progress progress); - Result Get(const char *path, const Headers &headers, - ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, ResponseHandler response_handler, + Result Get(const std::string &path, ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver); - Result Get(const char *path, const Headers &headers, + Result Get(const std::string &path, ContentReceiver content_receiver, + Progress progress); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver); - Result Get(const char *path, const Headers &headers, + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, ResponseHandler response_handler, + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress); - Result Get(const char *path, const Params ¶ms, const Headers &headers, + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ContentReceiver content_receiver, Progress progress = nullptr); - Result Get(const char *path, const Params ¶ms, const Headers &headers, + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress = nullptr); - Result Get(const char *path, const Params ¶ms, const Headers &headers, - ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress = nullptr); - Result Head(const char *path); - Result Head(const char *path, const Headers &headers); + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); - Result Post(const char *path); - Result Post(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Post(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Post(const char *path, const std::string &body, - const char *content_type); - Result Post(const char *path, const Headers &headers, const std::string &body, - const char *content_type); - Result Post(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Post(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Post(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Post(const char *path, const Headers &headers, + Result Post(const std::string &path); + 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, + size_t content_length, const std::string &content_type); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Post(const char *path, const Params ¶ms); - Result Post(const char *path, const Headers &headers, const Params ¶ms); - Result Post(const char *path, const MultipartFormDataItems &items); - Result Post(const char *path, const Headers &headers, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Post(const std::string &path, const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items); - Result Post(const char *path, const Headers &headers, + Result Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items, const std::string &boundary); - Result Put(const char *path); - Result Put(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Put(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Put(const char *path, const std::string &body, - const char *content_type); - Result Put(const char *path, const Headers &headers, const std::string &body, - const char *content_type); - Result Put(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Put(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Put(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Put(const char *path, const Headers &headers, + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Put(const std::string &path, size_t content_length, + ContentProvider content_provider, const std::string &content_type); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Put(const char *path, const Params ¶ms); - Result Put(const char *path, const Headers &headers, const Params ¶ms); - Result Patch(const char *path); - Result Patch(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Patch(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Patch(const char *path, const std::string &body, - const char *content_type); - Result Patch(const char *path, const Headers &headers, - const std::string &body, const char *content_type); - Result Patch(const char *path, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Patch(const char *path, ContentProviderWithoutLength content_provider, - const char *content_type); - Result Patch(const char *path, const Headers &headers, size_t content_length, - ContentProvider content_provider, const char *content_type); - Result Patch(const char *path, const Headers &headers, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Put(const std::string &path, const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type); + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); - Result Delete(const char *path); - Result Delete(const char *path, const Headers &headers); - Result Delete(const char *path, const char *body, size_t content_length, - const char *content_type); - Result Delete(const char *path, const Headers &headers, const char *body, - size_t content_length, const char *content_type); - Result Delete(const char *path, const std::string &body, - const char *content_type); - Result Delete(const char *path, const Headers &headers, - const std::string &body, const char *content_type); + Result Delete(const std::string &path); + Result Delete(const std::string &path, const Headers &headers); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); - Result Options(const char *path); - Result Options(const char *path, const Headers &headers); + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); bool send(Request &req, Response &res, Error &error); Result send(const Request &req); size_t is_socket_open() const; + socket_t socket() const; + void stop(); void set_hostname_addr_map(std::map addr_map); @@ -1335,10 +1386,11 @@ public: template void set_write_timeout(const std::chrono::duration &duration); - void set_basic_auth(const char *username, const char *password); - void set_bearer_token_auth(const char *token); + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_digest_auth(const char *username, const char *password); + void set_digest_auth(const std::string &username, + const std::string &password); #endif void set_keep_alive(bool on); @@ -1350,13 +1402,15 @@ public: void set_decompress(bool on); - void set_interface(const char *intf); + void set_interface(const std::string &intf); - void set_proxy(const char *host, int port); - void set_proxy_basic_auth(const char *username, const char *password); - void set_proxy_bearer_token_auth(const char *token); + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_proxy_digest_auth(const char *username, const char *password); + void set_proxy_digest_auth(const std::string &username, + const std::string &password); #endif #ifdef CPPHTTPLIB_OPENSSL_SUPPORT @@ -1367,8 +1421,8 @@ public: // SSL #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - void set_ca_cert_path(const char *ca_cert_file_path, - const char *ca_cert_dir_path = nullptr); + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); void set_ca_cert_store(X509_STORE *ca_cert_store); @@ -1483,12 +1537,13 @@ inline void duration_to_sec_and_usec(const T &duration, U callback) { } template -inline T get_header_value(const Headers & /*headers*/, const char * /*key*/, - size_t /*id*/ = 0, uint64_t /*def*/ = 0) {} +inline T get_header_value(const Headers & /*headers*/, + const std::string & /*key*/, size_t /*id*/ = 0, + uint64_t /*def*/ = 0) {} template <> inline uint64_t get_header_value(const Headers &headers, - const char *key, size_t id, + const std::string &key, size_t id, uint64_t def) { auto rng = headers.equal_range(key); auto it = rng.first; @@ -1502,12 +1557,12 @@ inline uint64_t get_header_value(const Headers &headers, } // namespace detail template -inline T Request::get_header_value(const char *key, size_t id) const { +inline T Request::get_header_value(const std::string &key, size_t id) const { return detail::get_header_value(headers, key, id, 0); } template -inline T Response::get_header_value(const char *key, size_t id) const { +inline T Response::get_header_value(const std::string &key, size_t id) const { return detail::get_header_value(headers, key, id, 0); } @@ -1516,11 +1571,7 @@ inline ssize_t Stream::write_format(const char *fmt, const Args &...args) { const auto bufsiz = 2048; std::array buf{}; -#if defined(_MSC_VER) && _MSC_VER < 1900 - auto sn = _snprintf_s(buf.data(), bufsiz, _TRUNCATE, fmt, args...); -#else auto sn = snprintf(buf.data(), buf.size() - 1, fmt, args...); -#endif if (sn <= 0) { return sn; } auto n = static_cast(sn); @@ -1530,14 +1581,8 @@ inline ssize_t Stream::write_format(const char *fmt, const Args &...args) { while (n >= glowable_buf.size() - 1) { glowable_buf.resize(glowable_buf.size() * 2); -#if defined(_MSC_VER) && _MSC_VER < 1900 - n = static_cast(_snprintf_s(&glowable_buf[0], glowable_buf.size(), - glowable_buf.size() - 1, fmt, - args...)); -#else n = static_cast( snprintf(&glowable_buf[0], glowable_buf.size() - 1, fmt, args...)); -#endif } return write(&glowable_buf[0], n); } else { @@ -1617,7 +1662,8 @@ inline std::ostream &operator<<(std::ostream &os, const Error &obj) { } template -inline T Result::get_request_header_value(const char *key, size_t id) const { +inline T Result::get_request_header_value(const std::string &key, + size_t id) const { return detail::get_header_value(request_headers_, key, id, 0); } @@ -1666,11 +1712,11 @@ Client::set_write_timeout(const std::chrono::duration &duration) { * .h + .cc. */ -std::string hosted_at(const char *hostname); +std::string hosted_at(const std::string &hostname); -void hosted_at(const char *hostname, std::vector &addrs); +void hosted_at(const std::string &hostname, std::vector &addrs); -std::string append_query_params(const char *path, const Params ¶ms); +std::string append_query_params(const std::string &path, const Params ¶ms); std::pair make_range_header(Ranges ranges); @@ -1698,13 +1744,13 @@ bool process_client_socket(socket_t sock, time_t read_timeout_sec, std::function callback); socket_t create_client_socket( - const char *host, const char *ip, int port, int address_family, - bool tcp_nodelay, SocketOptions socket_options, + const std::string &host, const std::string &ip, int port, + int address_family, bool tcp_nodelay, SocketOptions socket_options, time_t connection_timeout_sec, time_t connection_timeout_usec, time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, time_t write_timeout_usec, const std::string &intf, Error &error); -const char *get_header_value(const Headers &headers, const char *key, +const char *get_header_value(const Headers &headers, const std::string &key, size_t id = 0, const char *def = nullptr); std::string params_to_query_str(const Params ¶ms); @@ -2515,7 +2561,7 @@ inline int shutdown_socket(socket_t sock) { } template -socket_t create_socket(const char *host, const char *ip, int port, +socket_t create_socket(const std::string &host, const std::string &ip, int port, int address_family, int socket_flags, bool tcp_nodelay, SocketOptions socket_options, BindOrConnect bind_or_connect) { @@ -2528,17 +2574,41 @@ socket_t create_socket(const char *host, const char *ip, int port, hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; - if (ip[0] != '\0') { - node = ip; + if (!ip.empty()) { + node = ip.c_str(); // Ask getaddrinfo to convert IP in c-string to address hints.ai_family = AF_UNSPEC; hints.ai_flags = AI_NUMERICHOST; } else { - node = host; + if (!host.empty()) { node = host.c_str(); } hints.ai_family = address_family; hints.ai_flags = socket_flags; } +#ifndef _WIN32 + if (hints.ai_family == AF_UNIX) { + const auto addrlen = host.length(); + if (addrlen > sizeof(sockaddr_un::sun_path)) return INVALID_SOCKET; + + auto sock = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol); + if (sock != INVALID_SOCKET) { + sockaddr_un addr; + addr.sun_family = AF_UNIX; + std::copy(host.begin(), host.end(), addr.sun_path); + + hints.ai_addr = reinterpret_cast(&addr); + hints.ai_addrlen = static_cast( + sizeof(addr) - sizeof(addr.sun_path) + addrlen); + + if (!bind_or_connect(sock, hints)) { + close_socket(sock); + sock = INVALID_SOCKET; + } + } + return sock; + } +#endif + auto service = std::to_string(port); if (getaddrinfo(node, service.c_str(), &hints, &result)) { @@ -2626,7 +2696,7 @@ inline bool is_connection_error() { #endif } -inline bool bind_ip_address(socket_t sock, const char *host) { +inline bool bind_ip_address(socket_t sock, const std::string &host) { struct addrinfo hints; struct addrinfo *result; @@ -2635,7 +2705,7 @@ inline bool bind_ip_address(socket_t sock, const char *host) { hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; - if (getaddrinfo(host, "0", &hints, &result)) { return false; } + if (getaddrinfo(host.c_str(), "0", &hints, &result)) { return false; } auto ret = false; for (auto rp = result; rp; rp = rp->ai_next) { @@ -2694,8 +2764,8 @@ inline std::string if2ip(int address_family, const std::string &ifn) { #endif inline socket_t create_client_socket( - const char *host, const char *ip, int port, int address_family, - bool tcp_nodelay, SocketOptions socket_options, + const std::string &host, const std::string &ip, int port, + int address_family, bool tcp_nodelay, SocketOptions socket_options, time_t connection_timeout_sec, time_t connection_timeout_usec, time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, time_t write_timeout_usec, const std::string &intf, Error &error) { @@ -2704,9 +2774,9 @@ inline socket_t create_client_socket( [&](socket_t sock2, struct addrinfo &ai) -> bool { if (!intf.empty()) { #ifdef USE_IF2IP - auto ip = if2ip(address_family, intf); - if (ip.empty()) { ip = intf; } - if (!bind_ip_address(sock2, ip.c_str())) { + auto ip_from_if = if2ip(address_family, intf); + if (ip_from_if.empty()) { ip_from_if = intf; } + if (!bind_ip_address(sock2, ip_from_if.c_str())) { error = Error::BindIPAddress; return false; } @@ -3207,12 +3277,13 @@ inline bool brotli_decompressor::decompress(const char *data, } #endif -inline bool has_header(const Headers &headers, const char *key) { +inline bool has_header(const Headers &headers, const std::string &key) { return headers.find(key) != headers.end(); } -inline const char *get_header_value(const Headers &headers, const char *key, - size_t id, const char *def) { +inline const char *get_header_value(const Headers &headers, + const std::string &key, size_t id, + const char *def) { auto rng = headers.equal_range(key); auto it = rng.first; std::advance(it, static_cast(id)); @@ -3769,7 +3840,11 @@ class MultipartFormDataParser { public: MultipartFormDataParser() = default; - void set_boundary(std::string &&boundary) { boundary_ = boundary; } + void set_boundary(std::string &&boundary) { + boundary_ = boundary; + dash_boundary_crlf_ = dash_ + boundary_ + crlf_; + crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + } bool is_valid() const { return is_valid_; } @@ -3781,18 +3856,15 @@ public: R"~(^Content-Disposition:\s*form-data;\s*name="(.*?)"(?:;\s*filename="(.*?)")?(?:;\s*filename\*=\S+)?\s*$)~", std::regex_constants::icase); - static const std::string dash_ = "--"; - static const std::string crlf_ = "\r\n"; - buf_append(buf, n); while (buf_size() > 0) { switch (state_) { case 0: { // Initial boundary - auto pattern = dash_ + boundary_ + crlf_; - if (pattern.size() > buf_size()) { return true; } - if (!buf_start_with(pattern)) { return false; } - buf_erase(pattern.size()); + buf_erase(buf_find(dash_boundary_crlf_)); + if (dash_boundary_crlf_.size() > buf_size()) { return true; } + if (!buf_start_with(dash_boundary_crlf_)) { return false; } + buf_erase(dash_boundary_crlf_.size()); state_ = 1; break; } @@ -3827,7 +3899,6 @@ public: file_.filename = m[2]; } } - buf_erase(pos + crlf_.size()); pos = buf_find(crlf_); } @@ -3835,40 +3906,25 @@ public: break; } case 3: { // Body - { - auto pattern = crlf_ + dash_; - if (pattern.size() > buf_size()) { return true; } - - auto pos = buf_find(pattern); - + if (crlf_dash_boundary_.size() > buf_size()) { return true; } + auto pos = buf_find(crlf_dash_boundary_); + if (pos < buf_size()) { if (!content_callback(buf_data(), pos)) { is_valid_ = false; return false; } - - buf_erase(pos); - } - { - auto pattern = crlf_ + dash_ + boundary_; - if (pattern.size() > buf_size()) { return true; } - - auto pos = buf_find(pattern); - if (pos < buf_size()) { - if (!content_callback(buf_data(), pos)) { + buf_erase(pos + crlf_dash_boundary_.size()); + state_ = 4; + } else { + auto len = buf_size() - crlf_dash_boundary_.size(); + if (len > 0) { + if (!content_callback(buf_data(), len)) { is_valid_ = false; return false; } - - buf_erase(pos + pattern.size()); - state_ = 4; - } else { - if (!content_callback(buf_data(), pattern.size())) { - is_valid_ = false; - return false; - } - - buf_erase(pattern.size()); + buf_erase(len); } + return true; } break; } @@ -3878,22 +3934,17 @@ public: buf_erase(crlf_.size()); state_ = 1; } else { - auto pattern = dash_ + crlf_; - if (pattern.size() > buf_size()) { return true; } - if (buf_start_with(pattern)) { - buf_erase(pattern.size()); + if (dash_crlf_.size() > buf_size()) { return true; } + if (buf_start_with(dash_crlf_)) { + buf_erase(dash_crlf_.size()); is_valid_ = true; - state_ = 5; + buf_erase(buf_size()); // Remove epilogue } else { return true; } } break; } - case 5: { // Done - is_valid_ = false; - return false; - } } } @@ -3916,7 +3967,12 @@ private: return true; } + const std::string dash_ = "--"; + const std::string crlf_ = "\r\n"; + const std::string dash_crlf_ = "--\r\n"; std::string boundary_; + std::string dash_boundary_crlf_; + std::string crlf_dash_boundary_; size_t state_ = 0; bool is_valid_ = false; @@ -4022,6 +4078,44 @@ inline std::string make_multipart_data_boundary() { return result; } +inline bool is_multipart_boundary_chars_valid(const std::string &boundary) { + auto valid = true; + for (size_t i = 0; i < boundary.size(); i++) { + auto c = boundary[i]; + if (!std::isalnum(c) && c != '-' && c != '_') { + valid = false; + break; + } + } + return valid; +} + +inline std::string +serialize_multipart_formdata(const MultipartFormDataItems &items, + const std::string &boundary, + std::string &content_type) { + std::string body; + + for (const auto &item : items) { + body += "--" + boundary + "\r\n"; + body += "Content-Disposition: form-data; name=\"" + item.name + "\""; + if (!item.filename.empty()) { + body += "; filename=\"" + item.filename + "\""; + } + body += "\r\n"; + if (!item.content_type.empty()) { + body += "Content-Type: " + item.content_type + "\r\n"; + } + body += "\r\n"; + body += item.content + "\r\n"; + } + + body += "--" + boundary + "--\r\n"; + + content_type = "multipart/form-data; boundary=" + boundary; + return body; +} + inline std::pair get_range_offset_and_length(const Request &req, size_t content_length, size_t index) { @@ -4095,7 +4189,7 @@ inline bool make_multipart_ranges_data(const Request &req, Response &res, return process_multipart_ranges_data( req, res, boundary, content_type, [&](const std::string &token) { data += token; }, - [&](const char *token) { data += token; }, + [&](const std::string &token) { data += token; }, [&](size_t offset, size_t length) { if (offset < res.body.size()) { data += res.body.substr(offset, length); @@ -4114,7 +4208,7 @@ get_multipart_ranges_data_length(const Request &req, Response &res, process_multipart_ranges_data( req, res, boundary, content_type, [&](const std::string &token) { data_length += token.size(); }, - [&](const char *token) { data_length += strlen(token); }, + [&](const std::string &token) { data_length += token.size(); }, [&](size_t /*offset*/, size_t length) { data_length += length; return true; @@ -4132,7 +4226,7 @@ inline bool write_multipart_ranges_data(Stream &strm, const Request &req, return process_multipart_ranges_data( req, res, boundary, content_type, [&](const std::string &token) { strm.write(token); }, - [&](const char *token) { strm.write(token); }, + [&](const std::string &token) { strm.write(token); }, [&](size_t offset, size_t length) { return write_content(strm, res.content_provider_, offset, length, is_shutting_down); @@ -4160,8 +4254,8 @@ inline bool expect_content(const Request &req) { return false; } -inline bool has_crlf(const char *s) { - auto p = s; +inline bool has_crlf(const std::string &s) { + auto p = s.c_str(); while (*p) { if (*p == '\r' || *p == '\n') { return true; } p++; @@ -4374,14 +4468,15 @@ private: } // namespace detail -inline std::string hosted_at(const char *hostname) { +inline std::string hosted_at(const std::string &hostname) { std::vector addrs; hosted_at(hostname, addrs); if (addrs.empty()) { return std::string(); } return addrs[0]; } -inline void hosted_at(const char *hostname, std::vector &addrs) { +inline void hosted_at(const std::string &hostname, + std::vector &addrs) { struct addrinfo hints; struct addrinfo *result; @@ -4390,7 +4485,7 @@ inline void hosted_at(const char *hostname, std::vector &addrs) { hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; - if (getaddrinfo(hostname, nullptr, &hints, &result)) { + if (getaddrinfo(hostname.c_str(), nullptr, &hints, &result)) { #if defined __linux__ && !defined __ANDROID__ res_init(); #endif @@ -4407,9 +4502,12 @@ inline void hosted_at(const char *hostname, std::vector &addrs) { addrs.push_back(ip); } } + + freeaddrinfo(result); } -inline std::string append_query_params(const char *path, const Params ¶ms) { +inline std::string append_query_params(const std::string &path, + const Params ¶ms) { std::string path_with_query = path; const static std::regex re("[^?]+\\?.*"); auto delm = std::regex_match(path, re) ? '&' : '?'; @@ -4448,36 +4546,33 @@ make_bearer_token_authentication_header(const std::string &token, } // Request implementation -inline bool Request::has_header(const char *key) const { +inline bool Request::has_header(const std::string &key) const { return detail::has_header(headers, key); } -inline std::string Request::get_header_value(const char *key, size_t id) const { +inline std::string Request::get_header_value(const std::string &key, + size_t id) const { return detail::get_header_value(headers, key, id, ""); } -inline size_t Request::get_header_value_count(const char *key) const { +inline size_t Request::get_header_value_count(const std::string &key) const { auto r = headers.equal_range(key); return static_cast(std::distance(r.first, r.second)); } -inline void Request::set_header(const char *key, const char *val) { +inline void Request::set_header(const std::string &key, + const std::string &val) { if (!detail::has_crlf(key) && !detail::has_crlf(val)) { headers.emplace(key, val); } } -inline void Request::set_header(const char *key, const std::string &val) { - if (!detail::has_crlf(key) && !detail::has_crlf(val.c_str())) { - headers.emplace(key, val); - } -} - -inline bool Request::has_param(const char *key) const { +inline bool Request::has_param(const std::string &key) const { return params.find(key) != params.end(); } -inline std::string Request::get_param_value(const char *key, size_t id) const { +inline std::string Request::get_param_value(const std::string &key, + size_t id) const { auto rng = params.equal_range(key); auto it = rng.first; std::advance(it, static_cast(id)); @@ -4485,7 +4580,7 @@ inline std::string Request::get_param_value(const char *key, size_t id) const { return std::string(); } -inline size_t Request::get_param_value_count(const char *key) const { +inline size_t Request::get_param_value_count(const std::string &key) const { auto r = params.equal_range(key); return static_cast(std::distance(r.first, r.second)); } @@ -4495,44 +4590,39 @@ inline bool Request::is_multipart_form_data() const { return !content_type.rfind("multipart/form-data", 0); } -inline bool Request::has_file(const char *key) const { +inline bool Request::has_file(const std::string &key) const { return files.find(key) != files.end(); } -inline MultipartFormData Request::get_file_value(const char *key) const { +inline MultipartFormData Request::get_file_value(const std::string &key) const { auto it = files.find(key); if (it != files.end()) { return it->second; } return MultipartFormData(); } // Response implementation -inline bool Response::has_header(const char *key) const { +inline bool Response::has_header(const std::string &key) const { return headers.find(key) != headers.end(); } -inline std::string Response::get_header_value(const char *key, +inline std::string Response::get_header_value(const std::string &key, size_t id) const { return detail::get_header_value(headers, key, id, ""); } -inline size_t Response::get_header_value_count(const char *key) const { +inline size_t Response::get_header_value_count(const std::string &key) const { auto r = headers.equal_range(key); return static_cast(std::distance(r.first, r.second)); } -inline void Response::set_header(const char *key, const char *val) { +inline void Response::set_header(const std::string &key, + const std::string &val) { if (!detail::has_crlf(key) && !detail::has_crlf(val)) { headers.emplace(key, val); } } -inline void Response::set_header(const char *key, const std::string &val) { - if (!detail::has_crlf(key) && !detail::has_crlf(val.c_str())) { - headers.emplace(key, val); - } -} - -inline void Response::set_redirect(const char *url, int stat) { +inline void Response::set_redirect(const std::string &url, int stat) { if (!detail::has_crlf(url)) { set_header("Location", url); if (300 <= stat && stat < 400) { @@ -4543,12 +4633,8 @@ inline void Response::set_redirect(const char *url, int stat) { } } -inline void Response::set_redirect(const std::string &url, int stat) { - set_redirect(url.c_str(), stat); -} - inline void Response::set_content(const char *s, size_t n, - const char *content_type) { + const std::string &content_type) { body.assign(s, n); auto rng = headers.equal_range("Content-Type"); @@ -4557,12 +4643,12 @@ inline void Response::set_content(const char *s, size_t n, } inline void Response::set_content(const std::string &s, - const char *content_type) { + const std::string &content_type) { set_content(s.data(), s.size(), content_type); } inline void Response::set_content_provider( - size_t in_length, const char *content_type, ContentProvider provider, + size_t in_length, const std::string &content_type, ContentProvider provider, ContentProviderResourceReleaser resource_releaser) { assert(in_length > 0); set_header("Content-Type", content_type); @@ -4573,7 +4659,7 @@ inline void Response::set_content_provider( } inline void Response::set_content_provider( - const char *content_type, ContentProviderWithoutLength provider, + const std::string &content_type, ContentProviderWithoutLength provider, ContentProviderResourceReleaser resource_releaser) { set_header("Content-Type", content_type); content_length_ = 0; @@ -4583,7 +4669,7 @@ inline void Response::set_content_provider( } inline void Response::set_chunked_content_provider( - const char *content_type, ContentProviderWithoutLength provider, + const std::string &content_type, ContentProviderWithoutLength provider, ContentProviderResourceReleaser resource_releaser) { set_header("Content-Type", content_type); content_length_ = 0; @@ -4593,16 +4679,17 @@ inline void Response::set_chunked_content_provider( } // Result implementation -inline bool Result::has_request_header(const char *key) const { +inline bool Result::has_request_header(const std::string &key) const { return request_headers_.find(key) != request_headers_.end(); } -inline std::string Result::get_request_header_value(const char *key, +inline std::string Result::get_request_header_value(const std::string &key, size_t id) const { return detail::get_header_value(request_headers_, key, id, ""); } -inline size_t Result::get_request_header_value_count(const char *key) const { +inline size_t +Result::get_request_header_value_count(const std::string &key) const { auto r = request_headers_.equal_range(key); return static_cast(std::distance(r.first, r.second)); } @@ -4635,7 +4722,8 @@ inline bool SocketStream::is_readable() const { } inline bool SocketStream::is_writable() const { - return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0; + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_); } inline ssize_t SocketStream::read(char *ptr, size_t size) { @@ -4687,7 +4775,7 @@ inline ssize_t SocketStream::read(char *ptr, size_t size) { inline ssize_t SocketStream::write(const char *ptr, size_t size) { if (!is_writable()) { return -1; } -#ifdef _WIN32 +#if defined(_WIN32) && !defined(_WIN64) size = (std::min)(size, static_cast((std::numeric_limits::max)())); #endif @@ -4708,7 +4796,7 @@ inline bool BufferStream::is_readable() const { return true; } inline bool BufferStream::is_writable() const { return true; } inline ssize_t BufferStream::read(char *ptr, size_t size) { -#if defined(_MSC_VER) && _MSC_VER <= 1900 +#if defined(_MSC_VER) && _MSC_VER < 1910 auto len_read = buffer._Copy_s(ptr, size, size, position); #else auto len_read = buffer.copy(ptr, size, position); @@ -4835,8 +4923,8 @@ inline bool Server::remove_mount_point(const std::string &mount_point) { } inline Server & -Server::set_file_extension_and_mimetype_mapping(const char *ext, - const char *mime) { +Server::set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime) { file_extension_and_mimetype_map_[ext] = mime; return *this; } @@ -4939,17 +5027,19 @@ inline Server &Server::set_payload_max_length(size_t length) { return *this; } -inline bool Server::bind_to_port(const char *host, int port, int socket_flags) { +inline bool Server::bind_to_port(const std::string &host, int port, + int socket_flags) { if (bind_internal(host, port, socket_flags) < 0) return false; return true; } -inline int Server::bind_to_any_port(const char *host, int socket_flags) { +inline int Server::bind_to_any_port(const std::string &host, int socket_flags) { return bind_internal(host, 0, socket_flags); } inline bool Server::listen_after_bind() { return listen_internal(); } -inline bool Server::listen(const char *host, int port, int socket_flags) { +inline bool Server::listen(const std::string &host, int port, + int socket_flags) { return bind_to_port(host, port, socket_flags) && listen_internal(); } @@ -5092,14 +5182,16 @@ inline bool Server::write_response_core(Stream &strm, bool close_connection, // Flush buffer auto &data = bstrm.get_buffer(); - strm.write(data.data(), data.size()); + detail::write_data(strm, data.data(), data.size()); } // Body auto ret = true; if (req.method != "HEAD") { if (!res.body.empty()) { - if (!strm.write(res.body)) { ret = false; } + if (!detail::write_data(strm, res.body.data(), res.body.size())) { + ret = false; + } } else if (res.content_provider_) { if (write_content_with_provider(strm, req, res, boundary, content_type)) { res.content_provider_success_ = true; @@ -5168,6 +5260,7 @@ Server::write_content_with_provider(Stream &strm, const Request &req, inline bool Server::read_content(Stream &strm, Request &req, Response &res) { MultipartFormDataMap::iterator cur; + auto file_count = 0; if (read_content_core( strm, req, res, // Regular @@ -5178,6 +5271,9 @@ inline bool Server::read_content(Stream &strm, Request &req, Response &res) { }, // Multipart [&](const MultipartFormData &file) { + if (file_count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + return false; + } cur = req.files.emplace(file.name, file); return true; }, @@ -5189,7 +5285,7 @@ inline bool Server::read_content(Stream &strm, Request &req, Response &res) { })) { const auto &content_type = req.get_header_value("Content-Type"); if (!content_type.find("application/x-www-form-urlencoded")) { - if (req.body.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { res.status = 413; // NOTE: should be 414? return false; } @@ -5295,10 +5391,11 @@ inline bool Server::handle_file_request(const Request &req, Response &res, } inline socket_t -Server::create_server_socket(const char *host, int port, int socket_flags, +Server::create_server_socket(const std::string &host, int port, + int socket_flags, SocketOptions socket_options) const { return detail::create_socket( - host, "", port, address_family_, socket_flags, tcp_nodelay_, + host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, std::move(socket_options), [](socket_t sock, struct addrinfo &ai) -> bool { if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { @@ -5309,7 +5406,8 @@ Server::create_server_socket(const char *host, int port, int socket_flags, }); } -inline int Server::bind_internal(const char *host, int port, int socket_flags) { +inline int Server::bind_internal(const std::string &host, int port, + int socket_flags) { if (!is_valid()) { return -1; } svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); @@ -5728,15 +5826,22 @@ Server::process_request(Stream &strm, bool close_connection, routed = routing(req, res, strm); } catch (std::exception &e) { if (exception_handler_) { - exception_handler_(req, res, e); + auto ep = std::current_exception(); + exception_handler_(req, res, ep); routed = true; } else { res.status = 500; res.set_header("EXCEPTION_WHAT", e.what()); } } catch (...) { - res.status = 500; - res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = 500; + res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + } } #endif @@ -5835,7 +5940,7 @@ inline void ClientImpl::copy_settings(const ClientImpl &rhs) { inline socket_t ClientImpl::create_client_socket(Error &error) const { if (!proxy_host_.empty() && proxy_port_ != -1) { return detail::create_client_socket( - proxy_host_.c_str(), "", proxy_port_, address_family_, tcp_nodelay_, + proxy_host_, std::string(), proxy_port_, address_family_, tcp_nodelay_, socket_options_, connection_timeout_sec_, connection_timeout_usec_, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, write_timeout_usec_, interface_, error); @@ -5847,10 +5952,10 @@ inline socket_t ClientImpl::create_client_socket(Error &error) const { if (it != addr_map_.end()) ip = it->second; return detail::create_client_socket( - host_.c_str(), ip.c_str(), port_, address_family_, tcp_nodelay_, - socket_options_, connection_timeout_sec_, connection_timeout_usec_, - read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, - write_timeout_usec_, interface_, error); + host_, ip, port_, address_family_, tcp_nodelay_, socket_options_, + connection_timeout_sec_, connection_timeout_usec_, read_timeout_sec_, + read_timeout_usec_, write_timeout_sec_, write_timeout_usec_, interface_, + error); } inline bool ClientImpl::create_and_connect_socket(Socket &socket, @@ -6289,13 +6394,13 @@ inline bool ClientImpl::write_request(Stream &strm, Request &req, } inline std::unique_ptr ClientImpl::send_with_content_provider( - Request &req, - // const char *method, const char *path, const Headers &headers, - const char *body, size_t content_length, ContentProvider content_provider, + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const char *content_type, Error &error) { - - if (content_type) { req.headers.emplace("Content-Type", content_type); } + const std::string &content_type, Error &error) { + if (!content_type.empty()) { + req.headers.emplace("Content-Type", content_type); + } #ifdef CPPHTTPLIB_ZLIB_SUPPORT if (compress_) { req.headers.emplace("Content-Encoding", "gzip"); } @@ -6316,8 +6421,9 @@ inline std::unique_ptr ClientImpl::send_with_content_provider( auto last = offset + data_len == content_length; auto ret = compressor.compress( - data, data_len, last, [&](const char *data, size_t data_len) { - req.body.append(data, data_len); + data, data_len, last, + [&](const char *compressed_data, size_t compressed_data_len) { + req.body.append(compressed_data, compressed_data_len); return true; }); @@ -6372,10 +6478,10 @@ inline std::unique_ptr ClientImpl::send_with_content_provider( } inline Result ClientImpl::send_with_content_provider( - const char *method, const char *path, const Headers &headers, + const std::string &method, const std::string &path, const Headers &headers, const char *body, size_t content_length, ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const char *content_type) { + const std::string &content_type) { Request req; req.method = method; req.headers = headers; @@ -6384,9 +6490,7 @@ inline Result ClientImpl::send_with_content_provider( auto error = Error::Success; auto res = send_with_content_provider( - req, - // method, path, headers, - body, content_length, std::move(content_provider), + req, body, content_length, std::move(content_provider), std::move(content_provider_without_length), content_type, error); return Result{std::move(res), error, std::move(req.headers)}; @@ -6491,19 +6595,19 @@ ClientImpl::process_socket(const Socket &socket, inline bool ClientImpl::is_ssl() const { return false; } -inline Result ClientImpl::Get(const char *path) { +inline Result ClientImpl::Get(const std::string &path) { return Get(path, Headers(), Progress()); } -inline Result ClientImpl::Get(const char *path, Progress progress) { +inline Result ClientImpl::Get(const std::string &path, Progress progress) { return Get(path, Headers(), std::move(progress)); } -inline Result ClientImpl::Get(const char *path, const Headers &headers) { +inline Result ClientImpl::Get(const std::string &path, const Headers &headers) { return Get(path, headers, Progress()); } -inline Result ClientImpl::Get(const char *path, const Headers &headers, +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, Progress progress) { Request req; req.method = "GET"; @@ -6514,45 +6618,45 @@ inline Result ClientImpl::Get(const char *path, const Headers &headers, return send_(std::move(req)); } -inline Result ClientImpl::Get(const char *path, +inline Result ClientImpl::Get(const std::string &path, ContentReceiver content_receiver) { return Get(path, Headers(), nullptr, std::move(content_receiver), nullptr); } -inline Result ClientImpl::Get(const char *path, +inline Result ClientImpl::Get(const std::string &path, ContentReceiver content_receiver, Progress progress) { return Get(path, Headers(), nullptr, std::move(content_receiver), std::move(progress)); } -inline Result ClientImpl::Get(const char *path, const Headers &headers, +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver) { return Get(path, headers, nullptr, std::move(content_receiver), nullptr); } -inline Result ClientImpl::Get(const char *path, const Headers &headers, +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, Progress progress) { return Get(path, headers, nullptr, std::move(content_receiver), std::move(progress)); } -inline Result ClientImpl::Get(const char *path, +inline Result ClientImpl::Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver) { return Get(path, Headers(), std::move(response_handler), std::move(content_receiver), nullptr); } -inline Result ClientImpl::Get(const char *path, const Headers &headers, +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver) { return Get(path, headers, std::move(response_handler), std::move(content_receiver), nullptr); } -inline Result ClientImpl::Get(const char *path, +inline Result ClientImpl::Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress) { @@ -6560,7 +6664,7 @@ inline Result ClientImpl::Get(const char *path, std::move(content_receiver), std::move(progress)); } -inline Result ClientImpl::Get(const char *path, const Headers &headers, +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress) { @@ -6579,7 +6683,7 @@ inline Result ClientImpl::Get(const char *path, const Headers &headers, return send_(std::move(req)); } -inline Result ClientImpl::Get(const char *path, const Params ¶ms, +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, const Headers &headers, Progress progress) { if (params.empty()) { return Get(path, headers); } @@ -6587,14 +6691,14 @@ inline Result ClientImpl::Get(const char *path, const Params ¶ms, return Get(path_with_query.c_str(), headers, progress); } -inline Result ClientImpl::Get(const char *path, const Params ¶ms, +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, Progress progress) { return Get(path, params, headers, nullptr, content_receiver, progress); } -inline Result ClientImpl::Get(const char *path, const Params ¶ms, +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, @@ -6608,11 +6712,12 @@ inline Result ClientImpl::Get(const char *path, const Params ¶ms, content_receiver, progress); } -inline Result ClientImpl::Head(const char *path) { +inline Result ClientImpl::Head(const std::string &path) { return Head(path, Headers()); } -inline Result ClientImpl::Head(const char *path, const Headers &headers) { +inline Result ClientImpl::Head(const std::string &path, + const Headers &headers) { Request req; req.method = "HEAD"; req.headers = headers; @@ -6621,288 +6726,308 @@ inline Result ClientImpl::Head(const char *path, const Headers &headers) { return send_(std::move(req)); } -inline Result ClientImpl::Post(const char *path) { - return Post(path, std::string(), nullptr); +inline Result ClientImpl::Post(const std::string &path) { + return Post(path, std::string(), std::string()); } -inline Result ClientImpl::Post(const char *path, const char *body, +inline Result ClientImpl::Post(const std::string &path, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return Post(path, Headers(), body, content_length, content_type); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("POST", path, headers, body, content_length, nullptr, nullptr, content_type); } -inline Result ClientImpl::Post(const char *path, const std::string &body, - const char *content_type) { +inline Result ClientImpl::Post(const std::string &path, const std::string &body, + const std::string &content_type) { return Post(path, Headers(), body, content_type); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, const std::string &body, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("POST", path, headers, body.data(), body.size(), nullptr, nullptr, content_type); } -inline Result ClientImpl::Post(const char *path, const Params ¶ms) { +inline Result ClientImpl::Post(const std::string &path, const Params ¶ms) { return Post(path, Headers(), params); } -inline Result ClientImpl::Post(const char *path, size_t content_length, +inline Result ClientImpl::Post(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return Post(path, Headers(), content_length, std::move(content_provider), content_type); } -inline Result ClientImpl::Post(const char *path, +inline Result ClientImpl::Post(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return Post(path, Headers(), std::move(content_provider), content_type); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("POST", path, headers, nullptr, content_length, std::move(content_provider), nullptr, content_type); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, std::move(content_provider), content_type); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, const Params ¶ms) { auto query = detail::params_to_query_str(params); return Post(path, headers, query, "application/x-www-form-urlencoded"); } -inline Result ClientImpl::Post(const char *path, +inline Result ClientImpl::Post(const std::string &path, const MultipartFormDataItems &items) { return Post(path, Headers(), items); } -inline Result ClientImpl::Post(const char *path, const Headers &headers, +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items) { - return Post(path, headers, items, detail::make_multipart_data_boundary()); -} -inline Result ClientImpl::Post(const char *path, const Headers &headers, - const MultipartFormDataItems &items, - const std::string &boundary) { - for (size_t i = 0; i < boundary.size(); i++) { - char c = boundary[i]; - if (!std::isalnum(c) && c != '-' && c != '_') { - return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; - } - } - - std::string body; - - for (const auto &item : items) { - body += "--" + boundary + "\r\n"; - body += "Content-Disposition: form-data; name=\"" + item.name + "\""; - if (!item.filename.empty()) { - body += "; filename=\"" + item.filename + "\""; - } - body += "\r\n"; - if (!item.content_type.empty()) { - body += "Content-Type: " + item.content_type + "\r\n"; - } - body += "\r\n"; - body += item.content + "\r\n"; - } - - body += "--" + boundary + "--\r\n"; - - std::string content_type = "multipart/form-data; boundary=" + boundary; + std::string content_type; + const auto &body = detail::serialize_multipart_formdata( + items, detail::make_multipart_data_boundary(), content_type); return Post(path, headers, body, content_type.c_str()); } -inline Result ClientImpl::Put(const char *path) { - return Put(path, std::string(), nullptr); +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + std::string content_type; + const auto &body = + detail::serialize_multipart_formdata(items, boundary, content_type); + return Post(path, headers, body, content_type.c_str()); } -inline Result ClientImpl::Put(const char *path, const char *body, - size_t content_length, const char *content_type) { +inline Result ClientImpl::Put(const std::string &path) { + return Put(path, std::string(), std::string()); +} + +inline Result ClientImpl::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { return Put(path, Headers(), body, content_length, content_type); } -inline Result ClientImpl::Put(const char *path, const Headers &headers, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PUT", path, headers, body, content_length, nullptr, nullptr, content_type); } -inline Result ClientImpl::Put(const char *path, const std::string &body, - const char *content_type) { +inline Result ClientImpl::Put(const std::string &path, const std::string &body, + const std::string &content_type) { return Put(path, Headers(), body, content_type); } -inline Result ClientImpl::Put(const char *path, const Headers &headers, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, const std::string &body, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PUT", path, headers, body.data(), body.size(), nullptr, nullptr, content_type); } -inline Result ClientImpl::Put(const char *path, size_t content_length, +inline Result ClientImpl::Put(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return Put(path, Headers(), content_length, std::move(content_provider), content_type); } -inline Result ClientImpl::Put(const char *path, +inline Result ClientImpl::Put(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return Put(path, Headers(), std::move(content_provider), content_type); } -inline Result ClientImpl::Put(const char *path, const Headers &headers, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PUT", path, headers, nullptr, content_length, std::move(content_provider), nullptr, content_type); } -inline Result ClientImpl::Put(const char *path, const Headers &headers, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider), content_type); } -inline Result ClientImpl::Put(const char *path, const Params ¶ms) { +inline Result ClientImpl::Put(const std::string &path, const Params ¶ms) { return Put(path, Headers(), params); } -inline Result ClientImpl::Put(const char *path, const Headers &headers, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, const Params ¶ms) { auto query = detail::params_to_query_str(params); return Put(path, headers, query, "application/x-www-form-urlencoded"); } -inline Result ClientImpl::Patch(const char *path) { - return Patch(path, std::string(), nullptr); +inline Result ClientImpl::Put(const std::string &path, + const MultipartFormDataItems &items) { + return Put(path, Headers(), items); } -inline Result ClientImpl::Patch(const char *path, const char *body, +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + std::string content_type; + const auto &body = detail::serialize_multipart_formdata( + items, detail::make_multipart_data_boundary(), content_type); + return Put(path, headers, body, content_type); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + std::string content_type; + const auto &body = + detail::serialize_multipart_formdata(items, boundary, content_type); + return Put(path, headers, body, content_type); +} + +inline Result ClientImpl::Patch(const std::string &path) { + return Patch(path, std::string(), std::string()); +} + +inline Result ClientImpl::Patch(const std::string &path, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return Patch(path, Headers(), body, content_length, content_type); } -inline Result ClientImpl::Patch(const char *path, const Headers &headers, +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PATCH", path, headers, body, content_length, nullptr, nullptr, content_type); } -inline Result ClientImpl::Patch(const char *path, const std::string &body, - const char *content_type) { +inline Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type) { return Patch(path, Headers(), body, content_type); } -inline Result ClientImpl::Patch(const char *path, const Headers &headers, +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, const std::string &body, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PATCH", path, headers, body.data(), body.size(), nullptr, nullptr, content_type); } -inline Result ClientImpl::Patch(const char *path, size_t content_length, +inline Result ClientImpl::Patch(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return Patch(path, Headers(), content_length, std::move(content_provider), content_type); } -inline Result ClientImpl::Patch(const char *path, +inline Result ClientImpl::Patch(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return Patch(path, Headers(), std::move(content_provider), content_type); } -inline Result ClientImpl::Patch(const char *path, const Headers &headers, +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PATCH", path, headers, nullptr, content_length, std::move(content_provider), nullptr, content_type); } -inline Result ClientImpl::Patch(const char *path, const Headers &headers, +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), content_type); } -inline Result ClientImpl::Delete(const char *path) { - return Delete(path, Headers(), std::string(), nullptr); +inline Result ClientImpl::Delete(const std::string &path) { + return Delete(path, Headers(), std::string(), std::string()); } -inline Result ClientImpl::Delete(const char *path, const Headers &headers) { - return Delete(path, headers, std::string(), nullptr); +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers) { + return Delete(path, headers, std::string(), std::string()); } -inline Result ClientImpl::Delete(const char *path, const char *body, +inline Result ClientImpl::Delete(const std::string &path, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return Delete(path, Headers(), body, content_length, content_type); } -inline Result ClientImpl::Delete(const char *path, const Headers &headers, - const char *body, size_t content_length, - const char *content_type) { +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const char *body, + size_t content_length, + const std::string &content_type) { Request req; req.method = "DELETE"; req.headers = headers; req.path = path; - if (content_type) { req.headers.emplace("Content-Type", content_type); } + if (!content_type.empty()) { + req.headers.emplace("Content-Type", content_type); + } req.body.assign(body, content_length); return send_(std::move(req)); } -inline Result ClientImpl::Delete(const char *path, const std::string &body, - const char *content_type) { +inline Result ClientImpl::Delete(const std::string &path, + const std::string &body, + const std::string &content_type) { return Delete(path, Headers(), body.data(), body.size(), content_type); } -inline Result ClientImpl::Delete(const char *path, const Headers &headers, +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const std::string &body, - const char *content_type) { + const std::string &content_type) { return Delete(path, headers, body.data(), body.size(), content_type); } -inline Result ClientImpl::Options(const char *path) { +inline Result ClientImpl::Options(const std::string &path) { return Options(path, Headers()); } -inline Result ClientImpl::Options(const char *path, const Headers &headers) { +inline Result ClientImpl::Options(const std::string &path, + const Headers &headers) { Request req; req.method = "OPTIONS"; req.headers = headers; @@ -6916,6 +7041,8 @@ inline size_t ClientImpl::is_socket_open() const { return socket_.is_open(); } +inline socket_t ClientImpl::socket() const { return socket_.sock; } + inline void ClientImpl::stop() { std::lock_guard guard(socket_mutex_); @@ -6954,19 +7081,19 @@ inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) { write_timeout_usec_ = usec; } -inline void ClientImpl::set_basic_auth(const char *username, - const char *password) { +inline void ClientImpl::set_basic_auth(const std::string &username, + const std::string &password) { basic_auth_username_ = username; basic_auth_password_ = password; } -inline void ClientImpl::set_bearer_token_auth(const char *token) { +inline void ClientImpl::set_bearer_token_auth(const std::string &token) { bearer_token_auth_token_ = token; } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void ClientImpl::set_digest_auth(const char *username, - const char *password) { +inline void ClientImpl::set_digest_auth(const std::string &username, + const std::string &password) { digest_auth_username_ = username; digest_auth_password_ = password; } @@ -7001,36 +7128,38 @@ inline void ClientImpl::set_compress(bool on) { compress_ = on; } inline void ClientImpl::set_decompress(bool on) { decompress_ = on; } -inline void ClientImpl::set_interface(const char *intf) { interface_ = intf; } +inline void ClientImpl::set_interface(const std::string &intf) { + interface_ = intf; +} -inline void ClientImpl::set_proxy(const char *host, int port) { +inline void ClientImpl::set_proxy(const std::string &host, int port) { proxy_host_ = host; proxy_port_ = port; } -inline void ClientImpl::set_proxy_basic_auth(const char *username, - const char *password) { +inline void ClientImpl::set_proxy_basic_auth(const std::string &username, + const std::string &password) { proxy_basic_auth_username_ = username; proxy_basic_auth_password_ = password; } -inline void ClientImpl::set_proxy_bearer_token_auth(const char *token) { +inline void ClientImpl::set_proxy_bearer_token_auth(const std::string &token) { proxy_bearer_token_auth_token_ = token; } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void ClientImpl::set_proxy_digest_auth(const char *username, - const char *password) { +inline void ClientImpl::set_proxy_digest_auth(const std::string &username, + const std::string &password) { proxy_digest_auth_username_ = username; proxy_digest_auth_password_ = password; } #endif #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void ClientImpl::set_ca_cert_path(const char *ca_cert_file_path, - const char *ca_cert_dir_path) { - if (ca_cert_file_path) { ca_cert_file_path_ = ca_cert_file_path; } - if (ca_cert_dir_path) { ca_cert_dir_path_ = ca_cert_dir_path; } +inline void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + ca_cert_file_path_ = ca_cert_file_path; + ca_cert_dir_path_ = ca_cert_dir_path; } inline void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) { @@ -7217,68 +7346,70 @@ inline bool SSLSocketStream::is_readable() const { } inline bool SSLSocketStream::is_writable() const { - return detail::select_write(sock_, write_timeout_sec_, write_timeout_usec_) > - 0; + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_); } inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { - size_t readbytes = 0; if (SSL_pending(ssl_) > 0) { - auto ret = SSL_read_ex(ssl_, ptr, size, &readbytes); - if (ret == 1) { return static_cast(readbytes); } - if (SSL_get_error(ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0; } - return -1; - } - if (!is_readable()) { return -1; } - - auto ret = SSL_read_ex(ssl_, ptr, size, &readbytes); - if (ret == 1) { return static_cast(readbytes); } - auto err = SSL_get_error(ssl_, ret); - int n = 1000; + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (is_readable()) { + auto ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + int n = 1000; #ifdef _WIN32 - while (--n >= 0 && - (err == SSL_ERROR_WANT_READ || - (err == SSL_ERROR_SYSCALL && WSAGetLastError() == WSAETIMEDOUT))) { + while (--n >= 0 && (err == SSL_ERROR_WANT_READ || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { #else - while (--n >= 0 && err == SSL_ERROR_WANT_READ) { + while (--n >= 0 && err == SSL_ERROR_WANT_READ) { #endif - if (SSL_pending(ssl_) > 0) { - ret = SSL_read_ex(ssl_, ptr, size, &readbytes); - if (ret == 1) { return static_cast(readbytes); } - if (SSL_get_error(ssl_, ret) == SSL_ERROR_ZERO_RETURN) { return 0; } - return -1; + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (is_readable()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } } - if (!is_readable()) { return -1; } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - ret = SSL_read_ex(ssl_, ptr, size, &readbytes); - if (ret == 1) { return static_cast(readbytes); } - err = SSL_get_error(ssl_, ret); + return ret; } - if (err == SSL_ERROR_ZERO_RETURN) { return 0; } return -1; } inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) { - if (!is_writable()) { return -1; } - size_t written = 0; - auto ret = SSL_write_ex(ssl_, ptr, size, &written); - if (ret == 1) { return static_cast(written); } - auto err = SSL_get_error(ssl_, ret); - int n = 1000; + if (is_writable()) { + auto handle_size = static_cast( + std::min(size, (std::numeric_limits::max)())); + + auto ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + int n = 1000; #ifdef _WIN32 - while (--n >= 0 && - (err == SSL_ERROR_WANT_WRITE || - (err == SSL_ERROR_SYSCALL && WSAGetLastError() == WSAETIMEDOUT))) { + while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { #else - while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { + while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { #endif - if (!is_writable()) { return -1; } - std::this_thread::sleep_for(std::chrono::milliseconds(1)); - ret = SSL_write_ex(ssl_, ptr, size, &written); - if (ret == 1) { return static_cast(written); } - err = SSL_get_error(ssl_, ret); + if (is_writable()) { + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } + } + return ret; } - if (err == SSL_ERROR_ZERO_RETURN) { return 0; } return -1; } @@ -7374,11 +7505,11 @@ inline SSL_CTX *SSLServer::ssl_context() const { return ctx_; } inline bool SSLServer::process_and_close_socket(socket_t sock) { auto ssl = detail::ssl_new( sock, ctx_, ctx_mutex_, - [&](SSL *ssl) { + [&](SSL *ssl2) { return detail::ssl_connect_or_accept_nonblocking( - sock, ssl, SSL_accept, read_timeout_sec_, read_timeout_usec_); + sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_); }, - [](SSL * /*ssl*/) { return true; }); + [](SSL * /*ssl2*/) { return true; }); bool ret = false; if (ssl) { @@ -7572,31 +7703,31 @@ inline bool SSLClient::load_certs() { inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { auto ssl = detail::ssl_new( socket.sock, ctx_, ctx_mutex_, - [&](SSL *ssl) { + [&](SSL *ssl2) { if (server_certificate_verification_) { if (!load_certs()) { error = Error::SSLLoadingCerts; return false; } - SSL_set_verify(ssl, SSL_VERIFY_NONE, nullptr); + SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); } if (!detail::ssl_connect_or_accept_nonblocking( - socket.sock, ssl, SSL_connect, connection_timeout_sec_, + socket.sock, ssl2, SSL_connect, connection_timeout_sec_, connection_timeout_usec_)) { error = Error::SSLConnection; return false; } if (server_certificate_verification_) { - verify_result_ = SSL_get_verify_result(ssl); + verify_result_ = SSL_get_verify_result(ssl2); if (verify_result_ != X509_V_OK) { error = Error::SSLServerVerification; return false; } - auto server_cert = SSL_get_peer_certificate(ssl); + auto server_cert = SSL_get_peer_certificate(ssl2); if (server_cert == nullptr) { error = Error::SSLServerVerification; @@ -7613,8 +7744,8 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { return true; }, - [&](SSL *ssl) { - SSL_set_tlsext_host_name(ssl, host_.c_str()); + [&](SSL *ssl2) { + SSL_set_tlsext_host_name(ssl2, host_.c_str()); return true; }); @@ -7818,13 +7949,13 @@ inline Client::Client(const std::string &scheme_host_port, if (is_ssl) { #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - cli_ = detail::make_unique(host.c_str(), port, - client_cert_path, client_key_path); + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); is_ssl_ = is_ssl; #endif } else { - cli_ = detail::make_unique(host.c_str(), port, - client_cert_path, client_key_path); + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); } } else { cli_ = detail::make_unique(scheme_host_port, 80, @@ -7847,65 +7978,68 @@ inline bool Client::is_valid() const { return cli_ != nullptr && cli_->is_valid(); } -inline Result Client::Get(const char *path) { return cli_->Get(path); } -inline Result Client::Get(const char *path, const Headers &headers) { +inline Result Client::Get(const std::string &path) { return cli_->Get(path); } +inline Result Client::Get(const std::string &path, const Headers &headers) { return cli_->Get(path, headers); } -inline Result Client::Get(const char *path, Progress progress) { +inline Result Client::Get(const std::string &path, Progress progress) { return cli_->Get(path, std::move(progress)); } -inline Result Client::Get(const char *path, const Headers &headers, +inline Result Client::Get(const std::string &path, const Headers &headers, Progress progress) { return cli_->Get(path, headers, std::move(progress)); } -inline Result Client::Get(const char *path, ContentReceiver content_receiver) { +inline Result Client::Get(const std::string &path, + ContentReceiver content_receiver) { return cli_->Get(path, std::move(content_receiver)); } -inline Result Client::Get(const char *path, const Headers &headers, +inline Result Client::Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver) { return cli_->Get(path, headers, std::move(content_receiver)); } -inline Result Client::Get(const char *path, ContentReceiver content_receiver, - Progress progress) { +inline Result Client::Get(const std::string &path, + ContentReceiver content_receiver, Progress progress) { return cli_->Get(path, std::move(content_receiver), std::move(progress)); } -inline Result Client::Get(const char *path, const Headers &headers, +inline Result Client::Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, Progress progress) { return cli_->Get(path, headers, std::move(content_receiver), std::move(progress)); } -inline Result Client::Get(const char *path, ResponseHandler response_handler, +inline Result Client::Get(const std::string &path, + ResponseHandler response_handler, ContentReceiver content_receiver) { return cli_->Get(path, std::move(response_handler), std::move(content_receiver)); } -inline Result Client::Get(const char *path, const Headers &headers, +inline Result Client::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver) { return cli_->Get(path, headers, std::move(response_handler), std::move(content_receiver)); } -inline Result Client::Get(const char *path, ResponseHandler response_handler, +inline Result Client::Get(const std::string &path, + ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress) { return cli_->Get(path, std::move(response_handler), std::move(content_receiver), std::move(progress)); } -inline Result Client::Get(const char *path, const Headers &headers, +inline Result Client::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress) { return cli_->Get(path, headers, std::move(response_handler), std::move(content_receiver), std::move(progress)); } -inline Result Client::Get(const char *path, const Params ¶ms, +inline Result Client::Get(const std::string &path, const Params ¶ms, const Headers &headers, Progress progress) { return cli_->Get(path, params, headers, progress); } -inline Result Client::Get(const char *path, const Params ¶ms, +inline Result Client::Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, Progress progress) { return cli_->Get(path, params, headers, content_receiver, progress); } -inline Result Client::Get(const char *path, const Params ¶ms, +inline Result Client::Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, Progress progress) { @@ -7913,185 +8047,211 @@ inline Result Client::Get(const char *path, const Params ¶ms, progress); } -inline Result Client::Head(const char *path) { return cli_->Head(path); } -inline Result Client::Head(const char *path, const Headers &headers) { +inline Result Client::Head(const std::string &path) { return cli_->Head(path); } +inline Result Client::Head(const std::string &path, const Headers &headers) { return cli_->Head(path, headers); } -inline Result Client::Post(const char *path) { return cli_->Post(path); } -inline Result Client::Post(const char *path, const char *body, - size_t content_length, const char *content_type) { +inline Result Client::Post(const std::string &path) { return cli_->Post(path); } +inline Result Client::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { return cli_->Post(path, body, content_length, content_type); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return cli_->Post(path, headers, body, content_length, content_type); } -inline Result Client::Post(const char *path, const std::string &body, - const char *content_type) { +inline Result Client::Post(const std::string &path, const std::string &body, + const std::string &content_type) { return cli_->Post(path, body, content_type); } -inline Result Client::Post(const char *path, const Headers &headers, - const std::string &body, const char *content_type) { +inline Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { return cli_->Post(path, headers, body, content_type); } -inline Result Client::Post(const char *path, size_t content_length, +inline Result Client::Post(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Post(path, content_length, std::move(content_provider), content_type); } -inline Result Client::Post(const char *path, +inline Result Client::Post(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Post(path, std::move(content_provider), content_type); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Post(path, headers, content_length, std::move(content_provider), content_type); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Post(path, headers, std::move(content_provider), content_type); } -inline Result Client::Post(const char *path, const Params ¶ms) { +inline Result Client::Post(const std::string &path, const Params ¶ms) { return cli_->Post(path, params); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, const Params ¶ms) { return cli_->Post(path, headers, params); } -inline Result Client::Post(const char *path, +inline Result Client::Post(const std::string &path, const MultipartFormDataItems &items) { return cli_->Post(path, items); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items) { return cli_->Post(path, headers, items); } -inline Result Client::Post(const char *path, const Headers &headers, +inline Result Client::Post(const std::string &path, const Headers &headers, const MultipartFormDataItems &items, const std::string &boundary) { return cli_->Post(path, headers, items, boundary); } -inline Result Client::Put(const char *path) { return cli_->Put(path); } -inline Result Client::Put(const char *path, const char *body, - size_t content_length, const char *content_type) { +inline Result Client::Put(const std::string &path) { return cli_->Put(path); } +inline Result Client::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { return cli_->Put(path, body, content_length, content_type); } -inline Result Client::Put(const char *path, const Headers &headers, +inline Result Client::Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return cli_->Put(path, headers, body, content_length, content_type); } -inline Result Client::Put(const char *path, const std::string &body, - const char *content_type) { +inline Result Client::Put(const std::string &path, const std::string &body, + const std::string &content_type) { return cli_->Put(path, body, content_type); } -inline Result Client::Put(const char *path, const Headers &headers, - const std::string &body, const char *content_type) { +inline Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { return cli_->Put(path, headers, body, content_type); } -inline Result Client::Put(const char *path, size_t content_length, +inline Result Client::Put(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Put(path, content_length, std::move(content_provider), content_type); } -inline Result Client::Put(const char *path, +inline Result Client::Put(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Put(path, std::move(content_provider), content_type); } -inline Result Client::Put(const char *path, const Headers &headers, +inline Result Client::Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Put(path, headers, content_length, std::move(content_provider), content_type); } -inline Result Client::Put(const char *path, const Headers &headers, +inline Result Client::Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Put(path, headers, std::move(content_provider), content_type); } -inline Result Client::Put(const char *path, const Params ¶ms) { +inline Result Client::Put(const std::string &path, const Params ¶ms) { return cli_->Put(path, params); } -inline Result Client::Put(const char *path, const Headers &headers, +inline Result Client::Put(const std::string &path, const Headers &headers, const Params ¶ms) { return cli_->Put(path, headers, params); } -inline Result Client::Patch(const char *path) { return cli_->Patch(path); } -inline Result Client::Patch(const char *path, const char *body, - size_t content_length, const char *content_type) { +inline Result Client::Put(const std::string &path, + const MultipartFormDataItems &items) { + return cli_->Put(path, items); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + return cli_->Put(path, headers, items); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + return cli_->Put(path, headers, items, boundary); +} +inline Result Client::Patch(const std::string &path) { + return cli_->Patch(path); +} +inline Result Client::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { return cli_->Patch(path, body, content_length, content_type); } -inline Result Client::Patch(const char *path, const Headers &headers, +inline Result Client::Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return cli_->Patch(path, headers, body, content_length, content_type); } -inline Result Client::Patch(const char *path, const std::string &body, - const char *content_type) { +inline Result Client::Patch(const std::string &path, const std::string &body, + const std::string &content_type) { return cli_->Patch(path, body, content_type); } -inline Result Client::Patch(const char *path, const Headers &headers, - const std::string &body, const char *content_type) { +inline Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { return cli_->Patch(path, headers, body, content_type); } -inline Result Client::Patch(const char *path, size_t content_length, +inline Result Client::Patch(const std::string &path, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Patch(path, content_length, std::move(content_provider), content_type); } -inline Result Client::Patch(const char *path, +inline Result Client::Patch(const std::string &path, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Patch(path, std::move(content_provider), content_type); } -inline Result Client::Patch(const char *path, const Headers &headers, +inline Result Client::Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Patch(path, headers, content_length, std::move(content_provider), content_type); } -inline Result Client::Patch(const char *path, const Headers &headers, +inline Result Client::Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const char *content_type) { + const std::string &content_type) { return cli_->Patch(path, headers, std::move(content_provider), content_type); } -inline Result Client::Delete(const char *path) { return cli_->Delete(path); } -inline Result Client::Delete(const char *path, const Headers &headers) { +inline Result Client::Delete(const std::string &path) { + return cli_->Delete(path); +} +inline Result Client::Delete(const std::string &path, const Headers &headers) { return cli_->Delete(path, headers); } -inline Result Client::Delete(const char *path, const char *body, - size_t content_length, const char *content_type) { +inline Result Client::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { return cli_->Delete(path, body, content_length, content_type); } -inline Result Client::Delete(const char *path, const Headers &headers, +inline Result Client::Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const char *content_type) { + const std::string &content_type) { return cli_->Delete(path, headers, body, content_length, content_type); } -inline Result Client::Delete(const char *path, const std::string &body, - const char *content_type) { +inline Result Client::Delete(const std::string &path, const std::string &body, + const std::string &content_type) { return cli_->Delete(path, body, content_type); } -inline Result Client::Delete(const char *path, const Headers &headers, +inline Result Client::Delete(const std::string &path, const Headers &headers, const std::string &body, - const char *content_type) { + const std::string &content_type) { return cli_->Delete(path, headers, body, content_type); } -inline Result Client::Options(const char *path) { return cli_->Options(path); } -inline Result Client::Options(const char *path, const Headers &headers) { +inline Result Client::Options(const std::string &path) { + return cli_->Options(path); +} +inline Result Client::Options(const std::string &path, const Headers &headers) { return cli_->Options(path, headers); } @@ -8103,6 +8263,8 @@ inline Result Client::send(const Request &req) { return cli_->send(req); } inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); } +inline socket_t Client::socket() const { return cli_->socket(); } + inline void Client::stop() { cli_->stop(); } inline void @@ -8136,15 +8298,16 @@ inline void Client::set_write_timeout(time_t sec, time_t usec) { cli_->set_write_timeout(sec, usec); } -inline void Client::set_basic_auth(const char *username, const char *password) { +inline void Client::set_basic_auth(const std::string &username, + const std::string &password) { cli_->set_basic_auth(username, password); } -inline void Client::set_bearer_token_auth(const char *token) { +inline void Client::set_bearer_token_auth(const std::string &token) { cli_->set_bearer_token_auth(token); } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_digest_auth(const char *username, - const char *password) { +inline void Client::set_digest_auth(const std::string &username, + const std::string &password) { cli_->set_digest_auth(username, password); } #endif @@ -8160,23 +8323,23 @@ inline void Client::set_compress(bool on) { cli_->set_compress(on); } inline void Client::set_decompress(bool on) { cli_->set_decompress(on); } -inline void Client::set_interface(const char *intf) { +inline void Client::set_interface(const std::string &intf) { cli_->set_interface(intf); } -inline void Client::set_proxy(const char *host, int port) { +inline void Client::set_proxy(const std::string &host, int port) { cli_->set_proxy(host, port); } -inline void Client::set_proxy_basic_auth(const char *username, - const char *password) { +inline void Client::set_proxy_basic_auth(const std::string &username, + const std::string &password) { cli_->set_proxy_basic_auth(username, password); } -inline void Client::set_proxy_bearer_token_auth(const char *token) { +inline void Client::set_proxy_bearer_token_auth(const std::string &token) { cli_->set_proxy_bearer_token_auth(token); } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_proxy_digest_auth(const char *username, - const char *password) { +inline void Client::set_proxy_digest_auth(const std::string &username, + const std::string &password) { cli_->set_proxy_digest_auth(username, password); } #endif @@ -8190,8 +8353,8 @@ inline void Client::enable_server_certificate_verification(bool enabled) { inline void Client::set_logger(Logger logger) { cli_->set_logger(logger); } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_ca_cert_path(const char *ca_cert_file_path, - const char *ca_cert_dir_path) { +inline void Client::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); } From 7fd7f4df1059160787bd0b5154f7e87be124db7e Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Sat, 8 Oct 2022 23:26:12 -0230 Subject: [PATCH 6/9] Updated sqlite3 to latest version. --- src/lib/sqlite/source/sqlite3.c | 9505 +++++++++++++++++++------------ src/lib/sqlite/source/sqlite3.h | 42 +- 2 files changed, 5918 insertions(+), 3629 deletions(-) diff --git a/src/lib/sqlite/source/sqlite3.c b/src/lib/sqlite/source/sqlite3.c index eb8d7d5cd..51d5dbd0e 100644 --- a/src/lib/sqlite/source/sqlite3.c +++ b/src/lib/sqlite/source/sqlite3.c @@ -1,6 +1,6 @@ /****************************************************************************** ** This file is an amalgamation of many separate C source files from SQLite -** version 3.38.5. By combining all the individual C code files into this +** version 3.39.4. 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.38.5" -#define SQLITE_VERSION_NUMBER 3038005 -#define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe" +#define SQLITE_VERSION "3.39.4" +#define SQLITE_VERSION_NUMBER 3039004 +#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -5899,7 +5899,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** object D and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a -** memory allocation fails. +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. ** ** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object ** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer @@ -6581,6 +6582,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); +/* +** CAPI3REF: Return The Schema Name For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name +** for the N-th database on database connection D, or a NULL pointer of N is +** out of range. An N value of 0 means the main database file. An N of 1 is +** the "temp" schema. Larger values of N correspond to various ATTACH-ed +** databases. +** +** Space to hold the string that is returned by sqlite3_db_name() is managed +** by SQLite itself. The string might be deallocated by any operation that +** changes the schema, including [ATTACH] or [DETACH] or calls to +** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that +** occur on a different thread. Applications that need to +** remember the string long-term should make their own copy. Applications that +** are accessing the same database connection simultaneously on multiple +** threads should mutex-protect calls to this API and should make their own +** private copy of the result prior to releasing the mutex. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); + /* ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 @@ -9860,8 +9883,8 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** of a [virtual table] implementation. The result of calling this ** interface from outside of xBestIndex() is undefined and probably harmful. ** -** ^The sqlite3_vtab_distinct() interface returns an integer that is -** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and +** 3. The integer returned by sqlite3_vtab_distinct() ** gives the virtual table additional information about how the query ** planner wants the output to be ordered. As long as the virtual table ** can meet the ordering requirements of the query planner, it may set @@ -9893,6 +9916,13 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** that have the same value for all columns identified by "aOrderBy". ** ^However omitting the extra rows is optional. ** This mode is used for a DISTINCT query. +**
  • +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means +** that the query planner needs only distinct rows but it does need the +** rows to be sorted.)^ ^The virtual table implementation is free to omit +** rows that are identical in all aOrderBy columns, if it wants to, but +** it is not required to omit any rows. This mode is used for queries +** that have both DISTINCT and ORDER BY clauses. ** ** ** ^For the purposes of comparing virtual table output values to see if the @@ -13114,6 +13144,11 @@ struct fts5_api { /************** End of sqlite3.h *********************************************/ /************** Continuing where we left off in sqliteInt.h ******************/ +/* +** Reuse the STATIC_LRU for mutex access to sqlite3_temp_directory. +*/ +#define SQLITE_MUTEX_STATIC_TEMPDIR SQLITE_MUTEX_STATIC_VFS1 + /* ** Include the configuration header output by 'configure' if we're using the ** autoconf-based build @@ -14357,8 +14392,19 @@ typedef INT16_TYPE LogEst; /* ** Round up a number to the next larger multiple of 8. This is used ** to force 8-byte alignment on 64-bit architectures. +** +** ROUND8() always does the rounding, for any argument. +** +** ROUND8P() assumes that the argument is already an integer number of +** pointers in size, and so it is a no-op on systems where the pointer +** size is 8. */ #define ROUND8(x) (((x)+7)&~7) +#if SQLITE_PTRSIZE==8 +# define ROUND8P(x) (x) +#else +# define ROUND8P(x) (((x)+7)&~7) +#endif /* ** Round down to the nearest multiple of 8 @@ -14421,22 +14467,23 @@ typedef INT16_TYPE LogEst; #endif /* -** SELECTTRACE_ENABLED will be either 1 or 0 depending on whether or not -** the Select query generator tracing logic is turned on. +** TREETRACE_ENABLED will be either 1 or 0 depending on whether or not +** the Abstract Syntax Tree tracing logic is turned on. */ #if !defined(SQLITE_AMALGAMATION) -SQLITE_PRIVATE u32 sqlite3SelectTrace; +SQLITE_PRIVATE u32 sqlite3TreeTrace; #endif #if defined(SQLITE_DEBUG) \ - && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE)) -# define SELECTTRACE_ENABLED 1 + && (defined(SQLITE_TEST) || defined(SQLITE_ENABLE_SELECTTRACE) \ + || defined(SQLITE_ENABLE_TREETRACE)) +# define TREETRACE_ENABLED 1 # define SELECTTRACE(K,P,S,X) \ - if(sqlite3SelectTrace&(K)) \ + if(sqlite3TreeTrace&(K)) \ sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ sqlite3DebugPrintf X #else # define SELECTTRACE(K,P,S,X) -# define SELECTTRACE_ENABLED 0 +# define TREETRACE_ENABLED 0 #endif /* @@ -14521,7 +14568,7 @@ struct BusyHandler { ** pointer will work here as long as it is distinct from SQLITE_STATIC ** and SQLITE_TRANSIENT. */ -#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomFault) +#define SQLITE_DYNAMIC ((sqlite3_destructor_type)sqlite3OomClear) /* ** When SQLITE_OMIT_WSD is defined, it means that the target platform does @@ -14597,6 +14644,7 @@ typedef struct Lookaside Lookaside; typedef struct LookasideSlot LookasideSlot; typedef struct Module Module; typedef struct NameContext NameContext; +typedef struct OnOrUsing OnOrUsing; typedef struct Parse Parse; typedef struct ParseCleanup ParseCleanup; typedef struct PreUpdate PreUpdate; @@ -14715,14 +14763,15 @@ typedef struct Pager Pager; typedef struct PgHdr DbPage; /* -** Page number PAGER_MJ_PGNO is never used in an SQLite database (it is +** Page number PAGER_SJ_PGNO is never used in an SQLite database (it is ** reserved for working around a windows/posix incompatibility). It is ** used in the journal to signify that the remainder of the journal file ** is devoted to storing a super-journal name - there are no more pages to ** roll back. See comments for function writeSuperJournal() in pager.c ** for details. */ -#define PAGER_MJ_PGNO(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) +#define PAGER_SJ_PGNO_COMPUTED(x) ((Pgno)((PENDING_BYTE/((x)->pageSize))+1)) +#define PAGER_SJ_PGNO(x) ((x)->lckPgno) /* ** Allowed values for the flags parameter to sqlite3PagerOpen(). @@ -15399,7 +15448,6 @@ struct VdbeOp { #ifdef SQLITE_ENABLE_CURSOR_HINTS Expr *pExpr; /* Used when p4type is P4_EXPR */ #endif - int (*xAdvance)(BtCursor *, int); } p4; #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS char *zComment; /* Comment to improve readability */ @@ -15450,21 +15498,19 @@ typedef struct VdbeOpList VdbeOpList; #define P4_COLLSEQ (-2) /* P4 is a pointer to a CollSeq structure */ #define P4_INT32 (-3) /* P4 is a 32-bit signed integer */ #define P4_SUBPROGRAM (-4) /* P4 is a pointer to a SubProgram structure */ -#define P4_ADVANCE (-5) /* P4 is a pointer to BtreeNext() or BtreePrev() */ -#define P4_TABLE (-6) /* P4 is a pointer to a Table structure */ +#define P4_TABLE (-5) /* P4 is a pointer to a Table structure */ /* Above do not own any resources. Must free those below */ -#define P4_FREE_IF_LE (-7) -#define P4_DYNAMIC (-7) /* Pointer to memory from sqliteMalloc() */ -#define P4_FUNCDEF (-8) /* P4 is a pointer to a FuncDef structure */ -#define P4_KEYINFO (-9) /* P4 is a pointer to a KeyInfo structure */ -#define P4_EXPR (-10) /* P4 is a pointer to an Expr tree */ -#define P4_MEM (-11) /* P4 is a pointer to a Mem* structure */ -#define P4_VTAB (-12) /* P4 is a pointer to an sqlite3_vtab structure */ -#define P4_REAL (-13) /* P4 is a 64-bit floating point value */ -#define P4_INT64 (-14) /* P4 is a 64-bit signed integer */ -#define P4_INTARRAY (-15) /* P4 is a vector of 32-bit integers */ -#define P4_FUNCCTX (-16) /* P4 is a pointer to an sqlite3_context object */ -#define P4_DYNBLOB (-17) /* Pointer to memory from sqliteMalloc() */ +#define P4_FREE_IF_LE (-6) +#define P4_DYNAMIC (-6) /* Pointer to memory from sqliteMalloc() */ +#define P4_FUNCDEF (-7) /* P4 is a pointer to a FuncDef structure */ +#define P4_KEYINFO (-8) /* P4 is a pointer to a KeyInfo structure */ +#define P4_EXPR (-9) /* P4 is a pointer to an Expr tree */ +#define P4_MEM (-10) /* P4 is a pointer to a Mem* structure */ +#define P4_VTAB (-11) /* P4 is a pointer to an sqlite3_vtab structure */ +#define P4_REAL (-12) /* P4 is a 64-bit floating point value */ +#define P4_INT64 (-13) /* P4 is a 64-bit signed integer */ +#define P4_INTARRAY (-14) /* P4 is a vector of 32-bit integers */ +#define P4_FUNCCTX (-15) /* P4 is a pointer to an sqlite3_context object */ /* Error message codes for OP_Halt */ #define P5_ConstraintNotNull 1 @@ -15509,42 +15555,42 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Savepoint 0 #define OP_AutoCommit 1 #define OP_Transaction 2 -#define OP_SorterNext 3 /* jump */ -#define OP_Prev 4 /* jump */ -#define OP_Next 5 /* jump */ -#define OP_Checkpoint 6 -#define OP_JournalMode 7 -#define OP_Vacuum 8 -#define OP_VFilter 9 /* jump, synopsis: iplan=r[P3] zplan='P4' */ -#define OP_VUpdate 10 /* synopsis: data=r[P3@P2] */ -#define OP_Goto 11 /* jump */ -#define OP_Gosub 12 /* jump */ -#define OP_InitCoroutine 13 /* jump */ -#define OP_Yield 14 /* jump */ -#define OP_MustBeInt 15 /* jump */ -#define OP_Jump 16 /* jump */ -#define OP_Once 17 /* jump */ -#define OP_If 18 /* jump */ +#define OP_Checkpoint 3 +#define OP_JournalMode 4 +#define OP_Vacuum 5 +#define OP_VFilter 6 /* jump, synopsis: iplan=r[P3] zplan='P4' */ +#define OP_VUpdate 7 /* synopsis: data=r[P3@P2] */ +#define OP_Goto 8 /* jump */ +#define OP_Gosub 9 /* jump */ +#define OP_InitCoroutine 10 /* jump */ +#define OP_Yield 11 /* jump */ +#define OP_MustBeInt 12 /* jump */ +#define OP_Jump 13 /* jump */ +#define OP_Once 14 /* jump */ +#define OP_If 15 /* jump */ +#define OP_IfNot 16 /* jump */ +#define OP_IsNullOrType 17 /* jump, synopsis: if typeof(r[P1]) IN (P3,5) goto P2 */ +#define OP_IfNullRow 18 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ #define OP_Not 19 /* same as TK_NOT, synopsis: r[P2]= !r[P1] */ -#define OP_IfNot 20 /* jump */ -#define OP_IsNullOrType 21 /* jump, synopsis: if typeof(r[P1]) IN (P3,5) goto P2 */ -#define OP_IfNullRow 22 /* jump, synopsis: if P1.nullRow then r[P3]=NULL, goto P2 */ -#define OP_SeekLT 23 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekLE 24 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGE 25 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekGT 26 /* jump, synopsis: key=r[P3@P4] */ -#define OP_IfNotOpen 27 /* jump, synopsis: if( !csr[P1] ) goto P2 */ -#define OP_IfNoHope 28 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NoConflict 29 /* jump, synopsis: key=r[P3@P4] */ -#define OP_NotFound 30 /* jump, synopsis: key=r[P3@P4] */ -#define OP_Found 31 /* jump, synopsis: key=r[P3@P4] */ -#define OP_SeekRowid 32 /* jump, synopsis: intkey=r[P3] */ -#define OP_NotExists 33 /* jump, synopsis: intkey=r[P3] */ -#define OP_Last 34 /* jump */ -#define OP_IfSmaller 35 /* jump */ -#define OP_SorterSort 36 /* jump */ -#define OP_Sort 37 /* jump */ -#define OP_Rewind 38 /* jump */ +#define OP_SeekLT 20 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekLE 21 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGE 22 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekGT 23 /* jump, synopsis: key=r[P3@P4] */ +#define OP_IfNotOpen 24 /* jump, synopsis: if( !csr[P1] ) goto P2 */ +#define OP_IfNoHope 25 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NoConflict 26 /* jump, synopsis: key=r[P3@P4] */ +#define OP_NotFound 27 /* jump, synopsis: key=r[P3@P4] */ +#define OP_Found 28 /* jump, synopsis: key=r[P3@P4] */ +#define OP_SeekRowid 29 /* jump, synopsis: intkey=r[P3] */ +#define OP_NotExists 30 /* jump, synopsis: intkey=r[P3] */ +#define OP_Last 31 /* jump */ +#define OP_IfSmaller 32 /* jump */ +#define OP_SorterSort 33 /* jump */ +#define OP_Sort 34 /* jump */ +#define OP_Rewind 35 /* jump */ +#define OP_SorterNext 36 /* jump */ +#define OP_Prev 37 /* jump */ +#define OP_Next 38 /* jump */ #define OP_IdxLE 39 /* jump, synopsis: key=r[P3@P4] */ #define OP_IdxGT 40 /* jump, synopsis: key=r[P3@P4] */ #define OP_IdxLT 41 /* jump, synopsis: key=r[P3@P4] */ @@ -15580,34 +15626,34 @@ typedef struct VdbeOpList VdbeOpList; #define OP_Integer 71 /* synopsis: r[P2]=P1 */ #define OP_Int64 72 /* synopsis: r[P2]=P4 */ #define OP_String 73 /* synopsis: r[P2]='P4' (len=P1) */ -#define OP_Null 74 /* synopsis: r[P2..P3]=NULL */ -#define OP_SoftNull 75 /* synopsis: r[P1]=NULL */ -#define OP_Blob 76 /* synopsis: r[P2]=P4 (len=P1) */ -#define OP_Variable 77 /* synopsis: r[P2]=parameter(P1,P4) */ -#define OP_Move 78 /* synopsis: r[P2@P3]=r[P1@P3] */ -#define OP_Copy 79 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ -#define OP_SCopy 80 /* synopsis: r[P2]=r[P1] */ -#define OP_IntCopy 81 /* synopsis: r[P2]=r[P1] */ -#define OP_FkCheck 82 -#define OP_ResultRow 83 /* synopsis: output=r[P1@P2] */ -#define OP_CollSeq 84 -#define OP_AddImm 85 /* synopsis: r[P1]=r[P1]+P2 */ -#define OP_RealAffinity 86 -#define OP_Cast 87 /* synopsis: affinity(r[P1]) */ -#define OP_Permutation 88 -#define OP_Compare 89 /* synopsis: r[P1@P3] <-> r[P2@P3] */ -#define OP_IsTrue 90 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ -#define OP_ZeroOrNull 91 /* synopsis: r[P2] = 0 OR NULL */ -#define OP_Offset 92 /* synopsis: r[P3] = sqlite_offset(P1) */ -#define OP_Column 93 /* synopsis: r[P3]=PX */ -#define OP_TypeCheck 94 /* synopsis: typecheck(r[P1@P2]) */ -#define OP_Affinity 95 /* synopsis: affinity(r[P1@P2]) */ -#define OP_MakeRecord 96 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ -#define OP_Count 97 /* synopsis: r[P2]=count() */ -#define OP_ReadCookie 98 -#define OP_SetCookie 99 -#define OP_ReopenIdx 100 /* synopsis: root=P2 iDb=P3 */ -#define OP_OpenRead 101 /* synopsis: root=P2 iDb=P3 */ +#define OP_BeginSubrtn 74 /* synopsis: r[P2]=NULL */ +#define OP_Null 75 /* synopsis: r[P2..P3]=NULL */ +#define OP_SoftNull 76 /* synopsis: r[P1]=NULL */ +#define OP_Blob 77 /* synopsis: r[P2]=P4 (len=P1) */ +#define OP_Variable 78 /* synopsis: r[P2]=parameter(P1,P4) */ +#define OP_Move 79 /* synopsis: r[P2@P3]=r[P1@P3] */ +#define OP_Copy 80 /* synopsis: r[P2@P3+1]=r[P1@P3+1] */ +#define OP_SCopy 81 /* synopsis: r[P2]=r[P1] */ +#define OP_IntCopy 82 /* synopsis: r[P2]=r[P1] */ +#define OP_FkCheck 83 +#define OP_ResultRow 84 /* synopsis: output=r[P1@P2] */ +#define OP_CollSeq 85 +#define OP_AddImm 86 /* synopsis: r[P1]=r[P1]+P2 */ +#define OP_RealAffinity 87 +#define OP_Cast 88 /* synopsis: affinity(r[P1]) */ +#define OP_Permutation 89 +#define OP_Compare 90 /* synopsis: r[P1@P3] <-> r[P2@P3] */ +#define OP_IsTrue 91 /* synopsis: r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4 */ +#define OP_ZeroOrNull 92 /* synopsis: r[P2] = 0 OR NULL */ +#define OP_Offset 93 /* synopsis: r[P3] = sqlite_offset(P1) */ +#define OP_Column 94 /* synopsis: r[P3]=PX cursor P1 column P2 */ +#define OP_TypeCheck 95 /* synopsis: typecheck(r[P1@P2]) */ +#define OP_Affinity 96 /* synopsis: affinity(r[P1@P2]) */ +#define OP_MakeRecord 97 /* synopsis: r[P3]=mkrec(r[P1@P2]) */ +#define OP_Count 98 /* synopsis: r[P2]=count() */ +#define OP_ReadCookie 99 +#define OP_SetCookie 100 +#define OP_ReopenIdx 101 /* synopsis: root=P2 iDb=P3 */ #define OP_BitAnd 102 /* same as TK_BITAND, synopsis: r[P3]=r[P1]&r[P2] */ #define OP_BitOr 103 /* same as TK_BITOR, synopsis: r[P3]=r[P1]|r[P2] */ #define OP_ShiftLeft 104 /* same as TK_LSHIFT, synopsis: r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ -#define OP_AggInverse 160 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ -#define OP_AggStep 161 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggStep1 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ -#define OP_AggValue 163 /* synopsis: r[P3]=value N=P2 */ -#define OP_AggFinal 164 /* synopsis: accum=r[P1] N=P2 */ -#define OP_Expire 165 -#define OP_CursorLock 166 -#define OP_CursorUnlock 167 -#define OP_TableLock 168 /* synopsis: iDb=P1 root=P2 write=P3 */ -#define OP_VBegin 169 -#define OP_VCreate 170 -#define OP_VDestroy 171 -#define OP_VOpen 172 -#define OP_VInitIn 173 /* synopsis: r[P2]=ValueList(P1,P3) */ -#define OP_VColumn 174 /* synopsis: r[P3]=vcolumn(P2) */ -#define OP_VRename 175 -#define OP_Pagecount 176 -#define OP_MaxPgcnt 177 -#define OP_FilterAdd 178 /* synopsis: filter(P1) += key(P3@P4) */ -#define OP_Trace 179 -#define OP_CursorHint 180 -#define OP_ReleaseReg 181 /* synopsis: release r[P1@P2] mask P3 */ -#define OP_Noop 182 -#define OP_Explain 183 -#define OP_Abortable 184 +#define OP_DropTrigger 154 +#define OP_IntegrityCk 155 +#define OP_RowSetAdd 156 /* synopsis: rowset(P1)=r[P2] */ +#define OP_Param 157 +#define OP_FkCounter 158 /* synopsis: fkctr[P1]+=P2 */ +#define OP_MemMax 159 /* synopsis: r[P1]=max(r[P1],r[P2]) */ +#define OP_OffsetLimit 160 /* synopsis: if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1) */ +#define OP_AggInverse 161 /* synopsis: accum=r[P3] inverse(r[P2@P5]) */ +#define OP_AggStep 162 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggStep1 163 /* synopsis: accum=r[P3] step(r[P2@P5]) */ +#define OP_AggValue 164 /* synopsis: r[P3]=value N=P2 */ +#define OP_AggFinal 165 /* synopsis: accum=r[P1] N=P2 */ +#define OP_Expire 166 +#define OP_CursorLock 167 +#define OP_CursorUnlock 168 +#define OP_TableLock 169 /* synopsis: iDb=P1 root=P2 write=P3 */ +#define OP_VBegin 170 +#define OP_VCreate 171 +#define OP_VDestroy 172 +#define OP_VOpen 173 +#define OP_VInitIn 174 /* synopsis: r[P2]=ValueList(P1,P3) */ +#define OP_VColumn 175 /* synopsis: r[P3]=vcolumn(P2) */ +#define OP_VRename 176 +#define OP_Pagecount 177 +#define OP_MaxPgcnt 178 +#define OP_ClrSubtype 179 /* synopsis: r[P1].subtype = 0 */ +#define OP_FilterAdd 180 /* synopsis: filter(P1) += key(P3@P4) */ +#define OP_Trace 181 +#define OP_CursorHint 182 +#define OP_ReleaseReg 183 /* synopsis: release r[P1@P2] mask P3 */ +#define OP_Noop 184 +#define OP_Explain 185 +#define OP_Abortable 186 /* Properties such as "out2" or "jump" that are specified in ** comments following the "case" for each opcode in the vdbe.c @@ -15703,30 +15751,30 @@ typedef struct VdbeOpList VdbeOpList; #define OPFLG_OUT2 0x10 /* out2: P2 is an output */ #define OPFLG_OUT3 0x20 /* out3: P3 is an output */ #define OPFLG_INITIALIZER {\ -/* 0 */ 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x10,\ -/* 8 */ 0x00, 0x01, 0x00, 0x01, 0x01, 0x01, 0x03, 0x03,\ -/* 16 */ 0x01, 0x01, 0x03, 0x12, 0x03, 0x03, 0x01, 0x09,\ -/* 24 */ 0x09, 0x09, 0x09, 0x01, 0x09, 0x09, 0x09, 0x09,\ -/* 32 */ 0x09, 0x09, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ +/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,\ +/* 8 */ 0x01, 0x01, 0x01, 0x03, 0x03, 0x01, 0x01, 0x03,\ +/* 16 */ 0x03, 0x03, 0x01, 0x12, 0x09, 0x09, 0x09, 0x09,\ +/* 24 */ 0x01, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x01,\ +/* 32 */ 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\ /* 40 */ 0x01, 0x01, 0x01, 0x26, 0x26, 0x23, 0x0b, 0x01,\ /* 48 */ 0x01, 0x03, 0x03, 0x03, 0x0b, 0x0b, 0x0b, 0x0b,\ /* 56 */ 0x0b, 0x0b, 0x01, 0x03, 0x03, 0x01, 0x01, 0x01,\ /* 64 */ 0x01, 0x00, 0x00, 0x02, 0x02, 0x08, 0x00, 0x10,\ -/* 72 */ 0x10, 0x10, 0x10, 0x00, 0x10, 0x10, 0x00, 0x00,\ -/* 80 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x02,\ -/* 88 */ 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00, 0x00,\ -/* 96 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x26, 0x26,\ +/* 72 */ 0x10, 0x10, 0x00, 0x10, 0x00, 0x10, 0x10, 0x00,\ +/* 80 */ 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02,\ +/* 88 */ 0x02, 0x00, 0x00, 0x12, 0x1e, 0x20, 0x00, 0x00,\ +/* 96 */ 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x26, 0x26,\ /* 104 */ 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26, 0x26,\ /* 112 */ 0x00, 0x00, 0x12, 0x00, 0x00, 0x10, 0x00, 0x00,\ -/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x00,\ -/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ -/* 136 */ 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00, 0x10,\ -/* 144 */ 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 152 */ 0x00, 0x10, 0x00, 0x06, 0x10, 0x00, 0x04, 0x1a,\ -/* 160 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,\ -/* 176 */ 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ -/* 184 */ 0x00,} +/* 120 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10,\ +/* 128 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,\ +/* 136 */ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x10, 0x00,\ +/* 144 */ 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,\ +/* 152 */ 0x00, 0x10, 0x00, 0x00, 0x06, 0x10, 0x00, 0x04,\ +/* 160 */ 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\ +/* 168 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,\ +/* 176 */ 0x00, 0x10, 0x10, 0x02, 0x00, 0x00, 0x00, 0x00,\ +/* 184 */ 0x00, 0x00, 0x00,} /* The resolve3P2Values() routine is able to run faster if it knows ** the value of the largest JUMP opcode. The smaller the maximum @@ -15772,8 +15820,10 @@ SQLITE_PRIVATE void sqlite3VdbeVerifyNoResultRow(Vdbe *p); #endif #if defined(SQLITE_DEBUG) SQLITE_PRIVATE void sqlite3VdbeVerifyAbortable(Vdbe *p, int); +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn(Vdbe*,int,int,int); #else # define sqlite3VdbeVerifyAbortable(A,B) +# define sqlite3VdbeNoJumpsOutsideSubrtn(A,B,C,D) #endif SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); #ifndef SQLITE_OMIT_EXPLAIN @@ -15818,7 +15868,6 @@ SQLITE_PRIVATE int sqlite3VdbeMakeLabel(Parse*); SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe*); -SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3*,Vdbe*); SQLITE_PRIVATE void sqlite3VdbeMakeReady(Vdbe*,Parse*); SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe*); SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe*, int); @@ -16267,6 +16316,13 @@ SQLITE_PRIVATE int sqlite3PCacheIsDirty(PCache *pCache); # define SQLITE_MAX_PATHLEN FILENAME_MAX #endif +/* Maximum number of symlinks that will be resolved while trying to +** expand a filename in xFullPathname() in the VFS. +*/ +#ifndef SQLITE_MAX_SYMLINK +# define SQLITE_MAX_SYMLINK 200 +#endif + /* ** The default size of a disk sector */ @@ -17033,6 +17089,9 @@ struct sqlite3 { #define SQLITE_BloomFilter 0x00080000 /* Use a Bloom filter on searches */ #define SQLITE_BloomPulldown 0x00100000 /* Run Bloom filters early */ #define SQLITE_BalancedMerge 0x00200000 /* Balance multi-way merges */ +#define SQLITE_ReleaseReg 0x00400000 /* Use OP_ReleaseReg for testing */ +#define SQLITE_FlttnUnionAll 0x00800000 /* Disable the UNION ALL flattener */ + /* TH3 expects this value ^^^^^^^^^^ See flatten04.test */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* @@ -17135,7 +17194,7 @@ struct FuncDestructor { #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a ** single query - might change over time */ #define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */ -#define SQLITE_FUNC_OFFSET 0x8000 /* Built-in sqlite_offset() function */ +/* 0x8000 -- available for reuse */ #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */ #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */ #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */ @@ -17152,6 +17211,7 @@ struct FuncDestructor { #define INLINEFUNC_expr_compare 3 #define INLINEFUNC_affinity 4 #define INLINEFUNC_iif 5 +#define INLINEFUNC_sqlite_offset 6 #define INLINEFUNC_unlikely 99 /* Default case */ /* @@ -17378,6 +17438,7 @@ struct Column { #define COLFLAG_NOTAVAIL 0x0080 /* STORED column not yet calculated */ #define COLFLAG_BUSY 0x0100 /* Blocks recursion on GENERATED columns */ #define COLFLAG_HASCOLL 0x0200 /* Has collating sequence name in zCnName */ +#define COLFLAG_NOEXPAND 0x0400 /* Omit this column when expanding "*" */ #define COLFLAG_GENERATED 0x0060 /* Combo: _STORED, _VIRTUAL */ #define COLFLAG_NOINSERT 0x0062 /* Combo: _HIDDEN, _STORED, _VIRTUAL */ @@ -17784,6 +17845,11 @@ struct KeyInfo { struct UnpackedRecord { KeyInfo *pKeyInfo; /* Collation and sort-order information */ Mem *aMem; /* Values */ + union { + char *z; /* Cache of aMem[0].z for vdbeRecordCompareString() */ + i64 i; /* Cache of aMem[0].u.i for vdbeRecordCompareInt() */ + } u; + int n; /* Cache of aMem[0].n used by vdbeRecordCompareString() */ u16 nField; /* Number of entries in apMem[] */ i8 default_rc; /* Comparison result if keys are equal */ u8 errCode; /* Error detected by xRecordCompare (CORRUPT or NOMEM) */ @@ -18092,7 +18158,7 @@ struct Expr { ** TK_SELECT_COLUMN: column of the result vector */ i16 iAgg; /* Which entry in pAggInfo->aCol[] or ->aFunc[] */ union { - int iRightJoinTable; /* If EP_FromJoin, the right table of the join */ + int iJoin; /* If EP_OuterON or EP_InnerON, the right table */ int iOfst; /* else: start of token from start of statement */ } w; AggInfo *pAggInfo; /* Used by TK_AGG_COLUMN and TK_AGG_FUNCTION */ @@ -18113,29 +18179,29 @@ struct Expr { ** EP_Agg == NC_HasAgg == SF_HasAgg ** EP_Win == NC_HasWin */ -#define EP_FromJoin 0x000001 /* Originates in ON/USING clause of outer join */ -#define EP_Distinct 0x000002 /* Aggregate function with DISTINCT keyword */ -#define EP_HasFunc 0x000004 /* Contains one or more functions of any kind */ -#define EP_FixedCol 0x000008 /* TK_Column with a known fixed value */ +#define EP_OuterON 0x000001 /* Originates in ON/USING clause of outer join */ +#define EP_InnerON 0x000002 /* Originates in ON/USING of an inner join */ +#define EP_Distinct 0x000004 /* Aggregate function with DISTINCT keyword */ +#define EP_HasFunc 0x000008 /* Contains one or more functions of any kind */ #define EP_Agg 0x000010 /* Contains one or more aggregate functions */ -#define EP_VarSelect 0x000020 /* pSelect is correlated, not constant */ -#define EP_DblQuoted 0x000040 /* token.z was originally in "..." */ -#define EP_InfixFunc 0x000080 /* True for an infix function: LIKE, GLOB, etc */ -#define EP_Collate 0x000100 /* Tree contains a TK_COLLATE operator */ -#define EP_Commuted 0x000200 /* Comparison operator has been commuted */ -#define EP_IntValue 0x000400 /* Integer value contained in u.iValue */ -#define EP_xIsSelect 0x000800 /* x.pSelect is valid (otherwise x.pList is) */ -#define EP_Skip 0x001000 /* Operator does not contribute to affinity */ -#define EP_Reduced 0x002000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ -#define EP_TokenOnly 0x004000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_FixedCol 0x000020 /* TK_Column with a known fixed value */ +#define EP_VarSelect 0x000040 /* pSelect is correlated, not constant */ +#define EP_DblQuoted 0x000080 /* token.z was originally in "..." */ +#define EP_InfixFunc 0x000100 /* True for an infix function: LIKE, GLOB, etc */ +#define EP_Collate 0x000200 /* Tree contains a TK_COLLATE operator */ +#define EP_Commuted 0x000400 /* Comparison operator has been commuted */ +#define EP_IntValue 0x000800 /* Integer value contained in u.iValue */ +#define EP_xIsSelect 0x001000 /* x.pSelect is valid (otherwise x.pList is) */ +#define EP_Skip 0x002000 /* Operator does not contribute to affinity */ +#define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */ #define EP_Win 0x008000 /* Contains window functions */ -#define EP_MemToken 0x010000 /* Need to sqlite3DbFree() Expr.zToken */ -#define EP_IfNullRow 0x020000 /* The TK_IF_NULL_ROW opcode */ -#define EP_Unlikely 0x040000 /* unlikely() or likelihood() function */ -#define EP_ConstFunc 0x080000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ -#define EP_CanBeNull 0x100000 /* Can be null despite NOT NULL constraint */ -#define EP_Subquery 0x200000 /* Tree contains a TK_SELECT operator */ - /* 0x400000 // Available */ +#define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */ +#define EP_MemToken 0x020000 /* Need to sqlite3DbFree() Expr.zToken */ +#define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */ +#define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */ +#define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */ +#define EP_CanBeNull 0x200000 /* Can be null despite NOT NULL constraint */ +#define EP_Subquery 0x400000 /* Tree contains a TK_SELECT operator */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ #define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ @@ -18158,8 +18224,8 @@ struct Expr { #define ExprHasAllProperty(E,P) (((E)->flags&(P))==(P)) #define ExprSetProperty(E,P) (E)->flags|=(P) #define ExprClearProperty(E,P) (E)->flags&=~(P) -#define ExprAlwaysTrue(E) (((E)->flags&(EP_FromJoin|EP_IsTrue))==EP_IsTrue) -#define ExprAlwaysFalse(E) (((E)->flags&(EP_FromJoin|EP_IsFalse))==EP_IsFalse) +#define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue) +#define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse) /* Macros used to ensure that the correct members of unions are accessed ** in Expr. @@ -18246,12 +18312,18 @@ struct ExprList { struct ExprList_item { /* For each expression in the list */ Expr *pExpr; /* The parse tree for this expression */ char *zEName; /* Token associated with this expression */ - u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ - unsigned eEName :2; /* Meaning of zEName */ - unsigned done :1; /* A flag to indicate when processing is finished */ - unsigned reusable :1; /* Constant expression is reusable */ - unsigned bSorterRef :1; /* Defer evaluation until after sorting */ - unsigned bNulls: 1; /* True if explicit "NULLS FIRST/LAST" */ + struct { + u8 sortFlags; /* Mask of KEYINFO_ORDER_* flags */ + unsigned eEName :2; /* Meaning of zEName */ + unsigned done :1; /* Indicates when processing is finished */ + unsigned reusable :1; /* Constant expression is reusable */ + unsigned bSorterRef :1; /* Defer evaluation until after sorting */ + unsigned bNulls :1; /* True if explicit "NULLS FIRST/LAST" */ + unsigned bUsed :1; /* This column used in a SF_NestedFrom subquery */ + unsigned bUsingTerm:1; /* Term from the USING clause of a NestedFrom */ + unsigned bNoExpand: 1; /* Term is an auxiliary in NestedFrom and should + ** not be expanded by "*" in parent queries */ + } fg; union { struct { /* Used by any ExprList other than Parse.pConsExpr */ u16 iOrderByCol; /* For ORDER BY, column number in result set */ @@ -18286,13 +18358,25 @@ struct ExprList { ** If "a" is the k-th column of table "t", then IdList.a[0].idx==k. */ struct IdList { + int nId; /* Number of identifiers on the list */ + u8 eU4; /* Which element of a.u4 is valid */ struct IdList_item { char *zName; /* Name of the identifier */ - int idx; /* Index in some Table.aCol[] of a column named zName */ - } *a; - int nId; /* Number of identifiers on the list */ + union { + int idx; /* Index in some Table.aCol[] of a column named zName */ + Expr *pExpr; /* Expr to implement a USING variable -- NOT USED */ + } u4; + } a[1]; }; +/* +** Allowed values for IdList.eType, which determines which value of the a.u4 +** is valid. +*/ +#define EU4_NONE 0 /* Does not use IdList.a.u4 */ +#define EU4_IDX 1 /* Uses IdList.a.u4.idx */ +#define EU4_EXPR 2 /* Uses IdList.a.u4.pExpr -- NOT CURRENTLY USED */ + /* ** The SrcItem object represents a single term in the FROM clause of a query. ** The SrcList object is mostly an array of SrcItems. @@ -18320,15 +18404,22 @@ struct SrcItem { unsigned isIndexedBy :1; /* True if there is an INDEXED BY clause */ unsigned isTabFunc :1; /* True if table-valued-function syntax */ unsigned isCorrelated :1; /* True if sub-query is correlated */ + unsigned isMaterialized:1; /* This is a materialized view */ unsigned viaCoroutine :1; /* Implemented as a co-routine */ unsigned isRecursive :1; /* True for recursive reference in WITH */ unsigned fromDDL :1; /* Comes from sqlite_schema */ unsigned isCte :1; /* This is a CTE */ unsigned notCte :1; /* This item may not match a CTE */ + unsigned isUsing :1; /* u3.pUsing is valid */ + unsigned isOn :1; /* u3.pOn was once valid and non-NULL */ + unsigned isSynthUsing :1; /* u3.pUsing is synthensized from NATURAL */ + unsigned isNestedFrom :1; /* pSelect is a SF_NestedFrom subquery */ } fg; int iCursor; /* The VDBE cursor number used to access this table */ - Expr *pOn; /* The ON clause of a join */ - IdList *pUsing; /* The USING clause of a join */ + union { + Expr *pOn; /* fg.isUsing==0 => The ON clause of a join */ + IdList *pUsing; /* fg.isUsing==1 => The USING clause of a join */ + } u3; Bitmask colUsed; /* Bit N (1<" clause */ @@ -18340,6 +18431,15 @@ struct SrcItem { } u2; }; +/* +** The OnOrUsing object represents either an ON clause or a USING clause. +** It can never be both at the same time, but it can be neither. +*/ +struct OnOrUsing { + Expr *pOn; /* The ON clause of a join */ + IdList *pUsing; /* The USING clause of a join */ +}; + /* ** The following structure describes the FROM clause of a SELECT statement. ** Each table or subquery in the FROM clause is a separate element of @@ -18368,14 +18468,15 @@ struct SrcList { /* ** Permitted values of the SrcList.a.jointype field */ -#define JT_INNER 0x0001 /* Any kind of inner or cross join */ -#define JT_CROSS 0x0002 /* Explicit use of the CROSS keyword */ -#define JT_NATURAL 0x0004 /* True for a "natural" join */ -#define JT_LEFT 0x0008 /* Left outer join */ -#define JT_RIGHT 0x0010 /* Right outer join */ -#define JT_OUTER 0x0020 /* The "OUTER" keyword is present */ -#define JT_ERROR 0x0040 /* unknown or unsupported join type */ - +#define JT_INNER 0x01 /* Any kind of inner or cross join */ +#define JT_CROSS 0x02 /* Explicit use of the CROSS keyword */ +#define JT_NATURAL 0x04 /* True for a "natural" join */ +#define JT_LEFT 0x08 /* Left outer join */ +#define JT_RIGHT 0x10 /* Right outer join */ +#define JT_OUTER 0x20 /* The "OUTER" keyword is present */ +#define JT_LTORJ 0x40 /* One of the LEFT operands of a RIGHT JOIN + ** Mnemonic: Left Table Of Right Join */ +#define JT_ERROR 0x80 /* unknown or unsupported join type */ /* ** Flags appropriate for the wctrlFlags parameter of sqlite3WhereBegin() @@ -18398,7 +18499,7 @@ struct SrcList { #define WHERE_SORTBYGROUP 0x0200 /* Support sqlite3WhereIsSorted() */ #define WHERE_AGG_DISTINCT 0x0400 /* Query is "SELECT agg(DISTINCT ...)" */ #define WHERE_ORDERBY_LIMIT 0x0800 /* ORDERBY+LIMIT on the inner loop */ - /* 0x1000 not currently used */ +#define WHERE_RIGHT_JOIN 0x1000 /* Processing a RIGHT JOIN */ /* 0x2000 not currently used */ #define WHERE_USE_LIMIT 0x4000 /* Use the LIMIT in cost estimates */ /* 0x8000 not currently used */ @@ -18594,6 +18695,9 @@ struct Select { #define SF_CopyCte 0x4000000 /* SELECT statement is a copy of a CTE */ #define SF_OrderByReqd 0x8000000 /* The ORDER BY clause may not be omitted */ +/* True if S exists and has SF_NestedFrom */ +#define IsNestedFrom(S) ((S)!=0 && ((S)->selFlags&SF_NestedFrom)!=0) + /* ** The results of a SELECT can be distributed in several ways, as defined ** by one of the following macros. The "SRT" prefix means "SELECT Result @@ -18805,6 +18909,7 @@ struct Parse { u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 disableVtab; /* Disable all virtual tables for this parse */ + u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ #endif @@ -18977,20 +19082,20 @@ struct AuthContext { #define OPFLAG_PREFORMAT 0x80 /* OP_Insert uses preformatted cell */ /* - * Each trigger present in the database schema is stored as an instance of - * struct Trigger. - * - * Pointers to instances of struct Trigger are stored in two ways. - * 1. In the "trigHash" hash table (part of the sqlite3* that represents the - * database). This allows Trigger structures to be retrieved by name. - * 2. All triggers associated with a single table form a linked list, using the - * pNext member of struct Trigger. A pointer to the first element of the - * linked list is stored as the "pTrigger" member of the associated - * struct Table. - * - * The "step_list" member points to the first element of a linked list - * containing the SQL statements specified as the trigger program. - */ +** Each trigger present in the database schema is stored as an instance of +** struct Trigger. +** +** Pointers to instances of struct Trigger are stored in two ways. +** 1. In the "trigHash" hash table (part of the sqlite3* that represents the +** database). This allows Trigger structures to be retrieved by name. +** 2. All triggers associated with a single table form a linked list, using the +** pNext member of struct Trigger. A pointer to the first element of the +** linked list is stored as the "pTrigger" member of the associated +** struct Table. +** +** The "step_list" member points to the first element of a linked list +** containing the SQL statements specified as the trigger program. +*/ struct Trigger { char *zName; /* The name of the trigger */ char *table; /* The table or view to which the trigger applies */ @@ -19017,43 +19122,48 @@ struct Trigger { #define TRIGGER_AFTER 2 /* - * An instance of struct TriggerStep is used to store a single SQL statement - * that is a part of a trigger-program. - * - * Instances of struct TriggerStep are stored in a singly linked list (linked - * using the "pNext" member) referenced by the "step_list" member of the - * associated struct Trigger instance. The first element of the linked list is - * the first step of the trigger-program. - * - * The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or - * "SELECT" statement. The meanings of the other members is determined by the - * value of "op" as follows: - * - * (op == TK_INSERT) - * orconf -> stores the ON CONFLICT algorithm - * pSelect -> If this is an INSERT INTO ... SELECT ... statement, then - * this stores a pointer to the SELECT statement. Otherwise NULL. - * zTarget -> Dequoted name of the table to insert into. - * pExprList -> If this is an INSERT INTO ... VALUES ... statement, then - * this stores values to be inserted. Otherwise NULL. - * pIdList -> If this is an INSERT INTO ... () VALUES ... - * statement, then this stores the column-names to be - * inserted into. - * - * (op == TK_DELETE) - * zTarget -> Dequoted name of the table to delete from. - * pWhere -> The WHERE clause of the DELETE statement if one is specified. - * Otherwise NULL. - * - * (op == TK_UPDATE) - * zTarget -> Dequoted name of the table to update. - * pWhere -> The WHERE clause of the UPDATE statement if one is specified. - * Otherwise NULL. - * pExprList -> A list of the columns to update and the expressions to update - * them to. See sqlite3Update() documentation of "pChanges" - * argument. - * - */ +** An instance of struct TriggerStep is used to store a single SQL statement +** that is a part of a trigger-program. +** +** Instances of struct TriggerStep are stored in a singly linked list (linked +** using the "pNext" member) referenced by the "step_list" member of the +** associated struct Trigger instance. The first element of the linked list is +** the first step of the trigger-program. +** +** The "op" member indicates whether this is a "DELETE", "INSERT", "UPDATE" or +** "SELECT" statement. The meanings of the other members is determined by the +** value of "op" as follows: +** +** (op == TK_INSERT) +** orconf -> stores the ON CONFLICT algorithm +** pSelect -> The content to be inserted - either a SELECT statement or +** a VALUES clause. +** zTarget -> Dequoted name of the table to insert into. +** pIdList -> If this is an INSERT INTO ... () VALUES ... +** statement, then this stores the column-names to be +** inserted into. +** pUpsert -> The ON CONFLICT clauses for an Upsert +** +** (op == TK_DELETE) +** zTarget -> Dequoted name of the table to delete from. +** pWhere -> The WHERE clause of the DELETE statement if one is specified. +** Otherwise NULL. +** +** (op == TK_UPDATE) +** zTarget -> Dequoted name of the table to update. +** pWhere -> The WHERE clause of the UPDATE statement if one is specified. +** Otherwise NULL. +** pExprList -> A list of the columns to update and the expressions to update +** them to. See sqlite3Update() documentation of "pChanges" +** argument. +** +** (op == TK_SELECT) +** pSelect -> The SELECT statement +** +** (op == TK_RETURNING) +** pExprList -> The list of expressions that follow the RETURNING keyword. +** +*/ struct TriggerStep { u8 op; /* One of TK_DELETE, TK_UPDATE, TK_INSERT, TK_SELECT, ** or TK_RETURNING */ @@ -19408,7 +19518,7 @@ struct Window { Window **ppThis; /* Pointer to this object in Select.pWin list */ Window *pNextWin; /* Next window function belonging to this SELECT */ Expr *pFilter; /* The FILTER expression */ - FuncDef *pFunc; /* The function */ + FuncDef *pWFunc; /* The function */ int iEphCsr; /* Partition buffer or Peer buffer */ int regAccum; /* Accumulator */ int regResult; /* Interim result */ @@ -19663,18 +19773,53 @@ SQLITE_PRIVATE void *sqlite3TestTextToPtr(const char*); #endif #if defined(SQLITE_DEBUG) +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView*, const char *zFormat, ...); SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView*, const Expr*, u8); SQLITE_PRIVATE void sqlite3TreeViewBareExprList(TreeView*, const ExprList*, const char*); SQLITE_PRIVATE void sqlite3TreeViewExprList(TreeView*, const ExprList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewBareIdList(TreeView*, const IdList*, const char*); +SQLITE_PRIVATE void sqlite3TreeViewIdList(TreeView*, const IdList*, u8, const char*); +SQLITE_PRIVATE void sqlite3TreeViewColumnList(TreeView*, const Column*, int, u8); SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView*, const SrcList*); SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView*, const Select*, u8); SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView*, const With*, u8); +SQLITE_PRIVATE void sqlite3TreeViewUpsert(TreeView*, const Upsert*, u8); +#if TREETRACE_ENABLED +SQLITE_PRIVATE void sqlite3TreeViewDelete(const With*, const SrcList*, const Expr*, + const ExprList*,const Expr*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewInsert(const With*, const SrcList*, + const IdList*, const Select*, const ExprList*, + int, const Upsert*, const Trigger*); +SQLITE_PRIVATE void sqlite3TreeViewUpdate(const With*, const SrcList*, const ExprList*, + const Expr*, int, const ExprList*, const Expr*, + const Upsert*, const Trigger*); +#endif +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep(TreeView*, const TriggerStep*, u8, u8); +SQLITE_PRIVATE void sqlite3TreeViewTrigger(TreeView*, const Trigger*, u8, u8); +#endif #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView*, const Window*, u8); SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView*, const Window*, u8); #endif +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr*); +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList*); +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList*); +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList*); +SQLITE_PRIVATE void sqlite3ShowSelect(const Select*); +SQLITE_PRIVATE void sqlite3ShowWith(const With*); +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert*); +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep*); +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger*); +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger*); +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window*); +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window*); +#endif #endif - SQLITE_PRIVATE void sqlite3SetString(char **, sqlite3*, const char*); SQLITE_PRIVATE void sqlite3ErrorMsg(Parse*, const char*, ...); @@ -19823,13 +19968,14 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2); SQLITE_PRIVATE SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, - Token*, Select*, Expr*, IdList*); + Token*, Select*, OnOrUsing*); SQLITE_PRIVATE void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*); SQLITE_PRIVATE int sqlite3IndexedByLookup(Parse *, SrcItem *); -SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList*); +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse*,SrcList*); SQLITE_PRIVATE void sqlite3SrcListAssignCursors(Parse*, SrcList*); SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3*, IdList*); +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3*, OnOrUsing*); SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3*, SrcList*); SQLITE_PRIVATE Index *sqlite3AllocateIndexObject(sqlite3*,i16,int,char**); SQLITE_PRIVATE void sqlite3CreateIndex(Parse*,Token*,Token*,SrcList*,ExprList*,int,Token*, @@ -20027,7 +20173,8 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc(Parse*, TriggerStep*); SQLITE_PRIVATE int sqlite3JoinType(Parse*, Token*, Token*, Token*); SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol); -SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int); +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem*,int); +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr*,int,u32); SQLITE_PRIVATE void sqlite3CreateForeignKey(Parse*, ExprList*, Token*, ExprList*, int); SQLITE_PRIVATE void sqlite3DeferForeignKey(Parse*, int); #ifndef SQLITE_OMIT_AUTHORIZATION @@ -20373,7 +20520,7 @@ SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *); SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*); #if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \ && !defined(SQLITE_OMIT_VIRTUALTABLE) -SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info*); +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info*); #endif SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*); SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); @@ -21121,9 +21268,6 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_RTREE "ENABLE_RTREE", #endif -#ifdef SQLITE_ENABLE_SELECTTRACE - "ENABLE_SELECTTRACE", -#endif #ifdef SQLITE_ENABLE_SESSION "ENABLE_SESSION", #endif @@ -21145,6 +21289,9 @@ static const char * const sqlite3azCompileOpt[] = { #ifdef SQLITE_ENABLE_STMT_SCANSTATUS "ENABLE_STMT_SCANSTATUS", #endif +#ifdef SQLITE_ENABLE_TREETRACE + "ENABLE_TREETRACE", +#endif #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION "ENABLE_UNKNOWN_SQL_FUNCTION", #endif @@ -21894,6 +22041,9 @@ SQLITE_PRIVATE SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0x7ffffffe, /* iOnceResetThreshold */ SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ 0, /* iPrngSeed */ +#ifdef SQLITE_DEBUG + {0,0,0,0,0,0} /* aTune */ +#endif }; /* @@ -21948,7 +22098,7 @@ SQLITE_PRIVATE int sqlite3PendingByte = 0x40000000; /* ** Tracing flags set by SQLITE_TESTCTRL_TRACEFLAGS. */ -SQLITE_PRIVATE u32 sqlite3SelectTrace = 0; +SQLITE_PRIVATE u32 sqlite3TreeTrace = 0; SQLITE_PRIVATE u32 sqlite3WhereTrace = 0; /* #include "opcodes.h" */ @@ -22115,7 +22265,7 @@ struct VdbeCursor { Bool isEphemeral:1; /* True for an ephemeral table */ Bool useRandomRowid:1; /* Generate new record numbers semi-randomly */ Bool isOrdered:1; /* True if the table is not BTREE_UNORDERED */ - Bool hasBeenDuped:1; /* This cursor was source or target of OP_OpenDup */ + Bool noReuse:1; /* OpenEphemeral may not reuse this cursor */ u16 seekHit; /* See the OP_SeekHit and OP_IfNoHope opcodes */ union { /* pBtx for isEphermeral. pAltMap otherwise */ Btree *pBtx; /* Separate file holding temporary table */ @@ -22163,6 +22313,11 @@ struct VdbeCursor { u32 aType[1]; /* Type values record decode. MUST BE LAST */ }; +/* Return true if P is a null-only cursor +*/ +#define IsNullCursor(P) \ + ((P)->eCurType==CURTYPE_PSEUDO && (P)->nullRow && (P)->seekResult==0) + /* ** A value for VdbeCursor.cacheStatus that means the cache is always invalid. @@ -22237,16 +22392,16 @@ struct sqlite3_value { const char *zPType; /* Pointer type when MEM_Term|MEM_Subtype|MEM_Null */ FuncDef *pDef; /* Used only when flags==MEM_Agg */ } u; + char *z; /* String or BLOB value */ + int n; /* Number of characters in string value, excluding '\0' */ u16 flags; /* Some combination of MEM_Null, MEM_Str, MEM_Dyn, etc. */ u8 enc; /* SQLITE_UTF8, SQLITE_UTF16BE, SQLITE_UTF16LE */ u8 eSubtype; /* Subtype for this value */ - int n; /* Number of characters in string value, excluding '\0' */ - char *z; /* String or BLOB value */ /* ShallowCopy only needs to copy the information above */ - char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ + sqlite3 *db; /* The associated database connection */ int szMalloc; /* Size of the zMalloc allocation */ u32 uTemp; /* Transient storage for serial_type in OP_MakeRecord */ - sqlite3 *db; /* The associated database connection */ + char *zMalloc; /* Space to hold MEM_Str or MEM_Blob if szMalloc>0 */ void (*xDel)(void*);/* Destructor for Mem.z - only valid if MEM_Dyn */ #ifdef SQLITE_DEBUG Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ @@ -22258,11 +22413,43 @@ struct sqlite3_value { ** Size of struct Mem not including the Mem.zMalloc member or anything that ** follows. */ -#define MEMCELLSIZE offsetof(Mem,zMalloc) +#define MEMCELLSIZE offsetof(Mem,db) -/* One or more of the following flags are set to indicate the validOK +/* One or more of the following flags are set to indicate the ** representations of the value stored in the Mem struct. ** +** * MEM_Null An SQL NULL value +** +** * MEM_Null|MEM_Zero An SQL NULL with the virtual table +** UPDATE no-change flag set +** +** * MEM_Null|MEM_Term| An SQL NULL, but also contains a +** MEM_Subtype pointer accessible using +** sqlite3_value_pointer(). +** +** * MEM_Null|MEM_Cleared Special SQL NULL that compares non-equal +** to other NULLs even using the IS operator. +** +** * MEM_Str A string, stored in Mem.z with +** length Mem.n. Zero-terminated if +** MEM_Term is set. This flag is +** incompatible with MEM_Blob and +** MEM_Null, but can appear with MEM_Int, +** MEM_Real, and MEM_IntReal. +** +** * MEM_Blob A blob, stored in Mem.z length Mem.n. +** Incompatible with MEM_Str, MEM_Null, +** MEM_Int, MEM_Real, and MEM_IntReal. +** +** * MEM_Blob|MEM_Zero A blob in Mem.z of length Mem.n plus +** MEM.u.i extra 0x00 bytes at the end. +** +** * MEM_Int Integer stored in Mem.u.i. +** +** * MEM_Real Real stored in Mem.u.r. +** +** * MEM_IntReal Real stored as an integer in Mem.u.i. +** ** If the MEM_Null flag is set, then the value is an SQL NULL value. ** For a pointer type created using sqlite3_bind_pointer() or ** sqlite3_result_pointer() the MEM_Term and MEM_Subtype flags are also set. @@ -22273,6 +22460,7 @@ struct sqlite3_value { ** set, then the string is nul terminated. The MEM_Int and MEM_Real ** flags may coexist with the MEM_Str flag. */ +#define MEM_Undefined 0x0000 /* Value is undefined */ #define MEM_Null 0x0001 /* Value is NULL (or a pointer) */ #define MEM_Str 0x0002 /* Value is a string */ #define MEM_Int 0x0004 /* Value is an integer */ @@ -22280,28 +22468,24 @@ struct sqlite3_value { #define MEM_Blob 0x0010 /* Value is a BLOB */ #define MEM_IntReal 0x0020 /* MEM_Int that stringifies like MEM_Real */ #define MEM_AffMask 0x003f /* Mask of affinity bits */ -#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ -#define MEM_Undefined 0x0080 /* Value is undefined */ -#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ -#define MEM_TypeMask 0xc1bf /* Mask of type bits */ - -/* Whenever Mem contains a valid string or blob representation, one of -** the following flags must be set to determine the memory management -** policy for Mem.z. The MEM_Term flag tells us whether or not the -** string is \000 or \u0000 terminated +/* Extra bits that modify the meanings of the core datatypes above */ +#define MEM_FromBind 0x0040 /* Value originates from sqlite3_bind() */ + /* 0x0080 // Available */ +#define MEM_Cleared 0x0100 /* NULL set by OP_Null, not from data */ #define MEM_Term 0x0200 /* String in Mem.z is zero terminated */ -#define MEM_Dyn 0x0400 /* Need to call Mem.xDel() on Mem.z */ -#define MEM_Static 0x0800 /* Mem.z points to a static string */ -#define MEM_Ephem 0x1000 /* Mem.z points to an ephemeral string */ -#define MEM_Agg 0x2000 /* Mem.z points to an agg function context */ -#define MEM_Zero 0x4000 /* Mem.i contains count of 0s appended to blob */ -#define MEM_Subtype 0x8000 /* Mem.eSubtype is valid */ -#ifdef SQLITE_OMIT_INCRBLOB - #undef MEM_Zero - #define MEM_Zero 0x0000 -#endif +#define MEM_Zero 0x0400 /* Mem.i contains count of 0s appended to blob */ +#define MEM_Subtype 0x0800 /* Mem.eSubtype is valid */ +#define MEM_TypeMask 0x0dbf /* Mask of type bits */ + +/* Bits that determine the storage for Mem.z for a string or blob or +** aggregate accumulator. +*/ +#define MEM_Dyn 0x1000 /* Need to call Mem.xDel() on Mem.z */ +#define MEM_Static 0x2000 /* Mem.z points to a static string */ +#define MEM_Ephem 0x4000 /* Mem.z points to an ephemeral string */ +#define MEM_Agg 0x8000 /* Mem.z points to an agg function context */ /* Return TRUE if Mem X contains dynamically allocated content - anything ** that needs to be deallocated to avoid a leak. @@ -22323,11 +22507,15 @@ struct sqlite3_value { && (X)->n==0 && (X)->u.nZero==0) /* -** Return true if a memory cell is not marked as invalid. This macro +** Return true if a memory cell has been initialized and is valid. ** is for use inside assert() statements only. +** +** A Memory cell is initialized if at least one of the +** MEM_Null, MEM_Str, MEM_Int, MEM_Real, MEM_Blob, or MEM_IntReal bits +** is set. It is "undefined" if all those bits are zero. */ #ifdef SQLITE_DEBUG -#define memIsValid(M) ((M)->flags & MEM_Undefined)==0 +#define memIsValid(M) ((M)->flags & MEM_AffMask)!=0 #endif /* @@ -22365,6 +22553,7 @@ struct sqlite3_context { Vdbe *pVdbe; /* The VM that owns this context */ int iOp; /* Instruction number of OP_Function */ int isError; /* Error code returned by the function. */ + u8 enc; /* Encoding to use for results */ u8 skipFlag; /* Skip accumulator loading if true */ u8 argc; /* Number of arguments */ sqlite3_value *argv[1]; /* Argument set */ @@ -22413,7 +22602,6 @@ struct Vdbe { Vdbe *pPrev,*pNext; /* Linked list of VDBEs with the same Vdbe.db */ Parse *pParse; /* Parsing context used to create this Vdbe */ ynVar nVar; /* Number of entries in aVar[] */ - u32 iVdbeMagic; /* Magic number defining state of the SQL statement */ int nMem; /* Number of memory locations currently allocated */ int nCursor; /* Number of slots in apCsr[] */ u32 cacheCtr; /* VdbeCursor row cache generation counter */ @@ -22451,11 +22639,10 @@ struct Vdbe { u8 errorAction; /* Recovery action to do in case of an error */ u8 minWriteFileFormat; /* Minimum file format for writable database files */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ - u8 doingRerun; /* True if rerunning after an auto-reprepare */ + u8 eVdbeState; /* On of the VDBE_*_STATE values */ bft expired:2; /* 1: recompile VM immediately 2: when convenient */ bft explain:2; /* True if EXPLAIN present on SQL command */ bft changeCntOn:1; /* True to update the change-counter */ - bft runOnlyOnce:1; /* Automatically expire on reset */ bft usesStmtJournal:1; /* True if uses a statement journal */ bft readOnly:1; /* True for statements that do not write */ bft bIsReader:1; /* True for statements that read */ @@ -22482,13 +22669,12 @@ struct Vdbe { }; /* -** The following are allowed values for Vdbe.magic +** The following are allowed values for Vdbe.eVdbeState */ -#define VDBE_MAGIC_INIT 0x16bceaa5 /* Building a VDBE program */ -#define VDBE_MAGIC_RUN 0x2df20da3 /* VDBE is ready to execute */ -#define VDBE_MAGIC_HALT 0x319c2973 /* VDBE has completed execution */ -#define VDBE_MAGIC_RESET 0x48fa9f76 /* Reset and ready to run again */ -#define VDBE_MAGIC_DEAD 0x5606c3c8 /* The VDBE has been deallocated */ +#define VDBE_INIT_STATE 0 /* Prepared statement under construction */ +#define VDBE_READY_STATE 1 /* Ready to run but not yet started */ +#define VDBE_RUN_STATE 2 /* Run in progress */ +#define VDBE_HALT_STATE 3 /* Finished. Need reset() or finalize() */ /* ** Structure used to store the context required by the @@ -22529,18 +22715,31 @@ struct ValueList { sqlite3_value *pOut; /* Register to hold each decoded output value */ }; +/* Size of content associated with serial types that fit into a +** single-byte varint. +*/ +#ifndef SQLITE_AMALGAMATION +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[]; +#endif + /* ** Function prototypes */ SQLITE_PRIVATE void sqlite3VdbeError(Vdbe*, const char *, ...); SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *, VdbeCursor*); +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe*,VdbeCursor*); void sqliteVdbePopStack(Vdbe*,int); +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p); SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor*); -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor**, u32*); SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor*); SQLITE_PRIVATE u32 sqlite3VdbeSerialTypeLen(u32); SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8); -SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(unsigned char*, Mem*, u32); +#ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in); +# define swapMixedEndianFloat(X) X = sqlite3FloatSwap(X) +#else +# define swapMixedEndianFloat(X) +#endif SQLITE_PRIVATE void sqlite3VdbeSerialGet(const unsigned char*, u32, Mem*); SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3*, AuxData**, int, int); @@ -22598,6 +22797,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemCast(Mem*,u8,u8); SQLITE_PRIVATE int sqlite3VdbeMemFromBtree(BtCursor*,u32,u32,Mem*); SQLITE_PRIVATE int sqlite3VdbeMemFromBtreeZeroOffset(BtCursor*,u32,Mem*); SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p); +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem*p); SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem*, FuncDef*); #ifndef SQLITE_OMIT_WINDOWFUNC SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem*, Mem*, FuncDef*); @@ -23000,8 +23200,7 @@ SQLITE_API int sqlite3_db_status( db->pnBytesFreed = &nByte; for(pVdbe=db->pVdbe; pVdbe; pVdbe=pVdbe->pNext){ - sqlite3VdbeClearObject(db, pVdbe); - sqlite3DbFree(db, pVdbe); + sqlite3VdbeDelete(pVdbe); } db->pnBytesFreed = 0; @@ -26956,8 +27155,13 @@ static void *memsys5Realloc(void *pPrior, int nBytes){ */ static int memsys5Roundup(int n){ int iFullSz; - if( n > 0x40000000 ) return 0; - for(iFullSz=mem5.szAtom; iFullSz0x40000000 ) return 0; + for(iFullSz=mem5.szAtom*8; iFullSz=n ) return iFullSz/2; return iFullSz; } @@ -29364,8 +29568,13 @@ SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){ } DisableLookaside; if( db->pParse ){ + Parse *pParse; sqlite3ErrorMsg(db->pParse, "out of memory"); db->pParse->rc = SQLITE_NOMEM_BKPT; + for(pParse=db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse){ + pParse->nErr++; + pParse->rc = SQLITE_NOMEM; + } } } return 0; @@ -30231,8 +30440,8 @@ SQLITE_API void sqlite3_str_vappendf( case etSQLESCAPE: /* %q: Escape ' characters */ case etSQLESCAPE2: /* %Q: Escape ' and enclose in '...' */ case etSQLESCAPE3: { /* %w: Escape " characters */ - int i, j, k, n, isnull; - int needQuote; + i64 i, j, k, n; + int needQuote, isnull; char ch; char q = ((xtype==etSQLESCAPE3)?'"':'\''); /* Quote character */ char *escarg; @@ -30312,8 +30521,14 @@ SQLITE_API void sqlite3_str_vappendf( sqlite3_str_appendall(pAccum, pItem->zName); }else if( pItem->zAlias ){ sqlite3_str_appendall(pAccum, pItem->zAlias); - }else if( ALWAYS(pItem->pSelect) ){ - sqlite3_str_appendf(pAccum, "SUBQUERY %u", pItem->pSelect->selId); + }else{ + Select *pSel = pItem->pSelect; + assert( pSel!=0 ); + if( pSel->selFlags & SF_NestedFrom ){ + sqlite3_str_appendf(pAccum, "(join-%u)", pSel->selId); + }else{ + sqlite3_str_appendf(pAccum, "(subquery-%u)", pSel->selId); + } } length = width = 0; break; @@ -30376,7 +30591,9 @@ SQLITE_PRIVATE void sqlite3RecordErrorByteOffset(sqlite3 *db, const char *z){ ** as the error offset. */ SQLITE_PRIVATE void sqlite3RecordErrorOffsetOfExpr(sqlite3 *db, const Expr *pExpr){ - while( pExpr && (ExprHasProperty(pExpr,EP_FromJoin) || pExpr->w.iOfst<=0) ){ + while( pExpr + && (ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) || pExpr->w.iOfst<=0) + ){ pExpr = pExpr->pLeft; } if( pExpr==0 ) return; @@ -30836,40 +31053,44 @@ SQLITE_API void sqlite3_str_appendf(StrAccum *p, const char *zFormat, ...){ ** Add a new subitem to the tree. The moreToFollow flag indicates that this ** is not the last item in the tree. */ -static TreeView *sqlite3TreeViewPush(TreeView *p, u8 moreToFollow){ +static void sqlite3TreeViewPush(TreeView **pp, u8 moreToFollow){ + TreeView *p = *pp; if( p==0 ){ - p = sqlite3_malloc64( sizeof(*p) ); - if( p==0 ) return 0; + *pp = p = sqlite3_malloc64( sizeof(*p) ); + if( p==0 ) return; memset(p, 0, sizeof(*p)); }else{ p->iLevel++; } assert( moreToFollow==0 || moreToFollow==1 ); - if( p->iLevelbLine) ) p->bLine[p->iLevel] = moreToFollow; - return p; + if( p->iLevel<(int)sizeof(p->bLine) ) p->bLine[p->iLevel] = moreToFollow; } /* ** Finished with one layer of the tree */ -static void sqlite3TreeViewPop(TreeView *p){ +static void sqlite3TreeViewPop(TreeView **pp){ + TreeView *p = *pp; if( p==0 ) return; p->iLevel--; - if( p->iLevel<0 ) sqlite3_free(p); + if( p->iLevel<0 ){ + sqlite3_free(p); + *pp = 0; + } } /* ** Generate a single line of output for the tree, with a prefix that contains ** all the appropriate tree lines */ -static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ +SQLITE_PRIVATE void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ va_list ap; int i; StrAccum acc; - char zBuf[500]; + char zBuf[1000]; sqlite3StrAccumInit(&acc, 0, zBuf, sizeof(zBuf), 0); if( p ){ - for(i=0; iiLevel && ibLine)-1; i++){ + for(i=0; iiLevel && i<(int)sizeof(p->bLine)-1; i++){ sqlite3_str_append(&acc, p->bLine[i] ? "| " : " ", 4); } sqlite3_str_append(&acc, p->bLine[i] ? "|-- " : "'-- ", 4); @@ -30890,10 +31111,57 @@ static void sqlite3TreeViewLine(TreeView *p, const char *zFormat, ...){ ** Shorthand for starting a new tree item that consists of a single label */ static void sqlite3TreeViewItem(TreeView *p, const char *zLabel,u8 moreFollows){ - p = sqlite3TreeViewPush(p, moreFollows); + sqlite3TreeViewPush(&p, moreFollows); sqlite3TreeViewLine(p, "%s", zLabel); } +/* +** Show a list of Column objects in tree format. +*/ +SQLITE_PRIVATE void sqlite3TreeViewColumnList( + TreeView *pView, + const Column *aCol, + int nCol, + u8 moreToFollow +){ + int i; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, "COLUMNS"); + for(i=0; inCte>0 ){ - pView = sqlite3TreeViewPush(pView, 1); + sqlite3TreeViewPush(&pView, moreToFollow); for(i=0; inCte; i++){ StrAccum x; char zLine[1000]; @@ -30923,6 +31191,10 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m } sqlite3_str_appendf(&x, ")"); } + if( pCte->eM10d!=M10d_Any ){ + sqlite3_str_appendf(&x, " %sMATERIALIZED", + pCte->eM10d==M10d_No ? "NOT " : ""); + } if( pCte->pUse ){ sqlite3_str_appendf(&x, " (pUse=0x%p, nUse=%d)", pCte->pUse, pCte->pUse->nUse); @@ -30930,9 +31202,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inCte-1); sqlite3TreeViewSelect(pView, pCte->pSelect, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } @@ -30941,10 +31213,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWith(TreeView *pView, const With *pWith, u8 m */ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ int i; + if( pSrc==0 ) return; for(i=0; inSrc; i++){ const SrcItem *pItem = &pSrc->a[i]; StrAccum x; - char zLine[100]; + int n = 0; + char zLine[1000]; sqlite3StrAccumInit(&x, 0, zLine, sizeof(zLine), 0); x.printfFlags |= SQLITE_PRINTF_INTERNAL; sqlite3_str_appendf(&x, "{%d:*} %!S", pItem->iCursor, pItem); @@ -30952,26 +31226,48 @@ SQLITE_PRIVATE void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc) sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p used=%llx", pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab, pItem->colUsed); } - if( pItem->fg.jointype & JT_LEFT ){ + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==(JT_LEFT|JT_RIGHT) ){ + sqlite3_str_appendf(&x, " FULL-OUTER-JOIN"); + }else if( pItem->fg.jointype & JT_LEFT ){ sqlite3_str_appendf(&x, " LEFT-JOIN"); + }else if( pItem->fg.jointype & JT_RIGHT ){ + sqlite3_str_appendf(&x, " RIGHT-JOIN"); }else if( pItem->fg.jointype & JT_CROSS ){ sqlite3_str_appendf(&x, " CROSS-JOIN"); } + if( pItem->fg.jointype & JT_LTORJ ){ + sqlite3_str_appendf(&x, " LTORJ"); + } if( pItem->fg.fromDDL ){ sqlite3_str_appendf(&x, " DDL"); } if( pItem->fg.isCte ){ sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); } + if( pItem->fg.isOn || (pItem->fg.isUsing==0 && pItem->u3.pOn!=0) ){ + sqlite3_str_appendf(&x, " ON"); + } sqlite3StrAccumFinish(&x); sqlite3TreeViewItem(pView, zLine, inSrc-1); + n = 0; + if( pItem->pSelect ) n++; + if( pItem->fg.isTabFunc ) n++; + if( pItem->fg.isUsing ) n++; + if( pItem->fg.isUsing ){ + sqlite3TreeViewIdList(pView, pItem->u3.pUsing, (--n)>0, "USING"); + } if( pItem->pSelect ){ - sqlite3TreeViewSelect(pView, pItem->pSelect, 0); + if( pItem->pTab ){ + Table *pTab = pItem->pTab; + sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); + } + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + sqlite3TreeViewSelect(pView, pItem->pSelect, (--n)>0); } if( pItem->fg.isTabFunc ){ sqlite3TreeViewExprList(pView, pItem->u1.pFuncArg, 0, "func-args:"); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } @@ -30985,11 +31281,11 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m sqlite3TreeViewLine(pView, "nil-SELECT"); return; } - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); if( p->pWith ){ sqlite3TreeViewWith(pView, p->pWith, 1); cnt = 1; - sqlite3TreeViewPush(pView, 1); + sqlite3TreeViewPush(&pView, 1); } do{ if( p->selFlags & SF_WhereBegin ){ @@ -31003,7 +31299,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m (int)p->nSelectRow ); } - if( cnt++ ) sqlite3TreeViewPop(pView); + if( cnt++ ) sqlite3TreeViewPop(&pView); if( p->pPrior ){ n = 1000; }else{ @@ -31026,24 +31322,24 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWin ){ Window *pX; - pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewPush(&pView, (n--)>0); sqlite3TreeViewLine(pView, "window-functions"); for(pX=p->pWin; pX; pX=pX->pNextWin){ sqlite3TreeViewWinFunc(pView, pX, pX->pNextWin!=0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif if( p->pSrc && p->pSrc->nSrc ){ - pView = sqlite3TreeViewPush(pView, (n--)>0); + sqlite3TreeViewPush(&pView, (n--)>0); sqlite3TreeViewLine(pView, "FROM"); sqlite3TreeViewSrcList(pView, p->pSrc); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pWhere ){ sqlite3TreeViewItem(pView, "WHERE", (n--)>0); sqlite3TreeViewExpr(pView, p->pWhere, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pGroupBy ){ sqlite3TreeViewExprList(pView, p->pGroupBy, (n--)>0, "GROUPBY"); @@ -31051,7 +31347,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p->pHaving ){ sqlite3TreeViewItem(pView, "HAVING", (n--)>0); sqlite3TreeViewExpr(pView, p->pHaving, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #ifndef SQLITE_OMIT_WINDOWFUNC if( p->pWinDefn ){ @@ -31060,7 +31356,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m for(pX=p->pWinDefn; pX; pX=pX->pNextWin){ sqlite3TreeViewWindow(pView, pX, pX->pNextWin!=0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif if( p->pOrderBy ){ @@ -31072,9 +31368,9 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m if( p->pLimit->pRight ){ sqlite3TreeViewItem(pView, "OFFSET", (n--)>0); sqlite3TreeViewExpr(pView, p->pLimit->pRight, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( p->pPrior ){ const char *zOp = "UNION"; @@ -31087,7 +31383,7 @@ SQLITE_PRIVATE void sqlite3TreeViewSelect(TreeView *pView, const Select *p, u8 m } p = p->pPrior; }while( p!=0 ); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #ifndef SQLITE_OMIT_WINDOWFUNC @@ -31103,24 +31399,24 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( switch( eBound ){ case TK_UNBOUNDED: { sqlite3TreeViewItem(pView, "UNBOUNDED", moreToFollow); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_CURRENT: { sqlite3TreeViewItem(pView, "CURRENT", moreToFollow); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_PRECEDING: { sqlite3TreeViewItem(pView, "PRECEDING", moreToFollow); sqlite3TreeViewExpr(pView, pExpr, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } case TK_FOLLOWING: { sqlite3TreeViewItem(pView, "FOLLOWING", moreToFollow); sqlite3TreeViewExpr(pView, pExpr, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); break; } } @@ -31133,12 +31429,13 @@ SQLITE_PRIVATE void sqlite3TreeViewBound( */ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){ int nElement = 0; + if( pWin==0 ) return; if( pWin->pFilter ){ sqlite3TreeViewItem(pView, "FILTER", 1); sqlite3TreeViewExpr(pView, pWin->pFilter, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - pView = sqlite3TreeViewPush(pView, more); + sqlite3TreeViewPush(&pView, more); if( pWin->zName ){ sqlite3TreeViewLine(pView, "OVER %s (%p)", pWin->zName, pWin); }else{ @@ -31149,9 +31446,9 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u if( pWin->eFrmType ) nElement++; if( pWin->eExclude ) nElement++; if( pWin->zBase ){ - sqlite3TreeViewPush(pView, (--nElement)>0); + sqlite3TreeViewPush(&pView, (--nElement)>0); sqlite3TreeViewLine(pView, "window: %s", pWin->zBase); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( pWin->pPartition ){ sqlite3TreeViewExprList(pView, pWin->pPartition, nElement>0,"PARTITION-BY"); @@ -31169,7 +31466,7 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u sqlite3TreeViewItem(pView, zBuf, (--nElement)>0); sqlite3TreeViewBound(pView, pWin->eStart, pWin->pStart, 1); sqlite3TreeViewBound(pView, pWin->eEnd, pWin->pEnd, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } if( pWin->eExclude ){ char zBuf[30]; @@ -31184,11 +31481,11 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u zExclude = zBuf; break; } - sqlite3TreeViewPush(pView, 0); + sqlite3TreeViewPush(&pView, 0); sqlite3TreeViewLine(pView, "EXCLUDE %s", zExclude); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -31197,11 +31494,12 @@ SQLITE_PRIVATE void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u ** Generate a human-readable explanation for a Window Function object */ SQLITE_PRIVATE void sqlite3TreeViewWinFunc(TreeView *pView, const Window *pWin, u8 more){ - pView = sqlite3TreeViewPush(pView, more); + if( pWin==0 ) return; + sqlite3TreeViewPush(&pView, more); sqlite3TreeViewLine(pView, "WINFUNC %s(%d)", - pWin->pFunc->zName, pWin->pFunc->nArg); + pWin->pWFunc->zName, pWin->pWFunc->nArg); sqlite3TreeViewWindow(pView, pWin, 0); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } #endif /* SQLITE_OMIT_WINDOWFUNC */ @@ -31212,10 +31510,10 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m const char *zBinOp = 0; /* Binary operator */ const char *zUniOp = 0; /* Unary operator */ char zFlgs[200]; - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); if( pExpr==0 ){ sqlite3TreeViewLine(pView, "nil"); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); return; } if( pExpr->flags || pExpr->affExpr || pExpr->vvaFlags ){ @@ -31223,8 +31521,11 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3StrAccumInit(&x, 0, zFlgs, sizeof(zFlgs), 0); sqlite3_str_appendf(&x, " fg.af=%x.%c", pExpr->flags, pExpr->affExpr ? pExpr->affExpr : 'n'); - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - sqlite3_str_appendf(&x, " iRJT=%d", pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + sqlite3_str_appendf(&x, " outer.iJoin=%d", pExpr->w.iJoin); + } + if( ExprHasProperty(pExpr, EP_InnerON) ){ + sqlite3_str_appendf(&x, " inner.iJoin=%d", pExpr->w.iJoin); } if( ExprHasProperty(pExpr, EP_FromDDL) ){ sqlite3_str_appendf(&x, " DDL"); @@ -31448,7 +31749,17 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m break; } case TK_IN: { - sqlite3TreeViewLine(pView, "IN flags=0x%x", pExpr->flags); + sqlite3_str *pStr = sqlite3_str_new(0); + char *z; + sqlite3_str_appendf(pStr, "IN flags=0x%x", pExpr->flags); + if( pExpr->iTable ) sqlite3_str_appendf(pStr, " iTable=%d",pExpr->iTable); + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3_str_appendf(pStr, " subrtn(%d,%d)", + pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + } + z = sqlite3_str_finish(pStr); + sqlite3TreeViewLine(pView, z); + sqlite3_free(z); sqlite3TreeViewExpr(pView, pExpr->pLeft, 1); if( ExprUseXSelect(pExpr) ){ sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); @@ -31572,7 +31883,7 @@ SQLITE_PRIVATE void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 m sqlite3TreeViewLine(pView, "%s%s", zUniOp, zFlgs); sqlite3TreeViewExpr(pView, pExpr->pLeft, 0); } - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } @@ -31594,13 +31905,25 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( int j = pList->a[i].u.x.iOrderByCol; char *zName = pList->a[i].zEName; int moreToFollow = inExpr - 1; - if( pList->a[i].eEName!=ENAME_NAME ) zName = 0; if( j || zName ){ - sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); moreToFollow = 0; sqlite3TreeViewLine(pView, 0); if( zName ){ - fprintf(stdout, "AS %s ", zName); + switch( pList->a[i].fg.eEName ){ + default: + fprintf(stdout, "AS %s ", zName); + break; + case ENAME_TAB: + fprintf(stdout, "TABLE-ALIAS-NAME(\"%s\") ", zName); + if( pList->a[i].fg.bUsed ) fprintf(stdout, "(used) "); + if( pList->a[i].fg.bUsingTerm ) fprintf(stdout, "(USING-term) "); + if( pList->a[i].fg.bNoExpand ) fprintf(stdout, "(NoExpand) "); + break; + case ENAME_SPAN: + fprintf(stdout, "SPAN(\"%s\") ", zName); + break; + } } if( j ){ fprintf(stdout, "iOrderByCol=%d", j); @@ -31610,7 +31933,7 @@ SQLITE_PRIVATE void sqlite3TreeViewBareExprList( } sqlite3TreeViewExpr(pView, pList->a[i].pExpr, moreToFollow); if( j || zName ){ - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } } } @@ -31621,11 +31944,378 @@ SQLITE_PRIVATE void sqlite3TreeViewExprList( u8 moreToFollow, const char *zLabel ){ - pView = sqlite3TreeViewPush(pView, moreToFollow); + sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewBareExprList(pView, pList, zLabel); - sqlite3TreeViewPop(pView); + sqlite3TreeViewPop(&pView); } +/* +** Generate a human-readable explanation of an id-list. +*/ +SQLITE_PRIVATE void sqlite3TreeViewBareIdList( + TreeView *pView, + const IdList *pList, + const char *zLabel +){ + if( zLabel==0 || zLabel[0]==0 ) zLabel = "LIST"; + if( pList==0 ){ + sqlite3TreeViewLine(pView, "%s (empty)", zLabel); + }else{ + int i; + sqlite3TreeViewLine(pView, "%s", zLabel); + for(i=0; inId; i++){ + char *zName = pList->a[i].zName; + int moreToFollow = inId - 1; + if( zName==0 ) zName = "(null)"; + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewLine(pView, 0); + if( pList->eU4==EU4_NONE ){ + fprintf(stdout, "%s\n", zName); + }else if( pList->eU4==EU4_IDX ){ + fprintf(stdout, "%s (%d)\n", zName, pList->a[i].u4.idx); + }else{ + assert( pList->eU4==EU4_EXPR ); + if( pList->a[i].u4.pExpr==0 ){ + fprintf(stdout, "%s (pExpr=NULL)\n", zName); + }else{ + fprintf(stdout, "%s\n", zName); + sqlite3TreeViewPush(&pView, inId-1); + sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0); + sqlite3TreeViewPop(&pView); + } + } + sqlite3TreeViewPop(&pView); + } + } +} +SQLITE_PRIVATE void sqlite3TreeViewIdList( + TreeView *pView, + const IdList *pList, + u8 moreToFollow, + const char *zLabel +){ + sqlite3TreeViewPush(&pView, moreToFollow); + sqlite3TreeViewBareIdList(pView, pList, zLabel); + sqlite3TreeViewPop(&pView); +} + +/* +** Generate a human-readable explanation of a list of Upsert objects +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpsert( + TreeView *pView, + const Upsert *pUpsert, + u8 moreToFollow +){ + if( pUpsert==0 ) return; + sqlite3TreeViewPush(&pView, moreToFollow); + while( pUpsert ){ + int n; + sqlite3TreeViewPush(&pView, pUpsert->pNextUpsert!=0 || moreToFollow); + sqlite3TreeViewLine(pView, "ON CONFLICT DO %s", + pUpsert->isDoUpdate ? "UPDATE" : "NOTHING"); + n = (pUpsert->pUpsertSet!=0) + (pUpsert->pUpsertWhere!=0); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertTarget, (n--)>0, "TARGET"); + sqlite3TreeViewExprList(pView, pUpsert->pUpsertSet, (n--)>0, "SET"); + if( pUpsert->pUpsertWhere ){ + sqlite3TreeViewItem(pView, "WHERE", (n--)>0); + sqlite3TreeViewExpr(pView, pUpsert->pUpsertWhere, 0); + sqlite3TreeViewPop(&pView); + } + sqlite3TreeViewPop(&pView); + pUpsert = pUpsert->pNextUpsert; + } + sqlite3TreeViewPop(&pView); +} + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an DELETE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewDelete( + const With *pWith, + const SrcList *pTabList, + const Expr *pWhere, + const ExprList *pOrderBy, + const Expr *pLimit, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, "DELETE"); + if( pWith ) n++; + if( pTabList ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an INSERT statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewInsert( + const With *pWith, + const SrcList *pTabList, + const IdList *pColumnList, + const Select *pSelect, + const ExprList *pExprList, + int onError, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + TreeView *pView = 0; + int n = 0; + const char *zLabel = "INSERT"; + switch( onError ){ + case OE_Replace: zLabel = "REPLACE"; break; + case OE_Ignore: zLabel = "INSERT OR IGNORE"; break; + case OE_Rollback: zLabel = "INSERT OR ROLLBACK"; break; + case OE_Abort: zLabel = "INSERT OR ABORT"; break; + case OE_Fail: zLabel = "INSERT OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pColumnList ) n++; + if( pSelect ) n++; + if( pExprList ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "INTO"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pColumnList ){ + sqlite3TreeViewIdList(pView, pColumnList, (--n)>0, "COLUMNS"); + } + if( pSelect ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "DATA-SOURCE"); + sqlite3TreeViewSelect(pView, pSelect, 0); + sqlite3TreeViewPop(&pView); + } + if( pExprList ){ + sqlite3TreeViewExprList(pView, pExprList, (--n)>0, "VALUES"); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#if TREETRACE_ENABLED +/* +** Generate a human-readable diagram of the data structure that go +** into generating an UPDATE statement. +*/ +SQLITE_PRIVATE void sqlite3TreeViewUpdate( + const With *pWith, + const SrcList *pTabList, + const ExprList *pChanges, + const Expr *pWhere, + int onError, + const ExprList *pOrderBy, + const Expr *pLimit, + const Upsert *pUpsert, + const Trigger *pTrigger +){ + int n = 0; + TreeView *pView = 0; + const char *zLabel = "UPDATE"; + switch( onError ){ + case OE_Replace: zLabel = "UPDATE OR REPLACE"; break; + case OE_Ignore: zLabel = "UPDATE OR IGNORE"; break; + case OE_Rollback: zLabel = "UPDATE OR ROLLBACK"; break; + case OE_Abort: zLabel = "UPDATE OR ABORT"; break; + case OE_Fail: zLabel = "UPDATE OR FAIL"; break; + } + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewLine(pView, zLabel); + if( pWith ) n++; + if( pTabList ) n++; + if( pChanges ) n++; + if( pWhere ) n++; + if( pOrderBy ) n++; + if( pLimit ) n++; + if( pUpsert ) n++; + if( pTrigger ) n++; + if( pWith ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewWith(pView, pWith, 0); + sqlite3TreeViewPop(&pView); + } + if( pTabList ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "FROM"); + sqlite3TreeViewSrcList(pView, pTabList); + sqlite3TreeViewPop(&pView); + } + if( pChanges ){ + sqlite3TreeViewExprList(pView, pChanges, (--n)>0, "SET"); + } + if( pWhere ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "WHERE"); + sqlite3TreeViewExpr(pView, pWhere, 0); + sqlite3TreeViewPop(&pView); + } + if( pOrderBy ){ + sqlite3TreeViewExprList(pView, pOrderBy, (--n)>0, "ORDER-BY"); + } + if( pLimit ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "LIMIT"); + sqlite3TreeViewExpr(pView, pLimit, 0); + sqlite3TreeViewPop(&pView); + } + if( pUpsert ){ + sqlite3TreeViewPush(&pView, (--n)>0); + sqlite3TreeViewLine(pView, "UPSERT"); + sqlite3TreeViewUpsert(pView, pUpsert, 0); + sqlite3TreeViewPop(&pView); + } + if( pTrigger ){ + sqlite3TreeViewTrigger(pView, pTrigger, (--n)>0, 1); + } + sqlite3TreeViewPop(&pView); +} +#endif /* TREETRACE_ENABLED */ + +#ifndef SQLITE_OMIT_TRIGGER +/* +** Show a human-readable graph of a TriggerStep +*/ +SQLITE_PRIVATE void sqlite3TreeViewTriggerStep( + TreeView *pView, + const TriggerStep *pStep, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pStep==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pStep->pNext!=0)); + do{ + if( cnt++ && pStep->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "%s", pStep->zSpan ? pStep->zSpan : "RETURNING"); + }while( showFullList && (pStep = pStep->pNext)!=0 ); + sqlite3TreeViewPop(&pView); +} + +/* +** Show a human-readable graph of a Trigger +*/ +SQLITE_PRIVATE void sqlite3TreeViewTrigger( + TreeView *pView, + const Trigger *pTrigger, + u8 moreToFollow, + u8 showFullList +){ + int cnt = 0; + if( pTrigger==0 ) return; + sqlite3TreeViewPush(&pView, + moreToFollow || (showFullList && pTrigger->pNext!=0)); + do{ + if( cnt++ && pTrigger->pNext==0 ){ + sqlite3TreeViewPop(&pView); + sqlite3TreeViewPush(&pView, 0); + } + sqlite3TreeViewLine(pView, "TRIGGER %s", pTrigger->zName); + sqlite3TreeViewPush(&pView, 0); + sqlite3TreeViewTriggerStep(pView, pTrigger->step_list, 0, 1); + sqlite3TreeViewPop(&pView); + }while( showFullList && (pTrigger = pTrigger->pNext)!=0 ); + sqlite3TreeViewPop(&pView); +} +#endif /* SQLITE_OMIT_TRIGGER */ + + +/* +** These simplified versions of the tree-view routines omit unnecessary +** parameters. These variants are intended to be used from a symbolic +** debugger, such as "gdb", during interactive debugging sessions. +** +** This routines are given external linkage so that they will always be +** accessible to the debugging, and to avoid warnings about unused +** functions. But these routines only exist in debugging builds, so they +** do not contaminate the interface. +*/ +SQLITE_PRIVATE void sqlite3ShowExpr(const Expr *p){ sqlite3TreeViewExpr(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowExprList(const ExprList *p){ sqlite3TreeViewExprList(0,p,0,0);} +SQLITE_PRIVATE void sqlite3ShowIdList(const IdList *p){ sqlite3TreeViewIdList(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowSrcList(const SrcList *p){ sqlite3TreeViewSrcList(0,p); } +SQLITE_PRIVATE void sqlite3ShowSelect(const Select *p){ sqlite3TreeViewSelect(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWith(const With *p){ sqlite3TreeViewWith(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowUpsert(const Upsert *p){ sqlite3TreeViewUpsert(0,p,0); } +#ifndef SQLITE_OMIT_TRIGGER +SQLITE_PRIVATE void sqlite3ShowTriggerStep(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,0); +} +SQLITE_PRIVATE void sqlite3ShowTriggerStepList(const TriggerStep *p){ + sqlite3TreeViewTriggerStep(0,p,0,1); +} +SQLITE_PRIVATE void sqlite3ShowTrigger(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,0); } +SQLITE_PRIVATE void sqlite3ShowTriggerList(const Trigger *p){ sqlite3TreeViewTrigger(0,p,0,1);} +#endif +#ifndef SQLITE_OMIT_WINDOWFUNC +SQLITE_PRIVATE void sqlite3ShowWindow(const Window *p){ sqlite3TreeViewWindow(0,p,0); } +SQLITE_PRIVATE void sqlite3ShowWinFunc(const Window *p){ sqlite3TreeViewWinFunc(0,p,0); } +#endif + #endif /* SQLITE_DEBUG */ /************** End of treeview.c ********************************************/ @@ -32779,7 +33469,7 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ va_list ap; sqlite3 *db = pParse->db; assert( db!=0 ); - assert( db->pParse==pParse ); + assert( db->pParse==pParse || db->pParse->pToplevel==pParse ); db->errByteOffset = -2; va_start(ap, zFormat); zMsg = sqlite3VMPrintf(db, zFormat, ap); @@ -34592,42 +35282,42 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 0 */ "Savepoint" OpHelp(""), /* 1 */ "AutoCommit" OpHelp(""), /* 2 */ "Transaction" OpHelp(""), - /* 3 */ "SorterNext" OpHelp(""), - /* 4 */ "Prev" OpHelp(""), - /* 5 */ "Next" OpHelp(""), - /* 6 */ "Checkpoint" OpHelp(""), - /* 7 */ "JournalMode" OpHelp(""), - /* 8 */ "Vacuum" OpHelp(""), - /* 9 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), - /* 10 */ "VUpdate" OpHelp("data=r[P3@P2]"), - /* 11 */ "Goto" OpHelp(""), - /* 12 */ "Gosub" OpHelp(""), - /* 13 */ "InitCoroutine" OpHelp(""), - /* 14 */ "Yield" OpHelp(""), - /* 15 */ "MustBeInt" OpHelp(""), - /* 16 */ "Jump" OpHelp(""), - /* 17 */ "Once" OpHelp(""), - /* 18 */ "If" OpHelp(""), + /* 3 */ "Checkpoint" OpHelp(""), + /* 4 */ "JournalMode" OpHelp(""), + /* 5 */ "Vacuum" OpHelp(""), + /* 6 */ "VFilter" OpHelp("iplan=r[P3] zplan='P4'"), + /* 7 */ "VUpdate" OpHelp("data=r[P3@P2]"), + /* 8 */ "Goto" OpHelp(""), + /* 9 */ "Gosub" OpHelp(""), + /* 10 */ "InitCoroutine" OpHelp(""), + /* 11 */ "Yield" OpHelp(""), + /* 12 */ "MustBeInt" OpHelp(""), + /* 13 */ "Jump" OpHelp(""), + /* 14 */ "Once" OpHelp(""), + /* 15 */ "If" OpHelp(""), + /* 16 */ "IfNot" OpHelp(""), + /* 17 */ "IsNullOrType" OpHelp("if typeof(r[P1]) IN (P3,5) goto P2"), + /* 18 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), /* 19 */ "Not" OpHelp("r[P2]= !r[P1]"), - /* 20 */ "IfNot" OpHelp(""), - /* 21 */ "IsNullOrType" OpHelp("if typeof(r[P1]) IN (P3,5) goto P2"), - /* 22 */ "IfNullRow" OpHelp("if P1.nullRow then r[P3]=NULL, goto P2"), - /* 23 */ "SeekLT" OpHelp("key=r[P3@P4]"), - /* 24 */ "SeekLE" OpHelp("key=r[P3@P4]"), - /* 25 */ "SeekGE" OpHelp("key=r[P3@P4]"), - /* 26 */ "SeekGT" OpHelp("key=r[P3@P4]"), - /* 27 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), - /* 28 */ "IfNoHope" OpHelp("key=r[P3@P4]"), - /* 29 */ "NoConflict" OpHelp("key=r[P3@P4]"), - /* 30 */ "NotFound" OpHelp("key=r[P3@P4]"), - /* 31 */ "Found" OpHelp("key=r[P3@P4]"), - /* 32 */ "SeekRowid" OpHelp("intkey=r[P3]"), - /* 33 */ "NotExists" OpHelp("intkey=r[P3]"), - /* 34 */ "Last" OpHelp(""), - /* 35 */ "IfSmaller" OpHelp(""), - /* 36 */ "SorterSort" OpHelp(""), - /* 37 */ "Sort" OpHelp(""), - /* 38 */ "Rewind" OpHelp(""), + /* 20 */ "SeekLT" OpHelp("key=r[P3@P4]"), + /* 21 */ "SeekLE" OpHelp("key=r[P3@P4]"), + /* 22 */ "SeekGE" OpHelp("key=r[P3@P4]"), + /* 23 */ "SeekGT" OpHelp("key=r[P3@P4]"), + /* 24 */ "IfNotOpen" OpHelp("if( !csr[P1] ) goto P2"), + /* 25 */ "IfNoHope" OpHelp("key=r[P3@P4]"), + /* 26 */ "NoConflict" OpHelp("key=r[P3@P4]"), + /* 27 */ "NotFound" OpHelp("key=r[P3@P4]"), + /* 28 */ "Found" OpHelp("key=r[P3@P4]"), + /* 29 */ "SeekRowid" OpHelp("intkey=r[P3]"), + /* 30 */ "NotExists" OpHelp("intkey=r[P3]"), + /* 31 */ "Last" OpHelp(""), + /* 32 */ "IfSmaller" OpHelp(""), + /* 33 */ "SorterSort" OpHelp(""), + /* 34 */ "Sort" OpHelp(""), + /* 35 */ "Rewind" OpHelp(""), + /* 36 */ "SorterNext" OpHelp(""), + /* 37 */ "Prev" OpHelp(""), + /* 38 */ "Next" OpHelp(""), /* 39 */ "IdxLE" OpHelp("key=r[P3@P4]"), /* 40 */ "IdxGT" OpHelp("key=r[P3@P4]"), /* 41 */ "IdxLT" OpHelp("key=r[P3@P4]"), @@ -34663,34 +35353,34 @@ SQLITE_PRIVATE const char *sqlite3OpcodeName(int i){ /* 71 */ "Integer" OpHelp("r[P2]=P1"), /* 72 */ "Int64" OpHelp("r[P2]=P4"), /* 73 */ "String" OpHelp("r[P2]='P4' (len=P1)"), - /* 74 */ "Null" OpHelp("r[P2..P3]=NULL"), - /* 75 */ "SoftNull" OpHelp("r[P1]=NULL"), - /* 76 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), - /* 77 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), - /* 78 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), - /* 79 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), - /* 80 */ "SCopy" OpHelp("r[P2]=r[P1]"), - /* 81 */ "IntCopy" OpHelp("r[P2]=r[P1]"), - /* 82 */ "FkCheck" OpHelp(""), - /* 83 */ "ResultRow" OpHelp("output=r[P1@P2]"), - /* 84 */ "CollSeq" OpHelp(""), - /* 85 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), - /* 86 */ "RealAffinity" OpHelp(""), - /* 87 */ "Cast" OpHelp("affinity(r[P1])"), - /* 88 */ "Permutation" OpHelp(""), - /* 89 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), - /* 90 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), - /* 91 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), - /* 92 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), - /* 93 */ "Column" OpHelp("r[P3]=PX"), - /* 94 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), - /* 95 */ "Affinity" OpHelp("affinity(r[P1@P2])"), - /* 96 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), - /* 97 */ "Count" OpHelp("r[P2]=count()"), - /* 98 */ "ReadCookie" OpHelp(""), - /* 99 */ "SetCookie" OpHelp(""), - /* 100 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), - /* 101 */ "OpenRead" OpHelp("root=P2 iDb=P3"), + /* 74 */ "BeginSubrtn" OpHelp("r[P2]=NULL"), + /* 75 */ "Null" OpHelp("r[P2..P3]=NULL"), + /* 76 */ "SoftNull" OpHelp("r[P1]=NULL"), + /* 77 */ "Blob" OpHelp("r[P2]=P4 (len=P1)"), + /* 78 */ "Variable" OpHelp("r[P2]=parameter(P1,P4)"), + /* 79 */ "Move" OpHelp("r[P2@P3]=r[P1@P3]"), + /* 80 */ "Copy" OpHelp("r[P2@P3+1]=r[P1@P3+1]"), + /* 81 */ "SCopy" OpHelp("r[P2]=r[P1]"), + /* 82 */ "IntCopy" OpHelp("r[P2]=r[P1]"), + /* 83 */ "FkCheck" OpHelp(""), + /* 84 */ "ResultRow" OpHelp("output=r[P1@P2]"), + /* 85 */ "CollSeq" OpHelp(""), + /* 86 */ "AddImm" OpHelp("r[P1]=r[P1]+P2"), + /* 87 */ "RealAffinity" OpHelp(""), + /* 88 */ "Cast" OpHelp("affinity(r[P1])"), + /* 89 */ "Permutation" OpHelp(""), + /* 90 */ "Compare" OpHelp("r[P1@P3] <-> r[P2@P3]"), + /* 91 */ "IsTrue" OpHelp("r[P2] = coalesce(r[P1]==TRUE,P3) ^ P4"), + /* 92 */ "ZeroOrNull" OpHelp("r[P2] = 0 OR NULL"), + /* 93 */ "Offset" OpHelp("r[P3] = sqlite_offset(P1)"), + /* 94 */ "Column" OpHelp("r[P3]=PX cursor P1 column P2"), + /* 95 */ "TypeCheck" OpHelp("typecheck(r[P1@P2])"), + /* 96 */ "Affinity" OpHelp("affinity(r[P1@P2])"), + /* 97 */ "MakeRecord" OpHelp("r[P3]=mkrec(r[P1@P2])"), + /* 98 */ "Count" OpHelp("r[P2]=count()"), + /* 99 */ "ReadCookie" OpHelp(""), + /* 100 */ "SetCookie" OpHelp(""), + /* 101 */ "ReopenIdx" OpHelp("root=P2 iDb=P3"), /* 102 */ "BitAnd" OpHelp("r[P3]=r[P1]&r[P2]"), /* 103 */ "BitOr" OpHelp("r[P3]=r[P1]|r[P2]"), /* 104 */ "ShiftLeft" OpHelp("r[P3]=r[P2]<0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), - /* 160 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), - /* 161 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 162 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), - /* 163 */ "AggValue" OpHelp("r[P3]=value N=P2"), - /* 164 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), - /* 165 */ "Expire" OpHelp(""), - /* 166 */ "CursorLock" OpHelp(""), - /* 167 */ "CursorUnlock" OpHelp(""), - /* 168 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), - /* 169 */ "VBegin" OpHelp(""), - /* 170 */ "VCreate" OpHelp(""), - /* 171 */ "VDestroy" OpHelp(""), - /* 172 */ "VOpen" OpHelp(""), - /* 173 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), - /* 174 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), - /* 175 */ "VRename" OpHelp(""), - /* 176 */ "Pagecount" OpHelp(""), - /* 177 */ "MaxPgcnt" OpHelp(""), - /* 178 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), - /* 179 */ "Trace" OpHelp(""), - /* 180 */ "CursorHint" OpHelp(""), - /* 181 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), - /* 182 */ "Noop" OpHelp(""), - /* 183 */ "Explain" OpHelp(""), - /* 184 */ "Abortable" OpHelp(""), + /* 154 */ "DropTrigger" OpHelp(""), + /* 155 */ "IntegrityCk" OpHelp(""), + /* 156 */ "RowSetAdd" OpHelp("rowset(P1)=r[P2]"), + /* 157 */ "Param" OpHelp(""), + /* 158 */ "FkCounter" OpHelp("fkctr[P1]+=P2"), + /* 159 */ "MemMax" OpHelp("r[P1]=max(r[P1],r[P2])"), + /* 160 */ "OffsetLimit" OpHelp("if r[P1]>0 then r[P2]=r[P1]+max(0,r[P3]) else r[P2]=(-1)"), + /* 161 */ "AggInverse" OpHelp("accum=r[P3] inverse(r[P2@P5])"), + /* 162 */ "AggStep" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 163 */ "AggStep1" OpHelp("accum=r[P3] step(r[P2@P5])"), + /* 164 */ "AggValue" OpHelp("r[P3]=value N=P2"), + /* 165 */ "AggFinal" OpHelp("accum=r[P1] N=P2"), + /* 166 */ "Expire" OpHelp(""), + /* 167 */ "CursorLock" OpHelp(""), + /* 168 */ "CursorUnlock" OpHelp(""), + /* 169 */ "TableLock" OpHelp("iDb=P1 root=P2 write=P3"), + /* 170 */ "VBegin" OpHelp(""), + /* 171 */ "VCreate" OpHelp(""), + /* 172 */ "VDestroy" OpHelp(""), + /* 173 */ "VOpen" OpHelp(""), + /* 174 */ "VInitIn" OpHelp("r[P2]=ValueList(P1,P3)"), + /* 175 */ "VColumn" OpHelp("r[P3]=vcolumn(P2)"), + /* 176 */ "VRename" OpHelp(""), + /* 177 */ "Pagecount" OpHelp(""), + /* 178 */ "MaxPgcnt" OpHelp(""), + /* 179 */ "ClrSubtype" OpHelp("r[P1].subtype = 0"), + /* 180 */ "FilterAdd" OpHelp("filter(P1) += key(P3@P4)"), + /* 181 */ "Trace" OpHelp(""), + /* 182 */ "CursorHint" OpHelp(""), + /* 183 */ "ReleaseReg" OpHelp("release r[P1@P2] mask P3"), + /* 184 */ "Noop" OpHelp(""), + /* 185 */ "Explain" OpHelp(""), + /* 186 */ "Abortable" OpHelp(""), }; return azName[i]; } @@ -40638,6 +41330,7 @@ static const char *unixTempFileDir(void){ static int unixGetTempname(int nBuf, char *zBuf){ const char *zDir; int iLimit = 0; + int rc = SQLITE_OK; /* 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 @@ -40646,18 +41339,26 @@ static int unixGetTempname(int nBuf, char *zBuf){ zBuf[0] = 0; SimulateIOError( return SQLITE_IOERR ); + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); zDir = unixTempFileDir(); - if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH; - do{ - u64 r; - sqlite3_randomness(sizeof(r), &r); - assert( nBuf>2 ); - zBuf[nBuf-2] = 0; - sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", - zDir, r, 0); - if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR; - }while( osAccess(zBuf,0)==0 ); - return SQLITE_OK; + if( zDir==0 ){ + rc = SQLITE_IOERR_GETTEMPPATH; + }else{ + do{ + u64 r; + sqlite3_randomness(sizeof(r), &r); + assert( nBuf>2 ); + zBuf[nBuf-2] = 0; + sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c", + zDir, r, 0); + if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ){ + rc = SQLITE_ERROR; + break; + } + }while( osAccess(zBuf,0)==0 ); + } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return rc; } #if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__) @@ -40800,20 +41501,23 @@ static int findCreateFileMode( ** ** where NN is a decimal number. The NN naming schemes are ** used by the test_multiplex.c module. + ** + ** In normal operation, the journal file name will always contain + ** a '-' character. However in 8+3 filename mode, or if a corrupt + ** rollback journal specifies a super-journal with a goofy name, then + ** the '-' might be missing or the '-' might be the first character in + ** the filename. In that case, just return SQLITE_OK with *pMode==0. */ nDb = sqlite3Strlen30(zPath) - 1; - while( zPath[nDb]!='-' ){ - /* In normal operation, the journal file name will always contain - ** a '-' character. However in 8+3 filename mode, or if a corrupt - ** rollback journal specifies a super-journal with a goofy name, then - ** the '-' might be missing. */ - if( nDb==0 || zPath[nDb]=='.' ) return SQLITE_OK; + while( nDb>0 && zPath[nDb]!='.' ){ + if( zPath[nDb]=='-' ){ + memcpy(zDb, zPath, nDb); + zDb[nDb] = '\0'; + rc = getFileMode(zDb, pMode, pUid, pGid); + break; + } nDb--; } - memcpy(zDb, zPath, nDb); - zDb[nDb] = '\0'; - - rc = getFileMode(zDb, pMode, pUid, pGid); }else if( flags & SQLITE_OPEN_DELETEONCLOSE ){ *pMode = 0600; }else if( flags & SQLITE_OPEN_URI ){ @@ -41203,86 +41907,99 @@ static int unixAccess( } /* -** If the last component of the pathname in z[0]..z[j-1] is something -** other than ".." then back it out and return true. If the last -** component is empty or if it is ".." then return false. +** A pathname under construction */ -static int unixBackupDir(const char *z, int *pJ){ - int j = *pJ; - int i; - if( j<=0 ) return 0; - for(i=j-1; i>0 && z[i-1]!='/'; i--){} - if( i==0 ) return 0; - if( z[i]=='.' && i==j-2 && z[i+1]=='.' ) return 0; - *pJ = i-1; - return 1; +typedef struct DbPath DbPath; +struct DbPath { + int rc; /* Non-zero following any error */ + int nSymlink; /* Number of symlinks resolved */ + char *zOut; /* Write the pathname here */ + int nOut; /* Bytes of space available to zOut[] */ + int nUsed; /* Bytes of zOut[] currently being used */ +}; + +/* Forward reference */ +static void appendAllPathElements(DbPath*,const char*); + +/* +** Append a single path element to the DbPath under construction +*/ +static void appendOnePathElement( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zName, /* Name to append to pPath. Not zero-terminated */ + int nName /* Number of significant bytes in zName */ +){ + assert( nName>0 ); + assert( zName!=0 ); + if( zName[0]=='.' ){ + if( nName==1 ) return; + if( zName[1]=='.' && nName==2 ){ + if( pPath->nUsed<=1 ){ + pPath->rc = SQLITE_ERROR; + return; + } + assert( pPath->zOut[0]=='/' ); + while( pPath->zOut[--pPath->nUsed]!='/' ){} + return; + } + } + if( pPath->nUsed + nName + 2 >= pPath->nOut ){ + pPath->rc = SQLITE_ERROR; + return; + } + pPath->zOut[pPath->nUsed++] = '/'; + memcpy(&pPath->zOut[pPath->nUsed], zName, nName); + pPath->nUsed += nName; +#if defined(HAVE_READLINK) && defined(HAVE_LSTAT) + if( pPath->rc==SQLITE_OK ){ + const char *zIn; + struct stat buf; + pPath->zOut[pPath->nUsed] = 0; + zIn = pPath->zOut; + if( osLstat(zIn, &buf)!=0 ){ + if( errno!=ENOENT ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); + } + }else if( S_ISLNK(buf.st_mode) ){ + ssize_t got; + char zLnk[SQLITE_MAX_PATHLEN+2]; + if( pPath->nSymlink++ > SQLITE_MAX_SYMLINK ){ + pPath->rc = SQLITE_CANTOPEN_BKPT; + return; + } + got = osReadlink(zIn, zLnk, sizeof(zLnk)-2); + if( got<=0 || got>=(ssize_t)sizeof(zLnk)-2 ){ + pPath->rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); + return; + } + zLnk[got] = 0; + if( zLnk[0]=='/' ){ + pPath->nUsed = 0; + }else{ + pPath->nUsed -= nName + 1; + } + appendAllPathElements(pPath, zLnk); + } + } +#endif } /* -** Convert a relative pathname into a full pathname. Also -** simplify the pathname as follows: -** -** Remove all instances of /./ -** Remove all isntances of /X/../ for any X +** Append all path elements in zPath to the DbPath under construction. */ -static int mkFullPathname( - const char *zPath, /* Input path */ - char *zOut, /* Output buffer */ - int nOut /* Allocated size of buffer zOut */ +static void appendAllPathElements( + DbPath *pPath, /* Path under construction, to which to append zName */ + const char *zPath /* Path to append to pPath. Is zero-terminated */ ){ - int nPath = sqlite3Strlen30(zPath); - int iOff = 0; - int i, j; - if( zPath[0]!='/' ){ - if( osGetcwd(zOut, nOut-2)==0 ){ - return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); + int i = 0; + int j = 0; + do{ + while( zPath[i] && zPath[i]!='/' ){ i++; } + if( i>j ){ + appendOnePathElement(pPath, &zPath[j], i-j); } - iOff = sqlite3Strlen30(zOut); - zOut[iOff++] = '/'; - } - if( (iOff+nPath+1)>nOut ){ - /* SQLite assumes that xFullPathname() nul-terminates the output buffer - ** even if it returns an error. */ - zOut[iOff] = '\0'; - return SQLITE_CANTOPEN_BKPT; - } - sqlite3_snprintf(nOut-iOff, &zOut[iOff], "%s", zPath); - - /* Remove duplicate '/' characters. Except, two // at the beginning - ** of a pathname is allowed since this is important on windows. */ - for(i=j=1; zOut[i]; i++){ - zOut[j++] = zOut[i]; - while( zOut[i]=='/' && zOut[i+1]=='/' ) i++; - } - zOut[j] = 0; - - assert( zOut[0]=='/' ); - for(i=j=0; zOut[i]; i++){ - if( zOut[i]=='/' ){ - /* Skip over internal "/." directory components */ - if( zOut[i+1]=='.' && zOut[i+2]=='/' ){ - i += 1; - continue; - } - - /* If this is a "/.." directory component then back out the - ** previous term of the directory if it is something other than "..". - */ - if( zOut[i+1]=='.' - && zOut[i+2]=='.' - && zOut[i+3]=='/' - && unixBackupDir(zOut, &j) - ){ - i += 2; - continue; - } - } - if( ALWAYS(j>=0) ) zOut[j] = zOut[i]; - j++; - } - if( NEVER(j==0) ) zOut[j++] = '/'; - zOut[j] = 0; - return SQLITE_OK; + j = i+1; + }while( zPath[i++] ); } /* @@ -41300,86 +42017,27 @@ static int unixFullPathname( int nOut, /* Size of output buffer in bytes */ char *zOut /* Output buffer */ ){ -#if !defined(HAVE_READLINK) || !defined(HAVE_LSTAT) - return mkFullPathname(zPath, zOut, nOut); -#else - int rc = SQLITE_OK; - int nByte; - int nLink = 0; /* Number of symbolic links followed so far */ - const char *zIn = zPath; /* Input path for each iteration of loop */ - char *zDel = 0; - - assert( pVfs->mxPathname==MAX_PATHNAME ); + DbPath path; UNUSED_PARAMETER(pVfs); - - /* 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 - ** function failing. This function could fail if, for example, the - ** current working directory has been unlinked. - */ - SimulateIOError( return SQLITE_ERROR ); - - do { - - /* Call stat() on path zIn. Set bLink to true if the path is a symbolic - ** link, or false otherwise. */ - int bLink = 0; - struct stat buf; - if( osLstat(zIn, &buf)!=0 ){ - if( errno!=ENOENT ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "lstat", zIn); - } - }else{ - bLink = S_ISLNK(buf.st_mode); + path.rc = 0; + path.nUsed = 0; + path.nSymlink = 0; + path.nOut = nOut; + path.zOut = zOut; + if( zPath[0]!='/' ){ + char zPwd[SQLITE_MAX_PATHLEN+2]; + if( osGetcwd(zPwd, sizeof(zPwd)-2)==0 ){ + return unixLogError(SQLITE_CANTOPEN_BKPT, "getcwd", zPath); } - - if( bLink ){ - nLink++; - if( zDel==0 ){ - zDel = sqlite3_malloc(nOut); - if( zDel==0 ) rc = SQLITE_NOMEM_BKPT; - }else if( nLink>=SQLITE_MAX_SYMLINKS ){ - rc = SQLITE_CANTOPEN_BKPT; - } - - if( rc==SQLITE_OK ){ - nByte = osReadlink(zIn, zDel, nOut-1); - if( nByte<0 ){ - rc = unixLogError(SQLITE_CANTOPEN_BKPT, "readlink", zIn); - }else{ - if( zDel[0]!='/' ){ - int n; - for(n = sqlite3Strlen30(zIn); n>0 && zIn[n-1]!='/'; n--); - if( nByte+n+1>nOut ){ - rc = SQLITE_CANTOPEN_BKPT; - }else{ - memmove(&zDel[n], zDel, nByte+1); - memcpy(zDel, zIn, n); - nByte += n; - } - } - zDel[nByte] = '\0'; - } - } - - zIn = zDel; - } - - assert( rc!=SQLITE_OK || zIn!=zOut || zIn[0]=='/' ); - if( rc==SQLITE_OK && zIn!=zOut ){ - rc = mkFullPathname(zIn, zOut, nOut); - } - if( bLink==0 ) break; - zIn = zOut; - }while( rc==SQLITE_OK ); - - sqlite3_free(zDel); - if( rc==SQLITE_OK && nLink ) rc = SQLITE_OK_SYMLINK; - return rc; -#endif /* HAVE_READLINK && HAVE_LSTAT */ + appendAllPathElements(&path, zPwd); + } + appendAllPathElements(&path, zPath); + zOut[path.nUsed] = 0; + if( path.rc || path.nUsed<2 ) return SQLITE_CANTOPEN_BKPT; + if( path.nSymlink ) return SQLITE_OK_SYMLINK; + return SQLITE_OK; } - #ifndef SQLITE_OMIT_LOAD_EXTENSION /* ** Interfaces for opening a shared library, finding entry points @@ -44839,10 +45497,12 @@ SQLITE_API int sqlite3_win32_set_directory8( const char *zValue /* New value for directory being set or reset */ ){ char **ppDirectory = 0; + int rc; #ifndef SQLITE_OMIT_AUTOINIT - int rc = sqlite3_initialize(); + rc = sqlite3_initialize(); if( rc ) return rc; #endif + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ ppDirectory = &sqlite3_data_directory; }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ @@ -44857,14 +45517,19 @@ SQLITE_API int sqlite3_win32_set_directory8( if( zValue && zValue[0] ){ zCopy = sqlite3_mprintf("%s", zValue); if ( zCopy==0 ){ - return SQLITE_NOMEM_BKPT; + rc = SQLITE_NOMEM_BKPT; + goto set_directory8_done; } } sqlite3_free(*ppDirectory); *ppDirectory = zCopy; - return SQLITE_OK; + rc = SQLITE_OK; + }else{ + rc = SQLITE_ERROR; } - return SQLITE_ERROR; +set_directory8_done: + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return rc; } /* @@ -47638,6 +48303,18 @@ static int winMakeEndInDirSep(int nBuf, char *zBuf){ return 0; } +/* +** If sqlite3_temp_directory is not, take the mutex and return true. +** +** If sqlite3_temp_directory is NULL, omit the mutex and return false. +*/ +static int winTempDirDefined(void){ + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + if( sqlite3_temp_directory!=0 ) return 1; + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); + return 0; +} + /* ** Create a temporary file name and store the resulting pointer into pzBuf. ** The pointer returned in pzBuf must be freed via sqlite3_free(). @@ -47674,20 +48351,23 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){ */ nDir = nMax - (nPre + 15); assert( nDir>0 ); - if( sqlite3_temp_directory ){ + if( winTempDirDefined() ){ int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); if( nDirLen>0 ){ if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){ nDirLen++; } if( nDirLen>nDir ){ + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); sqlite3_free(zBuf); OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n")); return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0); } sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory); } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); } + #if defined(__CYGWIN__) else{ static const char *azDirs[] = { @@ -48476,7 +49156,7 @@ static BOOL winIsVerbatimPathname( ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname ** bytes in size. */ -static int winFullPathname( +static int winFullPathnameNoMutex( sqlite3_vfs *pVfs, /* Pointer to vfs object */ const char *zRelative, /* Possibly relative input path */ int nFull, /* Size of output buffer in bytes */ @@ -48655,6 +49335,19 @@ static int winFullPathname( } #endif } +static int winFullPathname( + sqlite3_vfs *pVfs, /* Pointer to vfs object */ + const char *zRelative, /* Possibly relative input path */ + int nFull, /* Size of output buffer in bytes */ + char *zFull /* Output buffer */ +){ + int rc; + sqlite3_mutex *pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR); + sqlite3_mutex_enter(pMutex); + rc = winFullPathnameNoMutex(pVfs, zRelative, nFull, zFull); + sqlite3_mutex_leave(pMutex); + return rc; +} #ifndef SQLITE_OMIT_LOAD_EXTENSION /* @@ -50928,8 +51621,7 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){ ** make it so. */ SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){ - assert( p->nRef>0 || p->pCache->bPurgeable==0 ); - testcase( p->nRef==0 ); + assert( p->nRef>0 ); assert( sqlite3PcachePageSanity(p) ); if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/ p->flags &= ~PGHDR_DONT_WRITE; @@ -51000,14 +51692,24 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ */ SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ PCache *pCache = p->pCache; + sqlite3_pcache_page *pOther; assert( p->nRef>0 ); assert( newPgno>0 ); assert( sqlite3PcachePageSanity(p) ); pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); + pOther = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, newPgno, 0); + if( pOther ){ + PgHdr *pXPage = (PgHdr*)pOther->pExtra; + assert( pXPage->nRef==0 ); + pXPage->nRef++; + pCache->nRefSum++; + sqlite3PcacheDrop(pXPage); + } sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); p->pgno = newPgno; if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); + assert( sqlite3PcachePageSanity(p) ); } } @@ -52389,23 +53091,26 @@ static void pcache1Rekey( PCache1 *pCache = (PCache1 *)p; PgHdr1 *pPage = (PgHdr1 *)pPg; PgHdr1 **pp; - unsigned int h; + unsigned int hOld, hNew; assert( pPage->iKey==iOld ); assert( pPage->pCache==pCache ); + assert( iOld!=iNew ); /* The page number really is changing */ pcache1EnterMutex(pCache->pGroup); - h = iOld%pCache->nHash; - pp = &pCache->apHash[h]; + assert( pcache1FetchNoMutex(p, iOld, 0)==pPage ); /* pPg really is iOld */ + hOld = iOld%pCache->nHash; + pp = &pCache->apHash[hOld]; while( (*pp)!=pPage ){ pp = &(*pp)->pNext; } *pp = pPage->pNext; - h = iNew%pCache->nHash; + assert( pcache1FetchNoMutex(p, iNew, 0)==0 ); /* iNew not in cache */ + hNew = iNew%pCache->nHash; pPage->iKey = iNew; - pPage->pNext = pCache->apHash[h]; - pCache->apHash[h] = pPage; + pPage->pNext = pCache->apHash[hNew]; + pCache->apHash[hNew] = pPage; if( iNew>pCache->iMaxKey ){ pCache->iMaxKey = iNew; } @@ -53898,6 +54603,7 @@ struct Pager { u32 vfsFlags; /* Flags for sqlite3_vfs.xOpen() */ u32 sectorSize; /* Assumed sector size during rollback */ Pgno mxPgno; /* Maximum allowed size of the database */ + Pgno lckPgno; /* Page number for the locking page */ i64 pageSize; /* Number of bytes in a page */ i64 journalSizeLimit; /* Size limit for persistent journal files */ char *zFilename; /* Name of the database file */ @@ -54884,7 +55590,7 @@ static int readJournalHdr( ** journal file descriptor is advanced to the next sector boundary before ** anything is written. The format is: ** -** + 4 bytes: PAGER_MJ_PGNO. +** + 4 bytes: PAGER_SJ_PGNO. ** + N bytes: super-journal filename in utf-8. ** + 4 bytes: N (length of super-journal name in bytes, no nul-terminator). ** + 4 bytes: super-journal name checksum. @@ -54932,7 +55638,7 @@ static int writeSuperJournal(Pager *pPager, const char *zSuper){ /* Write the super-journal data to the end of the journal file. If ** an error occurs, return the error code to the caller. */ - if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_MJ_PGNO(pPager)))) + if( (0 != (rc = write32bits(pPager->jfd, iHdrOff, PAGER_SJ_PGNO(pPager)))) || (0 != (rc = sqlite3OsWrite(pPager->jfd, zSuper, nSuper, iHdrOff+4))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper, nSuper))) || (0 != (rc = write32bits(pPager->jfd, iHdrOff+4+nSuper+4, cksum))) @@ -55442,7 +56148,7 @@ static u32 pager_cksum(Pager *pPager, const u8 *aData){ ** corrupted, SQLITE_DONE is returned. Data is considered corrupted in ** two circumstances: ** -** * If the record page-number is illegal (0 or PAGER_MJ_PGNO), or +** * If the record page-number is illegal (0 or PAGER_SJ_PGNO), or ** * If the record is being rolled back from the main journal file ** and the checksum field does not match the record content. ** @@ -55502,7 +56208,7 @@ static int pager_playback_one_page( ** it could cause invalid data to be written into the journal. We need to ** detect this invalid data (with high probability) and ignore it. */ - if( pgno==0 || pgno==PAGER_MJ_PGNO(pPager) ){ + if( pgno==0 || pgno==PAGER_SJ_PGNO(pPager) ){ assert( !isSavepnt ); return SQLITE_DONE; } @@ -55839,6 +56545,7 @@ static int pager_truncate(Pager *pPager, Pgno nPage){ memset(pTmp, 0, szPage); testcase( (newSize-szPage) == currentSize ); testcase( (newSize-szPage) > currentSize ); + sqlite3OsFileControlHint(pPager->fd, SQLITE_FCNTL_SIZE_HINT, &newSize); rc = sqlite3OsWrite(pPager->fd, pTmp, szPage, newSize-szPage); } if( rc==SQLITE_OK ){ @@ -56960,6 +57667,7 @@ SQLITE_PRIVATE int sqlite3PagerSetPagesize(Pager *pPager, u32 *pPageSize, int nR pPager->pTmpSpace = pNew; pPager->dbSize = (Pgno)((nByte+pageSize-1)/pageSize); pPager->pageSize = pageSize; + pPager->lckPgno = (Pgno)(PENDING_BYTE/pageSize) + 1; }else{ sqlite3PageFree(pNew); } @@ -58729,7 +59437,7 @@ static int getPageNormal( if( pPg->pPager && !noContent ){ /* In this case the pcache already contains an initialized copy of ** the page. Return without further ado. */ - assert( pgno!=PAGER_MJ_PGNO(pPager) ); + assert( pgno!=PAGER_SJ_PGNO(pPager) ); pPager->aStat[PAGER_STAT_HIT]++; return SQLITE_OK; @@ -58740,7 +59448,7 @@ static int getPageNormal( ** (*) obsolete. Was: maximum page number is 2^31 ** (2) Never try to fetch the locking page */ - if( pgno==PAGER_MJ_PGNO(pPager) ){ + if( pgno==PAGER_SJ_PGNO(pPager) ){ rc = SQLITE_CORRUPT_BKPT; goto pager_acquire_err; } @@ -59035,6 +59743,7 @@ static int pager_open_journal(Pager *pPager){ if( rc!=SQLITE_OK ){ sqlite3BitvecDestroy(pPager->pInJournal); pPager->pInJournal = 0; + pPager->journalOff = 0; }else{ assert( pPager->eState==PAGER_WRITER_LOCKED ); pPager->eState = PAGER_WRITER_CACHEMOD; @@ -59139,7 +59848,7 @@ static SQLITE_NOINLINE int pagerAddPageToRollbackJournal(PgHdr *pPg){ /* We should never write to the journal file the page that ** contains the database locks. The following assert verifies ** that we do not. */ - assert( pPg->pgno!=PAGER_MJ_PGNO(pPager) ); + assert( pPg->pgno!=PAGER_SJ_PGNO(pPager) ); assert( pPager->journalHdr<=pPager->journalOff ); pData2 = pPg->pData; @@ -59318,7 +60027,7 @@ static SQLITE_NOINLINE int pagerWriteLargeSector(PgHdr *pPg){ Pgno pg = pg1+ii; PgHdr *pPage; if( pg==pPg->pgno || !sqlite3BitvecTest(pPager->pInJournal, pg) ){ - if( pg!=PAGER_MJ_PGNO(pPager) ){ + if( pg!=PAGER_SJ_PGNO(pPager) ){ rc = sqlite3PagerGet(pPager, pg, &pPage, 0); if( rc==SQLITE_OK ){ rc = pager_write(pPage); @@ -59796,7 +60505,7 @@ SQLITE_PRIVATE int sqlite3PagerCommitPhaseOne( ** last page is never written out to disk, leaving the database file ** undersized. Fix this now if it is the case. */ if( pPager->dbSize>pPager->dbFileSize ){ - Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_MJ_PGNO(pPager)); + Pgno nNew = pPager->dbSize - (pPager->dbSize==PAGER_SJ_PGNO(pPager)); assert( pPager->eState==PAGER_WRITER_DBMOD ); rc = pager_truncate(pPager, nNew); if( rc!=SQLITE_OK ) goto commit_phase_one_exit; @@ -60590,7 +61299,7 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){ SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){ assert( assert_pager_state(pPager) ); if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0; - if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0; + if( isOpen(pPager->jfd) && pPager->journalOff>0 ) return 0; return 1; } @@ -65425,7 +66134,7 @@ struct MemPage { u8 *aData; /* Pointer to disk image of the page data */ u8 *aDataEnd; /* One byte past the end of the entire page - not just ** the usable space, the entire page. Used to prevent - ** corruption-induced of buffer overflow. */ + ** corruption-induced buffer overflow. */ u8 *aCellIdx; /* The cell index area */ u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */ DbPage *pDbPage; /* Pager page handle */ @@ -65730,7 +66439,7 @@ struct BtCursor { /* ** The database page the PENDING_BYTE occupies. This page is never used. */ -# define PENDING_BYTE_PAGE(pBt) PAGER_MJ_PGNO(pBt) +#define PENDING_BYTE_PAGE(pBt) ((Pgno)((PENDING_BYTE/((pBt)->pageSize))+1)) /* ** These macros define the location of the pointer-map entry for a @@ -66371,7 +67080,7 @@ static int hasSharedCacheTableLock( int bSeen = 0; for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ Index *pIdx = (Index *)sqliteHashData(p); - if( pIdx->tnum==(int)iRoot ){ + if( pIdx->tnum==iRoot ){ if( bSeen ){ /* Two or more indexes share the same root page. There must ** be imposter tables. So just return true. The assert is not @@ -66964,7 +67673,7 @@ SQLITE_PRIVATE void sqlite3BtreeClearCursor(BtCursor *pCur){ /* ** In this version of BtreeMoveto, pKey is a packed index record ** such as is generated by the OP_MakeRecord opcode. Unpack the -** record and then call BtreeMovetoUnpacked() to do the work. +** record and then call sqlite3BtreeIndexMoveto() to do the work. */ static int btreeMoveto( BtCursor *pCur, /* Cursor open on the btree to be searched */ @@ -67484,6 +68193,7 @@ static void btreeParseCell( ** the space used by the cell pointer. ** ** cellSizePtrNoPayload() => table internal nodes +** cellSizePtrTableLeaf() => table leaf nodes ** cellSizePtr() => all index nodes & table leaf nodes */ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ @@ -67509,13 +68219,6 @@ static u16 cellSizePtr(MemPage *pPage, u8 *pCell){ }while( *(pIter)>=0x80 && pIterintKey ){ - /* pIter now points at the 64-bit integer key value, a variable length - ** integer. The following block moves pIter to point at the first byte - ** past the end of the key value. */ - pEnd = &pIter[9]; - while( (*pIter++)&0x80 && pItermaxLocal ); testcase( nSize==(u32)pPage->maxLocal+1 ); if( nSize<=pPage->maxLocal ){ @@ -67555,6 +68258,58 @@ static u16 cellSizePtrNoPayload(MemPage *pPage, u8 *pCell){ assert( debuginfo.nSize==(u16)(pIter - pCell) || CORRUPT_DB ); return (u16)(pIter - pCell); } +static u16 cellSizePtrTableLeaf(MemPage *pPage, u8 *pCell){ + u8 *pIter = pCell; /* For looping over bytes of pCell */ + u8 *pEnd; /* End mark for a varint */ + u32 nSize; /* Size value to return */ + +#ifdef SQLITE_DEBUG + /* The value returned by this function should always be the same as + ** the (CellInfo.nSize) value found by doing a full parse of the + ** cell. If SQLITE_DEBUG is defined, an assert() at the bottom of + ** this function verifies that this invariant is not violated. */ + CellInfo debuginfo; + pPage->xParseCell(pPage, pCell, &debuginfo); +#endif + + nSize = *pIter; + if( nSize>=0x80 ){ + pEnd = &pIter[8]; + nSize &= 0x7f; + do{ + nSize = (nSize<<7) | (*++pIter & 0x7f); + }while( *(pIter)>=0x80 && pItermaxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize<=pPage->maxLocal ){ + nSize += (u32)(pIter - pCell); + if( nSize<4 ) nSize = 4; + }else{ + int minLocal = pPage->minLocal; + nSize = minLocal + (nSize - minLocal) % (pPage->pBt->usableSize - 4); + testcase( nSize==pPage->maxLocal ); + testcase( nSize==(u32)pPage->maxLocal+1 ); + if( nSize>pPage->maxLocal ){ + nSize = minLocal; + } + nSize += 4 + (u16)(pIter - pCell); + } + assert( nSize==debuginfo.nSize || CORRUPT_DB ); + return (u16)nSize; +} #ifdef SQLITE_DEBUG @@ -67568,7 +68323,7 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* ** The cell pCell is currently part of page pSrc but will ultimately be part -** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** of pPage. (pSrc and pPage are often the same.) If pCell contains a ** pointer to an overflow page, insert an entry into the pointer-map for ** the overflow page that will be valid after pCell has been moved to pPage. */ @@ -67659,7 +68414,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; - }else if( NEVER(iFree+sz>usableSize) ){ + }else if( iFree+sz>usableSize ){ return SQLITE_CORRUPT_PAGE(pPage); } @@ -67743,7 +68498,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ const int hdr = pPg->hdrOffset; /* Offset to page header */ u8 * const aData = pPg->aData; /* Page data */ int iAddr = hdr + 1; /* Address of ptr to pc */ - int pc = get2byte(&aData[iAddr]); /* Address of a free slot */ + u8 *pTmp = &aData[iAddr]; /* Temporary ptr into aData[] */ + int pc = get2byte(pTmp); /* Address of a free slot */ int x; /* Excess size of the slot */ int maxPC = pPg->pBt->usableSize - nByte; /* Max address for a usable slot */ int size; /* Size of the free slot */ @@ -67753,7 +68509,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ /* EVIDENCE-OF: R-22710-53328 The third and fourth bytes of each ** freeblock form a big-endian integer which is the size of the freeblock ** in bytes, including the 4-byte header. */ - size = get2byte(&aData[pc+2]); + pTmp = &aData[pc+2]; + size = get2byte(pTmp); if( (x = size - nByte)>=0 ){ testcase( x==4 ); testcase( x==3 ); @@ -67780,7 +68537,8 @@ static u8 *pageFindSlot(MemPage *pPg, int nByte, int *pRc){ return &aData[pc + x]; } iAddr = pc; - pc = get2byte(&aData[pc]); + pTmp = &aData[pc]; + pc = get2byte(pTmp); if( pc<=iAddr+size ){ if( pc ){ /* The next slot in the chain is not past the end of the current slot */ @@ -67814,6 +68572,7 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ u8 * const data = pPage->aData; /* Local cache of pPage->aData */ int top; /* First byte of cell content area */ int rc = SQLITE_OK; /* Integer return code */ + u8 *pTmp; /* Temp ptr into data[] */ int gap; /* First byte of gap between cell pointers and cell content */ assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -67832,7 +68591,8 @@ static int allocateSpace(MemPage *pPage, int nByte, int *pIdx){ ** then the cell content offset of an empty page wants to be 65536. ** However, that integer is too large to be stored in a 2-byte unsigned ** integer, so a value of 0 is used in its place. */ - top = get2byte(&data[hdr+5]); + pTmp = &data[hdr+5]; + top = get2byte(pTmp); assert( top<=(int)pPage->pBt->usableSize ); /* by btreeComputeFreeSpace() */ if( gap>top ){ if( top==0 && pPage->pBt->usableSize==65536 ){ @@ -67914,6 +68674,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ u16 x; /* Offset to cell content area */ u32 iEnd = iStart + iSize; /* First byte past the iStart buffer */ unsigned char *data = pPage->aData; /* Page content */ + u8 *pTmp; /* Temporary ptr into data[] */ assert( pPage->pBt!=0 ); assert( sqlite3PagerIswriteable(pPage->pDbPage) ); @@ -67976,7 +68737,8 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ if( nFrag>data[hdr+7] ) return SQLITE_CORRUPT_PAGE(pPage); data[hdr+7] -= nFrag; } - x = get2byte(&data[hdr+5]); + pTmp = &data[hdr+5]; + x = get2byte(pTmp); if( iStart<=x ){ /* The new freeblock is at the beginning of the cell content area, ** so just extend the cell content area rather than create another @@ -68020,7 +68782,6 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->leaf = (u8)(flagByte>>3); assert( PTF_LEAF == 1<<3 ); flagByte &= ~PTF_LEAF; pPage->childPtrSize = 4-4*pPage->leaf; - pPage->xCellSize = cellSizePtr; pBt = pPage->pBt; if( flagByte==(PTF_LEAFDATA | PTF_INTKEY) ){ /* EVIDENCE-OF: R-07291-35328 A value of 5 (0x05) means the page is an @@ -68032,6 +68793,7 @@ static int decodeFlags(MemPage *pPage, int flagByte){ pPage->intKey = 1; if( pPage->leaf ){ pPage->intKeyLeaf = 1; + pPage->xCellSize = cellSizePtrTableLeaf; pPage->xParseCell = btreeParseCellPtr; }else{ pPage->intKeyLeaf = 0; @@ -68049,12 +68811,17 @@ static int decodeFlags(MemPage *pPage, int flagByte){ assert( (PTF_ZERODATA|PTF_LEAF)==10 ); pPage->intKey = 0; pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; pPage->xParseCell = btreeParseCellPtrIndex; pPage->maxLocal = pBt->maxLocal; pPage->minLocal = pBt->minLocal; }else{ /* EVIDENCE-OF: R-47608-56469 Any other value for the b-tree page type is ** an error. */ + pPage->intKey = 0; + pPage->intKeyLeaf = 0; + pPage->xCellSize = cellSizePtr; + pPage->xParseCell = btreeParseCellPtrIndex; return SQLITE_CORRUPT_PAGE(pPage); } pPage->max1bytePayload = pBt->max1bytePayload; @@ -68408,7 +69175,9 @@ getAndInitPage_error1: pCur->pPage = pCur->apPage[pCur->iPage]; } testcase( pgno==0 ); - assert( pgno!=0 || rc==SQLITE_CORRUPT ); + assert( pgno!=0 || rc==SQLITE_CORRUPT + || rc==SQLITE_IOERR_NOMEM + || rc==SQLITE_NOMEM ); return rc; } @@ -70030,12 +70799,17 @@ static int incrVacuumStep(BtShared *pBt, Pgno nFin, Pgno iLastPg, int bCommit){ } do { MemPage *pFreePg; + Pgno dbSize = btreePagecount(pBt); rc = allocateBtreePage(pBt, &pFreePg, &iFreePg, iNear, eMode); if( rc!=SQLITE_OK ){ releasePage(pLastPg); return rc; } releasePage(pFreePg); + if( iFreePg>dbSize ){ + releasePage(pLastPg); + return SQLITE_CORRUPT_BKPT; + } }while( bCommit && iFreePg>nFin ); assert( iFreePgpPage; + int c; + int nCell; /* Size of the pCell cell in bytes */ + u8 *pCell = findCellPastPtr(pPage, idx); + + nCell = pCell[0]; + if( nCell<=pPage->max1bytePayload ){ + /* 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 = xRecordCompare(nCell, (void*)&pCell[1], pIdxKey); + }else if( !(pCell[1] & 0x80) + && (nCell = ((nCell&0x7f)<<7) + pCell[1])<=pPage->maxLocal + ){ + /* 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 = xRecordCompare(nCell, (void*)&pCell[2], pIdxKey); + }else{ + /* If the record extends into overflow pages, do not attempt + ** the optimization. */ + c = 99; + } + return c; +} + +/* +** Return true (non-zero) if pCur is current pointing to the last +** page of a table. +*/ +static int cursorOnLastPage(BtCursor *pCur){ + int i; + assert( pCur->eState==CURSOR_VALID ); + for(i=0; iiPage; i++){ + MemPage *pPage = pCur->apPage[i]; + if( pCur->aiIdx[i]nCell ) return 0; + } + return 1; +} + /* Move the cursor so that it points to an entry in an index table ** near the key pIdxKey. Return a success code. ** @@ -71847,6 +72684,43 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( || pIdxKey->default_rc==-1 ); + + /* Check to see if we can skip a lot of work. Two cases: + ** + ** (1) If the cursor is already pointing to the very last cell + ** in the table and the pIdxKey search key is greater than or + ** equal to that last cell, then no movement is required. + ** + ** (2) If the cursor is on the last page of the table and the first + ** cell on that last page is less than or equal to the pIdxKey + ** search key, then we can start the search on the current page + ** without needing to go back to root. + */ + if( pCur->eState==CURSOR_VALID + && pCur->pPage->leaf + && cursorOnLastPage(pCur) + ){ + int c; + if( pCur->ix==pCur->pPage->nCell-1 + && (c = indexCellCompare(pCur, pCur->ix, pIdxKey, xRecordCompare))<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + *pRes = c; + return SQLITE_OK; /* Cursor already pointing at the correct spot */ + } + if( pCur->iPage>0 + && indexCellCompare(pCur, 0, pIdxKey, xRecordCompare)<=0 + && pIdxKey->errCode==SQLITE_OK + ){ + pCur->curFlags &= ~BTCF_ValidOvfl; + if( !pCur->pPage->isInit ){ + return SQLITE_CORRUPT_BKPT; + } + goto bypass_moveto_root; /* Start search on the current page */ + } + pIdxKey->errCode = SQLITE_OK; + } + rc = moveToRoot(pCur); if( rc ){ if( rc==SQLITE_EMPTY ){ @@ -71856,12 +72730,14 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( } return rc; } + +bypass_moveto_root: assert( pCur->pPage ); assert( pCur->pPage->isInit ); assert( pCur->eState==CURSOR_VALID ); assert( pCur->pPage->nCell > 0 ); - assert( pCur->iPage==0 || pCur->apPage[0]->intKey==pCur->curIntKey ); - assert( pCur->curIntKey || pIdxKey ); + assert( pCur->curIntKey==0 ); + assert( pIdxKey!=0 ); for(;;){ int lwr, upr, idx, c; Pgno chldPg; @@ -71875,7 +72751,7 @@ SQLITE_PRIVATE int sqlite3BtreeIndexMoveto( ** be the right kind (index or table) of b-tree page. Otherwise ** a moveToChild() or moveToRoot() call would have detected corruption. */ assert( pPage->nCell>0 ); - assert( pPage->intKey==(pIdxKey==0) ); + assert( pPage->intKey==0 ); lwr = 0; upr = pPage->nCell-1; idx = upr>>1; /* idx = (lwr+upr)/2; */ @@ -73894,8 +74770,6 @@ static int balance_nonroot( Pgno pgno; /* Temp var to store a page number in */ u8 abDone[NB+2]; /* True after i'th new page is populated */ Pgno aPgno[NB+2]; /* Page numbers of new pages before shuffling */ - Pgno aPgOrder[NB+2]; /* Copy of aPgno[] used for sorting pages */ - u16 aPgFlags[NB+2]; /* flags field of new pages before shuffling */ CellArray b; /* Parsed information on cells being balanced */ memset(abDone, 0, sizeof(abDone)); @@ -74319,42 +75193,39 @@ static int balance_nonroot( ** of the table is closer to a linear scan through the file. That in turn ** helps the operating system to deliver pages from the disk more rapidly. ** - ** An O(n^2) insertion sort algorithm is used, but since n is never more - ** than (NB+2) (a small constant), that should not be a problem. + ** An O(N*N) sort algorithm is used, but since N is never more than NB+2 + ** (5), that is not a performance concern. ** ** When NB==3, this one optimization makes the database about 25% faster ** for large insertions and deletions. */ for(i=0; ipgno; - aPgFlags[i] = apNew[i]->pDbPage->flags; - for(j=0; jpgno; + assert( apNew[i]->pDbPage->flags & PGHDR_WRITEABLE ); + assert( apNew[i]->pDbPage->flags & PGHDR_DIRTY ); } - for(i=0; ipgno < apNew[iB]->pgno ) iB = j; } - pgno = aPgOrder[iBest]; - aPgOrder[iBest] = 0xffffffff; - if( iBest!=i ){ - if( iBest>i ){ - sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); - } - sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); - apNew[i]->pgno = pgno; + + /* If apNew[i] has a page number that is bigger than any of the + ** subsequence apNew[i] entries, then swap apNew[i] with the subsequent + ** entry that has the smallest page number (which we know to be + ** entry apNew[iB]). + */ + if( iB!=i ){ + Pgno pgnoA = apNew[i]->pgno; + Pgno pgnoB = apNew[iB]->pgno; + Pgno pgnoTemp = (PENDING_BYTE/pBt->pageSize)+1; + u16 fgA = apNew[i]->pDbPage->flags; + u16 fgB = apNew[iB]->pDbPage->flags; + sqlite3PagerRekey(apNew[i]->pDbPage, pgnoTemp, fgB); + sqlite3PagerRekey(apNew[iB]->pDbPage, pgnoA, fgA); + sqlite3PagerRekey(apNew[i]->pDbPage, pgnoB, fgB); + apNew[i]->pgno = pgnoB; + apNew[iB]->pgno = pgnoA; } } @@ -74742,7 +75613,6 @@ static int anotherValidCursor(BtCursor *pCur){ */ static int balance(BtCursor *pCur){ int rc = SQLITE_OK; - const int nMin = pCur->pBt->usableSize * 2 / 3; u8 aBalanceQuickSpace[13]; u8 *pFree = 0; @@ -74754,7 +75624,11 @@ static int balance(BtCursor *pCur){ MemPage *pPage = pCur->pPage; if( NEVER(pPage->nFree<0) && btreeComputeFreeSpace(pPage) ) break; - if( pPage->nOverflow==0 && pPage->nFree<=nMin ){ + if( pPage->nOverflow==0 && pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* No rebalance required as long as: + ** (1) There are no overflow cells + ** (2) The amount of free space on the page is less than 2/3rds of + ** the total usable space on the page. */ break; }else if( (iPage = pCur->iPage)==0 ){ if( pPage->nOverflow && (rc = anotherValidCursor(pCur))==SQLITE_OK ){ @@ -74974,7 +75848,7 @@ static int btreeOverwriteCell(BtCursor *pCur, const BtreePayload *pX){ ** pX.pData,nData,nZero fields must be zero. ** ** If the seekResult parameter is non-zero, then a successful call to -** MovetoUnpacked() to seek cursor pCur to (pKey,nKey) has already +** sqlite3BtreeIndexMoveto() to seek cursor pCur to (pKey,nKey) has already ** been performed. In other words, if seekResult!=0 then the cursor ** is currently pointing to a cell that will be adjacent to the cell ** to be inserted. If seekResult<0 then pCur points to a cell that is @@ -74992,7 +75866,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( BtCursor *pCur, /* Insert data into the table of this cursor */ const BtreePayload *pX, /* Content of the row to be inserted */ int flags, /* True if this is likely an append */ - int seekResult /* Result of prior MovetoUnpacked() call */ + int seekResult /* Result of prior IndexMoveto() call */ ){ int rc; int loc = seekResult; /* -1: before desired location +1: after */ @@ -75031,7 +75905,12 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( } } + /* Ensure that the cursor is not in the CURSOR_FAULT state and that it + ** points to a valid cell. + */ if( pCur->eState>=CURSOR_REQUIRESEEK ){ + testcase( pCur->eState==CURSOR_REQUIRESEEK ); + testcase( pCur->eState==CURSOR_FAULT ); rc = moveToRoot(pCur); if( rc && rc!=SQLITE_EMPTY ) return rc; } @@ -75143,7 +76022,8 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) ); assert( pPage->leaf || !pPage->intKey ); if( pPage->nFree<0 ){ - if( pCur->eState>CURSOR_INVALID ){ + if( NEVER(pCur->eState>CURSOR_INVALID) ){ + /* ^^^^^--- due to the moveToRoot() call above */ rc = SQLITE_CORRUPT_BKPT; }else{ rc = btreeComputeFreeSpace(pPage); @@ -75154,7 +76034,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert( TRACE(("INSERT: table=%d nkey=%lld ndata=%d page=%d %s\n", pCur->pgnoRoot, pX->nKey, pX->nData, pPage->pgno, loc==0 ? "overwrite" : "new entry")); - assert( pPage->isInit ); + assert( pPage->isInit || CORRUPT_DB ); newCell = pBt->pTmpSpace; assert( newCell!=0 ); if( flags & BTREE_PREFORMAT ){ @@ -75305,7 +76185,11 @@ SQLITE_PRIVATE int sqlite3BtreeTransferRow(BtCursor *pDest, BtCursor *pSrc, i64 u32 nRem; /* Bytes of data still to copy */ getCellInfo(pSrc); - aOut += putVarint32(aOut, pSrc->info.nPayload); + if( pSrc->info.nPayload<0x80 ){ + *(aOut++) = pSrc->info.nPayload; + }else{ + aOut += sqlite3PutVarint(aOut, pSrc->info.nPayload); + } if( pDest->pKeyInfo==0 ) aOut += putVarint(aOut, iKey); nIn = pSrc->info.nLocal; aIn = pSrc->info.pPayload; @@ -75465,7 +76349,8 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ bPreserve = (flags & BTREE_SAVEPOSITION)!=0; if( bPreserve ){ if( !pPage->leaf - || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || (pPage->nFree+pPage->xCellSize(pPage,pCell)+2) > + (int)(pBt->usableSize*2/3) || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. @@ -75561,7 +76446,15 @@ SQLITE_PRIVATE int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ ** been corrected, so be it. Otherwise, after balancing the leaf node, ** walk the cursor up the tree to the internal node and balance it as ** well. */ - rc = balance(pCur); + assert( pCur->pPage->nOverflow==0 ); + assert( pCur->pPage->nFree>=0 ); + if( pCur->pPage->nFree*3<=(int)pCur->pBt->usableSize*2 ){ + /* Optimization: If the free space is less than 2/3rds of the page, + ** then balance() will always be a no-op. No need to invoke it. */ + rc = SQLITE_OK; + }else{ + rc = balance(pCur); + } if( rc==SQLITE_OK && pCur->iPage>iCellDepth ){ releasePageNotNull(pCur->pPage); pCur->iPage--; @@ -78309,9 +79202,10 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ Mem t; assert( pFunc!=0 ); assert( pMem!=0 ); + assert( pMem->db!=0 ); assert( pFunc->xFinalize!=0 ); assert( (pMem->flags & MEM_Null)!=0 || pFunc==pMem->u.pDef ); - assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); + assert( sqlite3_mutex_held(pMem->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); memset(&t, 0, sizeof(t)); t.flags = MEM_Null; @@ -78319,6 +79213,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemFinalize(Mem *pMem, FuncDef *pFunc){ ctx.pOut = &t; ctx.pMem = pMem; ctx.pFunc = pFunc; + ctx.enc = ENC(t.db); pFunc->xFinalize(&ctx); /* IMP: R-24505-23230 */ assert( (pMem->flags & MEM_Dyn)==0 ); if( pMem->szMalloc>0 ) sqlite3DbFreeNN(pMem->db, pMem->zMalloc); @@ -78340,12 +79235,14 @@ SQLITE_PRIVATE int sqlite3VdbeMemAggValue(Mem *pAccum, Mem *pOut, FuncDef *pFunc assert( pFunc!=0 ); assert( pFunc->xValue!=0 ); assert( (pAccum->flags & MEM_Null)!=0 || pFunc==pAccum->u.pDef ); - assert( pAccum->db==0 || sqlite3_mutex_held(pAccum->db->mutex) ); + assert( pAccum->db!=0 ); + assert( sqlite3_mutex_held(pAccum->db->mutex) ); memset(&ctx, 0, sizeof(ctx)); sqlite3VdbeMemSetNull(pOut); ctx.pOut = pOut; ctx.pMem = pAccum; ctx.pFunc = pFunc; + ctx.enc = ENC(pAccum->db); pFunc->xValue(&ctx); return ctx.isError; } @@ -78411,6 +79308,14 @@ SQLITE_PRIVATE void sqlite3VdbeMemRelease(Mem *p){ } } +/* Like sqlite3VdbeMemRelease() but faster for cases where we +** know in advance that the Mem is not MEM_Dyn or MEM_Agg. +*/ +SQLITE_PRIVATE void sqlite3VdbeMemReleaseMalloc(Mem *p){ + assert( !VdbeMemDynamic(p) ); + if( p->szMalloc ) vdbeMemClear(p); +} + /* ** Convert a 64-bit IEEE double into a 64-bit signed integer. ** If the double is out of range of a 64-bit signed integer then @@ -78955,6 +79860,13 @@ SQLITE_PRIVATE void sqlite3VdbeMemMove(Mem *pTo, Mem *pFrom){ ** stored without allocating memory, then it is. If a memory allocation ** is required to store the string, then value of pMem is unchanged. In ** either case, SQLITE_TOOBIG is returned. +** +** The "enc" parameter is the text encoding for the string, or zero +** to store a blob. +** +** If n is negative, then the string consists of all bytes up to but +** excluding the first zero character. The n parameter must be +** non-negative for blobs. */ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( Mem *pMem, /* Memory cell to set to string value */ @@ -78965,11 +79877,12 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( ){ i64 nByte = n; /* New value for pMem->n */ int iLimit; /* Maximum allowed string or blob size */ - u16 flags = 0; /* New value for pMem->flags */ + u16 flags; /* New value for pMem->flags */ assert( pMem!=0 ); assert( pMem->db==0 || sqlite3_mutex_held(pMem->db->mutex) ); assert( !sqlite3VdbeMemIsRowSet(pMem) ); + assert( enc!=0 || n>=0 ); /* If z is a NULL pointer, set pMem to contain an SQL NULL. */ if( !z ){ @@ -78982,7 +79895,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( }else{ iLimit = SQLITE_MAX_LENGTH; } - flags = (enc==0?MEM_Blob:MEM_Str); if( nByte<0 ){ assert( enc!=0 ); if( enc==SQLITE_UTF8 ){ @@ -78990,7 +79902,23 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( }else{ for(nByte=0; nByte<=iLimit && (z[nByte] | z[nByte+1]); nByte+=2){} } - flags |= MEM_Term; + flags= MEM_Str|MEM_Term; + }else if( enc==0 ){ + flags = MEM_Blob; + enc = SQLITE_UTF8; + }else{ + flags = MEM_Str; + } + if( nByte>iLimit ){ + if( xDel && xDel!=SQLITE_TRANSIENT ){ + if( xDel==SQLITE_DYNAMIC ){ + sqlite3DbFree(pMem->db, (void*)z); + }else{ + xDel((void*)z); + } + } + sqlite3VdbeMemSetNull(pMem); + return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); } /* The following block sets the new values of Mem.z and Mem.xDel. It @@ -79002,9 +79930,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( if( flags&MEM_Term ){ nAlloc += (enc==SQLITE_UTF8?1:2); } - if( nByte>iLimit ){ - return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); - } testcase( nAlloc==0 ); testcase( nAlloc==31 ); testcase( nAlloc==32 ); @@ -79026,16 +79951,7 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( pMem->n = (int)(nByte & 0x7fffffff); pMem->flags = flags; - if( enc ){ - pMem->enc = enc; -#ifdef SQLITE_ENABLE_SESSION - }else if( pMem->db==0 ){ - pMem->enc = SQLITE_UTF8; -#endif - }else{ - assert( pMem->db!=0 ); - pMem->enc = ENC(pMem->db); - } + pMem->enc = enc; #ifndef SQLITE_OMIT_UTF16 if( enc>SQLITE_UTF8 && sqlite3VdbeMemHandleBom(pMem) ){ @@ -79043,9 +79959,6 @@ SQLITE_PRIVATE int sqlite3VdbeMemSetStr( } #endif - if( nByte>iLimit ){ - return sqlite3ErrorToParser(pMem->db, SQLITE_TOOBIG); - } return SQLITE_OK; } @@ -79323,10 +80236,12 @@ static int valueFromFunction( goto value_from_function_out; } - assert( pCtx->pParse->rc==SQLITE_OK ); + testcase( pCtx->pParse->rc==SQLITE_ERROR ); + testcase( pCtx->pParse->rc==SQLITE_OK ); memset(&ctx, 0, sizeof(ctx)); ctx.pOut = pVal; ctx.pFunc = pFunc; + ctx.enc = ENC(db); pFunc->xSFunc(&ctx, nVal, apVal); if( ctx.isError ){ rc = ctx.isError; @@ -79402,8 +80317,8 @@ static int valueFromExpr( rc = valueFromExpr(db, pExpr->pLeft, enc, aff, ppVal, pCtx); testcase( rc!=SQLITE_OK ); if( *ppVal ){ - sqlite3VdbeMemCast(*ppVal, aff, SQLITE_UTF8); - sqlite3ValueApplyAffinity(*ppVal, affinity, SQLITE_UTF8); + sqlite3VdbeMemCast(*ppVal, aff, enc); + sqlite3ValueApplyAffinity(*ppVal, affinity, enc); } return rc; } @@ -79837,7 +80752,7 @@ SQLITE_PRIVATE Vdbe *sqlite3VdbeCreate(Parse *pParse){ p->pNext = db->pVdbe; p->pPrev = 0; db->pVdbe = p; - p->iVdbeMagic = VDBE_MAGIC_INIT; + assert( p->eVdbeState==VDBE_INIT_STATE ); p->pParse = pParse; pParse->pVdbe = p; assert( pParse->aLabel==0 ); @@ -79982,7 +80897,7 @@ static int growOpArray(Vdbe *v, int nOp){ return SQLITE_NOMEM; } - assert( nOp<=(1024/sizeof(Op)) ); + assert( nOp<=(int)(1024/sizeof(Op)) ); assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ @@ -80038,7 +80953,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ VdbeOp *pOp; i = p->nOp; - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( op>=0 && op<0xff ); if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); @@ -80183,6 +81098,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall( addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function, p1, p2, p3, (char*)pCtx, P4_FUNCCTX); sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef); + sqlite3MayAbort(pParse); return addr; } @@ -80370,7 +81286,7 @@ static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); - assert( v->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( v->eVdbeState==VDBE_INIT_STATE ); assert( j<-p->nLabel ); assert( j>=0 ); #ifdef SQLITE_DEBUG @@ -80390,14 +81306,20 @@ SQLITE_PRIVATE void sqlite3VdbeResolveLabel(Vdbe *v, int x){ ** Mark the VDBE as one that can only be run one time. */ SQLITE_PRIVATE void sqlite3VdbeRunOnlyOnce(Vdbe *p){ - p->runOnlyOnce = 1; + sqlite3VdbeAddOp2(p, OP_Expire, 1, 1); } /* -** Mark the VDBE as one that can only be run multiple times. +** Mark the VDBE as one that can be run multiple times. */ SQLITE_PRIVATE void sqlite3VdbeReusable(Vdbe *p){ - p->runOnlyOnce = 0; + int i; + for(i=1; ALWAYS(inOp); i++){ + if( ALWAYS(p->aOp[i].opcode==OP_Expire) ){ + p->aOp[1].opcode = OP_Noop; + break; + } + } } #ifdef SQLITE_DEBUG /* sqlite3AssertMayAbort() logic */ @@ -80501,6 +81423,8 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ int hasInitCoroutine = 0; Op *pOp; VdbeOpIter sIter; + + if( v==0 ) return 0; memset(&sIter, 0, sizeof(sIter)); sIter.v = v; @@ -80510,6 +81434,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ || opcode==OP_VDestroy || opcode==OP_VCreate || opcode==OP_ParseSchema + || opcode==OP_Function || opcode==OP_PureFunc || ((opcode==OP_Halt || opcode==OP_HaltIfNull) && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ @@ -80584,7 +81509,7 @@ SQLITE_PRIVATE void sqlite3VdbeAssertAbortable(Vdbe *p){ ** (3) Update the Vdbe.readOnly and Vdbe.bIsReader flags to accurately ** indicate what the prepared statement actually does. ** -** (4) Initialize the p4.xAdvance pointer on opcodes that use it. +** (4) (discontinued) ** ** (5) Reclaim the memory allocated for storing labels. ** @@ -80630,25 +81555,6 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ p->bIsReader = 1; break; } - case OP_Next: - case OP_SorterNext: { - pOp->p4.xAdvance = sqlite3BtreeNext; - pOp->p4type = P4_ADVANCE; - /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a - ** known address */ - assert( pOp->p2>=0 ); - break; - } - case OP_Prev: { - pOp->p4.xAdvance = sqlite3BtreePrevious; - pOp->p4type = P4_ADVANCE; - /* The code generator never codes any of these opcodes as a jump - ** to a label. They are always coded as a jump backwards to a - ** known address */ - assert( pOp->p2>=0 ); - break; - } #ifndef SQLITE_OMIT_VIRTUALTABLE case OP_VUpdate: { if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; @@ -80684,18 +81590,104 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ if( pOp==p->aOp ) break; pOp--; } - sqlite3DbFree(p->db, pParse->aLabel); - pParse->aLabel = 0; + if( aLabel ){ + sqlite3DbFreeNN(p->db, pParse->aLabel); + pParse->aLabel = 0; + } pParse->nLabel = 0; *pMaxFuncArgs = nMaxArgs; assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); } +#ifdef SQLITE_DEBUG +/* +** Check to see if a subroutine contains a jump to a location outside of +** the subroutine. If a jump outside the subroutine is detected, add code +** that will cause the program to halt with an error message. +** +** The subroutine consists of opcodes between iFirst and iLast. Jumps to +** locations within the subroutine are acceptable. iRetReg is a register +** that contains the return address. Jumps to outside the range of iFirst +** through iLast are also acceptable as long as the jump destination is +** an OP_Return to iReturnAddr. +** +** A jump to an unresolved label means that the jump destination will be +** beyond the current address. That is normally a jump to an early +** termination and is consider acceptable. +** +** This routine only runs during debug builds. The purpose is (of course) +** to detect invalid escapes out of a subroutine. The OP_Halt opcode +** is generated rather than an assert() or other error, so that ".eqp full" +** will still work to show the original bytecode, to aid in debugging. +*/ +SQLITE_PRIVATE void sqlite3VdbeNoJumpsOutsideSubrtn( + Vdbe *v, /* The byte-code program under construction */ + int iFirst, /* First opcode of the subroutine */ + int iLast, /* Last opcode of the subroutine */ + int iRetReg /* Subroutine return address register */ +){ + VdbeOp *pOp; + Parse *pParse; + int i; + sqlite3_str *pErr = 0; + assert( v!=0 ); + pParse = v->pParse; + assert( pParse!=0 ); + if( pParse->nErr ) return; + assert( iLast>=iFirst ); + assert( iLastnOp ); + pOp = &v->aOp[iFirst]; + for(i=iFirst; i<=iLast; i++, pOp++){ + if( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ){ + int iDest = pOp->p2; /* Jump destination */ + if( iDest==0 ) continue; + if( pOp->opcode==OP_Gosub ) continue; + if( iDest<0 ){ + int j = ADDR(iDest); + assert( j>=0 ); + if( j>=-pParse->nLabel || pParse->aLabel[j]<0 ){ + continue; + } + iDest = pParse->aLabel[j]; + } + if( iDestiLast ){ + int j = iDest; + for(; jnOp; j++){ + VdbeOp *pX = &v->aOp[j]; + if( pX->opcode==OP_Return ){ + if( pX->p1==iRetReg ) break; + continue; + } + if( pX->opcode==OP_Noop ) continue; + if( pX->opcode==OP_Explain ) continue; + if( pErr==0 ){ + pErr = sqlite3_str_new(0); + }else{ + sqlite3_str_appendchar(pErr, 1, '\n'); + } + sqlite3_str_appendf(pErr, + "Opcode at %d jumps to %d which is outside the " + "subroutine at %d..%d", + i, iDest, iFirst, iLast); + break; + } + } + } + } + if( pErr ){ + char *zErr = sqlite3_str_finish(pErr); + sqlite3VdbeAddOp4(v, OP_Halt, SQLITE_INTERNAL, OE_Abort, 0, zErr, 0); + sqlite3_free(zErr); + sqlite3MayAbort(pParse); + } +} +#endif /* SQLITE_DEBUG */ + /* ** Return the address of the next instruction to be inserted. */ SQLITE_PRIVATE int sqlite3VdbeCurrentAddr(Vdbe *p){ - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); return p->nOp; } @@ -80780,7 +81772,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeAddOpList( int i; VdbeOp *pOut, *pFirst; assert( nOp>0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } @@ -80932,7 +81924,6 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ case P4_REAL: case P4_INT64: case P4_DYNAMIC: - case P4_DYNBLOB: case P4_INTARRAY: { sqlite3DbFree(db, p4); break; @@ -80972,13 +81963,16 @@ static void freeP4(sqlite3 *db, int p4type, void *p4){ ** nOp entries. */ static void vdbeFreeOpArray(sqlite3 *db, Op *aOp, int nOp){ + assert( nOp>=0 ); if( aOp ){ - Op *pOp; - for(pOp=&aOp[nOp-1]; pOp>=aOp; pOp--){ + Op *pOp = &aOp[nOp-1]; + while(1){ /* Exit via break */ if( pOp->p4type <= P4_FREE_IF_LE ) freeP4(db, pOp->p4type, pOp->p4.p); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS sqlite3DbFree(db, pOp->zComment); #endif + if( pOp==aOp ) break; + pOp--; } sqlite3DbFreeNN(db, aOp); } @@ -81040,7 +82034,7 @@ SQLITE_PRIVATE void sqlite3VdbeReleaseRegisters( u32 mask, /* Mask of registers to NOT release */ int bUndefine /* If true, mark registers as undefined */ ){ - if( N==0 ) return; + if( N==0 || OptimizationDisabled(pParse->db, SQLITE_ReleaseReg) ) return; assert( pParse->pVdbe ); assert( iFirst>=1 ); assert( iFirst+N-1<=pParse->nMem ); @@ -81104,7 +82098,7 @@ SQLITE_PRIVATE void sqlite3VdbeChangeP4(Vdbe *p, int addr, const char *zP4, int sqlite3 *db; assert( p!=0 ); db = p->db; - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( p->aOp!=0 || db->mallocFailed ); if( db->mallocFailed ){ if( n!=P4_VTAB ) freeP4(db, n, (void*)*(char**)&zP4); @@ -81232,7 +82226,7 @@ SQLITE_PRIVATE VdbeOp *sqlite3VdbeGetOp(Vdbe *p, int addr){ /* C89 specifies that the constant "dummy" will be initialized to all ** zeros, which is correct. MSVC generates a warning, nevertheless. */ static VdbeOp dummy; /* Ignore the MSVC warning about no initializer */ - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); if( addr<0 ){ addr = p->nOp - 1; } @@ -81299,8 +82293,11 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayComment( if( c=='4' ){ sqlite3_str_appendall(&x, zP4); }else if( c=='X' ){ - sqlite3_str_appendall(&x, pOp->zComment); - seenCom = 1; + if( pOp->zComment && pOp->zComment[0] ){ + sqlite3_str_appendall(&x, pOp->zComment); + seenCom = 1; + break; + } }else{ int v1 = translateP(c, pOp); int v2; @@ -81529,10 +82526,6 @@ SQLITE_PRIVATE char *sqlite3VdbeDisplayP4(sqlite3 *db, Op *pOp){ zP4 = "program"; break; } - case P4_DYNBLOB: - case P4_ADVANCE: { - break; - } case P4_TABLE: { zP4 = pOp->p4.pTab->zName; break; @@ -81664,21 +82657,40 @@ SQLITE_PRIVATE void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ /* ** Initialize an array of N Mem element. +** +** This is a high-runner, so only those fields that really do need to +** be initialized are set. The Mem structure is organized so that +** the fields that get initialized are nearby and hopefully on the same +** cache line. +** +** Mem.flags = flags +** Mem.db = db +** Mem.szMalloc = 0 +** +** All other fields of Mem can safely remain uninitialized for now. They +** will be initialized before use. */ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ - while( (N--)>0 ){ - p->db = db; - p->flags = flags; - p->szMalloc = 0; + if( N>0 ){ + do{ + p->flags = flags; + p->db = db; + p->szMalloc = 0; #ifdef SQLITE_DEBUG - p->pScopyFrom = 0; + p->pScopyFrom = 0; #endif - p++; + p++; + }while( (--N)>0 ); } } /* -** Release an array of N Mem elements +** Release auxiliary memory held in an array of N Mem elements. +** +** After this routine returns, all Mem elements in the array will still +** be valid. Those Mem elements that were not holding auxiliary resources +** will be unchanged. Mem elements which had something freed will be +** set to MEM_Undefined. */ static void releaseMemArray(Mem *p, int N){ if( p && N ){ @@ -81711,12 +82723,17 @@ static void releaseMemArray(Mem *p, int N){ if( p->flags&(MEM_Agg|MEM_Dyn) ){ testcase( (p->flags & MEM_Dyn)!=0 && p->xDel==sqlite3VdbeFrameMemDel ); sqlite3VdbeMemRelease(p); + p->flags = MEM_Undefined; }else if( p->szMalloc ){ sqlite3DbFreeNN(db, p->zMalloc); p->szMalloc = 0; + p->flags = MEM_Undefined; } - - p->flags = MEM_Undefined; +#ifdef SQLITE_DEBUG + else{ + p->flags = MEM_Undefined; + } +#endif }while( (++p)nChildMem]; assert( sqlite3VdbeFrameIsValid(p) ); for(i=0; inChildCsr; i++){ - sqlite3VdbeFreeCursor(p->v, apCsr[i]); + if( apCsr[i] ) sqlite3VdbeFreeCursorNN(p->v, apCsr[i]); } releaseMemArray(aMem, p->nChildMem); sqlite3VdbeDeleteAuxData(p->v->db, &p->pAuxData, -1, 0); @@ -81914,7 +82931,7 @@ SQLITE_PRIVATE int sqlite3VdbeList( Op *pOp; /* Current opcode */ assert( p->explain ); - assert( p->iVdbeMagic==VDBE_MAGIC_RUN ); + assert( p->eVdbeState==VDBE_RUN_STATE ); assert( p->rc==SQLITE_OK || p->rc==SQLITE_BUSY || p->rc==SQLITE_NOMEM ); /* Even though this opcode does not use dynamic strings for @@ -82069,11 +83086,11 @@ struct ReusableSpace { static void *allocSpace( struct ReusableSpace *p, /* Bulk memory available for allocation */ void *pBuf, /* Pointer to a prior allocation */ - sqlite3_int64 nByte /* Bytes of memory needed */ + sqlite3_int64 nByte /* Bytes of memory needed. */ ){ assert( EIGHT_BYTE_ALIGNMENT(p->pSpace) ); if( pBuf==0 ){ - nByte = ROUND8(nByte); + nByte = ROUND8P(nByte); if( nByte <= p->nFree ){ p->nFree -= nByte; pBuf = &p->pSpace[p->nFree]; @@ -82094,14 +83111,15 @@ SQLITE_PRIVATE void sqlite3VdbeRewind(Vdbe *p){ int i; #endif assert( p!=0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT || p->iVdbeMagic==VDBE_MAGIC_RESET ); + assert( p->eVdbeState==VDBE_INIT_STATE + || p->eVdbeState==VDBE_READY_STATE + || p->eVdbeState==VDBE_HALT_STATE ); /* There should be at least one opcode. */ assert( p->nOp>0 ); - /* Set the magic to VDBE_MAGIC_RUN sooner rather than later. */ - p->iVdbeMagic = VDBE_MAGIC_RUN; + p->eVdbeState = VDBE_READY_STATE; #ifdef SQLITE_DEBUG for(i=0; inMem; i++){ @@ -82157,7 +83175,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( assert( p!=0 ); assert( p->nOp>0 ); assert( pParse!=0 ); - assert( p->iVdbeMagic==VDBE_MAGIC_INIT ); + assert( p->eVdbeState==VDBE_INIT_STATE ); assert( pParse==p->pParse ); p->pVList = pParse->pVList; pParse->pVList = 0; @@ -82180,7 +83198,7 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** opcode array. This extra memory will be reallocated for other elements ** of the prepared statement. */ - n = ROUND8(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ + n = ROUND8P(sizeof(Op)*p->nOp); /* Bytes of opcode memory used */ x.pSpace = &((u8*)p->aOp)[n]; /* Unused opcode memory */ assert( EIGHT_BYTE_ALIGNMENT(x.pSpace) ); x.nFree = ROUNDDOWN8(pParse->szOpAlloc - n); /* Bytes of unused memory */ @@ -82268,9 +83286,9 @@ SQLITE_PRIVATE void sqlite3VdbeMakeReady( ** happens to hold. */ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ - if( pCx==0 ){ - return; - } + if( pCx ) sqlite3VdbeFreeCursorNN(p,pCx); +} +SQLITE_PRIVATE void sqlite3VdbeFreeCursorNN(Vdbe *p, VdbeCursor *pCx){ switch( pCx->eCurType ){ case CURTYPE_SORTER: { sqlite3VdbeSorterClose(p->db, pCx); @@ -82298,14 +83316,12 @@ SQLITE_PRIVATE void sqlite3VdbeFreeCursor(Vdbe *p, VdbeCursor *pCx){ ** Close all cursors in the current frame. */ static void closeCursorsInFrame(Vdbe *p){ - if( p->apCsr ){ - int i; - for(i=0; inCursor; i++){ - VdbeCursor *pC = p->apCsr[i]; - if( pC ){ - sqlite3VdbeFreeCursor(p, pC); - p->apCsr[i] = 0; - } + int i; + for(i=0; inCursor; i++){ + VdbeCursor *pC = p->apCsr[i]; + if( pC ){ + sqlite3VdbeFreeCursorNN(p, pC); + p->apCsr[i] = 0; } } } @@ -82354,9 +83370,7 @@ static void closeAllCursors(Vdbe *p){ } assert( p->nFrame==0 ); closeCursorsInFrame(p); - if( p->aMem ){ - releaseMemArray(p->aMem, p->nMem); - } + releaseMemArray(p->aMem, p->nMem); while( p->pDelFrame ){ VdbeFrame *pDel = p->pDelFrame; p->pDelFrame = pDel->pParent; @@ -82796,7 +83810,8 @@ SQLITE_PRIVATE int sqlite3VdbeCheckFk(Vdbe *p, int deferred){ p->rc = SQLITE_CONSTRAINT_FOREIGNKEY; p->errorAction = OE_Abort; sqlite3VdbeError(p, "FOREIGN KEY constraint failed"); - return SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)==0 ) return SQLITE_ERROR; + return SQLITE_CONSTRAINT_FOREIGNKEY; } return SQLITE_OK; } @@ -82835,9 +83850,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ ** one, or the complete transaction if there is no statement transaction. */ - if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){ - return SQLITE_OK; - } + assert( p->eVdbeState==VDBE_RUN_STATE ); if( db->mallocFailed ){ p->rc = SQLITE_NOMEM_BKPT; } @@ -82846,7 +83859,7 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ /* No commit or rollback needed if the program never started or if the ** SQL statement does not read or write a database file. */ - if( p->pc>=0 && p->bIsReader ){ + if( p->bIsReader ){ int mrc; /* Primary error code from p->rc */ int eStatementOp = 0; int isSpecialError; /* Set to true if a 'special' error */ @@ -82994,15 +84007,13 @@ SQLITE_PRIVATE int sqlite3VdbeHalt(Vdbe *p){ } /* We have successfully halted and closed the VM. Record this fact. */ - if( p->pc>=0 ){ - db->nVdbeActive--; - if( !p->readOnly ) db->nVdbeWrite--; - if( p->bIsReader ) db->nVdbeRead--; - assert( db->nVdbeActive>=db->nVdbeRead ); - assert( db->nVdbeRead>=db->nVdbeWrite ); - assert( db->nVdbeWrite>=0 ); - } - p->iVdbeMagic = VDBE_MAGIC_HALT; + db->nVdbeActive--; + if( !p->readOnly ) db->nVdbeWrite--; + if( p->bIsReader ) db->nVdbeRead--; + assert( db->nVdbeActive>=db->nVdbeRead ); + assert( db->nVdbeRead>=db->nVdbeWrite ); + assert( db->nVdbeWrite>=0 ); + p->eVdbeState = VDBE_HALT_STATE; checkActiveVdbeCnt(db); if( db->mallocFailed ){ p->rc = SQLITE_NOMEM_BKPT; @@ -83084,8 +84095,8 @@ static void vdbeInvokeSqllog(Vdbe *v){ ** again. ** ** To look at it another way, this routine resets the state of the -** virtual machine from VDBE_MAGIC_RUN or VDBE_MAGIC_HALT back to -** VDBE_MAGIC_INIT. +** virtual machine from VDBE_RUN_STATE or VDBE_HALT_STATE back to +** VDBE_READY_STATE. */ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ #if defined(SQLITE_DEBUG) || defined(VDBE_PROFILE) @@ -83099,7 +84110,7 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ ** error, then it might not have been halted properly. So halt ** it now. */ - sqlite3VdbeHalt(p); + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); /* If the VDBE has been run even partially, then transfer the error code ** and error message from the VDBE into the main database structure. But @@ -83113,13 +84124,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ }else{ db->errCode = p->rc; } - if( p->runOnlyOnce ) p->expired = 1; - }else if( p->rc && p->expired ){ - /* The expired flag was set on the VDBE before the first call - ** to sqlite3_step(). For consistency (since sqlite3_step() was - ** called), set the database error in this case as well. - */ - sqlite3ErrorWithMsg(db, p->rc, p->zErrMsg ? "%s" : 0, p->zErrMsg); } /* Reset register contents and reclaim error message memory. @@ -83176,7 +84180,6 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ } } #endif - p->iVdbeMagic = VDBE_MAGIC_RESET; return p->rc & db->errMask; } @@ -83186,7 +84189,10 @@ SQLITE_PRIVATE int sqlite3VdbeReset(Vdbe *p){ */ SQLITE_PRIVATE int sqlite3VdbeFinalize(Vdbe *p){ int rc = SQLITE_OK; - if( p->iVdbeMagic==VDBE_MAGIC_RUN || p->iVdbeMagic==VDBE_MAGIC_HALT ){ + assert( VDBE_RUN_STATE>VDBE_READY_STATE ); + assert( VDBE_HALT_STATE>VDBE_READY_STATE ); + assert( VDBE_INIT_STATEeVdbeState>=VDBE_READY_STATE ){ rc = sqlite3VdbeReset(p); assert( (rc & p->db->errMask)==rc ); } @@ -83238,22 +84244,24 @@ SQLITE_PRIVATE void sqlite3VdbeDeleteAuxData(sqlite3 *db, AuxData **pp, int iOp, ** VdbeDelete() also unlinks the Vdbe from the list of VMs associated with ** the database connection and frees the object itself. */ -SQLITE_PRIVATE void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ +static void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ SubProgram *pSub, *pNext; assert( p->db==0 || p->db==db ); - releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + if( p->aColName ){ + releaseMemArray(p->aColName, p->nResColumn*COLNAME_N); + sqlite3DbFreeNN(db, p->aColName); + } for(pSub=p->pProgram; pSub; pSub=pNext){ pNext = pSub->pNext; vdbeFreeOpArray(db, pSub->aOp, pSub->nOp); sqlite3DbFree(db, pSub); } - if( p->iVdbeMagic!=VDBE_MAGIC_INIT ){ + if( p->eVdbeState!=VDBE_INIT_STATE ){ releaseMemArray(p->aVar, p->nVar); - sqlite3DbFree(db, p->pVList); - sqlite3DbFree(db, p->pFree); + if( p->pVList ) sqlite3DbFreeNN(db, p->pVList); + if( p->pFree ) sqlite3DbFreeNN(db, p->pFree); } vdbeFreeOpArray(db, p->aOp, p->nOp); - sqlite3DbFree(db, p->aColName); sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); @@ -83286,17 +84294,17 @@ SQLITE_PRIVATE void sqlite3VdbeDelete(Vdbe *p){ db = p->db; assert( sqlite3_mutex_held(db->mutex) ); sqlite3VdbeClearObject(db, p); - if( p->pPrev ){ - p->pPrev->pNext = p->pNext; - }else{ - assert( db->pVdbe==p ); - db->pVdbe = p->pNext; + if( db->pnBytesFreed==0 ){ + if( p->pPrev ){ + p->pPrev->pNext = p->pNext; + }else{ + assert( db->pVdbe==p ); + db->pVdbe = p->pNext; + } + if( p->pNext ){ + p->pNext->pPrev = p->pPrev; + } } - if( p->pNext ){ - p->pNext->pPrev = p->pPrev; - } - p->iVdbeMagic = VDBE_MAGIC_DEAD; - p->db = 0; sqlite3DbFreeNN(db, p); } @@ -83331,7 +84339,7 @@ SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeFinishMoveto(VdbeCursor *p){ ** is supposed to be pointing. If the row was deleted out from under the ** cursor, set the cursor to point to a NULL row. */ -static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ +SQLITE_PRIVATE int SQLITE_NOINLINE sqlite3VdbeHandleMovedCursor(VdbeCursor *p){ int isDifferentRow, rc; assert( p->eCurType==CURTYPE_BTREE ); assert( p->uc.pCursor!=0 ); @@ -83347,41 +84355,9 @@ static int SQLITE_NOINLINE handleMovedCursor(VdbeCursor *p){ ** if need be. Return any I/O error from the restore operation. */ SQLITE_PRIVATE int sqlite3VdbeCursorRestore(VdbeCursor *p){ - assert( p->eCurType==CURTYPE_BTREE ); + assert( p->eCurType==CURTYPE_BTREE || IsNullCursor(p) ); if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ - return handleMovedCursor(p); - } - return SQLITE_OK; -} - -/* -** Make sure the cursor p is ready to read or write the row to which it -** was last positioned. Return an error code if an OOM fault or I/O error -** prevents us from positioning the cursor to its correct position. -** -** If a MoveTo operation is pending on the given cursor, then do that -** MoveTo now. If no move is pending, check to see if the row has been -** deleted out from under the cursor and if it has, mark the row as -** a NULL row. -** -** If the cursor is already pointing to the correct row and that row has -** not been deleted out from under the cursor, then this routine is a no-op. -*/ -SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){ - VdbeCursor *p = *pp; - assert( p->eCurType==CURTYPE_BTREE || p->eCurType==CURTYPE_PSEUDO ); - if( p->deferredMoveto ){ - u32 iMap; - assert( !p->isEphemeral ); - if( p->ub.aAltMap && (iMap = p->ub.aAltMap[1+*piCol])>0 && !p->nullRow ){ - *pp = p->pAltCursor; - *piCol = iMap - 1; - return SQLITE_OK; - } - return sqlite3VdbeFinishMoveto(p); - } - if( sqlite3BtreeCursorHasMoved(p->uc.pCursor) ){ - return handleMovedCursor(p); + return sqlite3VdbeHandleMovedCursor(p); } return SQLITE_OK; } @@ -83392,7 +84368,7 @@ SQLITE_PRIVATE int sqlite3VdbeCursorMoveto(VdbeCursor **pp, u32 *piCol){ ** sqlite3VdbeSerialType() ** sqlite3VdbeSerialTypeLen() ** sqlite3VdbeSerialLen() -** sqlite3VdbeSerialPut() +** sqlite3VdbeSerialPut() <--- in-lined into OP_MakeRecord as of 2022-04-02 ** sqlite3VdbeSerialGet() ** ** encapsulate the code that serializes values for storage in SQLite @@ -83504,7 +84480,7 @@ SQLITE_PRIVATE u32 sqlite3VdbeSerialType(Mem *pMem, int file_format, u32 *pLen){ /* ** The sizes for serial types less than 128 */ -static const u8 sqlite3SmallTypeSizes[] = { +SQLITE_PRIVATE const u8 sqlite3SmallTypeSizes[128] = { /* 0 1 2 3 4 5 6 7 8 9 */ /* 0 */ 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, /* 10 */ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, @@ -83573,7 +84549,7 @@ SQLITE_PRIVATE u8 sqlite3VdbeOneByteSerialTypeLen(u8 serial_type){ ** so we trust him. */ #ifdef SQLITE_MIXED_ENDIAN_64BIT_FLOAT -static u64 floatSwap(u64 in){ +SQLITE_PRIVATE u64 sqlite3FloatSwap(u64 in){ union { u64 r; u32 i[2]; @@ -83586,59 +84562,8 @@ static u64 floatSwap(u64 in){ u.i[1] = t; return u.r; } -# define swapMixedEndianFloat(X) X = floatSwap(X) -#else -# define swapMixedEndianFloat(X) -#endif +#endif /* SQLITE_MIXED_ENDIAN_64BIT_FLOAT */ -/* -** Write the serialized data blob for the value stored in pMem into -** buf. It is assumed that the caller has allocated sufficient space. -** Return the number of bytes written. -** -** nBuf is the amount of space left in buf[]. The caller is responsible -** for allocating enough space to buf[] to hold the entire field, exclusive -** of the pMem->u.nZero bytes for a MEM_Zero value. -** -** Return the number of bytes actually written into buf[]. The number -** of bytes in the zero-filled tail is included in the return value only -** if those bytes were zeroed in buf[]. -*/ -SQLITE_PRIVATE u32 sqlite3VdbeSerialPut(u8 *buf, Mem *pMem, u32 serial_type){ - u32 len; - - /* Integer and Real */ - if( serial_type<=7 && serial_type>0 ){ - u64 v; - u32 i; - if( serial_type==7 ){ - assert( sizeof(v)==sizeof(pMem->u.r) ); - memcpy(&v, &pMem->u.r, sizeof(v)); - swapMixedEndianFloat(v); - }else{ - v = pMem->u.i; - } - len = i = sqlite3SmallTypeSizes[serial_type]; - assert( i>0 ); - do{ - buf[--i] = (u8)(v&0xFF); - v >>= 8; - }while( i ); - return len; - } - - /* String or blob */ - if( serial_type>=12 ){ - assert( pMem->n + ((pMem->flags & MEM_Zero)?pMem->u.nZero:0) - == (int)sqlite3VdbeSerialTypeLen(serial_type) ); - len = pMem->n; - if( len>0 ) memcpy(buf, pMem->z, len); - return len; - } - - /* NULL or constants 0 or 1 */ - return 0; -} /* Input "x" is a sequence of unsigned characters that represent a ** big-endian integer. Return the equivalent native integer @@ -83804,10 +84729,10 @@ SQLITE_PRIVATE UnpackedRecord *sqlite3VdbeAllocUnpackedRecord( ){ UnpackedRecord *p; /* Unpacked record to return */ int nByte; /* Number of bytes required for *p */ - nByte = ROUND8(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); + nByte = ROUND8P(sizeof(UnpackedRecord)) + sizeof(Mem)*(pKeyInfo->nKeyField+1); p = (UnpackedRecord *)sqlite3DbMallocRaw(pKeyInfo->db, nByte); if( !p ) return 0; - p->aMem = (Mem*)&((char*)p)[ROUND8(sizeof(UnpackedRecord))]; + p->aMem = (Mem*)&((char*)p)[ROUND8P(sizeof(UnpackedRecord))]; assert( pKeyInfo->aSortFlags!=0 ); p->pKeyInfo = pKeyInfo; p->nField = pKeyInfo->nKeyField + 1; @@ -84043,8 +84968,8 @@ static int vdbeCompareMemString( }else{ rc = pColl->xCmp(pColl->pUser, c1.n, v1, c2.n, v2); } - sqlite3VdbeMemRelease(&c1); - sqlite3VdbeMemRelease(&c2); + sqlite3VdbeMemReleaseMalloc(&c1); + sqlite3VdbeMemReleaseMalloc(&c2); return rc; } } @@ -84305,14 +85230,22 @@ SQLITE_PRIVATE int sqlite3VdbeRecordCompareWithSkip( ** two elements in the keys are equal. Fix the various stack variables so ** that this routine begins comparing at the second field. */ if( bSkip ){ - u32 s1; - idx1 = 1 + getVarint32(&aKey1[1], s1); + u32 s1 = aKey1[1]; + if( s1<0x80 ){ + idx1 = 2; + }else{ + idx1 = 1 + sqlite3GetVarint32(&aKey1[1], &s1); + } szHdr1 = aKey1[0]; d1 = szHdr1 + sqlite3VdbeSerialTypeLen(s1); i = 1; pRhs++; }else{ - idx1 = getVarint32(aKey1, szHdr1); + if( (szHdr1 = aKey1[0])<0x80 ){ + idx1 = 1; + }else{ + idx1 = sqlite3GetVarint32(aKey1, &szHdr1); + } d1 = szHdr1; i = 0; } @@ -84568,7 +85501,8 @@ static int vdbeRecordCompareInt( return sqlite3VdbeRecordCompare(nKey1, pKey1, pPKey2); } - v = pPKey2->aMem[0].u.i; + assert( pPKey2->u.i == pPKey2->aMem[0].u.i ); + v = pPKey2->u.i; if( v>lhs ){ res = pPKey2->r1; }else if( vaMem[0].flags & MEM_Str ); + assert( pPKey2->aMem[0].n == pPKey2->n ); + assert( pPKey2->aMem[0].z == pPKey2->u.z ); vdbeAssertFieldCountWithinLimits(nKey1, pKey1, pPKey2->pKeyInfo); - serial_type = (u8)(aKey1[1]); - if( serial_type >= 0x80 ){ - sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); - } + serial_type = (signed char)(aKey1[1]); + +vrcs_restart: if( serial_type<12 ){ + if( serial_type<0 ){ + sqlite3GetVarint32(&aKey1[1], (u32*)&serial_type); + if( serial_type>=12 ) goto vrcs_restart; + assert( CORRUPT_DB ); + } res = pPKey2->r1; /* (pKey1/nKey1) is a number or a null */ }else if( !(serial_type & 0x01) ){ res = pPKey2->r2; /* (pKey1/nKey1) is a blob */ @@ -84622,15 +85562,15 @@ static int vdbeRecordCompareString( pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ } - nCmp = MIN( pPKey2->aMem[0].n, nStr ); - res = memcmp(&aKey1[szHdr], pPKey2->aMem[0].z, nCmp); + nCmp = MIN( pPKey2->n, nStr ); + res = memcmp(&aKey1[szHdr], pPKey2->u.z, nCmp); if( res>0 ){ res = pPKey2->r2; }else if( res<0 ){ res = pPKey2->r1; }else{ - res = nStr - pPKey2->aMem[0].n; + res = nStr - pPKey2->n; if( res==0 ){ if( pPKey2->nField>1 ){ res = sqlite3VdbeRecordCompareWithSkip(nKey1, pKey1, pPKey2, 1); @@ -84685,6 +85625,7 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ p->r2 = 1; } if( (flags & MEM_Int) ){ + p->u.i = p->aMem[0].u.i; return vdbeRecordCompareInt; } testcase( flags & MEM_Real ); @@ -84694,6 +85635,8 @@ SQLITE_PRIVATE RecordCompare sqlite3VdbeFindCompare(UnpackedRecord *p){ && p->pKeyInfo->aColl[0]==0 ){ assert( flags & MEM_Str ); + p->u.z = p->aMem[0].z; + p->n = p->aMem[0].n; return vdbeRecordCompareString; } } @@ -84766,14 +85709,14 @@ SQLITE_PRIVATE int sqlite3VdbeIdxRowid(sqlite3 *db, BtCursor *pCur, i64 *rowid){ /* Fetch the integer off the end of the index record */ sqlite3VdbeSerialGet((u8*)&m.z[m.n-lenRowid], typeRowid, &v); *rowid = v.u.i; - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_OK; /* Jump here if database corruption is detected after m has been ** allocated. Free the m object and return SQLITE_CORRUPT. */ idx_rowid_corruption: testcase( m.szMalloc!=0 ); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_CORRUPT_BKPT; } @@ -84815,7 +85758,7 @@ SQLITE_PRIVATE int sqlite3VdbeIdxKeyCompare( return rc; } *res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, pUnpacked, 0); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); return SQLITE_OK; } @@ -84982,7 +85925,7 @@ static void vdbeFreeUnpacked(sqlite3 *db, int nField, UnpackedRecord *p){ int i; for(i=0; iaMem[i]; - if( pMem->zMalloc ) sqlite3VdbeMemRelease(pMem); + if( pMem->zMalloc ) sqlite3VdbeMemReleaseMalloc(pMem); } sqlite3DbFreeNN(db, p); } @@ -85409,6 +86352,9 @@ SQLITE_API sqlite3_value *sqlite3_value_dup(const sqlite3_value *pOrig){ sqlite3ValueFree(pNew); pNew = 0; } + }else if( pNew->flags & MEM_Null ){ + /* Do not duplicate pointer values */ + pNew->flags &= ~(MEM_Term|MEM_Subtype); } return pNew; } @@ -85439,7 +86385,8 @@ static void setResultStrOrError( u8 enc, /* Encoding of z. 0 for BLOBs */ void (*xDel)(void*) /* Destructor function */ ){ - int rc = sqlite3VdbeMemSetStr(pCtx->pOut, z, n, enc, xDel); + Mem *pOut = pCtx->pOut; + int rc = sqlite3VdbeMemSetStr(pOut, z, n, enc, xDel); if( rc ){ if( rc==SQLITE_TOOBIG ){ sqlite3_result_error_toobig(pCtx); @@ -85449,6 +86396,11 @@ static void setResultStrOrError( assert( rc==SQLITE_NOMEM ); sqlite3_result_error_nomem(pCtx); } + return; + } + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); } } static int invokeValueDestructor( @@ -85592,17 +86544,22 @@ SQLITE_API void sqlite3_result_text16le( } #endif /* SQLITE_OMIT_UTF16 */ SQLITE_API void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){ + Mem *pOut = pCtx->pOut; assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - sqlite3VdbeMemCopy(pCtx->pOut, pValue); + sqlite3VdbeMemCopy(pOut, pValue); + sqlite3VdbeChangeEncoding(pOut, pCtx->enc); + if( sqlite3VdbeMemTooBig(pOut) ){ + sqlite3_result_error_toobig(pCtx); + } } SQLITE_API void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){ - assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) ); - sqlite3VdbeMemSetZeroBlob(pCtx->pOut, n); + sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0); } SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){ Mem *pOut = pCtx->pOut; assert( sqlite3_mutex_held(pOut->db->mutex) ); if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){ + sqlite3_result_error_toobig(pCtx); return SQLITE_TOOBIG; } #ifndef SQLITE_OMIT_INCRBLOB @@ -85618,8 +86575,8 @@ SQLITE_API void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){ if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode; #endif if( pCtx->pOut->flags & MEM_Null ){ - sqlite3VdbeMemSetStr(pCtx->pOut, sqlite3ErrStr(errCode), -1, - SQLITE_UTF8, SQLITE_STATIC); + setResultStrOrError(pCtx, sqlite3ErrStr(errCode), -1, SQLITE_UTF8, + SQLITE_STATIC); } } @@ -85693,80 +86650,83 @@ static int sqlite3Step(Vdbe *p){ int rc; assert(p); - if( p->iVdbeMagic!=VDBE_MAGIC_RUN ){ - /* We used to require that sqlite3_reset() be called before retrying - ** sqlite3_step() after any error or after SQLITE_DONE. But beginning - ** with version 3.7.0, we changed this so that sqlite3_reset() would - ** be called automatically instead of throwing the SQLITE_MISUSE error. - ** This "automatic-reset" change is not technically an incompatibility, - ** since any application that receives an SQLITE_MISUSE is broken by - ** definition. - ** - ** Nevertheless, some published applications that were originally written - ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE - ** 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 - ** or SQLITE_BUSY error. - */ -#ifdef SQLITE_OMIT_AUTORESET - if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ - sqlite3_reset((sqlite3_stmt*)p); - }else{ - return SQLITE_MISUSE_BKPT; - } -#else - sqlite3_reset((sqlite3_stmt*)p); -#endif - } - - /* Check that malloc() has not failed. If it has, return early. */ db = p->db; - if( db->mallocFailed ){ - p->rc = SQLITE_NOMEM; - return SQLITE_NOMEM_BKPT; - } + if( p->eVdbeState!=VDBE_RUN_STATE ){ + restart_step: + if( p->eVdbeState==VDBE_READY_STATE ){ + if( p->expired ){ + p->rc = SQLITE_SCHEMA; + rc = SQLITE_ERROR; + if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ + /* If this statement was prepared using saved SQL and an + ** error has occurred, then return the error code in p->rc to the + ** caller. Set the error code in the database handle to the same + ** value. + */ + rc = sqlite3VdbeTransferError(p); + } + goto end_of_step; + } - if( p->pc<0 && p->expired ){ - p->rc = SQLITE_SCHEMA; - rc = SQLITE_ERROR; - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ - /* If this statement was prepared using saved SQL and an - ** error has occurred, then return the error code in p->rc to the - ** caller. Set the error code in the database handle to the same value. + /* If there are no other statements currently running, then + ** reset the interrupt flag. This prevents a call to sqlite3_interrupt + ** from interrupting a statement that has not yet started. */ - rc = sqlite3VdbeTransferError(p); - } - goto end_of_step; - } - if( p->pc<0 ){ - /* If there are no other statements currently running, then - ** reset the interrupt flag. This prevents a call to sqlite3_interrupt - ** from interrupting a statement that has not yet started. - */ - if( db->nVdbeActive==0 ){ - AtomicStore(&db->u1.isInterrupted, 0); - } + if( db->nVdbeActive==0 ){ + AtomicStore(&db->u1.isInterrupted, 0); + } - assert( db->nVdbeWrite>0 || db->autoCommit==0 - || (db->nDeferredCons==0 && db->nDeferredImmCons==0) - ); + assert( db->nVdbeWrite>0 || db->autoCommit==0 + || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + ); #ifndef SQLITE_OMIT_TRACE - if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 - && !db->init.busy && p->zSql ){ - sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); - }else{ - assert( p->startTime==0 ); - } + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 + && !db->init.busy && p->zSql ){ + sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); + }else{ + assert( p->startTime==0 ); + } #endif - db->nVdbeActive++; - if( p->readOnly==0 ) db->nVdbeWrite++; - if( p->bIsReader ) db->nVdbeRead++; - p->pc = 0; + db->nVdbeActive++; + if( p->readOnly==0 ) db->nVdbeWrite++; + if( p->bIsReader ) db->nVdbeRead++; + p->pc = 0; + p->eVdbeState = VDBE_RUN_STATE; + }else + + if( ALWAYS(p->eVdbeState==VDBE_HALT_STATE) ){ + /* We used to require that sqlite3_reset() be called before retrying + ** sqlite3_step() after any error or after SQLITE_DONE. But beginning + ** with version 3.7.0, we changed this so that sqlite3_reset() would + ** be called automatically instead of throwing the SQLITE_MISUSE error. + ** This "automatic-reset" change is not technically an incompatibility, + ** since any application that receives an SQLITE_MISUSE is broken by + ** definition. + ** + ** Nevertheless, some published applications that were originally written + ** for version 3.6.23 or earlier do in fact depend on SQLITE_MISUSE + ** 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 + ** or SQLITE_BUSY error. + */ +#ifdef SQLITE_OMIT_AUTORESET + if( (rc = p->rc&0xff)==SQLITE_BUSY || rc==SQLITE_LOCKED ){ + sqlite3_reset((sqlite3_stmt*)p); + }else{ + return SQLITE_MISUSE_BKPT; + } +#else + sqlite3_reset((sqlite3_stmt*)p); +#endif + assert( p->eVdbeState==VDBE_READY_STATE ); + goto restart_step; + } } + #ifdef SQLITE_DEBUG p->rcApp = SQLITE_OK; #endif @@ -85781,7 +86741,12 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } - if( rc!=SQLITE_ROW ){ + if( rc==SQLITE_ROW ){ + assert( p->rc==SQLITE_OK ); + assert( db->mallocFailed==0 ); + db->errCode = SQLITE_ROW; + return SQLITE_ROW; + }else{ #ifndef SQLITE_OMIT_TRACE /* If the statement completed successfully, invoke the profile callback */ checkProfileCallback(db, p); @@ -85833,7 +86798,6 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ } db = v->db; sqlite3_mutex_enter(db->mutex); - v->doingRerun = 0; while( (rc = sqlite3Step(v))==SQLITE_SCHEMA && cnt++ < SQLITE_MAX_SCHEMA_RETRY ){ int savedPc = v->pc; @@ -85859,7 +86823,13 @@ SQLITE_API int sqlite3_step(sqlite3_stmt *pStmt){ break; } sqlite3_reset(pStmt); - if( savedPc>=0 ) v->doingRerun = 1; + if( savedPc>=0 ){ + /* 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-20220401a */ + v->minWriteFileFormat = 254; + } assert( v->expired==0 ); } sqlite3_mutex_leave(db->mutex); @@ -86168,15 +87138,15 @@ static const Mem *columnNullValue(void){ #endif = { /* .u = */ {0}, + /* .z = */ (char*)0, + /* .n = */ (int)0, /* .flags = */ (u16)MEM_Null, /* .enc = */ (u8)0, /* .eSubtype = */ (u8)0, - /* .n = */ (int)0, - /* .z = */ (char*)0, - /* .zMalloc = */ (char*)0, + /* .db = */ (sqlite3*)0, /* .szMalloc = */ (int)0, /* .uTemp = */ (u32)0, - /* .db = */ (sqlite3*)0, + /* .zMalloc = */ (char*)0, /* .xDel = */ (void(*)(void*))0, #ifdef SQLITE_DEBUG /* .pScopyFrom = */ (Mem*)0, @@ -86473,7 +87443,7 @@ static int vdbeUnbind(Vdbe *p, int i){ return SQLITE_MISUSE_BKPT; } sqlite3_mutex_enter(p->db->mutex); - if( p->iVdbeMagic!=VDBE_MAGIC_RUN || p->pc>=0 ){ + if( p->eVdbeState!=VDBE_READY_STATE ){ sqlite3Error(p->db, SQLITE_MISUSE); sqlite3_mutex_leave(p->db->mutex); sqlite3_log(SQLITE_MISUSE, @@ -86826,7 +87796,7 @@ SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){ */ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt *pStmt){ Vdbe *v = (Vdbe*)pStmt; - return v!=0 && v->iVdbeMagic==VDBE_MAGIC_RUN && v->pc>=0; + return v!=0 && v->eVdbeState==VDBE_RUN_STATE; } /* @@ -86872,8 +87842,7 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt *pStmt, int op, int resetFlag){ sqlite3_mutex_enter(db->mutex); v = 0; db->pnBytesFreed = (int*)&v; - sqlite3VdbeClearObject(db, pVdbe); - sqlite3DbFree(db, pVdbe); + sqlite3VdbeDelete(pVdbe); db->pnBytesFreed = 0; sqlite3_mutex_leave(db->mutex); }else{ @@ -87666,12 +88635,12 @@ static VdbeCursor *allocateCursor( int nByte; VdbeCursor *pCx = 0; nByte = - ROUND8(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + + ROUND8P(sizeof(VdbeCursor)) + 2*sizeof(u32)*nField + (eCurType==CURTYPE_BTREE?sqlite3BtreeCursorSize():0); assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ - sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); + sqlite3VdbeFreeCursorNN(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -87701,7 +88670,7 @@ static VdbeCursor *allocateCursor( pCx->aOffset = &pCx->aType[nField]; if( eCurType==CURTYPE_BTREE ){ pCx->uc.pCursor = (BtCursor*) - &pMem->z[ROUND8(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; + &pMem->z[ROUND8P(sizeof(VdbeCursor))+2*sizeof(u32)*nField]; sqlite3BtreeCursorZero(pCx->uc.pCursor); } return pCx; @@ -88140,7 +89109,7 @@ SQLITE_PRIVATE int sqlite3VdbeExec( #endif /*** INSERT STACK UNION HERE ***/ - assert( p->iVdbeMagic==VDBE_MAGIC_RUN ); /* sqlite3_step() verifies this */ + assert( p->eVdbeState==VDBE_RUN_STATE ); /* sqlite3_step() verifies this */ sqlite3VdbeEnter(p); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK if( db->xProgress ){ @@ -88383,26 +89352,39 @@ case OP_Gosub: { /* jump */ pIn1->flags = MEM_Int; pIn1->u.i = (int)(pOp-aOp); REGISTER_TRACE(pOp->p1, pIn1); - - /* Most jump operations do a goto to this spot in order to update - ** the pOp pointer. */ -jump_to_p2: - assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ - assert( pOp->p2nOp ); /* Jumps must be in range */ - pOp = &aOp[pOp->p2 - 1]; - break; + goto jump_to_p2_and_check_for_interrupt; } -/* Opcode: Return P1 * * * * +/* Opcode: Return P1 P2 P3 * * ** -** Jump to the next instruction after the address in register P1. After -** the jump, register P1 becomes undefined. +** Jump to the address stored in register P1. If P1 is a return address +** register, then this accomplishes a return from a subroutine. +** +** If P3 is 1, then the jump is only taken if register P1 holds an integer +** values, otherwise execution falls through to the next opcode, and the +** OP_Return becomes a no-op. If P3 is 0, then register P1 must hold an +** integer or else an assert() is raised. P3 should be set to 1 when +** this opcode is used in combination with OP_BeginSubrtn, and set to 0 +** otherwise. +** +** The value in register P1 is unchanged by this opcode. +** +** P2 is not used by the byte-code engine. However, if P2 is positive +** and also less than the current address, then the "EXPLAIN" output +** 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-20220407a in +** wherecode.c and shell.c. */ case OP_Return: { /* in1 */ pIn1 = &aMem[pOp->p1]; - assert( pIn1->flags==MEM_Int ); - pOp = &aOp[pIn1->u.i]; - pIn1->flags = MEM_Undefined; + if( pIn1->flags & MEM_Int ){ + if( pOp->p3 ){ VdbeBranchTaken(1, 2); } + pOp = &aOp[pIn1->u.i]; + }else if( ALWAYS(pOp->p3) ){ + VdbeBranchTaken(0, 2); + } break; } @@ -88425,7 +89407,14 @@ case OP_InitCoroutine: { /* jump */ assert( !VdbeMemDynamic(pOut) ); pOut->u.i = pOp->p3 - 1; pOut->flags = MEM_Int; - if( pOp->p2 ) goto jump_to_p2; + if( pOp->p2==0 ) break; + + /* Most jump operations do a goto to this spot in order to update + ** the pOp pointer. */ +jump_to_p2: + assert( pOp->p2>0 ); /* There are never any jumps to instruction 0 */ + assert( pOp->p2nOp ); /* Jumps must be in range */ + pOp = &aOp[pOp->p2 - 1]; break; } @@ -88527,11 +89516,10 @@ case OP_Halt: { VdbeFrame *pFrame; int pcx; - pcx = (int)(pOp - aOp); #ifdef SQLITE_DEBUG if( pOp->p2==OE_Abort ){ sqlite3VdbeAssertAbortable(p); } #endif - if( pOp->p1==SQLITE_OK && p->pFrame ){ + if( p->pFrame && pOp->p1==SQLITE_OK ){ /* Halt the sub-program. Return control to the parent frame. */ pFrame = p->pFrame; p->pFrame = pFrame->pParent; @@ -88553,7 +89541,6 @@ case OP_Halt: { } p->rc = pOp->p1; p->errorAction = (u8)pOp->p2; - p->pc = pcx; assert( pOp->p5<=4 ); if( p->rc ){ if( pOp->p5 ){ @@ -88570,6 +89557,7 @@ case OP_Halt: { }else{ sqlite3VdbeError(p, "%s", pOp->p4.z); } + pcx = (int)(pOp - aOp); sqlite3_log(pOp->p1, "abort at %d in [%s]: %s", pcx, p->zSql, p->zErrMsg); } rc = sqlite3VdbeHalt(p); @@ -88695,6 +89683,28 @@ case OP_String: { /* out2 */ break; } +/* Opcode: BeginSubrtn * P2 * * * +** Synopsis: r[P2]=NULL +** +** Mark the beginning of a subroutine that can be entered in-line +** or that can be called using OP_Gosub. The subroutine should +** be terminated by an OP_Return instruction that has a P1 operand that +** is the same as the P2 operand to this opcode and that has P3 set to 1. +** If the subroutine is entered in-line, then the OP_Return will simply +** fall through. But if the subroutine is entered using OP_Gosub, then +** the OP_Return will jump back to the first instruction after the OP_Gosub. +** +** This routine works by loading a NULL into the P2 register. When the +** return address register contains a NULL, the OP_Return instruction is +** a no-op that simply falls through to the next instruction (assuming that +** the OP_Return opcode has a P3 value of 1). Thus if the subroutine is +** entered in-line, then the OP_Return will cause in-line execution to +** continue. But if the subroutine is entered via OP_Gosub, then the +** OP_Return will cause a return to the address following the OP_Gosub. +** +** This opcode is identical to OP_Null. It has a different name +** only to make the byte code easier to read and verify. +*/ /* Opcode: Null P1 P2 P3 * * ** Synopsis: r[P2..P3]=NULL ** @@ -88707,6 +89717,7 @@ case OP_String: { /* out2 */ ** NULL values will not compare equal even if SQLITE_NULLEQ is set on ** OP_Ne or OP_Eq. */ +case OP_BeginSubrtn: case OP_Null: { /* out2 */ int cnt; u16 nullFlag; @@ -88837,11 +89848,16 @@ case OP_Move: { break; } -/* Opcode: Copy P1 P2 P3 * * +/* Opcode: Copy P1 P2 P3 * P5 ** Synopsis: r[P2@P3+1]=r[P1@P3+1] ** ** Make a copy of registers P1..P1+P3 into registers P2..P2+P3. ** +** If the 0x0002 bit of P5 is set then also clear the MEM_Subtype flag in the +** destination. The 0x0001 bit of P5 indicates that this Copy opcode cannot +** be merged. The 0x0001 bit is used by the query planner and does not +** come into play during query execution. +** ** This instruction makes a deep copy of the value. A duplicate ** is made of any string or blob constant. See also OP_SCopy. */ @@ -88856,6 +89872,9 @@ case OP_Copy: { memAboutToChange(p, pOut); sqlite3VdbeMemShallowCopy(pOut, pIn1, MEM_Ephem); Deephemeralize(pOut); + if( (pOut->flags & MEM_Subtype)!=0 && (pOp->p5 & 0x0002)!=0 ){ + pOut->flags &= ~MEM_Subtype; + } #ifdef SQLITE_DEBUG pOut->pScopyFrom = 0; #endif @@ -88936,45 +89955,32 @@ case OP_FkCheck: { ** the result row. */ case OP_ResultRow: { - Mem *pMem; - int i; assert( p->nResColumn==pOp->p2 ); assert( pOp->p1>0 || CORRUPT_DB ); assert( pOp->p1+pOp->p2<=(p->nMem+1 - p->nCursor)+1 ); - /* Invalidate all ephemeral cursor row caches */ p->cacheCtr = (p->cacheCtr + 2)|1; - - /* Make sure the results of the current row are \000 terminated - ** and have an assigned type. The results are de-ephemeralized as - ** a side effect. - */ - pMem = p->pResultSet = &aMem[pOp->p1]; - for(i=0; ip2; i++){ - assert( memIsValid(&pMem[i]) ); - Deephemeralize(&pMem[i]); - assert( (pMem[i].flags & MEM_Ephem)==0 - || (pMem[i].flags & (MEM_Str|MEM_Blob))==0 ); - sqlite3VdbeMemNulTerminate(&pMem[i]); - REGISTER_TRACE(pOp->p1+i, &pMem[i]); + p->pResultSet = &aMem[pOp->p1]; #ifdef SQLITE_DEBUG - /* The registers in the result will not be used again when the - ** prepared statement restarts. This is because sqlite3_column() - ** APIs might have caused type conversions of made other changes to - ** the register values. Therefore, we can go ahead and break any - ** OP_SCopy dependencies. */ - pMem[i].pScopyFrom = 0; -#endif + { + Mem *pMem = p->pResultSet; + int i; + for(i=0; ip2; i++){ + assert( memIsValid(&pMem[i]) ); + REGISTER_TRACE(pOp->p1+i, &pMem[i]); + /* The registers in the result will not be used again when the + ** prepared statement restarts. This is because sqlite3_column() + ** APIs might have caused type conversions of made other changes to + ** the register values. Therefore, we can go ahead and break any + ** OP_SCopy dependencies. */ + pMem[i].pScopyFrom = 0; + } } +#endif if( db->mallocFailed ) goto no_mem; - if( db->mTrace & SQLITE_TRACE_ROW ){ db->trace.xV2(SQLITE_TRACE_ROW, db->pTraceArg, p, 0); } - - - /* Return SQLITE_ROW - */ p->pc = (int)(pOp - aOp) + 1; rc = SQLITE_ROW; goto vdbe_return; @@ -89029,7 +90035,7 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ if( nByte>db->aLimit[SQLITE_LIMIT_LENGTH] ){ goto too_big; } - if( sqlite3VdbeMemGrow(pOut, (int)nByte+3, pOut==pIn2) ){ + if( sqlite3VdbeMemGrow(pOut, (int)nByte+2, pOut==pIn2) ){ goto no_mem; } MemSetTypeFlag(pOut, MEM_Str); @@ -89041,9 +90047,9 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */ memcpy(&pOut->z[pIn2->n], pIn1->z, pIn1->n); assert( (pIn1->flags & MEM_Dyn) == (flags1 & MEM_Dyn) ); pIn1->flags = flags1; + if( encoding>SQLITE_UTF8 ) nByte &= ~1; pOut->z[nByte]=0; pOut->z[nByte+1] = 0; - pOut->z[nByte+2] = 0; pOut->flags |= MEM_Term; pOut->n = (int)nByte; pOut->enc = encoding; @@ -89488,23 +90494,23 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ assert( (pOp->p5 & SQLITE_AFF_MASK)!=SQLITE_AFF_TEXT || CORRUPT_DB ); /* Common case of comparison of two integers */ if( pIn3->u.i > pIn1->u.i ){ - iCompare = +1; if( sqlite3aGTb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = +1; }else if( pIn3->u.i < pIn1->u.i ){ - iCompare = -1; if( sqlite3aLTb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = -1; }else{ - iCompare = 0; if( sqlite3aEQb[pOp->opcode] ){ VdbeBranchTaken(1, (pOp->p5 & SQLITE_NULLEQ)?2:3); goto jump_to_p2; } + iCompare = 0; } VdbeBranchTaken(0, (pOp->p5 & SQLITE_NULLEQ)?2:3); break; @@ -89531,11 +90537,11 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ ** then the result is always NULL. ** The jump is taken if the SQLITE_JUMPIFNULL bit is set. */ - iCompare = 1; /* Operands are not equal */ VdbeBranchTaken(2,3); if( pOp->p5 & SQLITE_JUMPIFNULL ){ goto jump_to_p2; } + iCompare = 1; /* Operands are not equal */ break; } }else{ @@ -89641,9 +90647,8 @@ case OP_ElseEq: { /* same as TK_ESCAPE, jump */ ** Set the permutation used by the OP_Compare operator in the next ** instruction. The permutation is stored in the P4 operand. ** -** The permutation is only valid until the next OP_Compare that has -** the OPFLAG_PERMUTE bit set in P5. Typically the OP_Permutation should -** occur immediately prior to the OP_Compare. +** The permutation is only valid for the next opcode which must be +** an OP_Compare that has the OPFLAG_PERMUTE bit set in P5. ** ** The first integer in the P4 integer array is the length of the array ** and does not become part of the permutation. @@ -89675,6 +90680,8 @@ case OP_Permutation: { ** The comparison is a sort comparison, so NULLs compare equal, ** NULLs are less than numbers, numbers are less than strings, ** and strings are less than blobs. +** +** This opcode must be immediately followed by an OP_Jump opcode. */ case OP_Compare: { int n; @@ -89733,6 +90740,7 @@ case OP_Compare: { break; } } + assert( pOp[1].opcode==OP_Jump ); break; } @@ -89741,8 +90749,11 @@ case OP_Compare: { ** Jump to the instruction at address P1, P2, or P3 depending on whether ** in the most recent OP_Compare instruction the P1 vector was less than ** equal to, or greater than the P2 vector, respectively. +** +** This opcode must immediately follow an OP_Compare opcode. */ case OP_Jump: { /* jump */ + assert( pOp>aOp && pOp[-1].opcode==OP_Compare ); if( iCompare<0 ){ VdbeBranchTaken(0,4); pOp = &aOp[pOp->p1 - 1]; }else if( iCompare==0 ){ @@ -90047,7 +91058,7 @@ case OP_Offset: { /* out3 */ #endif /* SQLITE_ENABLE_OFFSET_SQL_FUNC */ /* Opcode: Column P1 P2 P3 P4 P5 -** Synopsis: r[P3]=PX +** Synopsis: r[P3]=PX cursor P1 column P2 ** ** Interpret the data that cursor P1 points to as a structure built using ** the MakeRecord instruction. (See the MakeRecord opcode for additional @@ -90069,7 +91080,7 @@ case OP_Offset: { /* out3 */ case OP_Column: { u32 p2; /* column number to retrieve */ VdbeCursor *pC; /* The VDBE cursor */ - BtCursor *pCrsr; /* The BTree cursor */ + BtCursor *pCrsr; /* The B-Tree cursor corresponding to pC */ u32 *aOffset; /* aOffset[i] is offset to start of data for i-th column */ int len; /* The length of the serialized data for the column */ int i; /* Loop counter */ @@ -90083,21 +91094,14 @@ case OP_Column: { Mem *pReg; /* PseudoTable input register */ assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pC = p->apCsr[pOp->p1]; - assert( pC!=0 ); p2 = (u32)pOp->p2; - /* If the cursor cache is stale (meaning it is not currently point at - ** the correct row) then bring it up-to-date by doing the necessary - ** B-Tree seek. */ - rc = sqlite3VdbeCursorMoveto(&pC, &p2); - if( rc ) goto abort_due_to_error; - - assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); - pDest = &aMem[pOp->p3]; - memAboutToChange(p, pDest); +op_column_restart: assert( pC!=0 ); - assert( p2<(u32)pC->nField ); + assert( p2<(u32)pC->nField + || (pC->eCurType==CURTYPE_PSEUDO && pC->seekResult==0) ); aOffset = pC->aOffset; assert( aOffset==pC->aType+pC->nField ); assert( pC->eCurType!=CURTYPE_VTAB ); @@ -90106,21 +91110,37 @@ case OP_Column: { if( pC->cacheStatus!=p->cacheCtr ){ /*OPTIMIZATION-IF-FALSE*/ if( pC->nullRow ){ - if( pC->eCurType==CURTYPE_PSEUDO ){ + if( pC->eCurType==CURTYPE_PSEUDO && pC->seekResult>0 ){ /* For the special case of as pseudo-cursor, the seekResult field ** identifies the register that holds the record */ - assert( pC->seekResult>0 ); pReg = &aMem[pC->seekResult]; assert( pReg->flags & MEM_Blob ); assert( memIsValid(pReg) ); pC->payloadSize = pC->szRow = pReg->n; pC->aRow = (u8*)pReg->z; }else{ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); sqlite3VdbeMemSetNull(pDest); goto op_column_out; } }else{ pCrsr = pC->uc.pCursor; + if( pC->deferredMoveto ){ + u32 iMap; + assert( !pC->isEphemeral ); + if( pC->ub.aAltMap && (iMap = pC->ub.aAltMap[1+p2])>0 ){ + pC = pC->pAltCursor; + p2 = iMap - 1; + goto op_column_restart; + } + rc = sqlite3VdbeFinishMoveto(pC); + if( rc ) goto abort_due_to_error; + }else if( sqlite3BtreeCursorHasMoved(pCrsr) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; + } assert( pC->eCurType==CURTYPE_BTREE ); assert( pCrsr ); assert( sqlite3BtreeCursorIsValid(pCrsr) ); @@ -90128,15 +91148,15 @@ case OP_Column: { pC->aRow = sqlite3BtreePayloadFetch(pCrsr, &pC->szRow); assert( pC->szRow<=pC->payloadSize ); assert( pC->szRow<=65536 ); /* Maximum page size is 64KiB */ - if( pC->payloadSize > (u32)db->aLimit[SQLITE_LIMIT_LENGTH] ){ - goto too_big; - } } pC->cacheStatus = p->cacheCtr; - pC->iHdrOffset = getVarint32(pC->aRow, aOffset[0]); + if( (aOffset[0] = pC->aRow[0])<0x80 ){ + pC->iHdrOffset = 1; + }else{ + pC->iHdrOffset = sqlite3GetVarint32(pC->aRow, aOffset); + } pC->nHdrParsed = 0; - if( pC->szRowaRow does not have to hold the entire row, but it does at least ** need to cover the header of the record. If pC->aRow does not contain @@ -90176,6 +91196,10 @@ case OP_Column: { testcase( aOffset[0]==0 ); goto op_column_read_header; } + }else if( sqlite3BtreeCursorHasMoved(pC->uc.pCursor) ){ + rc = sqlite3VdbeHandleMovedCursor(pC); + if( rc ) goto abort_due_to_error; + goto op_column_restart; } /* Make sure at least the first p2+1 entries of the header have been @@ -90244,6 +91268,8 @@ case OP_Column: { ** columns. So the result will be either the default value or a NULL. */ if( pC->nHdrParsed<=p2 ){ + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); if( pOp->p4type==P4_MEM ){ sqlite3VdbeMemShallowCopy(pDest, pOp->p4.pMem, MEM_Static); }else{ @@ -90261,6 +91287,8 @@ case OP_Column: { */ assert( p2nHdrParsed ); assert( rc==SQLITE_OK ); + pDest = &aMem[pOp->p3]; + memAboutToChange(p, pDest); assert( sqlite3VdbeCheckMemInvariants(pDest) ); if( VdbeMemDynamic(pDest) ){ sqlite3VdbeMemSetNull(pDest); @@ -90281,6 +91309,7 @@ case OP_Column: { pDest->n = len = (t-12)/2; pDest->enc = encoding; if( pDest->szMalloc < len+2 ){ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; pDest->flags = MEM_Null; if( sqlite3VdbeMemGrow(pDest, len+2, 0) ) goto no_mem; }else{ @@ -90313,6 +91342,7 @@ case OP_Column: { */ sqlite3VdbeSerialGet((u8*)sqlite3CtypeMap, t, pDest); }else{ + if( len>db->aLimit[SQLITE_LIMIT_LENGTH] ) goto too_big; rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, aOffset[p2], len, pDest); if( rc!=SQLITE_OK ) goto abort_due_to_error; sqlite3VdbeSerialGet((const u8*)pDest->z, t, pDest); @@ -90525,7 +91555,6 @@ case OP_MakeRecord: { Mem *pLast; /* Last field of the record */ int nField; /* Number of fields in the record */ char *zAffinity; /* The affinity string for the record */ - int file_format; /* File format to use for encoding */ u32 len; /* Length of a field */ u8 *zHdr; /* Where to write next byte of the header */ u8 *zPayload; /* Where to write next byte of the payload */ @@ -90554,7 +91583,6 @@ case OP_MakeRecord: { pData0 = &aMem[nField]; nField = pOp->p2; pLast = &pData0[nField-1]; - file_format = p->minWriteFileFormat; /* Identify the output register */ assert( pOp->p3p1 || pOp->p3>=pOp->p1+pOp->p2 ); @@ -90656,7 +91684,7 @@ case OP_MakeRecord: { testcase( uu==2147483647 ); testcase( uu==2147483648LL ); testcase( uu==140737488355327LL ); testcase( uu==140737488355328LL ); if( uu<=127 ){ - if( (i&1)==i && file_format>=4 ){ + if( (i&1)==i && p->minWriteFileFormat>=4 ){ pRec->uTemp = 8+(u32)uu; }else{ nData++; @@ -90761,18 +91789,60 @@ case OP_MakeRecord: { zPayload = zHdr + nHdr; /* Write the record */ - zHdr += putVarint32(zHdr, nHdr); + if( nHdr<0x80 ){ + *(zHdr++) = nHdr; + }else{ + zHdr += sqlite3PutVarint(zHdr,nHdr); + } assert( pData0<=pLast ); pRec = pData0; - do{ + while( 1 /*exit-by-break*/ ){ serial_type = pRec->uTemp; /* EVIDENCE-OF: R-06529-47362 Following the size varint are one or more - ** additional varints, one per column. */ - zHdr += putVarint32(zHdr, serial_type); /* serial type */ - /* EVIDENCE-OF: R-64536-51728 The values for each column in the record + ** additional varints, one per column. + ** EVIDENCE-OF: R-64536-51728 The values for each column in the record ** immediately follow the header. */ - zPayload += sqlite3VdbeSerialPut(zPayload, pRec, serial_type); /* content */ - }while( (++pRec)<=pLast ); + if( serial_type<=7 ){ + *(zHdr++) = serial_type; + if( serial_type==0 ){ + /* NULL value. No change in zPayload */ + }else{ + u64 v; + u32 i; + if( serial_type==7 ){ + assert( sizeof(v)==sizeof(pRec->u.r) ); + memcpy(&v, &pRec->u.r, sizeof(v)); + swapMixedEndianFloat(v); + }else{ + v = pRec->u.i; + } + len = i = sqlite3SmallTypeSizes[serial_type]; + assert( i>0 ); + while( 1 /*exit-by-break*/ ){ + zPayload[--i] = (u8)(v&0xFF); + if( i==0 ) break; + v >>= 8; + } + zPayload += len; + } + }else if( serial_type<0x80 ){ + *(zHdr++) = serial_type; + if( serial_type>=14 && pRec->n>0 ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + }else{ + zHdr += sqlite3PutVarint(zHdr, serial_type); + if( pRec->n ){ + assert( pRec->z!=0 ); + memcpy(zPayload, pRec->z, pRec->n); + zPayload += pRec->n; + } + } + if( pRec==pLast ) break; + pRec++; + } assert( nHdr==(int)(zHdr - (u8*)pOut->z) ); assert( nByte==(int)(zPayload - (u8*)pOut->z) ); @@ -90991,7 +92061,10 @@ case OP_Savepoint: { } } if( rc ) goto abort_due_to_error; - + if( p->eVdbeState==VDBE_HALT_STATE ){ + rc = SQLITE_DONE; + goto vdbe_return; + } break; } @@ -91095,6 +92168,7 @@ case OP_AutoCommit: { */ case OP_Transaction: { Btree *pBt; + Db *pDb; int iMeta = 0; assert( p->bIsReader ); @@ -91114,7 +92188,8 @@ case OP_Transaction: { } goto abort_due_to_error; } - pBt = db->aDb[pOp->p1].pBt; + pDb = &db->aDb[pOp->p1]; + pBt = pDb->pBt; if( pBt ){ rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta); @@ -91155,8 +92230,7 @@ case OP_Transaction: { assert( pOp->p5==0 || pOp->p4type==P4_INT32 ); if( rc==SQLITE_OK && pOp->p5 - && (iMeta!=pOp->p3 - || db->aDb[pOp->p1].pSchema->iGeneration!=pOp->p4.i) + && (iMeta!=pOp->p3 || pDb->pSchema->iGeneration!=pOp->p4.i) ){ /* ** IMPLEMENTATION-OF: R-03189-51135 As each SQL statement runs, the schema @@ -91183,6 +92257,11 @@ case OP_Transaction: { } p->expired = 1; rc = SQLITE_SCHEMA; + + /* Set changeCntOn to 0 to prevent the value returned by sqlite3_changes() + ** from being modified in sqlite3VdbeHalt(). If this statement is + ** reprepared, changeCntOn will be set again. */ + p->changeCntOn = 0; } if( rc ) goto abort_due_to_error; break; @@ -91249,7 +92328,7 @@ case OP_SetCookie: { rc = sqlite3BtreeUpdateMeta(pDb->pBt, pOp->p2, pOp->p3); if( pOp->p2==BTREE_SCHEMA_VERSION ){ /* When the schema cookie changes, record the new cookie internally */ - pDb->pSchema->schema_cookie = pOp->p3 - pOp->p5; + *(u32*)&pDb->pSchema->schema_cookie = *(u32*)&pOp->p3 - pOp->p5; db->mDbFlags |= DBFLAG_SchemaChange; sqlite3FkClearTriggerCache(db, pOp->p1); }else if( pOp->p2==BTREE_FILE_FORMAT ){ @@ -91482,8 +92561,8 @@ case OP_OpenDup: { pCx->pgnoRoot = pOrig->pgnoRoot; pCx->isOrdered = pOrig->isOrdered; pCx->ub.pBtx = pOrig->ub.pBtx; - pCx->hasBeenDuped = 1; - pOrig->hasBeenDuped = 1; + pCx->noReuse = 1; + pOrig->noReuse = 1; rc = sqlite3BtreeCursor(pCx->ub.pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor @@ -91550,7 +92629,7 @@ case OP_OpenEphemeral: { aMem[pOp->p3].z = ""; } pCx = p->apCsr[pOp->p1]; - if( pCx && !pCx->hasBeenDuped && ALWAYS(pOp->p2<=pCx->nField) ){ + if( pCx && !pCx->noReuse && ALWAYS(pOp->p2<=pCx->nField) ){ /* If the ephermeral table is already open and has no duplicates from ** OP_OpenDup, then erase all existing content so that the table is ** empty again, rather than creating a new table. */ @@ -92299,11 +93378,8 @@ case OP_NoConflict: /* jump, in3 */ case OP_NotFound: /* jump, in3 */ case OP_Found: { /* jump, in3 */ int alreadyExists; - int takeJump; int ii; VdbeCursor *pC; - int res; - UnpackedRecord *pFree; UnpackedRecord *pIdxKey; UnpackedRecord r; @@ -92318,14 +93394,15 @@ case OP_Found: { /* jump, in3 */ #ifdef SQLITE_DEBUG pC->seekOp = pOp->opcode; #endif - pIn3 = &aMem[pOp->p3]; + r.aMem = &aMem[pOp->p3]; assert( pC->eCurType==CURTYPE_BTREE ); assert( pC->uc.pCursor!=0 ); assert( pC->isTable==0 ); - if( pOp->p4.i>0 ){ + r.nField = (u16)pOp->p4.i; + if( r.nField>0 ){ + /* Key values in an array of registers */ r.pKeyInfo = pC->pKeyInfo; - r.nField = (u16)pOp->p4.i; - r.aMem = pIn3; + r.default_rc = 0; #ifdef SQLITE_DEBUG for(ii=0; iip3+ii, &r.aMem[ii]); } #endif - pIdxKey = &r; - pFree = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, &r, &pC->seekResult); }else{ - assert( pIn3->flags & MEM_Blob ); - rc = ExpandBlob(pIn3); + /* Composite key generated by OP_MakeRecord */ + assert( r.aMem->flags & MEM_Blob ); + assert( pOp->opcode!=OP_NoConflict ); + rc = ExpandBlob(r.aMem); assert( rc==SQLITE_OK || rc==SQLITE_NOMEM ); if( rc ) goto no_mem; - pFree = pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pC->pKeyInfo); if( pIdxKey==0 ) goto no_mem; - sqlite3VdbeRecordUnpack(pC->pKeyInfo, pIn3->n, pIn3->z, pIdxKey); + sqlite3VdbeRecordUnpack(pC->pKeyInfo, r.aMem->n, r.aMem->z, pIdxKey); + pIdxKey->default_rc = 0; + rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &pC->seekResult); + sqlite3DbFreeNN(db, pIdxKey); } - pIdxKey->default_rc = 0; - takeJump = 0; - if( pOp->opcode==OP_NoConflict ){ - /* For the OP_NoConflict opcode, take the jump if any of the - ** input fields are NULL, since any key with a NULL will not - ** conflict */ - for(ii=0; iinField; ii++){ - if( pIdxKey->aMem[ii].flags & MEM_Null ){ - takeJump = 1; - break; - } - } - } - rc = sqlite3BtreeIndexMoveto(pC->uc.pCursor, pIdxKey, &res); - if( pFree ) sqlite3DbFreeNN(db, pFree); if( rc!=SQLITE_OK ){ goto abort_due_to_error; } - pC->seekResult = res; - alreadyExists = (res==0); + alreadyExists = (pC->seekResult==0); pC->nullRow = 1-alreadyExists; pC->deferredMoveto = 0; pC->cacheStatus = CACHE_STALE; @@ -92371,9 +93436,25 @@ case OP_Found: { /* jump, in3 */ VdbeBranchTaken(alreadyExists!=0,2); if( alreadyExists ) goto jump_to_p2; }else{ - VdbeBranchTaken(takeJump||alreadyExists==0,2); - if( takeJump || !alreadyExists ) goto jump_to_p2; - if( pOp->opcode==OP_IfNoHope ) pC->seekHit = pOp->p4.i; + if( !alreadyExists ){ + VdbeBranchTaken(1,2); + goto jump_to_p2; + } + if( pOp->opcode==OP_NoConflict ){ + /* For the OP_NoConflict opcode, take the jump if any of the + ** input fields are NULL, since any key with a NULL will not + ** conflict */ + for(ii=0; iiopcode==OP_IfNoHope ){ + pC->seekHit = pOp->p4.i; + } } break; } @@ -93064,7 +94145,7 @@ case OP_RowData: { } /* Opcode: Rowid P1 P2 * * * -** Synopsis: r[P2]=rowid +** Synopsis: r[P2]=PX rowid of P1 ** ** Store in register P2 an integer which is the key of the table entry that ** P1 is currently point to. @@ -93120,16 +94201,24 @@ case OP_Rowid: { /* out2 */ ** that occur while the cursor is on the null row will always ** write a NULL. ** -** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo) -** just reset the cache for that cursor. This causes the row of -** content held by the pseudo-cursor to be reparsed. +** If cursor P1 is not previously opened, open it now to a special +** pseudo-cursor that always returns NULL for every column. */ case OP_NullRow: { VdbeCursor *pC; assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; - assert( pC!=0 ); + if( pC==0 ){ + /* If the cursor is not already open, create a special kind of + ** pseudo-cursor that always gives null rows. */ + pC = allocateCursor(p, pOp->p1, 1, CURTYPE_PSEUDO); + if( pC==0 ) goto no_mem; + pC->seekResult = 0; + pC->isTable = 1; + pC->noReuse = 1; + pC->uc.pCursor = sqlite3BtreeFakeValidCursor(); + } pC->nullRow = 1; pC->cacheStatus = CACHE_STALE; if( pC->eCurType==CURTYPE_BTREE ){ @@ -93302,7 +94391,7 @@ case OP_Rewind: { /* jump */ break; } -/* Opcode: Next P1 P2 P3 P4 P5 +/* Opcode: Next P1 P2 P3 * P5 ** ** Advance cursor P1 so that it points to the next key/data pair in its ** table or index. If there are no more key/value pairs then fall through @@ -93321,15 +94410,12 @@ case OP_Rewind: { /* jump */ ** omitted if that index had been unique. P3 is usually 0. P3 is ** always either 0 or 1. ** -** P4 is always of type P4_ADVANCE. The function pointer points to -** sqlite3BtreeNext(). -** ** If P5 is positive and the jump is taken, then event counter ** number P5-1 in the prepared statement is incremented. ** ** See also: Prev */ -/* Opcode: Prev P1 P2 P3 P4 P5 +/* Opcode: Prev P1 P2 P3 * P5 ** ** Back up cursor P1 so that it points to the previous key/data pair in its ** table or index. If there is no previous key/value pairs then fall through @@ -93349,9 +94435,6 @@ case OP_Rewind: { /* jump */ ** omitted if that index had been unique. P3 is usually 0. P3 is ** always either 0 or 1. ** -** P4 is always of type P4_ADVANCE. The function pointer points to -** sqlite3BtreePrevious(). -** ** If P5 is positive and the jump is taken, then event counter ** number P5-1 in the prepared statement is incremented. */ @@ -93369,7 +94452,20 @@ case OP_SorterNext: { /* jump */ assert( isSorter(pC) ); rc = sqlite3VdbeSorterNext(db, pC); goto next_tail; + case OP_Prev: /* jump */ + assert( pOp->p1>=0 && pOp->p1nCursor ); + assert( pOp->p5aCounter) ); + pC = p->apCsr[pOp->p1]; + assert( pC!=0 ); + assert( pC->deferredMoveto==0 ); + assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE + || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope + || pC->seekOp==OP_NullRow); + rc = sqlite3BtreePrevious(pC->uc.pCursor, pOp->p3); + goto next_tail; + case OP_Next: /* jump */ assert( pOp->p1>=0 && pOp->p1nCursor ); assert( pOp->p5aCounter) ); @@ -93377,22 +94473,12 @@ case OP_Next: /* jump */ assert( pC!=0 ); assert( pC->deferredMoveto==0 ); assert( pC->eCurType==CURTYPE_BTREE ); - assert( pOp->opcode!=OP_Next || pOp->p4.xAdvance==sqlite3BtreeNext ); - assert( pOp->opcode!=OP_Prev || pOp->p4.xAdvance==sqlite3BtreePrevious ); - - /* The Next opcode is only used after SeekGT, SeekGE, Rewind, and Found. - ** The Prev opcode is only used after SeekLT, SeekLE, and Last. */ - assert( pOp->opcode!=OP_Next - || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE + assert( pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid || pC->seekOp==OP_IfNoHope); - assert( pOp->opcode!=OP_Prev - || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE - || pC->seekOp==OP_Last || pC->seekOp==OP_IfNoHope - || pC->seekOp==OP_NullRow); + rc = sqlite3BtreeNext(pC->uc.pCursor, pOp->p3); - rc = pOp->p4.xAdvance(pC->uc.pCursor, pOp->p3); next_tail: pC->cacheStatus = CACHE_STALE; VdbeBranchTaken(rc==SQLITE_OK,2); @@ -93579,9 +94665,9 @@ case OP_IdxRowid: { /* out2 */ assert( pOp->p1>=0 && pOp->p1nCursor ); pC = p->apCsr[pOp->p1]; assert( pC!=0 ); - assert( pC->eCurType==CURTYPE_BTREE ); + assert( pC->eCurType==CURTYPE_BTREE || IsNullCursor(pC) ); assert( pC->uc.pCursor!=0 ); - assert( pC->isTable==0 ); + assert( pC->isTable==0 || IsNullCursor(pC) ); assert( pC->deferredMoveto==0 ); assert( !pC->nullRow || pOp->opcode==OP_IdxRowid ); @@ -93610,6 +94696,7 @@ case OP_IdxRowid: { /* out2 */ pTabCur->nullRow = 0; pTabCur->movetoTarget = rowid; pTabCur->deferredMoveto = 1; + pTabCur->cacheStatus = CACHE_STALE; assert( pOp->p4type==P4_INTARRAY || pOp->p4.ai==0 ); assert( !pTabCur->isEphemeral ); pTabCur->ub.aAltMap = pOp->p4.ai; @@ -93744,7 +94831,7 @@ case OP_IdxGE: { /* jump */ rc = sqlite3VdbeMemFromBtreeZeroOffset(pCur, (u32)nCellKey, &m); if( rc ) goto abort_due_to_error; res = sqlite3VdbeRecordCompareWithSkip(m.n, m.z, &r, 0); - sqlite3VdbeMemRelease(&m); + sqlite3VdbeMemReleaseMalloc(&m); } /* End of inlined sqlite3VdbeIdxKeyCompare() */ @@ -94625,6 +95712,7 @@ case OP_AggStep: { pCtx->pVdbe = p; pCtx->skipFlag = 0; pCtx->isError = 0; + pCtx->enc = encoding; pCtx->argc = n; pOp->p4type = P4_FUNCCTX; pOp->p4.pCtx = pCtx; @@ -94754,9 +95842,6 @@ case OP_AggFinal: { } sqlite3VdbeChangeEncoding(pMem, encoding); UPDATE_MAX_BLOBSIZE(pMem); - if( sqlite3VdbeMemTooBig(pMem) ){ - goto too_big; - } break; } @@ -95264,7 +96349,6 @@ case OP_VColumn: { VdbeCursor *pCur = p->apCsr[pOp->p1]; assert( pCur!=0 ); - assert( pCur->eCurType==CURTYPE_VTAB ); assert( pOp->p3>0 && pOp->p3<=(p->nMem+1 - p->nCursor) ); pDest = &aMem[pOp->p3]; memAboutToChange(p, pDest); @@ -95272,11 +96356,13 @@ case OP_VColumn: { sqlite3VdbeMemSetNull(pDest); break; } + assert( pCur->eCurType==CURTYPE_VTAB ); pVtab = pCur->uc.pVCur->pVtab; pModule = pVtab->pModule; assert( pModule->xColumn ); memset(&sContext, 0, sizeof(sContext)); sContext.pOut = pDest; + sContext.enc = encoding; assert( pOp->p5==OPFLAG_NOCHNG || pOp->p5==0 ); if( pOp->p5 & OPFLAG_NOCHNG ){ sqlite3VdbeMemSetNull(pDest); @@ -95295,9 +96381,6 @@ case OP_VColumn: { REGISTER_TRACE(pOp->p3, pDest); UPDATE_MAX_BLOBSIZE(pDest); - if( sqlite3VdbeMemTooBig(pDest) ){ - goto too_big; - } if( rc ) goto abort_due_to_error; break; } @@ -95564,6 +96647,7 @@ case OP_Function: { /* group */ if( pCtx->pOut != pOut ){ pCtx->pVdbe = p; pCtx->pOut = pOut; + pCtx->enc = encoding; for(i=pCtx->argc-1; i>=0; i--) pCtx->argv[i] = &aMem[pOp->p2+i]; } assert( pCtx->pVdbe==p ); @@ -95590,17 +96674,27 @@ case OP_Function: { /* group */ if( rc ) goto abort_due_to_error; } - /* Copy the result of the function into register P3 */ - if( pOut->flags & (MEM_Str|MEM_Blob) ){ - sqlite3VdbeChangeEncoding(pOut, encoding); - if( sqlite3VdbeMemTooBig(pOut) ) goto too_big; - } + assert( (pOut->flags&MEM_Str)==0 + || pOut->enc==encoding + || db->mallocFailed ); + assert( !sqlite3VdbeMemTooBig(pOut) ); REGISTER_TRACE(pOp->p3, pOut); UPDATE_MAX_BLOBSIZE(pOut); break; } +/* Opcode: ClrSubtype P1 * * * * +** Synopsis: r[P1].subtype = 0 +** +** Clear the subtype from register P1. +*/ +case OP_ClrSubtype: { /* in1 */ + pIn1 = &aMem[pOp->p1]; + pIn1->flags &= ~MEM_Subtype; + break; +} + /* Opcode: FilterAdd P1 * P3 P4 * ** Synopsis: filter(P1) += key(P3@P4) ** @@ -95720,7 +96814,7 @@ case OP_Init: { /* jump */ #ifndef SQLITE_OMIT_TRACE if( (db->mTrace & (SQLITE_TRACE_STMT|SQLITE_TRACE_LEGACY))!=0 - && !p->doingRerun + && p->minWriteFileFormat!=254 /* tag-20220401a */ && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 ){ #ifndef SQLITE_OMIT_DEPRECATED @@ -95949,7 +97043,7 @@ abort_due_to_error: testcase( sqlite3GlobalConfig.xLog!=0 ); sqlite3_log(rc, "statement aborts at %d: [%s] %s", (int)(pOp - aOp), p->zSql, p->zErrMsg); - sqlite3VdbeHalt(p); + if( p->eVdbeState==VDBE_RUN_STATE ) sqlite3VdbeHalt(p); if( rc==SQLITE_IOERR_NOMEM ) sqlite3OomFault(db); if( rc==SQLITE_CORRUPT && db->autoCommit==0 ){ db->flags |= SQLITE_CorruptRdOnly; @@ -100511,53 +101605,26 @@ static void resolveAlias( sqlite3ExprDelete(db, pDup); pDup = 0; }else{ + Expr temp; incrAggFunctionDepth(pDup, nSubquery); if( pExpr->op==TK_COLLATE ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - - /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This - ** prevents ExprDelete() from deleting the Expr structure itself, - ** allowing it to be repopulated by the memcpy() on the following line. - ** The pExpr->u.zToken might point into memory that will be freed by the - ** sqlite3DbFree(db, pDup) on the last line of this block, so be sure to - ** make a copy of the token before doing the sqlite3DbFree(). - */ - ExprSetProperty(pExpr, EP_Static); - sqlite3ExprDelete(db, pExpr); - memcpy(pExpr, pDup, sizeof(*pExpr)); - if( !ExprHasProperty(pExpr, EP_IntValue) && pExpr->u.zToken!=0 ){ - assert( (pExpr->flags & (EP_Reduced|EP_TokenOnly))==0 ); - pExpr->u.zToken = sqlite3DbStrDup(db, pExpr->u.zToken); - pExpr->flags |= EP_MemToken; - } + memcpy(&temp, pDup, sizeof(Expr)); + memcpy(pDup, pExpr, sizeof(Expr)); + memcpy(pExpr, &temp, sizeof(Expr)); if( ExprHasProperty(pExpr, EP_WinFunc) ){ if( ALWAYS(pExpr->y.pWin!=0) ){ pExpr->y.pWin->pOwner = pExpr; } } - sqlite3DbFree(db, pDup); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprDelete, + pDup); } } - -/* -** Return TRUE if the name zCol occurs anywhere in the USING clause. -** -** Return FALSE if the USING clause is NULL or if it does not contain -** zCol. -*/ -static int nameInUsingClause(IdList *pUsing, const char *zCol){ - if( pUsing ){ - int k; - for(k=0; knId; k++){ - if( sqlite3StrICmp(pUsing->a[k].zName, zCol)==0 ) return 1; - } - } - return 0; -} - /* ** Subqueries stores the original database, table and column names for their ** result sets in ExprList.a[].zSpan, in the form "DATABASE.TABLE.COLUMN". @@ -100573,7 +101640,7 @@ SQLITE_PRIVATE int sqlite3MatchEName( ){ int n; const char *zSpan; - if( pItem->eEName!=ENAME_TAB ) return 0; + if( pItem->fg.eEName!=ENAME_TAB ) return 0; zSpan = pItem->zEName; for(n=0; ALWAYS(zSpan[n]) && zSpan[n]!='.'; n++){} if( zDb && (sqlite3StrNICmp(zSpan, zDb, n)!=0 || zDb[n]!=0) ){ @@ -100634,6 +101701,29 @@ SQLITE_PRIVATE Bitmask sqlite3ExprColUsed(Expr *pExpr){ } } +/* +** Create a new expression term for the column specified by pMatch and +** iColumn. Append this new expression term to the FULL JOIN Match set +** in *ppList. Create a new *ppList if this is the first term in the +** set. +*/ +static void extendFJMatch( + Parse *pParse, /* Parsing context */ + ExprList **ppList, /* ExprList to extend */ + SrcItem *pMatch, /* Source table containing the column */ + i16 iColumn /* The column number */ +){ + Expr *pNew = sqlite3ExprAlloc(pParse->db, TK_COLUMN, 0, 0); + if( pNew ){ + pNew->iTable = pMatch->iCursor; + pNew->iColumn = iColumn; + pNew->y.pTab = pMatch->pTab; + assert( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ); + ExprSetProperty(pNew, EP_CanBeNull); + *ppList = sqlite3ExprListAppend(pParse, *ppList, pNew); + } +} + /* ** Given the name of a column of the form X.Y.Z or Y.Z or just Z, look up ** that name in the set of source tables in pSrcList and make the pExpr @@ -100679,11 +101769,13 @@ static int lookupName( NameContext *pTopNC = pNC; /* First namecontext in the list */ Schema *pSchema = 0; /* Schema of the expression */ int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ - Table *pTab = 0; /* Table hold the row */ + Table *pTab = 0; /* Table holding the row */ Column *pCol; /* A column of pTab */ + ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */ assert( pNC ); /* the name context cannot be NULL. */ assert( zCol ); /* The Z in X.Y.Z cannot be NULL */ + assert( zDb==0 || zTab!=0 ); assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); /* Initialize the node to no-match */ @@ -100732,26 +101824,65 @@ static int lookupName( pTab = pItem->pTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 || pParse->nErr ); - if( pItem->pSelect && (pItem->pSelect->selFlags & SF_NestedFrom)!=0 ){ + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + /* In this case, pItem is a subquery that has been formed from a + ** parenthesized subset of the FROM clause terms. Example: + ** .... FROM t1 LEFT JOIN (t2 RIGHT JOIN t3 USING(x)) USING(y) ... + ** \_________________________/ + ** This pItem -------------^ + */ int hit = 0; + assert( pItem->pSelect!=0 ); pEList = pItem->pSelect->pEList; + assert( pEList!=0 ); + assert( pEList->nExpr==pTab->nCol ); for(j=0; jnExpr; j++){ - if( sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ - cnt++; - cntTab = 2; - pMatch = pItem; - pExpr->iColumn = j; - hit = 1; + if( !sqlite3MatchEName(&pEList->a[j], zCol, zTab, zDb) ){ + continue; } + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } + } + cnt++; + cntTab = 2; + pMatch = pItem; + pExpr->iColumn = j; + pEList->a[j].fg.bUsed = 1; + hit = 1; + if( pEList->a[j].fg.bUsingTerm ) break; } if( hit || zTab==0 ) continue; } - if( zDb ){ - if( pTab->pSchema!=pSchema ) continue; - if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; - } + assert( zDb==0 || zTab!=0 ); if( zTab ){ - const char *zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; + const char *zTabName; + if( zDb ){ + if( pTab->pSchema!=pSchema ) continue; + if( pSchema==0 && strcmp(zDb,"*")!=0 ) continue; + } + zTabName = pItem->zAlias ? pItem->zAlias : pTab->zName; assert( zTabName!=0 ); if( sqlite3StrICmp(zTabName, zTab)!=0 ){ continue; @@ -100766,18 +101897,37 @@ static int lookupName( if( pCol->hName==hCol && sqlite3StrICmp(pCol->zCnName, zCol)==0 ){ - /* If there has been exactly one prior match and this match - ** is for the right-hand table of a NATURAL JOIN or is in a - ** USING clause, then skip this match. - */ - if( cnt==1 ){ - if( pItem->fg.jointype & JT_NATURAL ) continue; - if( nameInUsingClause(pItem->pUsing, zCol) ) continue; + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + } } cnt++; pMatch = pItem; /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + if( pItem->fg.isNestedFrom ){ + sqlite3SrcItemColumnUsed(pItem, j); + } break; } } @@ -100790,9 +101940,7 @@ static int lookupName( pExpr->iTable = pMatch->iCursor; assert( ExprUseYTab(pExpr) ); pExpr->y.pTab = pMatch->pTab; - /* RIGHT JOIN not (yet) supported */ - assert( (pMatch->fg.jointype & JT_RIGHT)==0 ); - if( (pMatch->fg.jointype & JT_LEFT)!=0 ){ + if( (pMatch->fg.jointype & (JT_LEFT|JT_LTORJ))!=0 ){ ExprSetProperty(pExpr, EP_CanBeNull); } pSchema = pExpr->y.pTab->pSchema; @@ -100946,7 +102094,7 @@ static int lookupName( assert( pEList!=0 ); for(j=0; jnExpr; j++){ char *zAs = pEList->a[j].zEName; - if( pEList->a[j].eEName==ENAME_NAME + if( pEList->a[j].fg.eEName==ENAME_NAME && sqlite3_stricmp(zAs, zCol)==0 ){ Expr *pOrig; @@ -101033,11 +102181,37 @@ static int lookupName( } /* - ** cnt==0 means there was not match. cnt>1 means there were two or - ** more matches. Either way, we have an error. + ** cnt==0 means there was not match. + ** cnt>1 means there were two or more matches. + ** + ** cnt==0 is always an error. cnt>1 is often an error, but might + ** be multiple matches for a NATURAL LEFT JOIN or a LEFT JOIN USING. */ + assert( pFJMatch==0 || cnt>0 ); + assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) ); if( cnt!=1 ){ const char *zErr; + if( pFJMatch ){ + if( pFJMatch->nExpr==cnt-1 ){ + if( ExprHasProperty(pExpr,EP_Leaf) ){ + ExprClearProperty(pExpr,EP_Leaf); + }else{ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + } + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); + pExpr->op = TK_FUNCTION; + pExpr->u.zToken = "coalesce"; + pExpr->x.pList = pFJMatch; + cnt = 1; + goto lookupname_end; + }else{ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + } + } zErr = cnt==0 ? "no such column" : "ambiguous column name"; if( zDb ){ sqlite3ErrorMsg(pParse, "%s: %s.%s.%s", zErr, zDb, zTab, zCol); @@ -101050,6 +102224,16 @@ static int lookupName( pParse->checkSchema = 1; pTopNC->nNcErr++; } + assert( pFJMatch==0 ); + + /* Remove all substructure from pExpr */ + if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ + sqlite3ExprDelete(db, pExpr->pLeft); + pExpr->pLeft = 0; + sqlite3ExprDelete(db, pExpr->pRight); + pExpr->pRight = 0; + ExprSetProperty(pExpr, EP_Leaf); + } /* If a column from a table in pSrcList is referenced, then record ** this fact in the pSrcList.a[].colUsed bitmask. Column 0 causes @@ -101069,16 +102253,7 @@ static int lookupName( pMatch->colUsed |= sqlite3ExprColUsed(pExpr); } - /* Clean up and return - */ - if( !ExprHasProperty(pExpr,(EP_TokenOnly|EP_Leaf)) ){ - sqlite3ExprDelete(db, pExpr->pLeft); - pExpr->pLeft = 0; - sqlite3ExprDelete(db, pExpr->pRight); - pExpr->pRight = 0; - } pExpr->op = eNewExprOp; - ExprSetProperty(pExpr, EP_Leaf); lookupname_end: if( cnt==1 ){ assert( pNC!=0 ); @@ -101263,7 +102438,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ } sqlite3WalkExpr(pWalker, pExpr->pLeft); if( 0==sqlite3ExprCanBeNull(pExpr->pLeft) && !IN_RENAME_OBJECT ){ - testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + testcase( ExprHasProperty(pExpr, EP_OuterON) ); assert( !ExprHasProperty(pExpr, EP_IntValue) ); if( pExpr->op==TK_NOTNULL ){ pExpr->u.zToken = "true"; @@ -101672,7 +102847,7 @@ static int resolveAsName( assert( !ExprHasProperty(pE, EP_IntValue) ); zCol = pE->u.zToken; for(i=0; inExpr; i++){ - if( pEList->a[i].eEName==ENAME_NAME + if( pEList->a[i].fg.eEName==ENAME_NAME && sqlite3_stricmp(pEList->a[i].zEName, zCol)==0 ){ return i+1; @@ -101793,7 +102968,7 @@ static int resolveCompoundOrderBy( return 1; } for(i=0; inExpr; i++){ - pOrderBy->a[i].done = 0; + pOrderBy->a[i].fg.done = 0; } pSelect->pNext = 0; while( pSelect->pPrior ){ @@ -101808,7 +102983,7 @@ static int resolveCompoundOrderBy( for(i=0, pItem=pOrderBy->a; inExpr; i++, pItem++){ int iCol = -1; Expr *pE, *pDup; - if( pItem->done ) continue; + if( pItem->fg.done ) continue; pE = sqlite3ExprSkipCollateAndLikely(pItem->pExpr); if( NEVER(pE==0) ) continue; if( sqlite3ExprIsInteger(pE, &iCol) ){ @@ -101861,7 +103036,7 @@ static int resolveCompoundOrderBy( sqlite3ExprDelete(db, pE); pItem->u.x.iOrderByCol = (u16)iCol; } - pItem->done = 1; + pItem->fg.done = 1; }else{ moreToDo = 1; } @@ -101869,7 +103044,7 @@ static int resolveCompoundOrderBy( pSelect = pSelect->pNext; } for(i=0; inExpr; i++){ - if( pOrderBy->a[i].done==0 ){ + if( pOrderBy->a[i].fg.done==0 ){ sqlite3ErrorMsg(pParse, "%r ORDER BY term does not match any " "column in the result set", i+1); return 1; @@ -102159,8 +103334,8 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ sNC.uNC.pEList = p->pEList; sNC.ncFlags |= NC_UEList; if( p->pHaving ){ - if( !pGroupBy ){ - sqlite3ErrorMsg(pParse, "a GROUP BY clause is required before HAVING"); + if( (p->selFlags & SF_Aggregate)==0 ){ + sqlite3ErrorMsg(pParse, "HAVING clause on a non-aggregate query"); return WRC_Abort; } if( sqlite3ResolveExprNames(&sNC, p->pHaving) ) return WRC_Abort; @@ -103554,6 +104729,7 @@ SQLITE_PRIVATE Expr *sqlite3ExprFunction( sqlite3ExprListDelete(db, pList); /* Avoid memory leak when malloc fails */ return 0; } + assert( !ExprHasProperty(pNew, EP_InnerON|EP_OuterON) ); pNew->w.iOfst = (int)(pToken->z - pParse->zTail); if( pList && pList->nExpr > pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] @@ -103734,6 +104910,18 @@ SQLITE_PRIVATE void sqlite3ExprDelete(sqlite3 *db, Expr *p){ if( p ) sqlite3ExprDeleteNN(db, p); } +/* +** Clear both elements of an OnOrUsing object +*/ +SQLITE_PRIVATE void sqlite3ClearOnOrUsing(sqlite3 *db, OnOrUsing *p){ + if( p==0 ){ + /* Nothing to clear */ + }else if( p->pOn ){ + sqlite3ExprDeleteNN(db, p->pOn); + }else if( p->pUsing ){ + sqlite3IdListDelete(db, p->pUsing); + } +} /* ** Arrange to cause pExpr to be deleted when the pParse is deleted. @@ -103820,7 +105008,7 @@ static int dupedExprStructSize(const Expr *p, int flags){ nSize = EXPR_FULLSIZE; }else{ assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); - assert( !ExprHasProperty(p, EP_FromJoin) ); + assert( !ExprHasProperty(p, EP_OuterON) ); assert( !ExprHasProperty(p, EP_MemToken) ); assert( !ExprHasVVAProperty(p, EP_NoReduce) ); if( p->pLeft || p->x.pList ){ @@ -104000,6 +105188,7 @@ SQLITE_PRIVATE With *sqlite3WithDup(sqlite3 *db, With *p){ pRet->a[i].pSelect = sqlite3SelectDup(db, p->a[i].pSelect, 0); pRet->a[i].pCols = sqlite3ExprListDup(db, p->a[i].pCols, 0); pRet->a[i].zName = sqlite3DbStrDup(db, p->a[i].zName); + pRet->a[i].eM10d = p->a[i].eM10d; } } } @@ -104100,11 +105289,8 @@ SQLITE_PRIVATE ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int } } pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); - pItem->sortFlags = pOldItem->sortFlags; - pItem->eEName = pOldItem->eEName; - pItem->done = 0; - pItem->bNulls = pOldItem->bNulls; - pItem->bSorterRef = pOldItem->bSorterRef; + pItem->fg = pOldItem->fg; + pItem->fg.done = 0; pItem->u = pOldItem->u; } return pNew; @@ -104156,8 +105342,12 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListDup(sqlite3 *db, const SrcList *p, int fla pTab->nTabRef++; } pNewItem->pSelect = sqlite3SelectDup(db, pOldItem->pSelect, flags); - pNewItem->pOn = sqlite3ExprDup(db, pOldItem->pOn, flags); - pNewItem->pUsing = sqlite3IdListDup(db, pOldItem->pUsing); + if( pOldItem->fg.isUsing ){ + assert( pNewItem->fg.isUsing ); + pNewItem->u3.pUsing = sqlite3IdListDup(db, pOldItem->u3.pUsing); + }else{ + pNewItem->u3.pOn = sqlite3ExprDup(db, pOldItem->u3.pOn, flags); + } pNewItem->colUsed = pOldItem->colUsed; } return pNew; @@ -104167,22 +105357,16 @@ SQLITE_PRIVATE IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){ int i; assert( db!=0 ); if( p==0 ) return 0; - pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew) ); + assert( p->eU4!=EU4_EXPR ); + pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) ); if( pNew==0 ) return 0; pNew->nId = p->nId; - pNew->a = sqlite3DbMallocRawNN(db, p->nId*sizeof(p->a[0]) ); - if( pNew->a==0 ){ - sqlite3DbFreeNN(db, pNew); - return 0; - } - /* Note that because the size of the allocation for p->a[] is not - ** necessarily a power of two, sqlite3IdListAppend() may not be called - ** on the duplicate created by this function. */ + pNew->eU4 = p->eU4; for(i=0; inId; i++){ struct IdList_item *pNewItem = &pNew->a[i]; - struct IdList_item *pOldItem = &p->a[i]; + const struct IdList_item *pOldItem = &p->a[i]; pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pNewItem->idx = pOldItem->idx; + pNewItem->u4 = pOldItem->u4; } return pNew; } @@ -104406,16 +105590,16 @@ SQLITE_PRIVATE void sqlite3ExprListSetSortOrder(ExprList *p, int iSortOrder, int ); pItem = &p->a[p->nExpr-1]; - assert( pItem->bNulls==0 ); + assert( pItem->fg.bNulls==0 ); if( iSortOrder==SQLITE_SO_UNDEFINED ){ iSortOrder = SQLITE_SO_ASC; } - pItem->sortFlags = (u8)iSortOrder; + pItem->fg.sortFlags = (u8)iSortOrder; if( eNulls!=SQLITE_SO_UNDEFINED ){ - pItem->bNulls = 1; + pItem->fg.bNulls = 1; if( iSortOrder!=eNulls ){ - pItem->sortFlags |= KEYINFO_ORDER_BIGNULL; + pItem->fg.sortFlags |= KEYINFO_ORDER_BIGNULL; } } } @@ -104441,7 +105625,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetName( assert( pList->nExpr>0 ); pItem = &pList->a[pList->nExpr-1]; assert( pItem->zEName==0 ); - assert( pItem->eEName==ENAME_NAME ); + assert( pItem->fg.eEName==ENAME_NAME ); pItem->zEName = sqlite3DbStrNDup(pParse->db, pName->z, pName->n); if( dequote ){ /* If dequote==0, then pName->z does not point to part of a DDL @@ -104476,7 +105660,7 @@ SQLITE_PRIVATE void sqlite3ExprListSetSpan( assert( pList->nExpr>0 ); if( pItem->zEName==0 ){ pItem->zEName = sqlite3DbSpanDup(db, zStart, zEnd); - pItem->eEName = ENAME_SPAN; + pItem->fg.eEName = ENAME_SPAN; } } } @@ -104648,9 +105832,9 @@ SQLITE_PRIVATE Expr *sqlite3ExprSimplifiedAndOr(Expr *pExpr){ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ /* If pWalker->eCode is 2 then any term of the expression that comes from - ** the ON or USING clauses of a left join disqualifies the expression + ** the ON or USING clauses of an outer join disqualifies the expression ** from being considered constant. */ - if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_FromJoin) ){ + if( pWalker->eCode==2 && ExprHasProperty(pExpr, EP_OuterON) ){ pWalker->eCode = 0; return WRC_Abort; } @@ -104773,7 +105957,7 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** Check pExpr to see if it is an invariant constraint on data source pSrc. ** This is an optimization. False negatives will perhaps cause slower ** queries, but false positives will yield incorrect answers. So when in -** double, return 0. +** doubt, return 0. ** ** To be an invariant constraint, the following must be true: ** @@ -104781,24 +105965,28 @@ SQLITE_PRIVATE int sqlite3ExprIsTableConstant(Expr *p, int iCur){ ** ** (2) pExpr cannot use subqueries or non-deterministic functions. ** -** (*) ** Not applicable to this branch ** +** (3) pSrc cannot be part of the left operand for a RIGHT JOIN. +** (Is there some way to relax this constraint?) ** ** (4) If pSrc is the right operand of a LEFT JOIN, then... ** (4a) pExpr must come from an ON clause.. -** (4b) and specifically the ON clause associated with the LEFT JOIN. + (4b) and specifically the ON clause associated with the LEFT JOIN. ** ** (5) If pSrc is not the right operand of a LEFT JOIN or the left ** operand of a RIGHT JOIN, then pExpr must be from the WHERE ** clause, not an ON clause. */ SQLITE_PRIVATE int sqlite3ExprIsTableConstraint(Expr *pExpr, const SrcItem *pSrc){ - if( pSrc->fg.jointype & JT_LEFT ){ - if( !ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (4a) */ - if( pExpr->w.iRightJoinTable!=pSrc->iCursor ) return 0; /* rule (4b) */ - }else{ - if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; /* rule (5) */ + if( pSrc->fg.jointype & JT_LTORJ ){ + return 0; /* rule (3) */ } - return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ + if( pSrc->fg.jointype & JT_LEFT ){ + if( !ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (4a) */ + if( pExpr->w.iJoin!=pSrc->iCursor ) return 0; /* rule (4b) */ + }else{ + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; /* rule (5) */ + } + return sqlite3ExprIsTableConstant(pExpr, pSrc->iCursor); /* rules (1), (2) */ } @@ -105128,7 +106316,7 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** all members of the RHS set, skipping duplicates. ** ** A cursor is opened on the b-tree object that is the RHS of the IN operator -** and pX->iTable is set to the index of that cursor. +** and the *piTab parameter is set to the index of that cursor. ** ** The returned value of this function indicates the b-tree type, as follows: ** @@ -105148,7 +106336,10 @@ static int sqlite3InRhsIsConstant(Expr *pIn){ ** If the RHS of the IN operator is a list or a more complex subquery, then ** an ephemeral table might need to be generated from the RHS and then ** pX->iTable made to point to the ephemeral table instead of an -** existing table. +** existing table. In this case, the creation and initialization of the +** ephmeral table might be put inside of a subroutine, the EP_Subrtn flag +** will be set on pX and the pX->y.sub fields will be set to show where +** the subroutine is coded. ** ** The inFlags parameter must contain, at a minimum, one of the bits ** IN_INDEX_MEMBERSHIP or IN_INDEX_LOOP but not both. If inFlags contains @@ -105209,12 +106400,13 @@ SQLITE_PRIVATE int sqlite3FindInIndex( ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ - int iTab = pParse->nTab++; /* Cursor of the RHS table */ + int iTab; /* Cursor of the RHS table */ int mustBeUnique; /* True if RHS must be unique */ Vdbe *v = sqlite3GetVdbe(pParse); /* Virtual machine being coded */ assert( pX->op==TK_IN ); mustBeUnique = (inFlags & IN_INDEX_LOOP)!=0; + iTab = pParse->nTab++; /* If the RHS of this IN(...) operator is a SELECT, and if it matters ** whether or not the SELECT result contains NULL values, check whether @@ -105380,6 +106572,8 @@ SQLITE_PRIVATE int sqlite3FindInIndex( && ExprUseXList(pX) && (!sqlite3InRhsIsConstant(pX) || pX->x.pList->nExpr<=2) ){ + pParse->nTab--; /* Back out the allocation of the unused cursor */ + iTab = -1; /* Cursor is not allocated */ eType = IN_INDEX_NOOP; } @@ -105546,6 +106740,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( assert( ExprUseYSub(pExpr) ); sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, pExpr->y.sub.iAddr); + assert( iTab!=pExpr->iTable ); sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); sqlite3VdbeJumpHere(v, addrOnce); return; @@ -105557,8 +106752,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( assert( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) ); pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = - sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; - VdbeComment((v, "return address")); + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } @@ -105660,6 +106854,7 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( ** expression we need to rerun this code each time. */ if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce-1); sqlite3VdbeChangeToNoop(v, addrOnce); ExprClearProperty(pExpr, EP_Subrtn); addrOnce = 0; @@ -105680,8 +106875,11 @@ SQLITE_PRIVATE void sqlite3CodeRhsOfIN( sqlite3VdbeJumpHere(v, addrOnce); /* Subroutine return */ assert( ExprUseYSub(pExpr) ); - sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); - sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); sqlite3ClearTempRegCache(pParse); } } @@ -105735,9 +106933,7 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ ExprSetProperty(pExpr, EP_Subrtn); pExpr->y.sub.regReturn = ++pParse->nMem; pExpr->y.sub.iAddr = - sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; - VdbeComment((v, "return address")); - + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; /* The evaluation of the EXISTS/SELECT must be repeated every time it ** is encountered if any of the following is true: @@ -105810,8 +107006,11 @@ SQLITE_PRIVATE int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ /* Subroutine return */ assert( ExprUseYSub(pExpr) ); - sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); - sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + assert( sqlite3VdbeGetOp(v,pExpr->y.sub.iAddr-1)->opcode==OP_BeginSubrtn + || pParse->nErr ); + sqlite3VdbeAddOp3(v, OP_Return, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr, 1); + VdbeCoverage(v); sqlite3ClearTempRegCache(pParse); return rReg; } @@ -106245,6 +107444,7 @@ SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable( } if( iCol<0 || iCol==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Rowid, iTabCur, regOut); + VdbeComment((v, "%s.rowid", pTab->zName)); }else{ int op; int x; @@ -106415,7 +107615,17 @@ static int exprCodeInlineFunction( caseExpr.x.pList = pFarg; return sqlite3ExprCodeTarget(pParse, &caseExpr, target); } - +#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC + case INLINEFUNC_sqlite_offset: { + Expr *pArg = pFarg->a[0].pExpr; + if( pArg->op==TK_COLUMN && pArg->iTable>=0 ){ + sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); + }else{ + sqlite3VdbeAddOp2(v, OP_Null, 0, target); + } + break; + } +#endif default: { /* The UNLIKELY() function is a no-op. The result is the value ** of the first argument. @@ -106954,20 +108164,8 @@ expr_code_doover: if( !pColl ) pColl = db->pDfltColl; sqlite3VdbeAddOp4(v, OP_CollSeq, 0, 0, 0, (char *)pColl, P4_COLLSEQ); } -#ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - if( (pDef->funcFlags & SQLITE_FUNC_OFFSET)!=0 && ALWAYS(pFarg!=0) ){ - Expr *pArg = pFarg->a[0].pExpr; - if( pArg->op==TK_COLUMN ){ - sqlite3VdbeAddOp3(v, OP_Offset, pArg->iTable, pArg->iColumn, target); - }else{ - sqlite3VdbeAddOp2(v, OP_Null, 0, target); - } - }else -#endif - { - sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, - pDef, pExpr->op2); - } + sqlite3VdbeAddFunctionCall(pParse, constMask, r1, target, nFarg, + pDef, pExpr->op2); if( nFarg ){ if( constMask==0 ){ sqlite3ReleaseTempRange(pParse, r1, nFarg); @@ -106997,16 +108195,18 @@ expr_code_doover: } case TK_SELECT_COLUMN: { int n; - if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); + Expr *pLeft = pExpr->pLeft; + if( pLeft->iTable==0 || pParse->withinRJSubrtn > pLeft->op2 ){ + pLeft->iTable = sqlite3CodeSubselect(pParse, pLeft); + pLeft->op2 = pParse->withinRJSubrtn; } - assert( pExpr->pLeft->op==TK_SELECT || pExpr->pLeft->op==TK_ERROR ); - n = sqlite3ExprVectorSize(pExpr->pLeft); + assert( pLeft->op==TK_SELECT || pLeft->op==TK_ERROR ); + n = sqlite3ExprVectorSize(pLeft); if( pExpr->iTable!=n ){ sqlite3ErrorMsg(pParse, "%d columns assigned %d values", pExpr->iTable, n); } - return pExpr->pLeft->iTable + pExpr->iColumn; + return pLeft->iTable + pExpr->iColumn; } case TK_IN: { int destIfFalse = sqlite3VdbeMakeLabel(pParse); @@ -107037,8 +108237,24 @@ expr_code_doover: exprCodeBetween(pParse, pExpr, target, 0, 0); return target; } + case TK_COLLATE: { + if( !ExprHasProperty(pExpr, EP_Collate) + && ALWAYS(pExpr->pLeft) + && pExpr->pLeft->op==TK_FUNCTION + ){ + inReg = sqlite3ExprCodeTarget(pParse, pExpr->pLeft, target); + if( inReg!=target ){ + sqlite3VdbeAddOp2(v, OP_SCopy, inReg, target); + inReg = target; + } + sqlite3VdbeAddOp1(v, OP_ClrSubtype, inReg); + return inReg; + }else{ + pExpr = pExpr->pLeft; + goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. */ + } + } case TK_SPAN: - case TK_COLLATE: case TK_UPLUS: { pExpr = pExpr->pLeft; goto expr_code_doover; /* 2018-04-28: Prevent deep recursion. OSSFuzz. */ @@ -107279,7 +108495,9 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( struct ExprList_item *pItem; int i; for(pItem=p->a, i=p->nExpr; i>0; pItem++, i--){ - if( pItem->reusable && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 ){ + if( pItem->fg.reusable + && sqlite3ExprCompare(0,pItem->pExpr,pExpr,-1)==0 + ){ return pItem->u.iConstExprReg; } } @@ -107302,7 +108520,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeRunJustOnce( p = sqlite3ExprListAppend(pParse, p, pExpr); if( p ){ struct ExprList_item *pItem = &p->a[p->nExpr-1]; - pItem->reusable = regDest<0; + pItem->fg.reusable = regDest<0; if( regDest<0 ) regDest = ++pParse->nMem; pItem->u.iConstExprReg = regDest; } @@ -107436,7 +108654,7 @@ SQLITE_PRIVATE int sqlite3ExprCodeExprList( for(pItem=pList->a, i=0; ipExpr; #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( pItem->bSorterRef ){ + if( pItem->fg.bSorterRef ){ i--; n--; }else @@ -107530,8 +108748,8 @@ static void exprCodeBetween( ** so that the sqlite3ExprCodeTarget() routine will not attempt to move ** it into the Parse.pConstExpr list. We should use a new bit for this, ** for clarity, but we are out of bits in the Expr.flags field so we - ** have to reuse the EP_FromJoin bit. Bummer. */ - pDel->flags |= EP_FromJoin; + ** have to reuse the EP_OuterON bit. Bummer. */ + pDel->flags |= EP_OuterON; sqlite3ExprCodeTarget(pParse, &exprAnd, dest); } sqlite3ReleaseTempReg(pParse, regFree1); @@ -108061,7 +109279,7 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB int res; Expr *pExprA = pA->a[i].pExpr; Expr *pExprB = pB->a[i].pExpr; - if( pA->a[i].sortFlags!=pB->a[i].sortFlags ) return 1; + if( pA->a[i].fg.sortFlags!=pB->a[i].fg.sortFlags ) return 1; if( (res = sqlite3ExprCompare(0, pExprA, pExprB, iTab)) ) return res; } return 0; @@ -108216,7 +109434,7 @@ SQLITE_PRIVATE int sqlite3ExprImpliesExpr( static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_AGG_COLUMN ); testcase( pExpr->op==TK_AGG_FUNCTION ); - if( ExprHasProperty(pExpr, EP_FromJoin) ) return WRC_Prune; + if( ExprHasProperty(pExpr, EP_OuterON) ) return WRC_Prune; switch( pExpr->op ){ case TK_ISNOT: case TK_ISNULL: @@ -108313,8 +109531,8 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ ** False positives are not allowed, however. A false positive may result ** in an incorrect answer. ** -** Terms of p that are marked with EP_FromJoin (and hence that come from -** the ON or USING clauses of LEFT JOINS) are excluded from the analysis. +** Terms of p that are marked with EP_OuterON (and hence that come from +** the ON or USING clauses of OUTER JOINS) are excluded from the analysis. ** ** This routine is used to check if a LEFT JOIN can be converted into ** an ordinary JOIN. The p argument is the WHERE clause. If the WHERE @@ -109728,11 +110946,10 @@ static void unmapColumnIdlistNames( Parse *pParse, const IdList *pIdList ){ - if( pIdList ){ - int ii; - for(ii=0; iinId; ii++){ - sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); - } + int ii; + assert( pIdList!=0 ); + for(ii=0; iinId; ii++){ + sqlite3RenameTokenRemap(pParse, 0, (const void*)pIdList->a[ii].zName); } } @@ -109751,7 +110968,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ if( ALWAYS(p->pEList) ){ ExprList *pList = p->pEList; for(i=0; inExpr; i++){ - if( pList->a[i].zEName && pList->a[i].eEName==ENAME_NAME ){ + if( pList->a[i].zEName && pList->a[i].fg.eEName==ENAME_NAME ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pList->a[i].zEName); } } @@ -109760,8 +110977,11 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ SrcList *pSrc = p->pSrc; for(i=0; inSrc; i++){ sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); - sqlite3WalkExpr(pWalker, pSrc->a[i].pOn); - unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); + if( pSrc->a[i].fg.isUsing==0 ){ + sqlite3WalkExpr(pWalker, pSrc->a[i].u3.pOn); + }else{ + unmapColumnIdlistNames(pParse, pSrc->a[i].u3.pUsing); + } } } @@ -109797,7 +111017,7 @@ SQLITE_PRIVATE void sqlite3RenameExprlistUnmap(Parse *pParse, ExprList *pEList){ sWalker.xExprCallback = renameUnmapExprCb; sqlite3WalkExprList(&sWalker, pEList); for(i=0; inExpr; i++){ - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) ){ + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) ){ sqlite3RenameTokenRemap(pParse, 0, (void*)pEList->a[i].zEName); } } @@ -109955,7 +111175,7 @@ static void renameColumnElistNames( int i; for(i=0; inExpr; i++){ const char *zName = pEList->a[i].zEName; - if( ALWAYS(pEList->a[i].eEName==ENAME_NAME) + if( ALWAYS(pEList->a[i].fg.eEName==ENAME_NAME) && ALWAYS(zName!=0) && 0==sqlite3_stricmp(zName, zOld) ){ @@ -110185,27 +111405,33 @@ static int renameResolveTrigger(Parse *pParse){ if( rc==SQLITE_OK && pStep->zTarget ){ SrcList *pSrc = sqlite3TriggerStepSrc(pParse, pStep); if( pSrc ){ - int i; - for(i=0; inSrc && rc==SQLITE_OK; i++){ - SrcItem *p = &pSrc->a[i]; - p->iCursor = pParse->nTab++; - if( p->pSelect ){ - sqlite3SelectPrep(pParse, p->pSelect, 0); - sqlite3ExpandSubquery(pParse, p); - assert( i>0 ); - assert( pStep->pFrom->a[i-1].pSelect ); - sqlite3SelectPrep(pParse, pStep->pFrom->a[i-1].pSelect, 0); - }else{ - p->pTab = sqlite3LocateTableItem(pParse, 0, p); - if( p->pTab==0 ){ - rc = SQLITE_ERROR; - }else{ - p->pTab->nTabRef++; - rc = sqlite3ViewGetColumnNames(pParse, p->pTab); + Select *pSel = sqlite3SelectNew( + pParse, pStep->pExprList, pSrc, 0, 0, 0, 0, 0, 0 + ); + if( pSel==0 ){ + pStep->pExprList = 0; + pSrc = 0; + rc = SQLITE_NOMEM; + }else{ + sqlite3SelectPrep(pParse, pSel, 0); + rc = pParse->nErr ? SQLITE_ERROR : SQLITE_OK; + assert( pStep->pExprList==0 || pStep->pExprList==pSel->pEList ); + assert( pSrc==pSel->pSrc ); + if( pStep->pExprList ) pSel->pEList = 0; + pSel->pSrc = 0; + sqlite3SelectDelete(db, pSel); + } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc && rc==SQLITE_OK; i++){ + SrcItem *p = &pStep->pFrom->a[i]; + if( p->pSelect ){ + sqlite3SelectPrep(pParse, p->pSelect, 0); } } } - if( rc==SQLITE_OK && db->mallocFailed ){ + + if( db->mallocFailed ){ rc = SQLITE_NOMEM; } sNC.pSrcList = pSrc; @@ -110657,6 +111883,15 @@ static void renameTableFunc( if( pStep->zTarget && 0==sqlite3_stricmp(pStep->zTarget, zOld) ){ renameTokenFind(&sParse, &sCtx, pStep->zTarget); } + if( pStep->pFrom ){ + int i; + for(i=0; ipFrom->nSrc; i++){ + SrcItem *pItem = &pStep->pFrom->a[i]; + if( 0==sqlite3_stricmp(pItem->zName, zOld) ){ + renameTokenFind(&sParse, &sCtx, pItem->zName); + } + } + } } } } @@ -111980,9 +113215,14 @@ static void statGet( ** * "WHERE a=? AND b=?" matches 2 rows. ** ** If D is the count of distinct values and K is the total number of - ** rows, then each estimate is computed as: + ** rows, then each estimate is usually computed as: ** ** I = (K+D-1)/D + ** + ** In other words, I is K/D rounded up to the next whole integer. + ** However, if I is between 1.0 and 1.1 (in other words if I is + ** close to 1.0 but just a little larger) then do not round up but + ** instead keep the I value at 1.0. */ sqlite3_str sStat; /* Text of the constructed "stat" line */ int i; /* Loop counter */ @@ -111993,6 +113233,7 @@ static void statGet( for(i=0; inKeyCol; i++){ u64 nDistinct = p->current.anDLt[i] + 1; u64 iVal = (p->nRow + nDistinct - 1) / nDistinct; + if( iVal==2 && p->nRow*10 <= nDistinct*11 ) iVal = 1; sqlite3_str_appendf(&sStat, " %llu", iVal); assert( p->current.anEq[i] ); } @@ -112156,7 +113397,7 @@ static void analyzeOneTable( memcpy(pStat1->zName, "sqlite_stat1", 13); pStat1->nCol = 3; pStat1->iPKey = -1; - sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNBLOB); + sqlite3VdbeAddOp4(pParse->pVdbe, OP_Noop, 0, 0, 0,(char*)pStat1,P4_DYNAMIC); } #endif @@ -113546,7 +114787,11 @@ static int fixSelectCb(Walker *p, Select *pSelect){ pItem->fg.fromDDL = 1; } #if !defined(SQLITE_OMIT_VIEW) || !defined(SQLITE_OMIT_TRIGGER) - if( sqlite3WalkExpr(&pFix->w, pList->a[i].pOn) ) return WRC_Abort; + if( pList->a[i].fg.isUsing==0 + && sqlite3WalkExpr(&pFix->w, pList->a[i].u3.pOn) + ){ + return WRC_Abort; + } #endif } if( pSelect->pWith ){ @@ -114110,9 +115355,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ int i; int reg; - if( NEVER(pReturning->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pReturning->nRetCol ){ sqlite3VdbeAddOp0(v, OP_FkCheck); addrRewind = sqlite3VdbeAddOp1(v, OP_Rewind, pReturning->iRetCur); @@ -114152,7 +115395,9 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ int iDb, i; assert( sqlite3VdbeGetOp(v, 0)->opcode==OP_Init ); sqlite3VdbeJumpHere(v, 0); - for(iDb=0; iDbnDb; iDb++){ + assert( db->nDb>0 ); + iDb = 0; + do{ Schema *pSchema; if( DbMaskTest(pParse->cookieMask, iDb)==0 ) continue; sqlite3VdbeUsesBtree(v, iDb); @@ -114167,7 +115412,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); VdbeComment((v, "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); - } + }while( ++iDbnDb ); #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=0; inVtabLock; i++){ char *vtab = (char *)sqlite3GetVTable(db, pParse->apVtabLock[i]); @@ -114206,9 +115451,7 @@ SQLITE_PRIVATE void sqlite3FinishCoding(Parse *pParse){ if( pParse->bReturning ){ Returning *pRet = pParse->u1.pReturning; - if( NEVER(pRet->nRetCol==0) ){ - assert( CORRUPT_DB ); - }else{ + if( pRet->nRetCol ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); } } @@ -114271,8 +115514,6 @@ SQLITE_PRIVATE void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ memset(PARSE_TAIL(pParse), 0, PARSE_TAIL_SZ); db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3RunParser(pParse, zSql); - sqlite3DbFree(db, pParse->zErrMsg); - pParse->zErrMsg = 0; db->mDbFlags = savedDbFlags; sqlite3DbFree(db, zSql); memcpy(PARSE_TAIL(pParse), saveBuf, PARSE_TAIL_SZ); @@ -115830,7 +117071,7 @@ SQLITE_PRIVATE void sqlite3AddPrimaryKey( pTab->keyConf = (u8)onError; assert( autoInc==0 || autoInc==1 ); pTab->tabFlags |= autoInc*TF_Autoincrement; - if( pList ) pParse->iPkSortOrder = pList->a[0].sortFlags; + if( pList ) pParse->iPkSortOrder = pList->a[0].fg.sortFlags; (void)sqlite3HasExplicitNulls(pParse, pList); }else if( autoInc ){ #ifndef SQLITE_OMIT_AUTOINCREMENT @@ -116324,7 +117565,7 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( IN_RENAME_OBJECT ){ sqlite3RenameTokenRemap(pParse, pList->a[0].pExpr, &pTab->iPKey); } - pList->a[0].sortFlags = pParse->iPkSortOrder; + pList->a[0].fg.sortFlags = pParse->iPkSortOrder; assert( pParse->pNewTable==pTab ); pTab->iPKey = -1; sqlite3CreateIndex(pParse, 0, 0, 0, pList, pTab->keyConf, 0, 0, 0, 0, @@ -116995,7 +118236,6 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ Table *pSelTab; /* A fake table from which we get the result set */ Select *pSel; /* Copy of the SELECT that implements the view */ int nErr = 0; /* Number of errors encountered */ - int n; /* Temporarily holds the number of cursors assigned */ sqlite3 *db = pParse->db; /* Database connection for malloc errors */ #ifndef SQLITE_OMIT_VIRTUALTABLE int rc; @@ -117053,8 +118293,9 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ pSel = sqlite3SelectDup(db, pTable->u.view.pSelect, 0); if( pSel ){ u8 eParseMode = pParse->eParseMode; + int nTab = pParse->nTab; + int nSelect = pParse->nSelect; pParse->eParseMode = PARSE_MODE_NORMAL; - n = pParse->nTab; sqlite3SrcListAssignCursors(pParse, pSel->pSrc); pTable->nCol = -1; DisableLookaside; @@ -117066,7 +118307,8 @@ SQLITE_PRIVATE int sqlite3ViewGetColumnNames(Parse *pParse, Table *pTable){ #else pSelTab = sqlite3ResultSetOfSelect(pParse, pSel, SQLITE_AFF_NONE); #endif - pParse->nTab = n; + pParse->nTab = nTab; + pParse->nSelect = nSelect; if( pSelTab==0 ){ pTable->nCol = 0; nErr++; @@ -117811,8 +119053,8 @@ SQLITE_PRIVATE int sqlite3HasExplicitNulls(Parse *pParse, ExprList *pList){ if( pList ){ int i; for(i=0; inExpr; i++){ - if( pList->a[i].bNulls ){ - u8 sf = pList->a[i].sortFlags; + if( pList->a[i].fg.bNulls ){ + u8 sf = pList->a[i].fg.sortFlags; sqlite3ErrorMsg(pParse, "unsupported use of NULLS %s", (sf==0 || sf==3) ? "FIRST" : "LAST" ); @@ -118165,7 +119407,7 @@ SQLITE_PRIVATE void sqlite3CreateIndex( goto exit_create_index; } pIndex->azColl[i] = zColl; - requestedSortOrder = pListItem->sortFlags & sortOrderMask; + requestedSortOrder = pListItem->fg.sortFlags & sortOrderMask; pIndex->aSortOrder[i] = (u8)requestedSortOrder; } @@ -118608,18 +119850,17 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * if( pList==0 ){ pList = sqlite3DbMallocZero(db, sizeof(IdList) ); if( pList==0 ) return 0; + }else{ + IdList *pNew; + pNew = sqlite3DbRealloc(db, pList, + sizeof(IdList) + pList->nId*sizeof(pList->a)); + if( pNew==0 ){ + sqlite3IdListDelete(db, pList); + return 0; + } + pList = pNew; } - pList->a = sqlite3ArrayAllocate( - db, - pList->a, - sizeof(pList->a[0]), - &pList->nId, - &i - ); - if( i<0 ){ - sqlite3IdListDelete(db, pList); - return 0; - } + i = pList->nId++; pList->a[i].zName = sqlite3NameFromToken(db, pToken); if( IN_RENAME_OBJECT && pList->a[i].zName ){ sqlite3RenameTokenMap(pParse, (void*)pList->a[i].zName, pToken); @@ -118633,10 +119874,10 @@ SQLITE_PRIVATE IdList *sqlite3IdListAppend(Parse *pParse, IdList *pList, Token * SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ int i; if( pList==0 ) return; + assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */ for(i=0; inId; i++){ sqlite3DbFree(db, pList->a[i].zName); } - sqlite3DbFree(db, pList->a); sqlite3DbFreeNN(db, pList); } @@ -118646,7 +119887,7 @@ SQLITE_PRIVATE void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ */ SQLITE_PRIVATE int sqlite3IdListIndex(IdList *pList, const char *zName){ int i; - if( pList==0 ) return -1; + assert( pList!=0 ); for(i=0; inId; i++){ if( sqlite3StrICmp(pList->a[i].zName, zName)==0 ) return i; } @@ -118849,8 +120090,11 @@ SQLITE_PRIVATE void sqlite3SrcListDelete(sqlite3 *db, SrcList *pList){ if( pItem->fg.isTabFunc ) sqlite3ExprListDelete(db, pItem->u1.pFuncArg); sqlite3DeleteTable(db, pItem->pTab); if( pItem->pSelect ) sqlite3SelectDelete(db, pItem->pSelect); - if( pItem->pOn ) sqlite3ExprDelete(db, pItem->pOn); - if( pItem->pUsing ) sqlite3IdListDelete(db, pItem->pUsing); + if( pItem->fg.isUsing ){ + sqlite3IdListDelete(db, pItem->u3.pUsing); + }else if( pItem->u3.pOn ){ + sqlite3ExprDelete(db, pItem->u3.pOn); + } } sqlite3DbFreeNN(db, pList); } @@ -118878,14 +120122,13 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( Token *pDatabase, /* Name of the database containing pTable */ Token *pAlias, /* The right-hand side of the AS subexpression */ Select *pSubquery, /* A subquery used in place of a table name */ - Expr *pOn, /* The ON clause of a join */ - IdList *pUsing /* The USING clause of a join */ + OnOrUsing *pOnUsing /* Either the ON clause or the USING clause */ ){ SrcItem *pItem; sqlite3 *db = pParse->db; - if( !p && (pOn || pUsing) ){ + if( !p && pOnUsing!=0 && (pOnUsing->pOn || pOnUsing->pUsing) ){ sqlite3ErrorMsg(pParse, "a JOIN clause is required before %s", - (pOn ? "ON" : "USING") + (pOnUsing->pOn ? "ON" : "USING") ); goto append_from_error; } @@ -118905,15 +120148,27 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendFromTerm( if( pAlias->n ){ pItem->zAlias = sqlite3NameFromToken(db, pAlias); } - pItem->pSelect = pSubquery; - pItem->pOn = pOn; - pItem->pUsing = pUsing; + if( pSubquery ){ + pItem->pSelect = pSubquery; + if( pSubquery->selFlags & SF_NestedFrom ){ + pItem->fg.isNestedFrom = 1; + } + } + assert( pOnUsing==0 || pOnUsing->pOn==0 || pOnUsing->pUsing==0 ); + assert( pItem->fg.isUsing==0 ); + if( pOnUsing==0 ){ + pItem->u3.pOn = 0; + }else if( pOnUsing->pUsing ){ + pItem->fg.isUsing = 1; + pItem->u3.pUsing = pOnUsing->pUsing; + }else{ + pItem->u3.pOn = pOnUsing->pOn; + } return p; append_from_error: assert( p==0 ); - sqlite3ExprDelete(db, pOn); - sqlite3IdListDelete(db, pUsing); + sqlite3ClearOnOrUsing(db, pOnUsing); sqlite3SelectDelete(db, pSubquery); return 0; } @@ -118958,6 +120213,7 @@ SQLITE_PRIVATE SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, Src p1 = pNew; memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(SrcItem)); sqlite3DbFree(pParse->db, p2); + p1->a[0].fg.jointype |= (JT_LTORJ & p1->a[1].fg.jointype); } } return p1; @@ -118994,14 +120250,34 @@ SQLITE_PRIVATE void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList * ** The operator is "natural cross join". The A and B operands are stored ** in p->a[0] and p->a[1], respectively. The parser initially stores the ** operator with A. This routine shifts that operator over to B. +** +** Additional changes: +** +** * All tables to the left of the right-most RIGHT JOIN are tagged with +** JT_LTORJ (mnemonic: Left Table Of Right Join) so that the +** code generator can easily tell that the table is part of +** the left operand of at least one RIGHT JOIN. */ -SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(SrcList *p){ - if( p ){ - int i; - for(i=p->nSrc-1; i>0; i--){ - p->a[i].fg.jointype = p->a[i-1].fg.jointype; - } +SQLITE_PRIVATE void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){ + (void)pParse; + if( p && p->nSrc>1 ){ + int i = p->nSrc-1; + u8 allFlags = 0; + do{ + allFlags |= p->a[i].fg.jointype = p->a[i-1].fg.jointype; + }while( (--i)>0 ); p->a[0].fg.jointype = 0; + + /* All terms to the left of a RIGHT JOIN should be tagged with the + ** JT_LTORJ flags */ + if( allFlags & JT_RIGHT ){ + for(i=p->nSrc-1; ALWAYS(i>0) && (p->a[i].fg.jointype&JT_RIGHT)==0; i--){} + i--; + assert( i>=0 ); + do{ + p->a[i].fg.jointype |= JT_LTORJ; + }while( (--i)>=0 ); + } } } @@ -120250,8 +121526,8 @@ SQLITE_PRIVATE void sqlite3MaterializeView( assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); pFrom->a[0].zDatabase = sqlite3DbStrDup(db, db->aDb[iDb].zDbSName); - assert( pFrom->a[0].pOn==0 ); - assert( pFrom->a[0].pUsing==0 ); + assert( pFrom->a[0].fg.isUsing==0 ); + assert( pFrom->a[0].u3.pOn==0 ); } pSel = sqlite3SelectNew(pParse, 0, pFrom, pWhere, 0, 0, pOrderBy, SF_IncludeHidden, pLimit); @@ -120422,7 +121698,6 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( assert( db->mallocFailed==0 ); assert( pTabList->nSrc==1 ); - /* Locate the table which we want to delete. This table has to be ** put in an SrcList structure because some of the subroutines we ** will be calling are designed to work with multiple tables and expect @@ -120447,6 +121722,14 @@ SQLITE_PRIVATE void sqlite3DeleteFrom( # define isView 0 #endif +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Delete() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewDelete(pParse->pWith, pTabList, pWhere, + pOrderBy, pLimit, pTrigger); + } +#endif + #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT if( !isView ){ pWhere = sqlite3LimitWhere( @@ -123205,11 +124488,11 @@ static void logFunc( switch( SQLITE_PTR_TO_INT(sqlite3_user_data(context)) ){ case 1: /* Convert from natural logarithm to log base 10 */ - ans *= 1.0/M_LN10; + ans /= M_LN10; break; case 2: /* Convert from natural logarithm to log base 2 */ - ans *= 1.0/M_LN2; + ans /= M_LN2; break; default: break; @@ -123348,8 +124631,7 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){ INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY), #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC - {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF, - 0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} }, + INLINE_FUNC(sqlite_offset, 1, INLINEFUNC_sqlite_offset, 0 ), #endif FUNCTION(ltrim, 1, 1, 0, trimFunc ), FUNCTION(ltrim, 2, 1, 0, trimFunc ), @@ -123884,7 +125166,6 @@ static void fkLookupParent( }else{ int nCol = pFKey->nCol; int regTemp = sqlite3GetTempRange(pParse, nCol); - int regRec = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_OpenRead, iCur, pIdx->tnum, iDb); sqlite3VdbeSetP4KeyInfo(pParse, pIdx); @@ -123924,11 +125205,10 @@ static void fkLookupParent( sqlite3VdbeGoto(v, iOk); } - sqlite3VdbeAddOp4(v, OP_MakeRecord, regTemp, nCol, regRec, + sqlite3VdbeAddOp4(v, OP_Affinity, regTemp, nCol, 0, sqlite3IndexAffinityStr(pParse->db,pIdx), nCol); - sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regRec, 0); VdbeCoverage(v); - - sqlite3ReleaseTempReg(pParse, regRec); + sqlite3VdbeAddOp4Int(v, OP_Found, iCur, iOk, regTemp, nCol); + VdbeCoverage(v); sqlite3ReleaseTempRange(pParse, regTemp, nCol); } } @@ -124030,14 +125310,10 @@ static Expr *exprTableColumn( ** Operation | FK type | Action taken ** -------------------------------------------------------------------------- ** DELETE immediate Increment the "immediate constraint counter". -** Or, if the ON (UPDATE|DELETE) action is RESTRICT, -** throw a "FOREIGN KEY constraint failed" exception. ** ** INSERT immediate Decrement the "immediate constraint counter". ** ** DELETE deferred Increment the "deferred constraint counter". -** Or, if the ON (UPDATE|DELETE) action is RESTRICT, -** throw a "FOREIGN KEY constraint failed" exception. ** ** INSERT deferred Decrement the "deferred constraint counter". ** @@ -124685,9 +125961,9 @@ SQLITE_PRIVATE int sqlite3FkRequired( ** ** It returns a pointer to a Trigger structure containing a trigger ** equivalent to the ON UPDATE or ON DELETE action specified by pFKey. -** If the action is "NO ACTION" or "RESTRICT", then a NULL pointer is -** returned (these actions require no special handling by the triggers -** sub-system, code for them is created by fkScanChildren()). +** If the action is "NO ACTION" then a NULL pointer is returned (these actions +** require no special handling by the triggers sub-system, code for them is +** created by fkScanChildren()). ** ** For example, if pFKey is the foreign key and pTab is table "p" in ** the following schema: @@ -124816,18 +126092,23 @@ static Trigger *fkActionTrigger( nFrom = sqlite3Strlen30(zFrom); if( action==OE_Restrict ){ + int iDb = sqlite3SchemaToIndex(db, pTab->pSchema); Token tFrom; + Token tDb; Expr *pRaise; tFrom.z = zFrom; tFrom.n = nFrom; + tDb.z = db->aDb[iDb].zDbSName; + tDb.n = sqlite3Strlen30(tDb.z); + pRaise = sqlite3Expr(db, TK_RAISE, "FOREIGN KEY constraint failed"); if( pRaise ){ pRaise->affExpr = OE_Abort; } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(pParse, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tDb, &tFrom), pWhere, 0, 0, 0, 0, 0 ); @@ -125737,6 +127018,14 @@ SQLITE_PRIVATE void sqlite3Insert( #endif assert( (pTrigger && tmask) || (pTrigger==0 && tmask==0) ); +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Insert() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewInsert(pParse->pWith, pTabList, pColumn, pSelect, pList, + onError, pUpsert, pTrigger); + } +#endif + /* If pTab is really a view, make sure it has been initialized. ** ViewGetColumnNames() is a no-op if pTab is not a view. */ @@ -125815,13 +127104,15 @@ SQLITE_PRIVATE void sqlite3Insert( */ bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ + assert( pColumn->eU4!=EU4_EXPR ); + pColumn->eU4 = EU4_IDX; for(i=0; inId; i++){ - pColumn->a[i].idx = -1; + pColumn->a[i].u4.idx = -1; } for(i=0; inId; i++){ for(j=0; jnCol; j++){ if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){ - pColumn->a[i].idx = j; + pColumn->a[i].u4.idx = j; if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); @@ -126123,7 +127414,8 @@ SQLITE_PRIVATE void sqlite3Insert( } } if( pColumn ){ - for(j=0; jnId && pColumn->a[j].idx!=i; j++){} + assert( pColumn->eU4==EU4_IDX ); + for(j=0; jnId && pColumn->a[j].u4.idx!=i; j++){} if( j>=pColumn->nId ){ /* A column not named in the insert column list gets its ** default value */ @@ -127254,7 +128546,7 @@ SQLITE_PRIVATE void sqlite3GenerateConstraintChecks( if( isUpdate ){ /* If currently processing the PRIMARY KEY of a WITHOUT ROWID ** table, only conflict if the new PRIMARY KEY values are actually - ** different from the old. + ** different from the old. See TH3 withoutrowid04.test. ** ** For a UNIQUE index, only conflict if the PRIMARY KEY values ** of the matched index row are different from the original PRIMARY @@ -128618,6 +129910,12 @@ struct sqlite3_api_routines { int (*vtab_in)(sqlite3_index_info*,int,int); int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); + /* Version 3.39.0 and later */ + int (*deserialize)(sqlite3*,const char*,unsigned char*, + sqlite3_int64,sqlite3_int64,unsigned); + unsigned char *(*serialize)(sqlite3*,const char *,sqlite3_int64*, + unsigned int); + const char *(*db_name)(sqlite3*,int); }; /* @@ -128936,6 +130234,12 @@ typedef int (*sqlite3_loadext_entry)( #define sqlite3_vtab_in sqlite3_api->vtab_in #define sqlite3_vtab_in_first sqlite3_api->vtab_in_first #define sqlite3_vtab_in_next sqlite3_api->vtab_in_next +/* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE +#define sqlite3_deserialize sqlite3_api->deserialize +#define sqlite3_serialize sqlite3_api->serialize +#endif +#define sqlite3_db_name sqlite3_api->db_name #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) @@ -129427,11 +130731,28 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_autovacuum_pages, /* Version 3.38.0 and later */ sqlite3_error_offset, +#ifndef SQLITE_OMIT_VIRTUALTABLE sqlite3_vtab_rhs_value, sqlite3_vtab_distinct, sqlite3_vtab_in, sqlite3_vtab_in_first, - sqlite3_vtab_in_next + sqlite3_vtab_in_next, +#else + 0, + 0, + 0, + 0, + 0, +#endif + /* Version 3.39.0 and later */ +#ifndef SQLITE_OMIT_DESERIALIZE + sqlite3_deserialize, + sqlite3_serialize, +#else + 0, + 0, +#endif + sqlite3_db_name }; /* True if x is the directory separator character @@ -130102,7 +131423,7 @@ static const PragmaName aPragmaName[] = { #if !defined(SQLITE_OMIT_SCHEMA_PRAGMAS) {/* zName: */ "database_list", /* ePragTyp: */ PragTyp_DATABASE_LIST, - /* ePragFlg: */ PragFlg_NeedSchema|PragFlg_Result0, + /* ePragFlg: */ PragFlg_Result0, /* ColNames: */ 47, 3, /* iArg: */ 0 }, #endif @@ -130790,15 +132111,16 @@ static void pragmaFunclistLine( int isBuiltin, /* True if this is a built-in function */ int showInternFuncs /* True if showing internal functions */ ){ + u32 mask = + SQLITE_DETERMINISTIC | + SQLITE_DIRECTONLY | + SQLITE_SUBTYPE | + SQLITE_INNOCUOUS | + SQLITE_FUNC_INTERNAL + ; + if( showInternFuncs ) mask = 0xffffffff; for(; p; p=p->pNext){ const char *zType; - static const u32 mask = - SQLITE_DETERMINISTIC | - SQLITE_DIRECTONLY | - SQLITE_SUBTYPE | - SQLITE_INNOCUOUS | - SQLITE_FUNC_INTERNAL - ; static const char *azEnc[] = { 0, "utf8", "utf16le", "utf16be" }; assert( SQLITE_FUNC_ENCMASK==0x3 ); @@ -131290,7 +132612,7 @@ SQLITE_PRIVATE void sqlite3Pragma( */ #ifndef SQLITE_OMIT_AUTOVACUUM case PragTyp_INCREMENTAL_VACUUM: { - int iLimit, addr; + int iLimit = 0, addr; if( zRight==0 || !sqlite3GetInt32(zRight, &iLimit) || iLimit<=0 ){ iLimit = 0x7fffffff; } @@ -131447,6 +132769,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** */ case PragTyp_TEMP_STORE_DIRECTORY: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( !zRight ){ returnSingleText(v, sqlite3_temp_directory); }else{ @@ -131456,6 +132779,7 @@ SQLITE_PRIVATE void sqlite3Pragma( rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); if( rc!=SQLITE_OK || res==0 ){ sqlite3ErrorMsg(pParse, "not a writable directory"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); goto pragma_out; } } @@ -131473,6 +132797,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } #endif /* SQLITE_OMIT_WSD */ } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); break; } @@ -131491,6 +132816,7 @@ SQLITE_PRIVATE void sqlite3Pragma( ** */ case PragTyp_DATA_STORE_DIRECTORY: { + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); if( !zRight ){ returnSingleText(v, sqlite3_data_directory); }else{ @@ -131500,6 +132826,7 @@ SQLITE_PRIVATE void sqlite3Pragma( rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res); if( rc!=SQLITE_OK || res==0 ){ sqlite3ErrorMsg(pParse, "not a writable directory"); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); goto pragma_out; } } @@ -131511,6 +132838,7 @@ SQLITE_PRIVATE void sqlite3Pragma( } #endif /* SQLITE_OMIT_WSD */ } + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); break; } #endif @@ -131978,7 +133306,6 @@ SQLITE_PRIVATE void sqlite3Pragma( HashElem *k; /* Loop counter: Next table in schema */ int x; /* result variable */ int regResult; /* 3 registers to hold a result row */ - int regKey; /* Register to hold key for checking the FK */ int regRow; /* Registers to hold a row from pTab */ int addrTop; /* Top of a loop checking foreign keys */ int addrOk; /* Jump here if the key is OK */ @@ -131986,7 +133313,6 @@ SQLITE_PRIVATE void sqlite3Pragma( regResult = pParse->nMem+1; pParse->nMem += 4; - regKey = ++pParse->nMem; regRow = ++pParse->nMem; k = sqliteHashFirst(&db->aDb[iDb].pSchema->tblHash); while( k ){ @@ -132053,9 +133379,9 @@ SQLITE_PRIVATE void sqlite3Pragma( /* Generate code to query the parent index for a matching parent ** key. If a match is found, jump to addrOk. */ if( pIdx ){ - sqlite3VdbeAddOp4(v, OP_MakeRecord, regRow, pFK->nCol, regKey, + sqlite3VdbeAddOp4(v, OP_Affinity, regRow, pFK->nCol, 0, sqlite3IndexAffinityStr(db,pIdx), pFK->nCol); - sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regKey, 0); + sqlite3VdbeAddOp4Int(v, OP_Found, i, addrOk, regRow, pFK->nCol); VdbeCoverage(v); }else if( pParent ){ int jmp = sqlite3VdbeCurrentAddr(v)+2; @@ -134291,7 +135617,7 @@ SQLITE_API int sqlite3_prepare16_v3( */ typedef struct DistinctCtx DistinctCtx; struct DistinctCtx { - u8 isTnct; /* True if the DISTINCT keyword is present */ + u8 isTnct; /* 0: Not distinct. 1: DISTICT 2: DISTINCT and ORDER BY */ u8 eTnctType; /* One of the WHERE_DISTINCT_* operators */ int tabTnct; /* Ephemeral table used for DISTINCT processing */ int addrTnct; /* Address of OP_OpenEphemeral opcode for tabTnct */ @@ -134474,6 +135800,52 @@ static Select *findRightmost(Select *p){ ** ** If an illegal or unsupported join type is seen, then still return ** a join type, but put an error in the pParse structure. +** +** These are the valid join types: +** +** +** pA pB pC Return Value +** ------- ----- ----- ------------ +** CROSS - - JT_CROSS +** INNER - - JT_INNER +** LEFT - - JT_LEFT|JT_OUTER +** LEFT OUTER - JT_LEFT|JT_OUTER +** RIGHT - - JT_RIGHT|JT_OUTER +** RIGHT OUTER - JT_RIGHT|JT_OUTER +** FULL - - JT_LEFT|JT_RIGHT|JT_OUTER +** FULL OUTER - JT_LEFT|JT_RIGHT|JT_OUTER +** NATURAL INNER - JT_NATURAL|JT_INNER +** NATURAL LEFT - JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL LEFT OUTER JT_NATURAL|JT_LEFT|JT_OUTER +** NATURAL RIGHT - JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL RIGHT OUTER JT_NATURAL|JT_RIGHT|JT_OUTER +** NATURAL FULL - JT_NATURAL|JT_LEFT|JT_RIGHT +** NATURAL FULL OUTER JT_NATRUAL|JT_LEFT|JT_RIGHT +** +** To preserve historical compatibly, SQLite also accepts a variety +** of other non-standard and in many cases non-sensical join types. +** This routine makes as much sense at it can from the nonsense join +** type and returns a result. Examples of accepted nonsense join types +** include but are not limited to: +** +** INNER CROSS JOIN -> same as JOIN +** NATURAL CROSS JOIN -> same as NATURAL JOIN +** OUTER LEFT JOIN -> same as LEFT JOIN +** LEFT NATURAL JOIN -> same as NATURAL LEFT JOIN +** LEFT RIGHT JOIN -> same as FULL JOIN +** RIGHT OUTER FULL JOIN -> same as FULL JOIN +** CROSS CROSS CROSS JOIN -> same as JOIN +** +** The only restrictions on the join type name are: +** +** * "INNER" cannot appear together with "OUTER", "LEFT", "RIGHT", +** or "FULL". +** +** * "CROSS" cannot appear together with "OUTER", "LEFT", "RIGHT, +** or "FULL". +** +** * If "OUTER" is present then there must also be one of +** "LEFT", "RIGHT", or "FULL" */ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ int jointype = 0; @@ -134486,13 +135858,13 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p u8 nChar; /* Length of the keyword in characters */ u8 code; /* Join type mask */ } aKeyword[] = { - /* natural */ { 0, 7, JT_NATURAL }, - /* left */ { 6, 4, JT_LEFT|JT_OUTER }, - /* outer */ { 10, 5, JT_OUTER }, - /* right */ { 14, 5, JT_RIGHT|JT_OUTER }, - /* full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, - /* inner */ { 23, 5, JT_INNER }, - /* cross */ { 28, 5, JT_INNER|JT_CROSS }, + /* (0) natural */ { 0, 7, JT_NATURAL }, + /* (1) left */ { 6, 4, JT_LEFT|JT_OUTER }, + /* (2) outer */ { 10, 5, JT_OUTER }, + /* (3) right */ { 14, 5, JT_RIGHT|JT_OUTER }, + /* (4) full */ { 19, 4, JT_LEFT|JT_RIGHT|JT_OUTER }, + /* (5) inner */ { 23, 5, JT_INNER }, + /* (6) cross */ { 28, 5, JT_INNER|JT_CROSS }, }; int i, j; apAll[0] = pA; @@ -134515,18 +135887,15 @@ SQLITE_PRIVATE int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *p } if( (jointype & (JT_INNER|JT_OUTER))==(JT_INNER|JT_OUTER) || - (jointype & JT_ERROR)!=0 + (jointype & JT_ERROR)!=0 || + (jointype & (JT_OUTER|JT_LEFT|JT_RIGHT))==JT_OUTER ){ - const char *zSp = " "; - assert( pB!=0 ); - if( pC==0 ){ zSp++; } - sqlite3ErrorMsg(pParse, "unknown or unsupported join type: " - "%T %T%s%T", pA, pB, zSp, pC); - jointype = JT_INNER; - }else if( (jointype & JT_OUTER)!=0 - && (jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ){ - sqlite3ErrorMsg(pParse, - "RIGHT and FULL OUTER JOINs are not currently supported"); + const char *zSp1 = " "; + const char *zSp2 = " "; + if( pB==0 ){ zSp1++; } + if( pC==0 ){ zSp2++; } + sqlite3ErrorMsg(pParse, "unknown join type: " + "%T%s%T%s%T", pA, zSp1, pB, zSp2, pC); jointype = JT_INNER; } return jointype; @@ -134547,8 +135916,25 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ } /* -** Search the first N tables in pSrc, from left to right, looking for a -** table that has a column named zCol. +** Mark a subquery result column as having been used. +*/ +SQLITE_PRIVATE void sqlite3SrcItemColumnUsed(SrcItem *pItem, int iCol){ + assert( pItem!=0 ); + assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem->pSelect) ); + if( pItem->fg.isNestedFrom ){ + ExprList *pResults; + assert( pItem->pSelect!=0 ); + pResults = pItem->pSelect->pEList; + assert( pResults!=0 ); + assert( iCol>=0 && iColnExpr ); + pResults->a[iCol].fg.bUsed = 1; + } +} + +/* +** Search the tables iStart..iEnd (inclusive) in pSrc, looking for a +** table that has a column named zCol. The search is left-to-right. +** The first match found is returned. ** ** When found, set *piTab and *piCol to the table index and column index ** of the matching column and return TRUE. @@ -134557,22 +135943,27 @@ SQLITE_PRIVATE int sqlite3ColumnIndex(Table *pTab, const char *zCol){ */ static int tableAndColumnIndex( SrcList *pSrc, /* Array of tables to search */ - int N, /* Number of tables in pSrc->a[] to search */ + int iStart, /* First member of pSrc->a[] to check */ + int iEnd, /* Last member of pSrc->a[] to check */ const char *zCol, /* Name of the column we are looking for */ int *piTab, /* Write index of pSrc->a[] here */ int *piCol, /* Write index of pSrc->a[*piTab].pTab->aCol[] here */ - int bIgnoreHidden /* True to ignore hidden columns */ + int bIgnoreHidden /* Ignore hidden columns */ ){ int i; /* For looping over tables in pSrc */ int iCol; /* Index of column matching zCol */ + assert( iEndnSrc ); + assert( iStart>=0 ); assert( (piTab==0)==(piCol==0) ); /* Both or neither are NULL */ - for(i=0; ia[i].pTab, zCol); if( iCol>=0 && (bIgnoreHidden==0 || IsHiddenColumn(&pSrc->a[i].pTab->aCol[iCol])==0) ){ if( piTab ){ + sqlite3SrcItemColumnUsed(&pSrc->a[i], iCol); *piTab = i; *piCol = iCol; } @@ -134583,66 +135974,19 @@ static int tableAndColumnIndex( } /* -** This function is used to add terms implied by JOIN syntax to the -** WHERE clause expression of a SELECT statement. The new term, which -** is ANDed with the existing WHERE clause, is of the form: -** -** (tab1.col1 = tab2.col2) -** -** where tab1 is the iSrc'th table in SrcList pSrc and tab2 is the -** (iSrc+1)'th. Column col1 is column iColLeft of tab1, and col2 is -** column iColRight of tab2. -*/ -static void addWhereTerm( - Parse *pParse, /* Parsing context */ - SrcList *pSrc, /* List of tables in FROM clause */ - int iLeft, /* Index of first table to join in pSrc */ - int iColLeft, /* Index of column in first table */ - int iRight, /* Index of second table in pSrc */ - int iColRight, /* Index of column in second table */ - int isOuterJoin, /* True if this is an OUTER join */ - Expr **ppWhere /* IN/OUT: The WHERE clause to add to */ -){ - sqlite3 *db = pParse->db; - Expr *pE1; - Expr *pE2; - Expr *pEq; - - assert( iLeftnSrc>iRight ); - assert( pSrc->a[iLeft].pTab ); - assert( pSrc->a[iRight].pTab ); - - pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iColLeft); - pE2 = sqlite3CreateColumnExpr(db, pSrc, iRight, iColRight); - - pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); - assert( pE2!=0 || pEq==0 ); /* Due to db->mallocFailed test - ** in sqlite3DbMallocRawNN() called from - ** sqlite3PExpr(). */ - if( pEq && isOuterJoin ){ - ExprSetProperty(pEq, EP_FromJoin); - assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); - ExprSetVVAProperty(pEq, EP_NoReduce); - pEq->w.iRightJoinTable = pE2->iTable; - } - *ppWhere = sqlite3ExprAnd(pParse, *ppWhere, pEq); -} - -/* -** Set the EP_FromJoin property on all terms of the given expression. -** And set the Expr.w.iRightJoinTable to iTable for every term in the +** Set the EP_OuterON property on all terms of the given expression. +** And set the Expr.w.iJoin to iTable for every term in the ** expression. ** -** The EP_FromJoin property is used on terms of an expression to tell -** the LEFT OUTER JOIN processing logic that this term is part of the +** The EP_OuterON property is used on terms of an expression to tell +** the OUTER JOIN processing logic that this term is part of the ** join restriction specified in the ON or USING clause and not a part ** of the more general WHERE clause. These terms are moved over to the ** WHERE clause during join processing but we need to remember that they ** originated in the ON or USING clause. ** -** The Expr.w.iRightJoinTable tells the WHERE clause processing that the -** expression depends on table w.iRightJoinTable even if that table is not +** The Expr.w.iJoin tells the WHERE clause processing that the +** expression depends on table w.iJoin even if that table is not ** explicitly mentioned in the expression. That information is needed ** for cases like this: ** @@ -134655,39 +135999,48 @@ static void addWhereTerm( ** after the t1 loop and rows with t1.x!=5 will never appear in ** the output, which is incorrect. */ -SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable){ +SQLITE_PRIVATE void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){ + assert( joinFlag==EP_OuterON || joinFlag==EP_InnerON ); while( p ){ - ExprSetProperty(p, EP_FromJoin); + ExprSetProperty(p, joinFlag); assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) ); ExprSetVVAProperty(p, EP_NoReduce); - p->w.iRightJoinTable = iTable; + p->w.iJoin = iTable; if( p->op==TK_FUNCTION ){ assert( ExprUseXList(p) ); if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ - sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable); + sqlite3SetJoinExpr(p->x.pList->a[i].pExpr, iTable, joinFlag); } } } - sqlite3SetJoinExpr(p->pLeft, iTable); + sqlite3SetJoinExpr(p->pLeft, iTable, joinFlag); p = p->pRight; } } -/* Undo the work of sqlite3SetJoinExpr(). In the expression p, convert every -** term that is marked with EP_FromJoin and w.iRightJoinTable==iTable into -** an ordinary term that omits the EP_FromJoin mark. +/* Undo the work of sqlite3SetJoinExpr(). This is used when a LEFT JOIN +** is simplified into an ordinary JOIN, and when an ON expression is +** "pushed down" into the WHERE clause of a subquery. ** -** This happens when a LEFT JOIN is simplified into an ordinary JOIN. +** Convert every term that is marked with EP_OuterON and w.iJoin==iTable into +** an ordinary term that omits the EP_OuterON mark. Or if iTable<0, then +** just clear every EP_OuterON and EP_InnerON mark from the expression tree. +** +** If nullable is true, that means that Expr p might evaluate to NULL even +** if it is a reference to a NOT NULL column. This can happen, for example, +** if the table that p references is on the left side of a RIGHT JOIN. +** If nullable is true, then take care to not remove the EP_CanBeNull bit. +** See forum thread https://sqlite.org/forum/forumpost/b40696f50145d21c */ -static void unsetJoinExpr(Expr *p, int iTable){ +static void unsetJoinExpr(Expr *p, int iTable, int nullable){ while( p ){ - if( ExprHasProperty(p, EP_FromJoin) - && (iTable<0 || p->w.iRightJoinTable==iTable) ){ - ExprClearProperty(p, EP_FromJoin); + if( iTable<0 || (ExprHasProperty(p, EP_OuterON) && p->w.iJoin==iTable) ){ + ExprClearProperty(p, EP_OuterON|EP_InnerON); + if( iTable>=0 ) ExprSetProperty(p, EP_InnerON); } - if( p->op==TK_COLUMN && p->iTable==iTable ){ + if( p->op==TK_COLUMN && p->iTable==iTable && !nullable ){ ExprClearProperty(p, EP_CanBeNull); } if( p->op==TK_FUNCTION ){ @@ -134695,30 +136048,37 @@ static void unsetJoinExpr(Expr *p, int iTable){ if( p->x.pList ){ int i; for(i=0; ix.pList->nExpr; i++){ - unsetJoinExpr(p->x.pList->a[i].pExpr, iTable); + unsetJoinExpr(p->x.pList->a[i].pExpr, iTable, nullable); } } } - unsetJoinExpr(p->pLeft, iTable); + unsetJoinExpr(p->pLeft, iTable, nullable); p = p->pRight; } } /* ** This routine processes the join information for a SELECT statement. -** ON and USING clauses are converted into extra terms of the WHERE clause. -** NATURAL joins also create extra WHERE clause terms. +** +** * A NATURAL join is converted into a USING join. After that, we +** do not need to be concerned with NATURAL joins and we only have +** think about USING joins. +** +** * ON and USING clauses result in extra terms being added to the +** WHERE clause to enforce the specified constraints. The extra +** WHERE clause terms will be tagged with EP_OuterON or +** EP_InnerON so that we know that they originated in ON/USING. ** ** The terms of a FROM clause are contained in the Select.pSrc structure. ** The left most table is the first entry in Select.pSrc. The right-most ** table is the last entry. The join operator is held in the entry to -** the left. Thus entry 0 contains the join operator for the join between +** the right. Thus entry 1 contains the join operator for the join between ** entries 0 and 1. Any ON or USING clauses associated with the join are -** also attached to the left entry. +** also attached to the right entry. ** ** This routine returns the number of errors encountered. */ -static int sqliteProcessJoin(Parse *pParse, Select *p){ +static int sqlite3ProcessJoin(Parse *pParse, Select *p){ SrcList *pSrc; /* All tables in the FROM clause */ int i, j; /* Loop counters */ SrcItem *pLeft; /* Left table being joined */ @@ -134729,49 +136089,41 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ pRight = &pLeft[1]; for(i=0; inSrc-1; i++, pRight++, pLeft++){ Table *pRightTab = pRight->pTab; - int isOuter; + u32 joinType; if( NEVER(pLeft->pTab==0 || pRightTab==0) ) continue; - isOuter = (pRight->fg.jointype & JT_OUTER)!=0; + joinType = (pRight->fg.jointype & JT_OUTER)!=0 ? EP_OuterON : EP_InnerON; - /* When the NATURAL keyword is present, add WHERE clause terms for - ** every column that the two tables have in common. + /* If this is a NATURAL join, synthesize an approprate USING clause + ** to specify which columns should be joined. */ if( pRight->fg.jointype & JT_NATURAL ){ - if( pRight->pOn || pRight->pUsing ){ + IdList *pUsing = 0; + if( pRight->fg.isUsing || pRight->u3.pOn ){ sqlite3ErrorMsg(pParse, "a NATURAL join may not have " "an ON or USING clause", 0); return 1; } for(j=0; jnCol; j++){ char *zName; /* Name of column in the right table */ - int iLeft; /* Matching left table */ - int iLeftCol; /* Matching column in the left table */ if( IsHiddenColumn(&pRightTab->aCol[j]) ) continue; zName = pRightTab->aCol[j].zCnName; - if( tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 1) ){ - addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, j, - isOuter, &p->pWhere); + if( tableAndColumnIndex(pSrc, 0, i, zName, 0, 0, 1) ){ + pUsing = sqlite3IdListAppend(pParse, pUsing, 0); + if( pUsing ){ + assert( pUsing->nId>0 ); + assert( pUsing->a[pUsing->nId-1].zName==0 ); + pUsing->a[pUsing->nId-1].zName = sqlite3DbStrDup(pParse->db, zName); + } } } - } - - /* Disallow both ON and USING clauses in the same join - */ - if( pRight->pOn && pRight->pUsing ){ - sqlite3ErrorMsg(pParse, "cannot have both ON and USING " - "clauses in the same join"); - return 1; - } - - /* Add the ON clause to the end of the WHERE clause, connected by - ** an AND operator. - */ - if( pRight->pOn ){ - if( isOuter ) sqlite3SetJoinExpr(pRight->pOn, pRight->iCursor); - p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->pOn); - pRight->pOn = 0; + if( pUsing ){ + pRight->fg.isUsing = 1; + pRight->fg.isSynthUsing = 1; + pRight->u3.pUsing = pUsing; + } + if( pParse->nErr ) return 1; } /* Create extra terms on the WHERE clause for each column named @@ -134781,27 +136133,88 @@ static int sqliteProcessJoin(Parse *pParse, Select *p){ ** Report an error if any column mentioned in the USING clause is ** not contained in both tables to be joined. */ - if( pRight->pUsing ){ - IdList *pList = pRight->pUsing; + if( pRight->fg.isUsing ){ + IdList *pList = pRight->u3.pUsing; + sqlite3 *db = pParse->db; + assert( pList!=0 ); for(j=0; jnId; j++){ char *zName; /* Name of the term in the USING clause */ int iLeft; /* Table on the left with matching column name */ int iLeftCol; /* Column number of matching column on the left */ int iRightCol; /* Column number of matching column on the right */ + Expr *pE1; /* Reference to the column on the LEFT of the join */ + Expr *pE2; /* Reference to the column on the RIGHT of the join */ + Expr *pEq; /* Equality constraint. pE1 == pE2 */ zName = pList->a[j].zName; iRightCol = sqlite3ColumnIndex(pRightTab, zName); if( iRightCol<0 - || !tableAndColumnIndex(pSrc, i+1, zName, &iLeft, &iLeftCol, 0) + || tableAndColumnIndex(pSrc, 0, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)==0 ){ sqlite3ErrorMsg(pParse, "cannot join using column %s - column " "not present in both tables", zName); return 1; } - addWhereTerm(pParse, pSrc, iLeft, iLeftCol, i+1, iRightCol, - isOuter, &p->pWhere); + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + if( (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* This branch runs if the query contains one or more RIGHT or FULL + ** JOINs. If only a single table on the left side of this join + ** contains the zName column, then this branch is a no-op. + ** But if there are two or more tables on the left side + ** of the join, construct a coalesce() function that gathers all + ** such tables. Raise an error if more than one of those references + ** to zName is not also within a prior USING clause. + ** + ** We really ought to raise an error if there are two or more + ** non-USING references to zName on the left of an INNER or LEFT + ** JOIN. But older versions of SQLite do not do that, so we avoid + ** adding a new error so as to not break legacy applications. + */ + ExprList *pFuncArgs = 0; /* Arguments to the coalesce() */ + static const Token tkCoalesce = { "coalesce", 8 }; + while( tableAndColumnIndex(pSrc, iLeft+1, i, zName, &iLeft, &iLeftCol, + pRight->fg.isSynthUsing)!=0 ){ + if( pSrc->a[iLeft].fg.isUsing==0 + || sqlite3IdListIndex(pSrc->a[iLeft].u3.pUsing, zName)<0 + ){ + sqlite3ErrorMsg(pParse, "ambiguous reference to %s in USING()", + zName); + break; + } + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3CreateColumnExpr(db, pSrc, iLeft, iLeftCol); + sqlite3SrcItemColumnUsed(&pSrc->a[iLeft], iLeftCol); + } + if( pFuncArgs ){ + pFuncArgs = sqlite3ExprListAppend(pParse, pFuncArgs, pE1); + pE1 = sqlite3ExprFunction(pParse, pFuncArgs, &tkCoalesce, 0); + } + } + pE2 = sqlite3CreateColumnExpr(db, pSrc, i+1, iRightCol); + sqlite3SrcItemColumnUsed(pRight, iRightCol); + pEq = sqlite3PExpr(pParse, TK_EQ, pE1, pE2); + assert( pE2!=0 || pEq==0 ); + if( pEq ){ + ExprSetProperty(pEq, joinType); + assert( !ExprHasProperty(pEq, EP_TokenOnly|EP_Reduced) ); + ExprSetVVAProperty(pEq, EP_NoReduce); + pEq->w.iJoin = pE2->iTable; + } + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pEq); } } + + /* Add the ON clause to the end of the WHERE clause, connected by + ** an AND operator. + */ + else if( pRight->u3.pOn ){ + sqlite3SetJoinExpr(pRight->u3.pOn, pRight->iCursor, joinType); + p->pWhere = sqlite3ExprAnd(pParse, p->pWhere, pRight->u3.pOn); + pRight->u3.pOn = 0; + pRight->fg.isOn = 1; + } } return 0; } @@ -135190,7 +136603,7 @@ static void fixDistinctOpenEph( ** retrieved directly from table t1. If the values are very large, this ** can be more efficient than storing them directly in the sorter records. ** -** The ExprList_item.bSorterRef flag is set for each expression in pEList +** The ExprList_item.fg.bSorterRef flag is set for each expression in pEList ** for which the sorter-reference optimization should be enabled. ** Additionally, the pSort->aDefer[] array is populated with entries ** for all cursors required to evaluate all selected expressions. Finally. @@ -135250,7 +136663,7 @@ static void selectExprDefer( nDefer++; } } - pItem->bSorterRef = 1; + pItem->fg.bSorterRef = 1; } } } @@ -135381,7 +136794,7 @@ static void selectInnerLoop( for(i=0; inExpr; i++){ if( pEList->a[i].u.x.iOrderByCol>0 #ifdef SQLITE_ENABLE_SORTER_REFERENCES - || pEList->a[i].bSorterRef + || pEList->a[i].fg.bSorterRef #endif ){ nResultCol--; @@ -135743,7 +137156,7 @@ SQLITE_PRIVATE KeyInfo *sqlite3KeyInfoFromExprList( assert( sqlite3KeyInfoIsWriteable(pInfo) ); for(i=iStart, pItem=pList->a+iStart; iaColl[i-iStart] = sqlite3ExprNNCollSeq(pParse, pItem->pExpr); - pInfo->aSortFlags[i-iStart] = pItem->sortFlags; + pInfo->aSortFlags[i-iStart] = pItem->fg.sortFlags; } } return pInfo; @@ -135871,7 +137284,7 @@ static void generateSortTail( if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce); addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak); VdbeCoverage(v); - codeOffset(v, p->iOffset, addrContinue); + assert( p->iLimit==0 && p->iOffset==0 ); sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab); bSeq = 0; }else{ @@ -135879,10 +137292,13 @@ static void generateSortTail( codeOffset(v, p->iOffset, addrContinue); iSortTab = iTab; bSeq = 1; + if( p->iOffset>0 ){ + sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1); + } } for(i=0, iCol=nKey+bSeq-1; i=0; i--){ #ifdef SQLITE_ENABLE_SORTER_REFERENCES - if( aOutEx[i].bSorterRef ){ + if( aOutEx[i].fg.bSorterRef ){ sqlite3ExprCode(pParse, aOutEx[i].pExpr, regRow+i); }else #endif @@ -136285,7 +137701,7 @@ SQLITE_PRIVATE void sqlite3GenerateColumnNames( assert( p->op!=TK_AGG_COLUMN ); /* Agg processing has not run yet */ assert( p->op!=TK_COLUMN || (ExprUseYTab(p) && p->y.pTab!=0) ); /* Covering idx not yet coded */ - if( pEList->a[i].zEName && pEList->a[i].eEName==ENAME_NAME ){ + if( pEList->a[i].zEName && pEList->a[i].fg.eEName==ENAME_NAME ){ /* An AS clause always takes first priority */ char *zName = pEList->a[i].zEName; sqlite3VdbeSetColName(v, i, COLNAME_NAME, zName, SQLITE_TRANSIENT); @@ -136370,22 +137786,25 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( *paCol = aCol; for(i=0, pCol=aCol; imallocFailed; i++, pCol++){ + struct ExprList_item *pX = &pEList->a[i]; + struct ExprList_item *pCollide; /* Get an appropriate name for the column */ - if( (zName = pEList->a[i].zEName)!=0 && pEList->a[i].eEName==ENAME_NAME ){ + if( (zName = pX->zEName)!=0 && pX->fg.eEName==ENAME_NAME ){ /* If the column contains an "AS " phrase, use as the name */ }else{ - Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pEList->a[i].pExpr); + Expr *pColExpr = sqlite3ExprSkipCollateAndLikely(pX->pExpr); while( ALWAYS(pColExpr!=0) && pColExpr->op==TK_DOT ){ pColExpr = pColExpr->pRight; assert( pColExpr!=0 ); } if( pColExpr->op==TK_COLUMN && ALWAYS( ExprUseYTab(pColExpr) ) - && (pTab = pColExpr->y.pTab)!=0 + && ALWAYS( pColExpr->y.pTab!=0 ) ){ /* For columns use the column name name */ int iCol = pColExpr->iColumn; + pTab = pColExpr->y.pTab; if( iCol<0 ) iCol = pTab->iPKey; zName = iCol>=0 ? pTab->aCol[iCol].zCnName : "rowid"; }else if( pColExpr->op==TK_ID ){ @@ -136393,7 +137812,7 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( zName = pColExpr->u.zToken; }else{ /* Use the original text of the column expression as its name */ - zName = pEList->a[i].zEName; + assert( zName==pX->zEName ); /* pointer comparison intended */ } } if( zName && !sqlite3IsTrueOrFalse(zName) ){ @@ -136406,7 +137825,10 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( ** append an integer to the name so that it becomes unique. */ cnt = 0; - while( zName && sqlite3HashFind(&ht, zName)!=0 ){ + while( zName && (pCollide = sqlite3HashFind(&ht, zName))!=0 ){ + if( pCollide->fg.bUsingTerm ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } nName = sqlite3Strlen30(zName); if( nName>0 ){ for(j=nName-1; j>0 && sqlite3Isdigit(zName[j]); j--){} @@ -136417,8 +137839,11 @@ SQLITE_PRIVATE int sqlite3ColumnsFromExprList( } pCol->zCnName = zName; pCol->hName = sqlite3StrIHash(zName); + if( pX->fg.bNoExpand ){ + pCol->colFlags |= COLFLAG_NOEXPAND; + } sqlite3ColumnPropertiesFromName(0, pCol); - if( zName && sqlite3HashInsert(&ht, zName, pCol)==pCol ){ + if( zName && sqlite3HashInsert(&ht, zName, pX)==pX ){ sqlite3OomFault(db); } } @@ -136675,7 +138100,7 @@ static KeyInfo *multiSelectOrderByKeyInfo(Parse *pParse, Select *p, int nExtra){ } assert( sqlite3KeyInfoIsWriteable(pRet) ); pRet->aColl[i] = pColl; - pRet->aSortFlags[i] = pOrderBy->a[i].sortFlags; + pRet->aSortFlags[i] = pOrderBy->a[i].fg.sortFlags; } } @@ -136893,7 +138318,7 @@ static int multiSelectOrderBy( ** The "LIMIT of exactly 1" case of condition (1) comes about when a VALUES ** clause occurs within scalar expression (ex: "SELECT (VALUES(1),(2),(3))"). ** The sqlite3CodeSubselect will have added the LIMIT 1 clause in tht case. -** Since the limit is exactly 1, we only need to evalutes the left-most VALUES. +** Since the limit is exactly 1, we only need to evaluate the left-most VALUES. */ static int multiSelectValues( Parse *pParse, /* Parsing context */ @@ -137862,10 +139287,11 @@ static int multiSelectOrderBy( */ sqlite3VdbeResolveLabel(v, labelEnd); - /* Reassembly the compound query so that it will be freed correctly + /* Reassemble the compound query so that it will be freed correctly ** by the calling function */ if( pSplit->pPrior ){ - sqlite3SelectDelete(db, pSplit->pPrior); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior); } pSplit->pPrior = pPrior; pPrior->pNext = pSplit; @@ -137886,12 +139312,40 @@ static int multiSelectOrderBy( ** ** All references to columns in table iTable are to be replaced by corresponding ** expressions in pEList. +** +** ## About "isOuterJoin": +** +** The isOuterJoin column indicates that the replacement will occur into a +** position in the parent that NULL-able due to an OUTER JOIN. Either the +** target slot in the parent is the right operand of a LEFT JOIN, or one of +** the left operands of a RIGHT JOIN. In either case, we need to potentially +** bypass the substituted expression with OP_IfNullRow. +** +** Suppose the original expression integer constant. Even though the table +** has the nullRow flag set, because the expression is an integer constant, +** it will not be NULLed out. So instead, we insert an OP_IfNullRow opcode +** that checks to see if the nullRow flag is set on the table. If the nullRow +** flag is set, then the value in the register is set to NULL and the original +** expression is bypassed. If the nullRow flag is not set, then the original +** expression runs to populate the register. +** +** Example where this is needed: +** +** CREATE TABLE t1(a INTEGER PRIMARY KEY, b INT); +** CREATE TABLE t2(x INT UNIQUE); +** +** SELECT a,b,m,x FROM t1 LEFT JOIN (SELECT 59 AS m,x FROM t2) ON b=x; +** +** When the subquery on the right side of the LEFT JOIN is flattened, we +** have to add OP_IfNullRow in front of the OP_Integer that implements the +** "m" value of the subquery so that a NULL will be loaded instead of 59 +** when processing a non-matched row of the left. */ typedef struct SubstContext { Parse *pParse; /* The parsing context */ int iTable; /* Replace references to this table */ int iNewTable; /* New table number */ - int isLeftJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ + int isOuterJoin; /* Add TK_IF_NULL_ROW opcodes on each replacement */ ExprList *pEList; /* Replacement expressions */ } SubstContext; @@ -137917,10 +139371,11 @@ static Expr *substExpr( Expr *pExpr /* Expr in which substitution occurs */ ){ if( pExpr==0 ) return 0; - if( ExprHasProperty(pExpr, EP_FromJoin) - && pExpr->w.iRightJoinTable==pSubst->iTable + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) + && pExpr->w.iJoin==pSubst->iTable ){ - pExpr->w.iRightJoinTable = pSubst->iNewTable; + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + pExpr->w.iJoin = pSubst->iNewTable; } if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable @@ -137941,7 +139396,7 @@ static Expr *substExpr( sqlite3VectorErrorMsg(pSubst->pParse, pCopy); }else{ sqlite3 *db = pSubst->pParse->db; - if( pSubst->isLeftJoin && pCopy->op!=TK_COLUMN ){ + if( pSubst->isOuterJoin && pCopy->op!=TK_COLUMN ){ memset(&ifNullRow, 0, sizeof(ifNullRow)); ifNullRow.op = TK_IF_NULL_ROW; ifNullRow.pLeft = pCopy; @@ -137955,14 +139410,20 @@ static Expr *substExpr( sqlite3ExprDelete(db, pNew); return pExpr; } - if( pSubst->isLeftJoin ){ + if( pSubst->isOuterJoin ){ ExprSetProperty(pNew, EP_CanBeNull); } - if( ExprHasProperty(pExpr,EP_FromJoin) ){ - sqlite3SetJoinExpr(pNew, pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr,EP_OuterON|EP_InnerON) ){ + sqlite3SetJoinExpr(pNew, pExpr->w.iJoin, + pExpr->flags & (EP_OuterON|EP_InnerON)); } sqlite3ExprDelete(db, pExpr); pExpr = pNew; + if( pExpr->op==TK_TRUEFALSE ){ + pExpr->u.iValue = sqlite3ExprTruthValue(pExpr); + pExpr->op = TK_INTEGER; + ExprSetProperty(pExpr, EP_IntValue); + } /* Ensure that the expression now has an implicit collation sequence, ** just as it did when it was a column of a view or sub-query. */ @@ -138123,8 +139584,8 @@ static int renumberCursorsCb(Walker *pWalker, Expr *pExpr){ if( op==TK_COLUMN || op==TK_IF_NULL_ROW ){ renumberCursorDoMapping(pWalker, &pExpr->iTable); } - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - renumberCursorDoMapping(pWalker, &pExpr->w.iRightJoinTable); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + renumberCursorDoMapping(pWalker, &pExpr->w.iJoin); } return WRC_Continue; } @@ -138209,6 +139670,7 @@ static void renumberCursors( ** table and ** (3c) the outer query may not be an aggregate. ** (3d) the outer query may not be DISTINCT. +** See also (26) for restrictions on RIGHT JOIN. ** ** (4) The subquery can not be DISTINCT. ** @@ -138260,6 +139722,9 @@ static void renumberCursors( ** (17d2) DISTINCT ** (17e) the subquery may not contain window functions, and ** (17f) the subquery must not be the RHS of a LEFT JOIN. +** (17g) either the subquery is the first element of the outer +** query or there are no RIGHT or FULL JOINs in any arm +** of the subquery. (This is a duplicate of condition (27b).) ** ** The parent and sub-query may contain WHERE clauses. Subject to ** rules (11), (13) and (14), they may also contain ORDER BY, @@ -138307,6 +139772,23 @@ static void renumberCursors( ** function in the select list or ORDER BY clause, flattening ** is not attempted. ** +** (26) The subquery may not be the right operand of a RIGHT JOIN. +** See also (3) for restrictions on LEFT JOIN. +** +** (27) The subquery may not contain a FULL or RIGHT JOIN unless it +** is the first element of the parent query. This must be the +** the case if: +** (27a) the subquery is not compound query, and +** (27b) the subquery is a compound query and the RIGHT JOIN occurs +** in any arm of the compound query. (See also (17g).) +** +** (28) The subquery is not a MATERIALIZED CTE. +** +** (29) Either the subquery is not the right-hand operand of a join with an +** ON or USING clause nor the right-hand operand of a NATURAL JOIN, or +** the right-most table within the FROM clause of the subquery +** is not part of an outer join. +** ** ** In this routine, the "p" parameter is a pointer to the outer query. ** The subquery is p->pSrc->a[iFrom]. isAgg is true if the outer query @@ -138332,7 +139814,7 @@ static int flattenSubquery( SrcList *pSubSrc; /* The FROM clause of the subquery */ int iParent; /* VDBE cursor number of the pSub result set temp table */ int iNewParent = -1;/* Replacement table for iParent */ - int isLeftJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ + int isOuterJoin = 0; /* True if pSub is the right side of a LEFT JOIN */ int i; /* Loop counter */ Expr *pWhere; /* The WHERE clause */ SrcItem *pSubitem; /* The subquery */ @@ -138405,25 +139887,63 @@ static int flattenSubquery( ** ** See also tickets #306, #350, and #3300. */ - if( (pSubitem->fg.jointype & JT_OUTER)!=0 ){ - isLeftJoin = 1; - if( pSubSrc->nSrc>1 /* (3a) */ - || isAgg /* (3b) */ - || IsVirtual(pSubSrc->a[0].pTab) /* (3c) */ - || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + if( (pSubitem->fg.jointype & (JT_OUTER|JT_LTORJ))!=0 ){ + if( pSubSrc->nSrc>1 /* (3a) */ + || isAgg /* (3c) */ + || IsVirtual(pSubSrc->a[0].pTab) /* (3b) */ + || (p->selFlags & SF_Distinct)!=0 /* (3d) */ + || (pSubitem->fg.jointype & JT_RIGHT)!=0 /* (26) */ + ){ + return 0; + } + isOuterJoin = 1; + } +#ifdef SQLITE_EXTRA_IFNULLROW + else if( iFrom>0 && !isAgg ){ + /* Setting isOuterJoin to -1 causes OP_IfNullRow opcodes to be generated for + ** every reference to any result column from subquery in a join, even + ** though they are not necessary. This will stress-test the OP_IfNullRow + ** opcode. */ + isOuterJoin = -1; + } +#endif + + assert( pSubSrc->nSrc>0 ); /* True by restriction (7) */ + if( iFrom>0 && (pSubSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + return 0; /* Restriction (27a) */ + } + if( pSubitem->fg.isCte && pSubitem->u2.pCteUse->eM10d==M10d_Yes ){ + return 0; /* (28) */ + } + + /* Restriction (29): + ** + ** We do not want two constraints on the same term of the flattened + ** query where one constraint has EP_InnerON and the other is EP_OuterON. + ** To prevent this, one or the other of the following conditions must be + ** false: + ** + ** (29a) The right-most entry in the FROM clause of the subquery + ** must not be part of an outer join. + ** + ** (29b) The subquery itself must not be the right operand of a + ** NATURAL join or a join that as an ON or USING clause. + ** + ** These conditions are sufficient to keep an EP_OuterON from being + ** flattened into an EP_InnerON. Restrictions (3a) and (27a) prevent + ** an EP_InnerON from being flattened into an EP_OuterON. + */ + if( pSubSrc->nSrc>=2 + && (pSubSrc->a[pSubSrc->nSrc-1].fg.jointype & JT_OUTER)!=0 + ){ + if( (pSubitem->fg.jointype & JT_NATURAL)!=0 + || pSubitem->fg.isUsing + || NEVER(pSubitem->u3.pOn!=0) /* ON clause already shifted into WHERE */ + || pSubitem->fg.isOn ){ return 0; } } -#ifdef SQLITE_EXTRA_IFNULLROW - else if( iFrom>0 && !isAgg ){ - /* Setting isLeftJoin to -1 causes OP_IfNullRow opcodes to be generated for - ** every reference to any result column from subquery in a join, even - ** though they are not necessary. This will stress-test the OP_IfNullRow - ** opcode. */ - isLeftJoin = -1; - } -#endif /* Restriction (17): If the sub-query is a compound SELECT, then it must ** use only the UNION ALL operator. And none of the simple select queries @@ -138434,7 +139954,7 @@ static int flattenSubquery( if( pSub->pOrderBy ){ return 0; /* Restriction (20) */ } - if( isAgg || (p->selFlags & SF_Distinct)!=0 || isLeftJoin>0 ){ + if( isAgg || (p->selFlags & SF_Distinct)!=0 || isOuterJoin>0 ){ return 0; /* (17d1), (17d2), or (17f) */ } for(pSub1=pSub; pSub1; pSub1=pSub1->pPrior){ @@ -138452,6 +139972,12 @@ static int flattenSubquery( ){ return 0; } + if( iFrom>0 && (pSub1->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + /* Without this restriction, the JT_LTORJ flag would end up being + ** omitted on left-hand tables of the right join that is being + ** flattened. */ + return 0; /* Restrictions (17g), (27b) */ + } testcase( pSub1->pSrc->nSrc>1 ); } @@ -138468,6 +139994,7 @@ static int flattenSubquery( if( pSrc->nSrc>1 ){ if( pParse->nSelect>500 ) return 0; + if( OptimizationDisabled(db, SQLITE_FlttnUnionAll) ) return 0; aCsrMap = sqlite3DbMallocZero(db, ((i64)pParse->nTab+1)*sizeof(int)); if( aCsrMap ) aCsrMap[0] = pParse->nTab; } @@ -138492,7 +140019,7 @@ static int flattenSubquery( pSubitem->zName = 0; pSubitem->zAlias = 0; pSubitem->pSelect = 0; - assert( pSubitem->pOn==0 ); + assert( pSubitem->fg.isUsing!=0 || pSubitem->u3.pOn==0 ); /* If the sub-query is a compound SELECT statement, then (by restrictions ** 17 and 18 above) it must be a UNION ALL and the parent query must @@ -138602,6 +140129,7 @@ static int flattenSubquery( for(pParent=p; pParent; pParent=pParent->pPrior, pSub=pSub->pPrior){ int nSubSrc; u8 jointype = 0; + u8 ltorj = pSrc->a[iFrom].fg.jointype & JT_LTORJ; assert( pSub!=0 ); pSubSrc = pSub->pSrc; /* FROM clause of subquery */ nSubSrc = pSubSrc->nSrc; /* Number of terms in subquery FROM clause */ @@ -138636,13 +140164,16 @@ static int flattenSubquery( ** outer query. */ for(i=0; ia[i+iFrom].pUsing); - assert( pSrc->a[i+iFrom].fg.isTabFunc==0 ); - pSrc->a[i+iFrom] = pSubSrc->a[i]; + SrcItem *pItem = &pSrc->a[i+iFrom]; + if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing); + assert( pItem->fg.isTabFunc==0 ); + *pItem = pSubSrc->a[i]; + pItem->fg.jointype |= ltorj; iNewParent = pSubSrc->a[i].iCursor; memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i])); } - pSrc->a[iFrom].fg.jointype = jointype; + pSrc->a[iFrom].fg.jointype &= JT_LTORJ; + pSrc->a[iFrom].fg.jointype |= jointype | ltorj; /* Now begin substituting subquery result set expressions for ** references to the iParent in the outer query. @@ -138677,8 +140208,8 @@ static int flattenSubquery( } pWhere = pSub->pWhere; pSub->pWhere = 0; - if( isLeftJoin>0 ){ - sqlite3SetJoinExpr(pWhere, iNewParent); + if( isOuterJoin>0 ){ + sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON); } if( pWhere ){ if( pParent->pWhere ){ @@ -138692,7 +140223,7 @@ static int flattenSubquery( x.pParse = pParse; x.iTable = iParent; x.iNewTable = iNewParent; - x.isLeftJoin = isLeftJoin; + x.isOuterJoin = isOuterJoin; x.pEList = pSub->pEList; substSelect(&x, pParent, 0); } @@ -138727,8 +140258,8 @@ static int flattenSubquery( sqlite3WalkSelect(&w,pSub1); sqlite3SelectDelete(db, pSub1); -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p,("After flattening:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -138749,6 +140280,8 @@ struct WhereConst { int nConst; /* Number for COLUMN=CONSTANT terms */ int nChng; /* Number of times a constant is propagated */ int bHasAffBlob; /* At least one column in apExpr[] as affinity BLOB */ + u32 mExcludeOn; /* Which ON expressions to exclude from considertion. + ** Either EP_OuterON or EP_InnerON|EP_OuterON */ Expr **apExpr; /* [i*2] is COLUMN and [i*2+1] is VALUE */ }; @@ -138811,7 +140344,11 @@ static void constInsert( static void findConstInWhere(WhereConst *pConst, Expr *pExpr){ Expr *pRight, *pLeft; if( NEVER(pExpr==0) ) return; - if( ExprHasProperty(pExpr, EP_FromJoin) ) return; + if( ExprHasProperty(pExpr, pConst->mExcludeOn) ){ + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); + return; + } if( pExpr->op==TK_AND ){ findConstInWhere(pConst, pExpr->pRight); findConstInWhere(pConst, pExpr->pLeft); @@ -138847,9 +140384,10 @@ static int propagateConstantExprRewriteOne( int i; if( pConst->pOomFault[0] ) return WRC_Prune; if( pExpr->op!=TK_COLUMN ) return WRC_Continue; - if( ExprHasProperty(pExpr, EP_FixedCol|EP_FromJoin) ){ + if( ExprHasProperty(pExpr, EP_FixedCol|pConst->mExcludeOn) ){ testcase( ExprHasProperty(pExpr, EP_FixedCol) ); - testcase( ExprHasProperty(pExpr, EP_FromJoin) ); + testcase( ExprHasProperty(pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pExpr, EP_InnerON) ); return WRC_Continue; } for(i=0; inConst; i++){ @@ -138973,6 +140511,17 @@ static int propagateConstants( x.nChng = 0; x.apExpr = 0; x.bHasAffBlob = 0; + if( ALWAYS(p->pSrc!=0) + && p->pSrc->nSrc>0 + && (p->pSrc->a[0].fg.jointype & JT_LTORJ)!=0 + ){ + /* Do not propagate constants on any ON clause if there is a + ** RIGHT JOIN anywhere in the query */ + x.mExcludeOn = EP_InnerON | EP_OuterON; + }else{ + /* Do not propagate constants through the ON clause of a LEFT JOIN */ + x.mExcludeOn = EP_OuterON; + } findConstInWhere(&x, p->pWhere); if( x.nConst ){ memset(&w, 0, sizeof(w)); @@ -139098,6 +140647,7 @@ static int pushDownWhereTerms( int nChng = 0; if( pWhere==0 ) return 0; if( pSubq->selFlags & (SF_Recursive|SF_MultiPart) ) return 0; + if( pSrc->fg.jointype & (JT_LTORJ|JT_RIGHT) ) return 0; #ifndef SQLITE_OMIT_WINDOWFUNC if( pSubq->pPrior ){ @@ -139133,13 +140683,13 @@ static int pushDownWhereTerms( #if 0 /* Legacy code. Checks now done by sqlite3ExprIsTableConstraint() */ if( isLeftJoin - && (ExprHasProperty(pWhere,EP_FromJoin)==0 - || pWhere->w.iRightJoinTable!=iCursor) + && (ExprHasProperty(pWhere,EP_OuterON)==0 + || pWhere->w.iJoin!=iCursor) ){ return 0; /* restriction (4) */ } - if( ExprHasProperty(pWhere,EP_FromJoin) - && pWhere->w.iRightJoinTable!=iCursor + if( ExprHasProperty(pWhere,EP_OuterON) + && pWhere->w.iJoin!=iCursor ){ return 0; /* restriction (5) */ } @@ -139151,11 +140701,11 @@ static int pushDownWhereTerms( while( pSubq ){ SubstContext x; pNew = sqlite3ExprDup(pParse->db, pWhere, 0); - unsetJoinExpr(pNew, -1); + unsetJoinExpr(pNew, -1, 1); x.pParse = pParse; x.iTable = pSrc->iCursor; x.iNewTable = pSrc->iCursor; - x.isLeftJoin = 0; + x.isOuterJoin = 0; x.pEList = pSubq->pEList; pNew = substExpr(&x, pNew); #ifndef SQLITE_OMIT_WINDOWFUNC @@ -139228,7 +140778,7 @@ static u8 minMaxQuery(sqlite3 *db, Expr *pFunc, ExprList **ppMinMax){ } *ppMinMax = pOrderBy = sqlite3ExprListDup(db, pEList, 0); assert( pOrderBy!=0 || db->mallocFailed ); - if( pOrderBy ) pOrderBy->a[0].sortFlags = sortFlags; + if( pOrderBy ) pOrderBy->a[0].fg.sortFlags = sortFlags; return eRet; } @@ -139260,6 +140810,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ || p->pSrc->nSrc!=1 || p->pSrc->a[0].pSelect || pAggInfo->nFunc!=1 + || p->pHaving ){ return 0; } @@ -139364,7 +140915,7 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ pNew = sqlite3DbMallocZero(db, sizeof(*pNew) ); if( pNew==0 ) return WRC_Abort; memset(&dummy, 0, sizeof(dummy)); - pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0,0); + pNewSrc = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&dummy,pNew,0); if( pNewSrc==0 ) return WRC_Abort; *pNew = *p; p->pSrc = pNewSrc; @@ -139697,7 +141248,7 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ if( pFrom->zAlias ){ pTab->zName = sqlite3DbStrDup(pParse->db, pFrom->zAlias); }else{ - pTab->zName = sqlite3MPrintf(pParse->db, "subquery_%u", pSel->selId); + pTab->zName = sqlite3MPrintf(pParse->db, "%!S", pFrom); } while( pSel->pPrior ){ pSel = pSel->pPrior; } sqlite3ColumnsFromExprList(pParse, pSel->pEList,&pTab->nCol,&pTab->aCol); @@ -139709,11 +141260,35 @@ SQLITE_PRIVATE int sqlite3ExpandSubquery(Parse *pParse, SrcItem *pFrom){ #else pTab->tabFlags |= TF_Ephemeral; /* Legacy compatibility mode */ #endif - - return pParse->nErr ? SQLITE_ERROR : SQLITE_OK; } + +/* +** Check the N SrcItem objects to the right of pBase. (N might be zero!) +** If any of those SrcItem objects have a USING clause containing zName +** then return true. +** +** If N is zero, or none of the N SrcItem objects to the right of pBase +** contains a USING clause, or if none of the USING clauses contain zName, +** then return false. +*/ +static int inAnyUsingClause( + const char *zName, /* Name we are looking for */ + SrcItem *pBase, /* The base SrcItem. Looking at pBase[1] and following */ + int N /* How many SrcItems to check */ +){ + while( N>0 ){ + N--; + pBase++; + if( pBase->fg.isUsing==0 ) continue; + if( NEVER(pBase->u3.pUsing==0) ) continue; + if( sqlite3IdListIndex(pBase->u3.pUsing, zName)>=0 ) return 1; + } + return 0; +} + + /* ** This routine is a Walker callback for "expanding" a SELECT statement. ** "Expanding" means to do the following: @@ -139863,7 +141438,7 @@ static int selectExpander(Walker *pWalker, Select *p){ /* Process NATURAL keywords, and ON and USING clauses of joins. */ assert( db->mallocFailed==0 || pParse->nErr!=0 ); - if( pParse->nErr || sqliteProcessJoin(pParse, p) ){ + if( pParse->nErr || sqlite3ProcessJoin(pParse, p) ){ return WRC_Abort; } @@ -139911,7 +141486,7 @@ static int selectExpander(Walker *pWalker, Select *p){ pNew = sqlite3ExprListAppend(pParse, pNew, a[k].pExpr); if( pNew ){ pNew->a[pNew->nExpr-1].zEName = a[k].zEName; - pNew->a[pNew->nExpr-1].eEName = a[k].eEName; + pNew->a[pNew->nExpr-1].fg.eEName = a[k].fg.eEName; a[k].zEName = 0; } a[k].pExpr = 0; @@ -139926,32 +141501,60 @@ static int selectExpander(Walker *pWalker, Select *p){ zTName = pE->pLeft->u.zToken; } for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - Select *pSub = pFrom->pSelect; - char *zTabName = pFrom->zAlias; - const char *zSchemaName = 0; - int iDb; - if( zTabName==0 ){ + Table *pTab = pFrom->pTab; /* Table for this data source */ + ExprList *pNestedFrom; /* Result-set of a nested FROM clause */ + char *zTabName; /* AS name for this data source */ + const char *zSchemaName = 0; /* Schema name for this data source */ + int iDb; /* Schema index for this data src */ + IdList *pUsing; /* USING clause for pFrom[1] */ + + if( (zTabName = pFrom->zAlias)==0 ){ zTabName = pTab->zName; } if( db->mallocFailed ) break; - if( pSub==0 || (pSub->selFlags & SF_NestedFrom)==0 ){ - pSub = 0; + assert( (int)pFrom->fg.isNestedFrom == IsNestedFrom(pFrom->pSelect) ); + if( pFrom->fg.isNestedFrom ){ + assert( pFrom->pSelect!=0 ); + pNestedFrom = pFrom->pSelect->pEList; + assert( pNestedFrom!=0 ); + assert( pNestedFrom->nExpr==pTab->nCol ); + }else{ if( zTName && sqlite3StrICmp(zTName, zTabName)!=0 ){ continue; } + pNestedFrom = 0; iDb = sqlite3SchemaToIndex(db, pTab->pSchema); zSchemaName = iDb>=0 ? db->aDb[iDb].zDbSName : "*"; } + if( i+1nSrc + && pFrom[1].fg.isUsing + && (selFlags & SF_NestedFrom)!=0 + ){ + int ii; + pUsing = pFrom[1].u3.pUsing; + for(ii=0; iinId; ii++){ + const char *zUName = pUsing->a[ii].zName; + pRight = sqlite3Expr(db, TK_ID, zUName); + pNew = sqlite3ExprListAppend(pParse, pNew, pRight); + if( pNew ){ + struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + pX->zEName = sqlite3MPrintf(db,"..%s", zUName); + pX->fg.eEName = ENAME_TAB; + pX->fg.bUsingTerm = 1; + } + } + }else{ + pUsing = 0; + } for(j=0; jnCol; j++){ char *zName = pTab->aCol[j].zCnName; - char *zColname; /* The computed column name */ - char *zToFree; /* Malloced string that needs to be freed */ - Token sColname; /* Computed column name as a token */ + struct ExprList_item *pX; /* Newly added ExprList term */ assert( zName ); - if( zTName && pSub - && sqlite3MatchEName(&pSub->pEList->a[j], 0, zTName, 0)==0 + if( zTName + && pNestedFrom + && sqlite3MatchEName(&pNestedFrom->a[j], 0, zTName, 0)==0 ){ continue; } @@ -139965,57 +141568,75 @@ static int selectExpander(Walker *pWalker, Select *p){ ){ continue; } + if( (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + && zTName==0 + && (selFlags & (SF_NestedFrom))==0 + ){ + continue; + } tableSeen = 1; - if( i>0 && zTName==0 ){ - if( (pFrom->fg.jointype & JT_NATURAL)!=0 - && tableAndColumnIndex(pTabList, i, zName, 0, 0, 1) + if( i>0 && zTName==0 && (selFlags & SF_NestedFrom)==0 ){ + if( pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0 ){ - /* In a NATURAL join, omit the join columns from the - ** table to the right of the join */ - continue; - } - if( sqlite3IdListIndex(pFrom->pUsing, zName)>=0 ){ /* In a join with a USING clause, omit columns in the ** using clause from the table on the right. */ continue; } } pRight = sqlite3Expr(db, TK_ID, zName); - zColname = zName; - zToFree = 0; - if( longNames || pTabList->nSrc>1 ){ + if( (pTabList->nSrc>1 + && ( (pFrom->fg.jointype & JT_LTORJ)==0 + || (selFlags & SF_NestedFrom)!=0 + || !inAnyUsingClause(zName,pFrom,pTabList->nSrc-i-1) + ) + ) + || IN_RENAME_OBJECT + ){ Expr *pLeft; pLeft = sqlite3Expr(db, TK_ID, zTabName); pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight); + if( IN_RENAME_OBJECT && pE->pLeft ){ + sqlite3RenameTokenRemap(pParse, pLeft, pE->pLeft); + } if( zSchemaName ){ pLeft = sqlite3Expr(db, TK_ID, zSchemaName); pExpr = sqlite3PExpr(pParse, TK_DOT, pLeft, pExpr); } - if( longNames ){ - zColname = sqlite3MPrintf(db, "%s.%s", zTabName, zName); - zToFree = zColname; - } }else{ pExpr = pRight; } pNew = sqlite3ExprListAppend(pParse, pNew, pExpr); - sqlite3TokenInit(&sColname, zColname); - sqlite3ExprListSetName(pParse, pNew, &sColname, 0); - if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ - struct ExprList_item *pX = &pNew->a[pNew->nExpr-1]; - sqlite3DbFree(db, pX->zEName); - if( pSub ){ - pX->zEName = sqlite3DbStrDup(db, pSub->pEList->a[j].zEName); + if( pNew==0 ){ + break; /* OOM */ + } + pX = &pNew->a[pNew->nExpr-1]; + assert( pX->zEName==0 ); + if( (selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){ + if( pNestedFrom ){ + pX->zEName = sqlite3DbStrDup(db, pNestedFrom->a[j].zEName); testcase( pX->zEName==0 ); }else{ pX->zEName = sqlite3MPrintf(db, "%s.%s.%s", - zSchemaName, zTabName, zColname); + zSchemaName, zTabName, zName); testcase( pX->zEName==0 ); } - pX->eEName = ENAME_TAB; + pX->fg.eEName = ENAME_TAB; + if( (pFrom->fg.isUsing + && sqlite3IdListIndex(pFrom->u3.pUsing, zName)>=0) + || (pUsing && sqlite3IdListIndex(pUsing, zName)>=0) + || (pTab->aCol[j].colFlags & COLFLAG_NOEXPAND)!=0 + ){ + pX->fg.bNoExpand = 1; + } + }else if( longNames ){ + pX->zEName = sqlite3MPrintf(db, "%s.%s", zTabName, zName); + pX->fg.eEName = ENAME_NAME; + }else{ + pX->zEName = sqlite3DbStrDup(db, zName); + pX->fg.eEName = ENAME_NAME; } - sqlite3DbFree(db, zToFree); } } if( !tableSeen ){ @@ -140039,6 +141660,12 @@ static int selectExpander(Walker *pWalker, Select *p){ p->selFlags |= SF_ComplexResult; } } +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ + SELECTTRACE(0x100,pParse,p,("After result-set wildcard expansion:\n")); + sqlite3TreeViewSelect(0, p, 0); + } +#endif return WRC_Continue; } @@ -140429,8 +142056,8 @@ static void havingToWhere(Parse *pParse, Select *p){ sWalker.xExprCallback = havingToWhereExprCb; sWalker.u.pSelect = p; sqlite3WalkExpr(&sWalker, p->pHaving); -#if SELECTTRACE_ENABLED - if( sWalker.eCode && (sqlite3SelectTrace & 0x100)!=0 ){ +#if TREETRACE_ENABLED + if( sWalker.eCode && (sqlite3TreeTrace & 0x100)!=0 ){ SELECTTRACE(0x100,pParse,p,("Move HAVING terms into WHERE:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140562,8 +142189,8 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ p->pEList->a[0].pExpr = pExpr; p->selFlags &= ~SF_Aggregate; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("After count-of-view optimization:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140572,6 +142199,29 @@ static int countOfViewOptimization(Parse *pParse, Select *p){ } #endif /* SQLITE_COUNTOFVIEW_OPTIMIZATION */ +/* +** If any term of pSrc, or any SF_NestedFrom sub-query, is not the same +** as pSrcItem but has the same alias as p0, then return true. +** Otherwise return false. +*/ +static int sameSrcAlias(SrcItem *p0, SrcList *pSrc){ + int i; + for(i=0; inSrc; i++){ + SrcItem *p1 = &pSrc->a[i]; + if( p1==p0 ) continue; + if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ + return 1; + } + if( p1->pSelect + && (p1->pSelect->selFlags & SF_NestedFrom)!=0 + && sameSrcAlias(p0, p1->pSelect->pSrc) + ){ + return 1; + } + } + return 0; +} + /* ** Generate code for the SELECT statement given in the p argument. ** @@ -140616,10 +142266,14 @@ SQLITE_PRIVATE int sqlite3Select( } assert( db->mallocFailed==0 ); if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); - if( sqlite3SelectTrace & 0x100 ){ - sqlite3TreeViewSelect(0, p, 0); + if( sqlite3TreeTrace & 0x10100 ){ + if( (sqlite3TreeTrace & 0x10001)==0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Select() at %s:%d", + __FILE__, __LINE__); + } + sqlite3ShowSelect(p); } #endif @@ -140633,9 +142287,9 @@ SQLITE_PRIVATE int sqlite3Select( pDest->eDest==SRT_DistQueue || pDest->eDest==SRT_DistFifo ); /* All of these destinations are also able to ignore the ORDER BY clause */ if( p->pOrderBy ){ -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(1,pParse,p, ("dropping superfluous ORDER BY:\n")); - if( sqlite3SelectTrace & 0x100 ){ + if( sqlite3TreeTrace & 0x100 ){ sqlite3TreeViewExprList(0, p->pOrderBy, 0, "ORDERBY"); } #endif @@ -140654,8 +142308,8 @@ SQLITE_PRIVATE int sqlite3Select( } assert( db->mallocFailed==0 ); assert( p->pEList!=0 ); -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x104 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x104 ){ SELECTTRACE(0x104,pParse,p, ("after name resolution:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140672,15 +142326,12 @@ SQLITE_PRIVATE int sqlite3Select( ** disallow it altogether. */ if( p->selFlags & SF_UFSrcCheck ){ SrcItem *p0 = &p->pSrc->a[0]; - for(i=1; ipSrc->nSrc; i++){ - SrcItem *p1 = &p->pSrc->a[i]; - if( p0->pTab==p1->pTab && 0==sqlite3_stricmp(p0->zAlias, p1->zAlias) ){ - sqlite3ErrorMsg(pParse, - "target object/alias may not appear in FROM clause: %s", - p0->zAlias ? p0->zAlias : p0->pTab->zName - ); - goto select_end; - } + if( sameSrcAlias(p0, p->pSrc) ){ + sqlite3ErrorMsg(pParse, + "target object/alias may not appear in FROM clause: %s", + p0->zAlias ? p0->zAlias : p0->pTab->zName + ); + goto select_end; } /* Clear the SF_UFSrcCheck flag. The check has already been performed, @@ -140699,8 +142350,8 @@ SQLITE_PRIVATE int sqlite3Select( assert( pParse->nErr ); goto select_end; } -#if SELECTTRACE_ENABLED - if( p->pWin && (sqlite3SelectTrace & 0x108)!=0 ){ +#if TREETRACE_ENABLED + if( p->pWin && (sqlite3TreeTrace & 0x108)!=0 ){ SELECTTRACE(0x104,pParse,p, ("after window rewrite:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140728,14 +142379,16 @@ SQLITE_PRIVATE int sqlite3Select( /* Convert LEFT JOIN into JOIN if there are terms of the right table ** of the LEFT JOIN used in the WHERE clause. */ - if( (pItem->fg.jointype & JT_LEFT)!=0 + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))==JT_LEFT && sqlite3ExprImpliesNonNullRow(p->pWhere, pItem->iCursor) && OptimizationEnabled(db, SQLITE_SimplifyJoin) ){ SELECTTRACE(0x100,pParse,p, ("LEFT-JOIN simplifies to JOIN on term %d\n",i)); pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER); - unsetJoinExpr(p->pWhere, pItem->iCursor); + assert( pItem->iCursor>=0 ); + unsetJoinExpr(p->pWhere, pItem->iCursor, + pTabList->a[0].fg.jointype & JT_LTORJ); } /* No futher action if this term of the FROM clause is no a subquery */ @@ -140788,7 +142441,9 @@ SQLITE_PRIVATE int sqlite3Select( ){ SELECTTRACE(0x100,pParse,p, ("omit superfluous ORDER BY on %r FROM-clause subquery\n",i+1)); - sqlite3ExprListDelete(db, pSub->pOrderBy); + sqlite3ParserAddCleanup(pParse, + (void(*)(sqlite3*,void*))sqlite3ExprListDelete, + pSub->pOrderBy); pSub->pOrderBy = 0; } @@ -140814,7 +142469,7 @@ SQLITE_PRIVATE int sqlite3Select( && i==0 && (p->selFlags & SF_ComplexResult)!=0 && (pTabList->nSrc==1 - || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) ){ continue; } @@ -140838,9 +142493,9 @@ SQLITE_PRIVATE int sqlite3Select( */ if( p->pPrior ){ rc = multiSelect(pParse, p, pDest); -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end compound-select processing\n")); - if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ sqlite3TreeViewSelect(0, p, 0); } #endif @@ -140859,8 +142514,8 @@ SQLITE_PRIVATE int sqlite3Select( && OptimizationEnabled(db, SQLITE_PropagateConst) && propagateConstants(pParse, p) ){ -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p,("After constant propagation:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -140938,8 +142593,8 @@ SQLITE_PRIVATE int sqlite3Select( || (pItem->u2.pCteUse->eM10d!=M10d_Yes && pItem->u2.pCteUse->nUse<2)) && pushDownWhereTerms(pParse, pSub, p->pWhere, pItem) ){ -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x100 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x100 ){ SELECTTRACE(0x100,pParse,p, ("After WHERE-clause push-down into subquery %d:\n", pSub->selId)); sqlite3TreeViewSelect(0, p, 0); @@ -140955,18 +142610,19 @@ SQLITE_PRIVATE int sqlite3Select( /* Generate code to implement the subquery ** - ** The subquery is implemented as a co-routine if: + ** The subquery is implemented as a co-routine if all of the following are + ** true: + ** ** (1) the subquery is guaranteed to be the outer loop (so that ** it does not need to be computed more than once), and ** (2) the subquery is not a CTE that should be materialized - ** - ** TODO: Are there other reasons beside (1) and (2) to use a co-routine - ** implementation? + ** (3) the subquery is not part of a left operand for a RIGHT JOIN */ if( i==0 && (pTabList->nSrc==1 - || (pTabList->a[1].fg.jointype&(JT_LEFT|JT_CROSS))!=0) /* (1) */ - && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */ + || (pTabList->a[1].fg.jointype&(JT_OUTER|JT_CROSS))!=0) /* (1) */ + && (pItem->fg.isCte==0 || pItem->u2.pCteUse->eM10d!=M10d_Yes) /* (2) */ + && (pTabList->a[0].fg.jointype & JT_LTORJ)==0 /* (3) */ ){ /* Implement a co-routine that will return a single row of the result ** set on each invocation. @@ -141012,11 +142668,11 @@ SQLITE_PRIVATE int sqlite3Select( ** the same view can reuse the materialization. */ int topAddr; int onceAddr = 0; - int retAddr; pItem->regReturn = ++pParse->nMem; - topAddr = sqlite3VdbeAddOp2(v, OP_Integer, 0, pItem->regReturn); + topAddr = sqlite3VdbeAddOp0(v, OP_Goto); pItem->addrFillSub = topAddr+1; + pItem->fg.isMaterialized = 1; if( pItem->fg.isCorrelated==0 ){ /* If the subquery is not correlated and if we are not inside of ** a trigger, then we only need to compute the value of the subquery @@ -141031,9 +142687,9 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3Select(pParse, pSub, &dest); pItem->pTab->nRowLogEst = pSub->nSelectRow; if( onceAddr ) sqlite3VdbeJumpHere(v, onceAddr); - retAddr = sqlite3VdbeAddOp1(v, OP_Return, pItem->regReturn); + sqlite3VdbeAddOp2(v, OP_Return, pItem->regReturn, topAddr+1); VdbeComment((v, "end %!S", pItem)); - sqlite3VdbeChangeP1(v, topAddr, retAddr); + sqlite3VdbeJumpHere(v, topAddr); sqlite3ClearTempRegCache(pParse); if( pItem->fg.isCte && pItem->fg.isCorrelated==0 ){ CteUse *pCteUse = pItem->u2.pCteUse; @@ -141057,8 +142713,8 @@ SQLITE_PRIVATE int sqlite3Select( pHaving = p->pHaving; sDistinct.isTnct = (p->selFlags & SF_Distinct)!=0; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("After all FROM-clause analysis:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -141092,9 +142748,10 @@ SQLITE_PRIVATE int sqlite3Select( ** the sDistinct.isTnct is still set. Hence, isTnct represents the ** original setting of the SF_Distinct flag, not the current setting */ assert( sDistinct.isTnct ); + sDistinct.isTnct = 2; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ SELECTTRACE(0x400,pParse,p,("Transform DISTINCT into GROUP BY:\n")); sqlite3TreeViewSelect(0, p, 0); } @@ -141127,6 +142784,18 @@ SQLITE_PRIVATE int sqlite3Select( */ if( pDest->eDest==SRT_EphemTab ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pDest->iSDParm, pEList->nExpr); + if( p->selFlags & SF_NestedFrom ){ + /* Delete or NULL-out result columns that will never be used */ + int ii; + for(ii=pEList->nExpr-1; ii>0 && pEList->a[ii].fg.bUsed==0; ii--){ + sqlite3ExprDelete(db, pEList->a[ii].pExpr); + sqlite3DbFree(db, pEList->a[ii].zEName); + pEList->nExpr--; + } + for(ii=0; iinExpr; ii++){ + if( pEList->a[ii].fg.bUsed==0 ) pEList->a[ii].pExpr->op = TK_NULL; + } + } } /* Set the limiter. @@ -141276,8 +142945,9 @@ SQLITE_PRIVATE int sqlite3Select( ** ORDER BY to maximize the chances of rows being delivered in an ** order that makes the ORDER BY redundant. */ for(ii=0; iinExpr; ii++){ - u8 sortFlags = sSort.pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_DESC; - pGroupBy->a[ii].sortFlags = sortFlags; + u8 sortFlags; + sortFlags = sSort.pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_DESC; + pGroupBy->a[ii].fg.sortFlags = sortFlags; } if( sqlite3ExprListCompare(pGroupBy, sSort.pOrderBy, -1)==0 ){ orderByGrp = 1; @@ -141346,8 +143016,8 @@ SQLITE_PRIVATE int sqlite3Select( } pAggInfo->mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; -#if SELECTTRACE_ENABLED - if( sqlite3SelectTrace & 0x400 ){ +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x400 ){ int ii; SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); sqlite3TreeViewSelect(0, p, 0); @@ -141435,7 +143105,8 @@ SQLITE_PRIVATE int sqlite3Select( sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset); SELECTTRACE(1,pParse,p,("WhereBegin\n")); pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, pGroupBy, pDistinct, - 0, (WHERE_GROUPBY|(orderByGrp ? WHERE_SORTBYGROUP : 0)|distFlag), 0 + 0, (sDistinct.isTnct==2 ? WHERE_DISTINCTBY : WHERE_GROUPBY) + | (orderByGrp ? WHERE_SORTBYGROUP : 0) | distFlag, 0 ); if( pWInfo==0 ){ sqlite3ExprListDelete(db, pDistinct); @@ -141617,7 +143288,7 @@ SQLITE_PRIVATE int sqlite3Select( VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); - if( eDist!=WHERE_DISTINCT_NOOP ){ + if( distFlag!=0 && eDist!=WHERE_DISTINCT_NOOP ){ struct AggInfo_func *pF = &pAggInfo->aFunc[0]; fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); } @@ -141741,8 +143412,10 @@ SQLITE_PRIVATE int sqlite3Select( eDist = sqlite3WhereIsDistinct(pWInfo); updateAccumulator(pParse, regAcc, pAggInfo, eDist); if( eDist!=WHERE_DISTINCT_NOOP ){ - struct AggInfo_func *pF = &pAggInfo->aFunc[0]; - fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + struct AggInfo_func *pF = pAggInfo->aFunc; + if( pF ){ + fixDistinctOpenEph(pParse, eDist, pF->iDistinct, pF->iDistAddr); + } } if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); @@ -141809,9 +143482,9 @@ select_end: } #endif -#if SELECTTRACE_ENABLED +#if TREETRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end processing\n")); - if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ + if( (sqlite3TreeTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ sqlite3TreeViewSelect(0, p, 0); } #endif @@ -142076,9 +143749,7 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ Trigger *pList; /* List of triggers to return */ HashElem *p; /* Loop variable for TEMP triggers */ - if( pParse->disableTriggers ){ - return 0; - } + assert( pParse->disableTriggers==0 ); pTmpSchema = pParse->db->aDb[1].pSchema; p = sqliteHashFirst(&pTmpSchema->trigHash); pList = pTab->pTrigger; @@ -142091,11 +143762,10 @@ SQLITE_PRIVATE Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ ){ pTrig->pNext = pList; pList = pTrig; - }else if( pTrig->op==TK_RETURNING + }else if( pTrig->op==TK_RETURNING ){ #ifndef SQLITE_OMIT_VIRTUALTABLE - && pParse->db->pVtabCtx==0 + assert( pParse->db->pVtabCtx==0 ); #endif - ){ assert( pParse->bReturning ); assert( &(pParse->u1.pReturning->retTrig) == pTrig ); pTrig->table = pTab->zName; @@ -142378,6 +144048,23 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( Vdbe *v; char *z; + /* If this is a new CREATE TABLE statement, and if shadow tables + ** are read-only, and the trigger makes a change to a shadow table, + ** then raise an error - do not allow the trigger to be created. */ + if( sqlite3ReadOnlyShadowTables(db) ){ + TriggerStep *pStep; + for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){ + if( pStep->zTarget!=0 + && sqlite3ShadowTableName(db, pStep->zTarget) + ){ + sqlite3ErrorMsg(pParse, + "trigger \"%s\" may not write to shadow table \"%s\"", + pTrig->zName, pStep->zTarget); + goto triggerfinish_cleanup; + } + } + } + /* Make an entry in the sqlite_schema table */ v = sqlite3GetVdbe(pParse); if( v==0 ) goto triggerfinish_cleanup; @@ -142541,7 +144228,7 @@ SQLITE_PRIVATE TriggerStep *sqlite3TriggerInsertStep( SQLITE_PRIVATE TriggerStep *sqlite3TriggerUpdateStep( Parse *pParse, /* Parser */ Token *pTableName, /* Name of the table to be updated */ - SrcList *pFrom, + SrcList *pFrom, /* FROM clause for an UPDATE-FROM, or NULL */ ExprList *pEList, /* The SET clause: list of column and new values */ Expr *pWhere, /* The WHERE clause */ u8 orconf, /* The conflict algorithm. (OE_Abort, OE_Ignore, etc) */ @@ -142754,13 +144441,22 @@ static int checkColumnOverlap(IdList *pIdList, ExprList *pEList){ return 0; } +/* +** Return true if any TEMP triggers exist +*/ +static int tempTriggersExist(sqlite3 *db){ + if( NEVER(db->aDb[1].pSchema==0) ) return 0; + if( sqliteHashFirst(&db->aDb[1].pSchema->trigHash)==0 ) return 0; + return 1; +} + /* ** Return a list of all triggers on table pTab if there exists at least ** one trigger that must be fired when an operation of type 'op' is ** performed on the table, and, if that operation is an UPDATE, if at ** least one of the columns in pChanges is being modified. */ -SQLITE_PRIVATE Trigger *sqlite3TriggersExist( +static SQLITE_NOINLINE Trigger *triggersReallyExist( Parse *pParse, /* Parse context */ Table *pTab, /* The table the contains the triggers */ int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ @@ -142823,6 +144519,22 @@ exit_triggers_exist: } return (mask ? pList : 0); } +SQLITE_PRIVATE Trigger *sqlite3TriggersExist( + Parse *pParse, /* Parse context */ + Table *pTab, /* The table the contains the triggers */ + int op, /* one of TK_DELETE, TK_INSERT, TK_UPDATE */ + ExprList *pChanges, /* Columns that change in an UPDATE statement */ + int *pMask /* OUT: Mask of TRIGGER_BEFORE|TRIGGER_AFTER */ +){ + assert( pTab!=0 ); + if( (pTab->pTrigger==0 && !tempTriggersExist(pParse->db)) + || pParse->disableTriggers + ){ + if( pMask ) *pMask = 0; + return 0; + } + return triggersReallyExist(pParse,pTab,op,pChanges,pMask); +} /* ** Convert the pStep->zTarget string into a SrcList and return a pointer @@ -142852,6 +144564,14 @@ SQLITE_PRIVATE SrcList *sqlite3TriggerStepSrc( } if( pStep->pFrom ){ SrcList *pDup = sqlite3SrcListDup(db, pStep->pFrom, 0); + if( pDup && pDup->nSrc>1 && !IN_RENAME_OBJECT ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pDup,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pDup = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } pSrc = sqlite3SrcListAppendList(pParse, pSrc, pDup); } }else{ @@ -142907,7 +144627,7 @@ static ExprList *sqlite3ExpandReturning( if( !db->mallocFailed ){ struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; pItem->zEName = sqlite3DbStrDup(db, pTab->aCol[jj].zCnName); - pItem->eEName = ENAME_NAME; + pItem->fg.eEName = ENAME_NAME; } } }else{ @@ -142916,7 +144636,7 @@ static ExprList *sqlite3ExpandReturning( if( !db->mallocFailed && ALWAYS(pList->a[i].zEName!=0) ){ struct ExprList_item *pItem = &pNew->a[pNew->nExpr-1]; pItem->zEName = sqlite3DbStrDup(db, pList->a[i].zEName); - pItem->eEName = pList->a[i].eEName; + pItem->fg.eEName = pList->a[i].fg.eEName; } } } @@ -143831,6 +145551,14 @@ SQLITE_PRIVATE void sqlite3Update( # define isView 0 #endif +#if TREETRACE_ENABLED + if( sqlite3TreeTrace & 0x10000 ){ + sqlite3TreeViewLine(0, "In sqlite3Update() at %s:%d", __FILE__, __LINE__); + sqlite3TreeViewUpdate(pParse->pWith, pTabList, pChanges, pWhere, + onError, pOrderBy, pLimit, pUpsert, pTrigger); + } +#endif + /* If there was a FROM clause, set nChangeFrom to the number of expressions ** in the change-list. Otherwise, set it to 0. There cannot be a FROM ** clause if this function is being called to generate code for part of @@ -144475,7 +146203,7 @@ SQLITE_PRIVATE void sqlite3Update( }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); } - VdbeCoverageNeverTaken(v); + VdbeCoverage(v); } /* Do FK constraint checks. */ @@ -145481,6 +147209,7 @@ SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3RunVacuum( assert( rc==SQLITE_OK ); if( pOut==0 ){ + nRes = sqlite3BtreeGetRequestedReserve(pTemp); rc = sqlite3BtreeSetPageSize(pMain, sqlite3BtreeGetPageSize(pTemp), nRes,1); } @@ -146923,6 +148652,28 @@ typedef struct WhereLoopBuilder WhereLoopBuilder; typedef struct WhereScan WhereScan; typedef struct WhereOrCost WhereOrCost; typedef struct WhereOrSet WhereOrSet; +typedef struct WhereMemBlock WhereMemBlock; +typedef struct WhereRightJoin WhereRightJoin; + +/* +** This object is a header on a block of allocated memory that will be +** automatically freed when its WInfo oject is destructed. +*/ +struct WhereMemBlock { + WhereMemBlock *pNext; /* Next block in the chain */ + u64 sz; /* Bytes of space */ +}; + +/* +** Extra information attached to a WhereLevel that is a RIGHT JOIN. +*/ +struct WhereRightJoin { + int iMatch; /* Cursor used to determine prior matched rows */ + int regBloom; /* Bloom filter for iRJMatch */ + int regReturn; /* Return register for the interior subroutine */ + int addrSubrtn; /* Starting address for the interior subroutine */ + int endSubrtn; /* The last opcode in the interior subroutine */ +}; /* ** This object contains information needed to implement a single nested @@ -146956,6 +148707,7 @@ struct WhereLevel { int addrLikeRep; /* LIKE range processing address */ #endif int regFilter; /* Bloom filter */ + WhereRightJoin *pRJ; /* Extra information for RIGHT JOIN */ u8 iFrom; /* Which entry in the FROM clause */ u8 op, p3, p5; /* Opcode, P3 & P5 of the opcode that ends the loop */ int p1, p2; /* Operands of the opcode used to end the loop */ @@ -147369,6 +149121,7 @@ struct WhereInfo { int iEndWhere; /* End of the WHERE clause itself */ WhereLoop *pLoops; /* List of all WhereLoop objects */ WhereExprMod *pExprMods; /* Expression modifications */ + WhereMemBlock *pMemToFree;/* Memory to free when this object destroyed */ Bitmask revMask; /* Mask of ORDER BY terms that need reversing */ WhereClause sWC; /* Decomposition of the WHERE clause */ WhereMaskSet sMaskSet; /* Map cursor numbers to bitmasks */ @@ -147394,6 +149147,8 @@ SQLITE_PRIVATE WhereTerm *sqlite3WhereFindTerm( u32 op, /* Mask of WO_xx values describing operator */ Index *pIdx /* Must be compatible with this index, if not NULL */ ); +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte); +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte); /* wherecode.c: */ #ifndef SQLITE_OMIT_EXPLAIN @@ -147430,6 +149185,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +); /* whereexpr.c: */ SQLITE_PRIVATE void sqlite3WhereClauseInit(WhereClause*,WhereInfo*); @@ -147472,8 +149232,9 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs(Parse*, SrcItem*, WhereClause*); #define WO_AND 0x0400 /* Two or more AND-connected terms */ #define WO_EQUIV 0x0800 /* Of the form A==B, both columns */ #define WO_NOOP 0x1000 /* This term does not restrict search space */ +#define WO_ROWVAL 0x2000 /* A row-value term */ -#define WO_ALL 0x1fff /* Mask of all possible WO_* values */ +#define WO_ALL 0x3fff /* Mask of all possible WO_* values */ #define WO_SINGLE 0x01ff /* Mask of all non-compound WO_* values */ /* @@ -147697,6 +149458,9 @@ SQLITE_PRIVATE int sqlite3WhereExplainOneScan( pLoop->u.vtab.idxNum, pLoop->u.vtab.idxStr); } #endif + if( pItem->fg.jointype & JT_LEFT ){ + sqlite3_str_appendf(&str, " LEFT-JOIN"); + } #ifdef SQLITE_EXPLAIN_ESTIMATED_ROWS if( pLoop->nOut>=10 ){ sqlite3_str_appendf(&str, " (~%llu rows)", @@ -147840,7 +149604,7 @@ static void disableTerm(WhereLevel *pLevel, WhereTerm *pTerm){ int nLoop = 0; assert( pTerm!=0 ); while( (pTerm->wtFlags & TERM_CODED)==0 - && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pLevel->iLeftJoin==0 || ExprHasProperty(pTerm->pExpr, EP_OuterON)) && (pLevel->notReady & pTerm->prereqAll)==0 ){ if( nLoop && (pTerm->wtFlags & TERM_LIKE)!=0 ){ @@ -148101,16 +149865,22 @@ static int codeEqualityTerm( if( !ExprUseXSelect(pX) || pX->x.pSelect->pEList->nExpr==1 ){ eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ - sqlite3 *db = pParse->db; - pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); - - if( !db->mallocFailed ){ - aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + Expr *pExpr = pTerm->pExpr; + if( pExpr->iTable==0 || !ExprHasProperty(pExpr, EP_Subrtn) ){ + sqlite3 *db = pParse->db; + pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); + if( !db->mallocFailed ){ + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap,&iTab); + pExpr->iTable = iTab; + } + sqlite3ExprDelete(db, pX); + }else{ + int n = sqlite3ExprVectorSize(pX->pLeft); + aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n)); eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); - pTerm->pExpr->iTable = iTab; } - sqlite3ExprDelete(db, pX); - pX = pTerm->pExpr; + pX = pExpr; } if( eType==IN_INDEX_INDEX_DESC ){ @@ -148133,8 +149903,9 @@ static int codeEqualityTerm( i = pLevel->u.in.nIn; pLevel->u.in.nIn += nEq; pLevel->u.in.aInLoop = - sqlite3DbReallocOrFree(pParse->db, pLevel->u.in.aInLoop, - sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); + sqlite3WhereRealloc(pTerm->pWC->pWInfo, + pLevel->u.in.aInLoop, + sizeof(pLevel->u.in.aInLoop[0])*pLevel->u.in.nIn); pIn = pLevel->u.in.aInLoop; if( pIn ){ int iMap = 0; /* Index in aiMap[] */ @@ -148555,8 +150326,8 @@ static void codeCursorHint( */ if( pTabItem->fg.jointype & JT_LEFT ){ Expr *pExpr = pTerm->pExpr; - if( !ExprHasProperty(pExpr, EP_FromJoin) - || pExpr->w.iRightJoinTable!=pTabItem->iCursor + if( !ExprHasProperty(pExpr, EP_OuterON) + || pExpr->w.iJoin!=pTabItem->iCursor ){ sWalker.eCode = 0; sWalker.xExprCallback = codeCursorHintIsOrFunction; @@ -148564,7 +150335,7 @@ static void codeCursorHint( if( sWalker.eCode ) continue; } }else{ - if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) continue; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) continue; } /* All terms in pWLoop->aLTerm[] except pEndRange are used to initialize @@ -148612,13 +150383,21 @@ static void codeCursorHint( ** ** OP_DeferredSeek $iCur $iRowid ** +** Which causes a seek on $iCur to the row with rowid $iRowid. +** ** However, if the scan currently being coded is a branch of an OR-loop and -** the statement currently being coded is a SELECT, then P3 of OP_DeferredSeek -** is set to iIdxCur and P4 is set to point to an array of integers -** containing one entry for each column of the table cursor iCur is open -** on. For each table column, if the column is the i'th column of the -** index, then the corresponding array entry is set to (i+1). If the column -** does not appear in the index at all, the array entry is set to 0. +** the statement currently being coded is a SELECT, then additional information +** is added that might allow OP_Column to omit the seek and instead do its +** lookup on the index, thus avoiding an expensive seek operation. To +** enable this optimization, the P3 of OP_DeferredSeek is set to iIdxCur +** and P4 is set to an array of integers containing one entry for each column +** in the table. For each table column, if the column is the i'th +** column of the index, then the corresponding array entry is set to (i+1). +** If the column does not appear in the index at all, the array entry is set +** to 0. The OP_Column opcode can check this array to see if the column it +** wants is in the index and if it is, it will substitute the index cursor +** and column number and continue with those new values, rather than seeking +** the table cursor. */ static void codeDeferredSeek( WhereInfo *pWInfo, /* Where clause context */ @@ -148634,7 +150413,7 @@ static void codeDeferredSeek( pWInfo->bDeferredSeek = 1; sqlite3VdbeAddOp3(v, OP_DeferredSeek, iIdxCur, 0, iCur); - if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) && DbMaskAllZero(sqlite3ParseToplevel(pParse)->writeMask) ){ int i; @@ -148734,7 +150513,6 @@ static int whereIndexExprTransNode(Walker *p, Expr *pExpr){ pExpr->op = TK_COLUMN; pExpr->iTable = pX->iIdxCur; pExpr->iColumn = pX->iIdxCol; - testcase( ExprHasProperty(pExpr, EP_Skip) ); testcase( ExprHasProperty(pExpr, EP_Unlikely) ); ExprClearProperty(pExpr, EP_Skip|EP_Unlikely|EP_WinFunc|EP_Subrtn); pExpr->y.pTab = 0; @@ -148990,7 +150768,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** initialize a memory cell that records if this table matches any ** row of the left table of the join. */ - assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE) + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN)) || pLevel->iFrom>0 || (pTabItem[0].fg.jointype & JT_LEFT)==0 ); if( pLevel->iFrom>0 && (pTabItem[0].fg.jointype & JT_LEFT)!=0 ){ @@ -149001,7 +150779,10 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Compute a safe address to jump to if we discover that the table for ** this loop is empty and can never contribute content. */ - for(j=iLevel; j>0 && pWInfo->a[j].iLeftJoin==0; j--){} + for(j=iLevel; j>0; j--){ + if( pWInfo->a[j].iLeftJoin ) break; + if( pWInfo->a[j].pRJ ) break; + } addrHalt = pWInfo->a[j].addrBrk; /* Special case of a FROM clause subquery implemented as a co-routine */ @@ -149628,7 +151409,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* Seek the table cursor, if required */ omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; + && (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ @@ -149662,7 +151443,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( ** move forward to the next index. ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + if( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } @@ -149681,7 +151462,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( /* The following assert() is not a requirement, merely an observation: ** The OR-optimization doesn't work for the right hand table of ** a LEFT JOIN: */ - assert( (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ); + assert( (pWInfo->wctrlFlags & (WHERE_OR_SUBCLAUSE|WHERE_RIGHT_JOIN))==0 ); } /* Record the instruction used to terminate the loop. */ @@ -149885,7 +151666,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( Expr *pDelete; /* Local copy of OR clause term */ int jmp1 = 0; /* Address of jump operation */ testcase( (pTabItem[0].fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pOrExpr, EP_FromJoin) + && !ExprHasProperty(pOrExpr, EP_OuterON) ); /* See TH3 vtab25.400 and ticket 614b25314c766238 */ pDelete = pOrExpr = sqlite3ExprDup(db, pOrExpr, 0); if( db->mallocFailed ){ @@ -150023,6 +151804,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeGoto(v, pLevel->addrBrk); sqlite3VdbeResolveLabel(v, iLoopBody); + /* Set the P2 operand of the OP_Return opcode that will end the current + ** 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-20220407a in vdbe.c and shell.c */ + assert( pLevel->op==OP_Return ); + pLevel->p2 = sqlite3VdbeCurrentAddr(v); + if( pWInfo->nLevel>1 ){ sqlite3StackFree(db, pOrTab); } if( !untestedTerms ) disableTerm(pLevel, pTerm); }else @@ -150085,10 +151874,22 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( } pE = pTerm->pExpr; assert( pE!=0 ); - if( (pTabItem->fg.jointype&JT_LEFT) && !ExprHasProperty(pE,EP_FromJoin) ){ - continue; + 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-20220513a */ + continue; + }else if( (pTabItem->fg.jointype & JT_LEFT)==JT_LEFT + && !ExprHasProperty(pE,EP_OuterON) ){ + continue; + }else{ + Bitmask m = sqlite3WhereGetMask(&pWInfo->sMaskSet, pE->w.iJoin); + if( m & pLevel->notReady ){ + /* An ON clause that is not ripe */ + continue; + } + } } - if( iLoop==1 && !sqlite3ExprCoveredByIndex(pE, pLevel->iTabCur, pIdx) ){ iNext = 2; continue; @@ -150147,7 +151948,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) continue; if( (pTerm->eOperator & WO_EQUIV)==0 ) continue; if( pTerm->leftCursor!=iCur ) continue; - if( pTabItem->fg.jointype & JT_LEFT ) continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT) ) continue; pE = pTerm->pExpr; #ifdef WHERETRACE_ENABLED /* 0x800 */ if( sqlite3WhereTrace & 0x800 ){ @@ -150155,7 +151956,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( sqlite3WhereTermPrint(pTerm, pWC->nTerm-j); } #endif - assert( !ExprHasProperty(pE, EP_FromJoin) ); + assert( !ExprHasProperty(pE, EP_OuterON) ); assert( (pTerm->prereqRight & pLevel->notReady)!=0 ); assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); pAlt = sqlite3WhereFindTerm(pWC, iCur, pTerm->u.x.leftColumn, notReady, @@ -150178,6 +151979,47 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pAlt->wtFlags |= TERM_CODED; } + /* For a RIGHT OUTER JOIN, record the fact that the current row has + ** been matched at least once. + */ + if( pLevel->pRJ ){ + Table *pTab; + int nPk; + int r; + int jmp1 = 0; + WhereRightJoin *pRJ = pLevel->pRJ; + + /* pTab is the right-hand table of the RIGHT JOIN. Generate code that + ** will record that the current row of that table has been matched at + ** least once. This is accomplished by storing the PK for the row in + ** both the iMatch index and the regBloom Bloom filter. + */ + pTab = pWInfo->pTabList->a[pLevel->iFrom].pTab; + if( HasRowid(pTab) ){ + r = sqlite3GetTempRange(pParse, 2); + sqlite3ExprCodeGetColumnOfTable(v, pTab, pLevel->iTabCur, -1, r+1); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + r = sqlite3GetTempRange(pParse, nPk+1); + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+1+iPk); + } + } + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, 0, r+1, nPk); + VdbeCoverage(v); + VdbeComment((v, "match against %s", pTab->zName)); + sqlite3VdbeAddOp3(v, OP_MakeRecord, r+1, nPk, r); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pRJ->iMatch, r, r+1, nPk); + sqlite3VdbeAddOp4Int(v, OP_FilterAdd, pRJ->regBloom, 0, r+1, nPk); + sqlite3VdbeChangeP5(v, OPFLAG_USESEEKRESULT); + sqlite3VdbeJumpHere(v, jmp1); + sqlite3ReleaseTempRange(pParse, r, nPk+1); + } + /* For a LEFT OUTER JOIN, generate code that will record the fact that ** at least one row of the right table has matched the left table. */ @@ -150185,6 +152027,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( pLevel->addrFirst = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp2(v, OP_Integer, 1, pLevel->iLeftJoin); VdbeComment((v, "record LEFT JOIN hit")); + if( pLevel->pRJ==0 ){ + goto code_outer_join_constraints; /* WHERE clause constraints */ + } + } + + if( pLevel->pRJ ){ + /* Create a subroutine used to process all interior loops and code + ** of the RIGHT JOIN. During normal operation, the subroutine will + ** be in-line with the rest of the code. But at the end, a separate + ** loop will run that invokes this subroutine for unmatched rows + ** of pTab, with all tables to left begin set to NULL. + */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pRJ->regReturn); + pRJ->addrSubrtn = sqlite3VdbeCurrentAddr(v); + assert( pParse->withinRJSubrtn < 255 ); + pParse->withinRJSubrtn++; + + /* 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-20220513a. + */ + code_outer_join_constraints: for(pTerm=pWC->a, j=0; jnBase; j++, pTerm++){ testcase( pTerm->wtFlags & TERM_VIRTUAL ); testcase( pTerm->wtFlags & TERM_CODED ); @@ -150193,6 +152059,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( assert( pWInfo->untestedTerms ); continue; } + if( pTabItem->fg.jointype & JT_LTORJ ) continue; assert( pTerm->pExpr ); sqlite3ExprIfFalse(pParse, pTerm->pExpr, addrCont, SQLITE_JUMPIFNULL); pTerm->wtFlags |= TERM_CODED; @@ -150213,6 +152080,96 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart( return pLevel->notReady; } +/* +** Generate the code for the loop that finds all non-matched terms +** for a RIGHT JOIN. +*/ +SQLITE_PRIVATE SQLITE_NOINLINE void sqlite3WhereRightJoinLoop( + WhereInfo *pWInfo, + int iLevel, + WhereLevel *pLevel +){ + Parse *pParse = pWInfo->pParse; + Vdbe *v = pParse->pVdbe; + WhereRightJoin *pRJ = pLevel->pRJ; + Expr *pSubWhere = 0; + WhereClause *pWC = &pWInfo->sWC; + WhereInfo *pSubWInfo; + WhereLoop *pLoop = pLevel->pWLoop; + SrcItem *pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; + SrcList sFrom; + Bitmask mAll = 0; + int k; + + ExplainQueryPlan((pParse, 1, "RIGHT-JOIN %s", pTabItem->pTab->zName)); + sqlite3VdbeNoJumpsOutsideSubrtn(v, pRJ->addrSubrtn, pRJ->endSubrtn, + pRJ->regReturn); + for(k=0; ka[k].pWLoop->maskSelf; + sqlite3VdbeAddOp1(v, OP_NullRow, pWInfo->a[k].iTabCur); + iIdxCur = pWInfo->a[k].iIdxCur; + if( iIdxCur ){ + sqlite3VdbeAddOp1(v, OP_NullRow, iIdxCur); + } + } + if( (pTabItem->fg.jointype & JT_LTORJ)==0 ){ + mAll |= pLoop->maskSelf; + for(k=0; knTerm; k++){ + WhereTerm *pTerm = &pWC->a[k]; + if( (pTerm->wtFlags & (TERM_VIRTUAL|TERM_SLICE))!=0 + && pTerm->eOperator!=WO_ROWVAL + ){ + break; + } + if( pTerm->prereqAll & ~mAll ) continue; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) ) continue; + pSubWhere = sqlite3ExprAnd(pParse, pSubWhere, + sqlite3ExprDup(pParse->db, pTerm->pExpr, 0)); + } + } + sFrom.nSrc = 1; + sFrom.nAlloc = 1; + memcpy(&sFrom.a[0], pTabItem, sizeof(SrcItem)); + sFrom.a[0].fg.jointype = 0; + assert( pParse->withinRJSubrtn < 100 ); + pParse->withinRJSubrtn++; + pSubWInfo = sqlite3WhereBegin(pParse, &sFrom, pSubWhere, 0, 0, 0, + WHERE_RIGHT_JOIN, 0); + if( pSubWInfo ){ + int iCur = pLevel->iTabCur; + int r = ++pParse->nMem; + int nPk; + int jmp; + int addrCont = sqlite3WhereContinueLabel(pSubWInfo); + Table *pTab = pTabItem->pTab; + if( HasRowid(pTab) ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, -1, r); + nPk = 1; + }else{ + int iPk; + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + nPk = pPk->nKeyCol; + pParse->nMem += nPk - 1; + for(iPk=0; iPkaiColumn[iPk]; + sqlite3ExprCodeGetColumnOfTable(v, pTab, iCur, iCol,r+iPk); + } + } + jmp = sqlite3VdbeAddOp4Int(v, OP_Filter, pRJ->regBloom, 0, r, nPk); + VdbeCoverage(v); + sqlite3VdbeAddOp4Int(v, OP_Found, pRJ->iMatch, addrCont, r, nPk); + VdbeCoverage(v); + sqlite3VdbeJumpHere(v, jmp); + sqlite3VdbeAddOp2(v, OP_Gosub, pRJ->regReturn, pRJ->addrSubrtn); + sqlite3WhereEnd(pSubWInfo); + } + sqlite3ExprDelete(pParse->db, pSubWhere); + ExplainQueryPlanPop(pParse); + assert( pParse->withinRJSubrtn>0 ); + pParse->withinRJSubrtn--; +} + /************** End of wherecode.c *******************************************/ /************** Begin file whereexpr.c ***************************************/ /* @@ -150281,7 +152238,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ if( pWC->nTerm>=pWC->nSlot ){ WhereTerm *pOld = pWC->a; sqlite3 *db = pWC->pWInfo->pParse->db; - pWC->a = sqlite3DbMallocRawNN(db, sizeof(pWC->a[0])*pWC->nSlot*2 ); + pWC->a = sqlite3WhereMalloc(pWC->pWInfo, sizeof(pWC->a[0])*pWC->nSlot*2 ); if( pWC->a==0 ){ if( wtFlags & TERM_DYNAMIC ){ sqlite3ExprDelete(db, p); @@ -150290,10 +152247,7 @@ static int whereClauseInsert(WhereClause *pWC, Expr *p, u16 wtFlags){ return 0; } memcpy(pWC->a, pOld, sizeof(pWC->a[0])*pWC->nTerm); - if( pOld!=pWC->aStatic ){ - sqlite3DbFree(db, pOld); - } - pWC->nSlot = sqlite3DbMallocSize(db, pWC->a)/sizeof(pWC->a[0]); + pWC->nSlot = pWC->nSlot*2; } pTerm = &pWC->a[idx = pWC->nTerm++]; if( (wtFlags & TERM_VIRTUAL)==0 ) pWC->nBase = pWC->nTerm; @@ -150681,9 +152635,9 @@ static int isAuxiliaryVtabOperator( ** a join, then transfer the appropriate markings over to derived. */ static void transferJoinMarkings(Expr *pDerived, Expr *pBase){ - if( pDerived ){ - pDerived->flags |= pBase->flags & EP_FromJoin; - pDerived->w.iRightJoinTable = pBase->w.iRightJoinTable; + if( pDerived && ExprHasProperty(pBase, EP_OuterON|EP_InnerON) ){ + pDerived->flags |= pBase->flags & (EP_OuterON|EP_InnerON); + pDerived->w.iJoin = pBase->w.iJoin; } } @@ -151137,7 +153091,7 @@ static int termIsEquivalence(Parse *pParse, Expr *pExpr){ CollSeq *pColl; if( !OptimizationEnabled(pParse->db, SQLITE_Transitive) ) return 0; if( pExpr->op!=TK_EQ && pExpr->op!=TK_IS ) return 0; - if( ExprHasProperty(pExpr, EP_FromJoin) ) return 0; + if( ExprHasProperty(pExpr, EP_OuterON) ) return 0; aff1 = sqlite3ExprAffinity(pExpr->pLeft); aff2 = sqlite3ExprAffinity(pExpr->pRight); if( aff1!=aff2 @@ -151168,7 +153122,9 @@ static Bitmask exprSelectUsage(WhereMaskSet *pMaskSet, Select *pS){ int i; for(i=0; inSrc; i++){ mask |= exprSelectUsage(pMaskSet, pSrc->a[i].pSelect); - mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].pOn); + if( pSrc->a[i].fg.isUsing==0 ){ + mask |= sqlite3WhereExprUsage(pMaskSet, pSrc->a[i].u3.pOn); + } if( pSrc->a[i].fg.isTabFunc ){ mask |= sqlite3WhereExprListUsage(pMaskSet, pSrc->a[i].u1.pFuncArg); } @@ -151323,18 +153279,32 @@ static void exprAnalyze( if( prereqAll!=sqlite3WhereExprUsageNN(pMaskSet, pExpr) ){ printf("\n*** Incorrect prereqAll computed for:\n"); sqlite3TreeViewExpr(0,pExpr,0); - abort(); + assert( 0 ); } #endif - if( ExprHasProperty(pExpr, EP_FromJoin) ){ - Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iRightJoinTable); - prereqAll |= x; - extraRight = x-1; /* ON clause terms may not be used with an index - ** on left table of a LEFT JOIN. Ticket #3015 */ - if( (prereqAll>>1)>=x ){ - sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); - return; + if( ExprHasProperty(pExpr, EP_OuterON|EP_InnerON) ){ + Bitmask x = sqlite3WhereGetMask(pMaskSet, pExpr->w.iJoin); + if( ExprHasProperty(pExpr, EP_OuterON) ){ + prereqAll |= x; + extraRight = x-1; /* ON clause terms may not be used with an index + ** on left table of a LEFT JOIN. Ticket #3015 */ + if( (prereqAll>>1)>=x ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + }else if( (prereqAll>>1)>=x ){ + /* The ON clause of an INNER JOIN references a table to its right. + ** Most other SQL database engines raise an error. But SQLite versions + ** 3.0 through 3.38 just put the ON clause constraint into the WHERE + ** clause and carried on. Beginning with 3.39, raise an error only + ** if there is a RIGHT or FULL JOIN in the query. This makes SQLite + ** more like other systems, and also preserves legacy. */ + if( ALWAYS(pSrc->nSrc>0) && (pSrc->a[0].fg.jointype & JT_LTORJ)!=0 ){ + sqlite3ErrorMsg(pParse, "ON clause references tables to its right"); + return; + } + ExprClearProperty(pExpr, EP_InnerON); } } pTerm->prereqAll = prereqAll; @@ -151402,7 +153372,7 @@ static void exprAnalyze( pNew->eOperator = (operatorMask(pDup->op) + eExtraOp) & opMask; }else if( op==TK_ISNULL - && !ExprHasProperty(pExpr,EP_FromJoin) + && !ExprHasProperty(pExpr,EP_OuterON) && 0==sqlite3ExprCanBeNull(pLeft) ){ assert( !ExprHasProperty(pExpr, EP_IntValue) ); @@ -151473,7 +153443,7 @@ static void exprAnalyze( else if( pExpr->op==TK_NOTNULL ){ if( pExpr->pLeft->op==TK_COLUMN && pExpr->pLeft->iColumn>=0 - && !ExprHasProperty(pExpr, EP_FromJoin) + && !ExprHasProperty(pExpr, EP_OuterON) ){ Expr *pNewExpr; Expr *pLeft = pExpr->pLeft; @@ -151621,7 +153591,7 @@ static void exprAnalyze( } pTerm = &pWC->a[idxTerm]; pTerm->wtFlags |= TERM_CODED|TERM_VIRTUAL; /* Disable the original */ - pTerm->eOperator = 0; + pTerm->eOperator = WO_ROWVAL; } /* If there is a vector IN term - e.g. "(a, b) IN (SELECT ...)" - create @@ -151677,9 +153647,9 @@ static void exprAnalyze( Expr *pNewExpr; pNewExpr = sqlite3PExpr(pParse, TK_MATCH, 0, sqlite3ExprDup(db, pRight, 0)); - if( ExprHasProperty(pExpr, EP_FromJoin) && pNewExpr ){ - ExprSetProperty(pNewExpr, EP_FromJoin); - pNewExpr->w.iRightJoinTable = pExpr->w.iRightJoinTable; + if( ExprHasProperty(pExpr, EP_OuterON) && pNewExpr ){ + ExprSetProperty(pNewExpr, EP_OuterON); + pNewExpr->w.iJoin = pExpr->w.iJoin; } idxNew = whereClauseInsert(pWC, pNewExpr, TERM_VIRTUAL|TERM_DYNAMIC); testcase( idxNew==0 ); @@ -151822,7 +153792,7 @@ SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ /* This term is a vector operation that has been decomposed into ** other, subsequent terms. It can be ignored. See tag-20220128a */ assert( pWC->a[ii].wtFlags & TERM_VIRTUAL ); - assert( pWC->a[ii].eOperator==0 ); + assert( pWC->a[ii].eOperator==WO_ROWVAL ); continue; } if( pWC->a[ii].leftCursor!=iCsr ) return; @@ -151834,7 +153804,7 @@ SQLITE_PRIVATE void sqlite3WhereAddLimit(WhereClause *pWC, Select *p){ Expr *pExpr = pOrderBy->a[ii].pExpr; if( pExpr->op!=TK_COLUMN ) return; if( pExpr->iTable!=iCsr ) return; - if( pOrderBy->a[ii].sortFlags & KEYINFO_ORDER_BIGNULL ) return; + if( pOrderBy->a[ii].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) return; } } @@ -151901,9 +153871,6 @@ SQLITE_PRIVATE void sqlite3WhereClauseClear(WhereClause *pWC){ a++; } } - if( pWC->a!=pWC->aStatic ){ - sqlite3DbFree(db, pWC->a); - } } @@ -152030,6 +153997,7 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( if( pArgs==0 ) return; for(j=k=0; jnExpr; j++){ Expr *pRhs; + u32 joinType; while( knCol && (pTab->aCol[k].colFlags & COLFLAG_HIDDEN)==0 ){k++;} if( k>=pTab->nCol ){ sqlite3ErrorMsg(pParse, "too many arguments on %s() - max %d", @@ -152046,9 +154014,12 @@ SQLITE_PRIVATE void sqlite3WhereTabFuncArgs( pRhs = sqlite3PExpr(pParse, TK_UPLUS, sqlite3ExprDup(pParse->db, pArgs->a[j].pExpr, 0), 0); pTerm = sqlite3PExpr(pParse, TK_EQ, pColRef, pRhs); - if( pItem->fg.jointype & JT_LEFT ){ - sqlite3SetJoinExpr(pTerm, pItem->iCursor); + if( pItem->fg.jointype & (JT_LEFT|JT_LTORJ) ){ + joinType = EP_OuterON; + }else{ + joinType = EP_InnerON; } + sqlite3SetJoinExpr(pTerm, pItem->iCursor, joinType); whereClauseInsert(pWC, pTerm, TERM_DYNAMIC); } } @@ -152159,7 +154130,7 @@ SQLITE_PRIVATE int sqlite3WhereOrderByLimitOptLabel(WhereInfo *pWInfo){ } pInner = &pWInfo->a[pWInfo->nLevel-1]; assert( pInner->addrNxt!=0 ); - return pInner->addrNxt; + return pInner->pRJ ? pWInfo->iContinue : pInner->addrNxt; } /* @@ -152310,6 +154281,30 @@ SQLITE_PRIVATE Bitmask sqlite3WhereGetMask(WhereMaskSet *pMaskSet, int iCursor){ return 0; } +/* Allocate memory that is automatically freed when pWInfo is freed. +*/ +SQLITE_PRIVATE void *sqlite3WhereMalloc(WhereInfo *pWInfo, u64 nByte){ + WhereMemBlock *pBlock; + pBlock = sqlite3DbMallocRawNN(pWInfo->pParse->db, nByte+sizeof(*pBlock)); + if( pBlock ){ + pBlock->pNext = pWInfo->pMemToFree; + pBlock->sz = nByte; + pWInfo->pMemToFree = pBlock; + pBlock++; + } + return (void*)pBlock; +} +SQLITE_PRIVATE void *sqlite3WhereRealloc(WhereInfo *pWInfo, void *pOld, u64 nByte){ + void *pNew = sqlite3WhereMalloc(pWInfo, nByte); + if( pNew && pOld ){ + WhereMemBlock *pOldBlk = (WhereMemBlock*)pOld; + pOldBlk--; + assert( pOldBlk->szsz); + } + return pNew; +} + /* ** Create a new mask for cursor iCursor. ** @@ -152363,7 +154358,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ && (iColumn!=XN_EXPR || sqlite3ExprCompareSkip(pTerm->pExpr->pLeft, pScan->pIdxExpr,iCur)==0) - && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) + && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_OuterON)) ){ if( (pTerm->eOperator & WO_EQUIV)!=0 && pScan->nEquivaiCur) @@ -152715,6 +154710,7 @@ static void translateColumnToCopy( pOp->p1 = pOp->p2 + iRegister; pOp->p2 = pOp->p3; pOp->p3 = 0; + pOp->p5 = 2; /* Cause the MEM_Subtype flag to be cleared */ }else if( pOp->opcode==OP_Rowid ){ pOp->opcode = OP_Sequence; pOp->p1 = iAutoidxCur; @@ -152789,14 +154785,17 @@ static int termCanDriveIndex( char aff; if( pTerm->leftCursor!=pSrc->iCursor ) return 0; if( (pTerm->eOperator & (WO_EQ|WO_IS))==0 ) return 0; - if( (pSrc->fg.jointype & JT_LEFT) - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - && (pTerm->eOperator & WO_IS) - ){ - /* Cannot use an IS term from the WHERE clause as an index driver for - ** the RHS of a LEFT JOIN. Such a term can only be used if it is from - ** the ON clause. */ - return 0; + assert( (pSrc->fg.jointype & JT_RIGHT)==0 ); + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + return 0; /* See tag-20191211-001 */ + } } if( (pTerm->prereqRight & notReady)!=0 ) return 0; assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); @@ -153137,7 +155136,7 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter( const SrcItem *pTabItem; pLevel = &pWInfo->a[iLevel]; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; - if( pTabItem->fg.jointype & JT_LEFT ) continue; + if( pTabItem->fg.jointype & (JT_LEFT|JT_LTORJ) ) continue; pLoop = pLevel->pWLoop; if( NEVER(pLoop==0) ) continue; if( pLoop->prereq & notReady ) continue; @@ -153210,12 +155209,20 @@ static sqlite3_index_info *allocateIndexInfo( assert( pTerm->u.x.leftColumnnCol ); /* tag-20191211-002: WHERE-clause constraints are not useful to the - ** right-hand table of a LEFT JOIN. See tag-20191211-001 for the + ** right-hand table of a LEFT JOIN nor to the either table of a + ** RIGHT JOIN. See tag-20191211-001 for the ** equivalent restriction for ordinary tables. */ - if( (pSrc->fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - continue; + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ); + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } } nTerm++; pTerm->wtFlags |= TERM_OK; @@ -153238,7 +155245,7 @@ static sqlite3_index_info *allocateIndexInfo( } /* Virtual tables are unable to deal with NULLS FIRST */ - if( pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL ) break; + if( pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL ) break; /* First case - a direct column references without a COLLATE operator */ if( pExpr->op==TK_COLUMN && pExpr->iTable==pSrc->iCursor ){ @@ -153268,8 +155275,10 @@ static sqlite3_index_info *allocateIndexInfo( } if( i==n ){ nOrderBy = n; - if( (pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY)) ){ - eDistinct = 1 + ((pWInfo->wctrlFlags & WHERE_DISTINCTBY)!=0); + if( (pWInfo->wctrlFlags & WHERE_DISTINCTBY) ){ + eDistinct = 2 + ((pWInfo->wctrlFlags & WHERE_SORTBYGROUP)!=0); + }else if( pWInfo->wctrlFlags & WHERE_GROUPBY ){ + eDistinct = 1; } } } @@ -153348,7 +155357,7 @@ static sqlite3_index_info *allocateIndexInfo( || (pExpr->op==TK_COLLATE && pExpr->pLeft->op==TK_COLUMN && pExpr->iColumn==pExpr->pLeft->iColumn) ); pIdxOrderBy[j].iColumn = pExpr->iColumn; - pIdxOrderBy[j].desc = pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC; + pIdxOrderBy[j].desc = pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC; j++; } pIdxInfo->nOrderBy = j; @@ -153452,7 +155461,7 @@ static int whereKeyStats( #endif assert( pRec!=0 ); assert( pIdx->nSample>0 ); - assert( pRec->nField>0 && pRec->nField<=pIdx->nSampleCol ); + assert( pRec->nField>0 ); /* Do a binary search to find the first sample greater than or equal ** to pRec. If pRec contains a single field, the set of samples to search @@ -153498,7 +155507,7 @@ static int whereKeyStats( ** it is extended to two fields. The duplicates that this creates do not ** cause any problems. */ - nField = pRec->nField; + nField = MIN(pRec->nField, pIdx->nSample); iCol = 0; iSample = pIdx->nSample * nField; do{ @@ -154089,7 +156098,7 @@ SQLITE_PRIVATE void sqlite3WhereTermPrint(WhereTerm *pTerm, int iTerm){ memcpy(zType, "....", 5); if( pTerm->wtFlags & TERM_VIRTUAL ) zType[0] = 'V'; if( pTerm->eOperator & WO_EQUIV ) zType[1] = 'E'; - if( ExprHasProperty(pTerm->pExpr, EP_FromJoin) ) zType[2] = 'L'; + if( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) zType[2] = 'L'; if( pTerm->wtFlags & TERM_CODED ) zType[3] = 'C'; if( pTerm->eOperator & WO_SINGLE ){ assert( (pTerm->eOperator & (WO_OR|WO_AND))==0 ); @@ -154270,15 +156279,7 @@ static void whereLoopDelete(sqlite3 *db, WhereLoop *p){ ** Free a WhereInfo structure */ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ - int i; assert( pWInfo!=0 ); - for(i=0; inLevel; i++){ - WhereLevel *pLevel = &pWInfo->a[i]; - if( pLevel->pWLoop && (pLevel->pWLoop->wsFlags & WHERE_IN_ABLE)!=0 ){ - assert( (pLevel->pWLoop->wsFlags & WHERE_MULTI_OR)==0 ); - sqlite3DbFree(db, pLevel->u.in.aInLoop); - } - } sqlite3WhereClauseClear(&pWInfo->sWC); while( pWInfo->pLoops ){ WhereLoop *p = pWInfo->pLoops; @@ -154286,6 +156287,11 @@ static void whereInfoFree(sqlite3 *db, WhereInfo *pWInfo){ whereLoopDelete(db, p); } assert( pWInfo->pExprMods==0 ); + while( pWInfo->pMemToFree ){ + WhereMemBlock *pNext = pWInfo->pMemToFree->pNext; + sqlite3DbFreeNN(db, pWInfo->pMemToFree); + pWInfo->pMemToFree = pNext; + } sqlite3DbFreeNN(db, pWInfo); } @@ -154654,10 +156660,11 @@ static void whereLoopOutputAdjust( ** ** 2022-03-24: Self-culling only applies if either the extra terms ** are straight comparison operators that are non-true with NULL - ** operand, or if the loop is not a LEFT JOIN. + ** operand, or if the loop is not an OUTER JOIN. */ if( (pTerm->eOperator & 0x3f)!=0 - || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype & JT_LEFT)==0 + || (pWC->pWInfo->pTabList->a[pLoop->iTab].fg.jointype + & (JT_LEFT|JT_LTORJ))==0 ){ pLoop->wsFlags |= WHERE_SELFCULL; } @@ -154864,12 +156871,29 @@ static int whereLoopAddBtreeIndex( if( pTerm->wtFlags & TERM_LIKEOPT && pTerm->eOperator==WO_LT ) continue; /* tag-20191211-001: Do not allow constraints from the WHERE clause to - ** be used by the right table of a LEFT JOIN. Only constraints in the - ** ON clause are allowed. See tag-20191211-002 for the vtab equivalent. */ - if( (pSrc->fg.jointype & JT_LEFT)!=0 - && !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - ){ - continue; + ** be used by the right table of a LEFT JOIN nor by the left table of a + ** RIGHT JOIN. Only constraints in the ON clause are allowed. + ** See tag-20191211-002 for the vtab equivalent. + ** + ** 2022-06-06: See https://sqlite.org/forum/forumpost/206d99a16dd9212f + ** for an example of a WHERE clause constraints that may not be used on + ** the right table of a RIGHT JOIN because the constraint implies a + ** not-NULL condition on the left table of the RIGHT JOIN. + ** + ** 2022-06-10: The same condition applies to termCanDriveIndex() above. + ** https://sqlite.org/forum/forumpost/51e6959f61 + */ + if( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))!=0 ){ + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LEFT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_RIGHT ); + testcase( (pSrc->fg.jointype & (JT_LEFT|JT_LTORJ|JT_RIGHT))==JT_LTORJ ); + testcase( ExprHasProperty(pTerm->pExpr, EP_OuterON) ) + testcase( ExprHasProperty(pTerm->pExpr, EP_InnerON) ); + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON|EP_InnerON) + || pTerm->pExpr->w.iJoin != pSrc->iCursor + ){ + continue; + } } if( IsUniqueIndex(pProbe) && saved_nEq==pProbe->nKeyCol-1 ){ @@ -155221,23 +157245,26 @@ static int indexMightHelpWithOrderBy( */ static int whereUsablePartialIndex( int iTab, /* The table for which we want an index */ - int isLeft, /* True if iTab is the right table of a LEFT JOIN */ + u8 jointype, /* The JT_* flags on the join */ WhereClause *pWC, /* The WHERE clause of the query */ Expr *pWhere /* The WHERE clause from the partial index */ ){ int i; WhereTerm *pTerm; - Parse *pParse = pWC->pWInfo->pParse; + Parse *pParse; + + if( jointype & JT_LTORJ ) return 0; + pParse = pWC->pWInfo->pParse; while( pWhere->op==TK_AND ){ - if( !whereUsablePartialIndex(iTab,isLeft,pWC,pWhere->pLeft) ) return 0; + if( !whereUsablePartialIndex(iTab,jointype,pWC,pWhere->pLeft) ) return 0; pWhere = pWhere->pRight; } if( pParse->db->flags & SQLITE_EnableQPSG ) pParse = 0; for(i=0, pTerm=pWC->a; inTerm; i++, pTerm++){ Expr *pExpr; pExpr = pTerm->pExpr; - if( (!ExprHasProperty(pExpr, EP_FromJoin) || pExpr->w.iRightJoinTable==iTab) - && (isLeft==0 || ExprHasProperty(pExpr, EP_FromJoin)) + if( (!ExprHasProperty(pExpr, EP_OuterON) || pExpr->w.iJoin==iTab) + && ((jointype & JT_OUTER)==0 || ExprHasProperty(pExpr, EP_OuterON)) && sqlite3ExprImpliesExpr(pParse, pExpr, pWhere, iTab) && (pTerm->wtFlags & TERM_VNULL)==0 ){ @@ -155346,13 +157373,14 @@ static int whereLoopAddBtree( #ifndef SQLITE_OMIT_AUTOMATIC_INDEX /* Automatic indexes */ if( !pBuilder->pOrSet /* Not part of an OR optimization */ - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + && (pWInfo->wctrlFlags & (WHERE_RIGHT_JOIN|WHERE_OR_SUBCLAUSE))==0 && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 && !pSrc->fg.isIndexedBy /* Has no INDEXED BY clause */ && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ && !pSrc->fg.isCorrelated /* Not a correlated subquery */ && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ + && (pSrc->fg.jointype & JT_RIGHT)==0 /* Not the right tab of a RIGHT JOIN */ ){ /* Generate auto-index WhereLoops */ LogEst rLogSize; /* Logarithm of the number of rows in the table */ @@ -155402,9 +157430,8 @@ static int whereLoopAddBtree( for(; rc==SQLITE_OK && pProbe; pProbe=(pSrc->fg.isIndexedBy ? 0 : pProbe->pNext), iSortIdx++ ){ - int isLeft = (pSrc->fg.jointype & JT_OUTER)!=0; if( pProbe->pPartIdxWhere!=0 - && !whereUsablePartialIndex(pSrc->iCursor, isLeft, pWC, + && !whereUsablePartialIndex(pSrc->iCursor, pSrc->fg.jointype, pWC, pProbe->pPartIdxWhere) ){ testcase( pNew->iTab!=pSrc->iCursor ); /* See ticket [98d973b8f5] */ @@ -155512,7 +157539,14 @@ static int whereLoopAddBtree( } ApplyCostMultiplier(pNew->rRun, pTab->costMult); whereLoopOutputAdjust(pWC, pNew, rSize); - rc = whereLoopInsert(pBuilder, pNew); + if( (pSrc->fg.jointype & JT_RIGHT)!=0 && pProbe->aColExpr ){ + /* Do not do an SCAN of a index-on-expression in a RIGHT JOIN + ** because the cursor used to access the index might not be + ** positioned to the correct row during the right-join no-match + ** loop. */ + }else{ + rc = whereLoopInsert(pBuilder, pNew); + } pNew->nOut = rSize; if( rc ) break; } @@ -155687,6 +157721,7 @@ static int whereLoopAddVirtualOne( *pbIn = 1; assert( (mExclude & WO_IN)==0 ); } + assert( pbRetryLimit || !isLimitTerm(pTerm) ); if( isLimitTerm(pTerm) && *pbIn ){ /* If there is an IN(...) term handled as an == (separate call to ** xFilter for each value on the RHS of the IN) and a LIMIT or @@ -155834,9 +157869,7 @@ SQLITE_API int sqlite3_vtab_rhs_value( */ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; - assert( pHidden->eDistinct==0 - || pHidden->eDistinct==1 - || pHidden->eDistinct==2 ); + assert( pHidden->eDistinct>=0 && pHidden->eDistinct<=3 ); return pHidden->eDistinct; } @@ -155844,15 +157877,26 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){ && !defined(SQLITE_OMIT_VIRTUALTABLE) /* ** Cause the prepared statement that is associated with a call to -** xBestIndex to open write transactions on all attached schemas. +** xBestIndex to potentiall use all schemas. If the statement being +** prepared is read-only, then just start read transactions on all +** schemas. But if this is a write operation, start writes on all +** schemas. +** ** This is used by the (built-in) sqlite_dbpage virtual table. */ -SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){ +SQLITE_PRIVATE void sqlite3VtabUsesAllSchemas(sqlite3_index_info *pIdxInfo){ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1]; Parse *pParse = pHidden->pParse; int nDb = pParse->db->nDb; int i; - for(i=0; iwriteMask ){ + for(i=0; ipTabList->a + pNew->iTab; iCur = pItem->iCursor; + /* The multi-index OR optimization does not work for RIGHT and FULL JOIN */ + if( pItem->fg.jointype & JT_RIGHT ) return SQLITE_OK; + for(pTerm=pWC->a; pTermeOperator & WO_OR)!=0 && (pTerm->u.pOrInfo->indexable & pNew->maskSelf)!=0 @@ -156148,8 +158195,11 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ SrcItem *pEnd = &pTabList->a[pWInfo->nLevel]; sqlite3 *db = pWInfo->pParse->db; int rc = SQLITE_OK; + int bFirstPastRJ = 0; + int hasRightJoin = 0; WhereLoop *pNew; + /* Loop over the tables in the join, from left to right */ pNew = pBuilder->pNew; whereLoopInit(pNew); @@ -156159,18 +158209,30 @@ static int whereLoopAddAll(WhereLoopBuilder *pBuilder){ pNew->iTab = iTab; pBuilder->iPlanLimit += SQLITE_QUERY_PLANNER_LIMIT_INCR; pNew->maskSelf = sqlite3WhereGetMask(&pWInfo->sMaskSet, pItem->iCursor); - if( (pItem->fg.jointype & (JT_LEFT|JT_CROSS))!=0 ){ - /* This condition is true when pItem is the FROM clause term on the - ** right-hand-side of a LEFT or CROSS JOIN. */ - mPrereq = mPrior; - }else{ + if( bFirstPastRJ + || (pItem->fg.jointype & (JT_OUTER|JT_CROSS|JT_LTORJ))!=0 + ){ + /* Add prerequisites to prevent reordering of FROM clause terms + ** across CROSS joins and outer joins. The bFirstPastRJ boolean + ** prevents the right operand of a RIGHT JOIN from being swapped with + ** other elements even further to the right. + ** + ** The JT_LTORJ case and the hasRightJoin flag work together to + ** prevent FROM-clause terms from moving from the right side of + ** a LEFT JOIN over to the left side of that join if the LEFT JOIN + ** is itself on the left side of a RIGHT JOIN. + */ + if( pItem->fg.jointype & JT_LTORJ ) hasRightJoin = 1; + mPrereq |= mPrior; + bFirstPastRJ = (pItem->fg.jointype & JT_RIGHT)!=0; + }else if( !hasRightJoin ){ mPrereq = 0; } #ifndef SQLITE_OMIT_VIRTUALTABLE if( IsVirtual(pItem->pTab) ){ SrcItem *p; for(p=&pItem[1]; pfg.jointype & (JT_LEFT|JT_CROSS)) ){ + if( mUnusable || (p->fg.jointype & (JT_OUTER|JT_CROSS)) ){ mUnusable |= sqlite3WhereGetMask(&pWInfo->sMaskSet, p->iCursor); } } @@ -156295,7 +158357,9 @@ static i8 wherePathSatisfiesOrderBy( pLoop = pLast; } if( pLoop->wsFlags & WHERE_VIRTUALTABLE ){ - if( pLoop->u.vtab.isOrdered && (wctrlFlags & WHERE_DISTINCTBY)==0 ){ + if( pLoop->u.vtab.isOrdered + && ((wctrlFlags&(WHERE_DISTINCTBY|WHERE_SORTBYGROUP))!=WHERE_DISTINCTBY) + ){ obSat = obDone; } break; @@ -156473,16 +158537,18 @@ static i8 wherePathSatisfiesOrderBy( /* Make sure the sort order is compatible in an ORDER BY clause. ** Sort order is irrelevant for a GROUP BY clause. */ if( revSet ){ - if( (rev ^ revIdx)!=(pOrderBy->a[i].sortFlags&KEYINFO_ORDER_DESC) ){ + if( (rev ^ revIdx) + != (pOrderBy->a[i].fg.sortFlags&KEYINFO_ORDER_DESC) + ){ isMatch = 0; } }else{ - rev = revIdx ^ (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_DESC); + rev = revIdx ^ (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_DESC); if( rev ) *pRevMask |= MASKBIT(iLoop); revSet = 1; } } - if( isMatch && (pOrderBy->a[i].sortFlags & KEYINFO_ORDER_BIGNULL) ){ + if( isMatch && (pOrderBy->a[i].fg.sortFlags & KEYINFO_ORDER_BIGNULL) ){ if( j==pLoop->u.btree.nEq ){ pLoop->wsFlags |= WHERE_BIGNULL_SORT; }else{ @@ -156562,7 +158628,7 @@ static i8 wherePathSatisfiesOrderBy( ** SELECT * FROM t1 GROUP BY y,x ORDER BY y,x; -- IsSorted()==0 */ SQLITE_PRIVATE int sqlite3WhereIsSorted(WhereInfo *pWInfo){ - assert( pWInfo->wctrlFlags & WHERE_GROUPBY ); + assert( pWInfo->wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY) ); assert( pWInfo->wctrlFlags & WHERE_SORTBYGROUP ); return pWInfo->sorted; } @@ -156963,12 +159029,12 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } pWInfo->bOrderedInnerLoop = 0; if( pWInfo->pOrderBy ){ + pWInfo->nOBSat = pFrom->isOrdered; if( pWInfo->wctrlFlags & WHERE_DISTINCTBY ){ if( pFrom->isOrdered==pWInfo->pOrderBy->nExpr ){ pWInfo->eDistinct = WHERE_DISTINCT_ORDERED; } }else{ - pWInfo->nOBSat = pFrom->isOrdered; pWInfo->revMask = pFrom->revLoop; if( pWInfo->nOBSat<=0 ){ pWInfo->nOBSat = 0; @@ -157047,7 +159113,11 @@ static int whereShortCut(WhereLoopBuilder *pBuilder){ pItem = pWInfo->pTabList->a; pTab = pItem->pTab; if( IsVirtual(pTab) ) return 0; - if( pItem->fg.isIndexedBy ) return 0; + if( pItem->fg.isIndexedBy || pItem->fg.notIndexed ){ + testcase( pItem->fg.isIndexedBy ); + testcase( pItem->fg.notIndexed ); + return 0; + } iCur = pItem->iCursor; pWC = &pWInfo->sWC; pLoop = pBuilder->pNew; @@ -157220,7 +159290,7 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( WhereLoop *pLoop; pLoop = pWInfo->a[i].pWLoop; pItem = &pWInfo->pTabList->a[pLoop->iTab]; - if( (pItem->fg.jointype & JT_LEFT)==0 ) continue; + if( (pItem->fg.jointype & (JT_LEFT|JT_RIGHT))!=JT_LEFT ) continue; if( (pWInfo->wctrlFlags & WHERE_WANT_DISTINCT)==0 && (pLoop->wsFlags & WHERE_ONEROW)==0 ){ @@ -157230,8 +159300,8 @@ static SQLITE_NOINLINE Bitmask whereOmitNoopJoin( pEnd = pWInfo->sWC.a + pWInfo->sWC.nTerm; for(pTerm=pWInfo->sWC.a; pTermprereqAll & pLoop->maskSelf)!=0 ){ - if( !ExprHasProperty(pTerm->pExpr, EP_FromJoin) - || pTerm->pExpr->w.iRightJoinTable!=pItem->iCursor + if( !ExprHasProperty(pTerm->pExpr, EP_OuterON) + || pTerm->pExpr->w.iJoin!=pItem->iCursor ){ break; } @@ -157462,7 +159532,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( ** field (type Bitmask) it must be aligned on an 8-byte boundary on ** some architectures. Hence the ROUND8() below. */ - nByteWInfo = ROUND8(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); + nByteWInfo = ROUND8P(sizeof(WhereInfo)+(nTabList-1)*sizeof(WhereLevel)); pWInfo = sqlite3DbMallocRawNN(db, nByteWInfo + sizeof(WhereLoop)); if( db->mallocFailed ){ sqlite3DbFree(db, pWInfo); @@ -157552,7 +159622,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* Analyze all of the subexpressions. */ sqlite3WhereExprAnalyze(pTabList, &pWInfo->sWC); sqlite3WhereAddLimit(&pWInfo->sWC, pLimit); - if( db->mallocFailed ) goto whereBeginError; + if( pParse->nErr ) goto whereBeginError; /* Special case: WHERE terms that do not refer to any tables in the join ** (constant expressions). Evaluate each such term, and jump over all the @@ -157784,8 +159854,10 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( /* noop */ }else #endif - if( (pLoop->wsFlags & WHERE_IDX_ONLY)==0 - && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ + if( ((pLoop->wsFlags & WHERE_IDX_ONLY)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0) + || (pTabItem->fg.jointype & (JT_LTORJ|JT_RIGHT))!=0 + ){ int op = OP_OpenRead; if( pWInfo->eOnePass!=ONEPASS_OFF ){ op = OP_OpenWrite; @@ -157854,6 +159926,7 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( iIndexCur = pParse->nTab++; } pLevel->iIdxCur = iIndexCur; + assert( pIx!=0 ); assert( pIx->pSchema==pTab->pSchema ); assert( iIndexCur>=0 ); if( op ){ @@ -157887,6 +159960,37 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( } } if( iDb>=0 ) sqlite3CodeVerifySchema(pParse, iDb); + if( (pTabItem->fg.jointype & JT_RIGHT)!=0 + && (pLevel->pRJ = sqlite3WhereMalloc(pWInfo, sizeof(WhereRightJoin)))!=0 + ){ + WhereRightJoin *pRJ = pLevel->pRJ; + pRJ->iMatch = pParse->nTab++; + pRJ->regBloom = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Blob, 65536, pRJ->regBloom); + pRJ->regReturn = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_Null, 0, pRJ->regReturn); + assert( pTab==pTabItem->pTab ); + if( HasRowid(pTab) ){ + KeyInfo *pInfo; + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, 1); + pInfo = sqlite3KeyInfoAlloc(pParse->db, 1, 0); + if( pInfo ){ + pInfo->aColl[0] = 0; + pInfo->aSortFlags[0] = 0; + sqlite3VdbeAppendP4(v, pInfo, P4_KEYINFO); + } + }else{ + Index *pPk = sqlite3PrimaryKeyIndex(pTab); + sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRJ->iMatch, pPk->nKeyCol); + sqlite3VdbeSetP4KeyInfo(pParse, pPk); + } + pLoop->wsFlags &= ~WHERE_IDX_ONLY; + /* The nature of RIGHT JOIN processing is such that it messes up + ** the output order. So omit any ORDER BY/GROUP BY elimination + ** optimizations. We need to do an actual sort for RIGHT JOIN. */ + pWInfo->nOBSat = 0; + pWInfo->eDistinct = WHERE_DISTINCT_UNORDERED; + } } pWInfo->iTop = sqlite3VdbeCurrentAddr(v); if( db->mallocFailed ) goto whereBeginError; @@ -157898,9 +160002,20 @@ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin( for(ii=0; iinErr ) goto whereBeginError; pLevel = &pWInfo->a[ii]; wsFlags = pLevel->pWLoop->wsFlags; + pSrc = &pTabList->a[pLevel->iFrom]; + if( pSrc->fg.isMaterialized ){ + if( pSrc->fg.isCorrelated ){ + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + }else{ + int iOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Gosub, pSrc->regReturn, pSrc->addrFillSub); + sqlite3VdbeJumpHere(v, iOnce); + } + } if( (wsFlags & (WHERE_AUTO_INDEX|WHERE_BLOOMFILTER))!=0 ){ if( (wsFlags & WHERE_AUTO_INDEX)!=0 ){ #ifndef SQLITE_OMIT_AUTOMATIC_INDEX @@ -157992,6 +160107,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ SrcList *pTabList = pWInfo->pTabList; sqlite3 *db = pParse->db; int iEnd = sqlite3VdbeCurrentAddr(v); + int nRJ = 0; /* Generate loop termination code. */ @@ -157999,6 +160115,17 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ for(i=pWInfo->nLevel-1; i>=0; i--){ int addr; pLevel = &pWInfo->a[i]; + if( pLevel->pRJ ){ + /* Terminate the subroutine that forms the interior of the loop of + ** the RIGHT JOIN table */ + WhereRightJoin *pRJ = pLevel->pRJ; + sqlite3VdbeResolveLabel(v, pLevel->addrCont); + pLevel->addrCont = 0; + pRJ->endSubrtn = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Return, pRJ->regReturn, pRJ->addrSubrtn, 1); + VdbeCoverage(v); + nRJ++; + } pLoop = pLevel->pWLoop; if( pLevel->op!=OP_Noop ){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT @@ -158026,7 +160153,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } #endif /* SQLITE_DISABLE_SKIPAHEAD_DISTINCT */ /* The common case: Advance to the next row */ - sqlite3VdbeResolveLabel(v, pLevel->addrCont); + if( pLevel->addrCont ) sqlite3VdbeResolveLabel(v, pLevel->addrCont); sqlite3VdbeAddOp3(v, pLevel->op, pLevel->p1, pLevel->p2, pLevel->p3); sqlite3VdbeChangeP5(v, pLevel->p5); VdbeCoverage(v); @@ -158041,7 +160168,7 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ #ifndef SQLITE_DISABLE_SKIPAHEAD_DISTINCT if( addrSeek ) sqlite3VdbeJumpHere(v, addrSeek); #endif - }else{ + }else if( pLevel->addrCont ){ sqlite3VdbeResolveLabel(v, pLevel->addrCont); } if( (pLoop->wsFlags & WHERE_IN_ABLE)!=0 && pLevel->u.in.nIn>0 ){ @@ -158091,6 +160218,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } } sqlite3VdbeResolveLabel(v, pLevel->addrBrk); + if( pLevel->pRJ ){ + sqlite3VdbeAddOp3(v, OP_Return, pLevel->pRJ->regReturn, 0, 1); + VdbeCoverage(v); + } if( pLevel->addrSkip ){ sqlite3VdbeGoto(v, pLevel->addrSkip); VdbeComment((v, "next skip-scan on %s", pLoop->u.btree.pIndex->zName)); @@ -158134,12 +160265,8 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ pWInfo->pTabList->a[pLevel->iFrom].pTab->zName)); } - /* The "break" point is here, just past the end of the outer loop. - ** Set it. - */ - sqlite3VdbeResolveLabel(v, pWInfo->iBreak); - assert( pWInfo->nLevel<=pTabList->nSrc ); + if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo); for(i=0, pLevel=pWInfo->a; inLevel; i++, pLevel++){ int k, last; VdbeOp *pOp, *pLastOp; @@ -158149,6 +160276,15 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ assert( pTab!=0 ); pLoop = pLevel->pWLoop; + /* Do RIGHT JOIN processing. Generate code that will output the + ** unmatched rows of the right operand of the RIGHT JOIN with + ** all of the columns of the left operand set to NULL. + */ + if( pLevel->pRJ ){ + sqlite3WhereRightJoinLoop(pWInfo, i, pLevel); + continue; + } + /* For a co-routine, change all OP_Column references to the table of ** the co-routine into OP_Copy of result contained in a register. ** OP_Rowid becomes OP_Null. @@ -158160,29 +160296,6 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } -#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE - /* Close all of the cursors that were opened by sqlite3WhereBegin. - ** Except, do not close cursors that will be reused by the OR optimization - ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors - ** created for the ONEPASS optimization. - */ - if( (pTab->tabFlags & TF_Ephemeral)==0 - && !IsView(pTab) - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 - ){ - int ws = pLoop->wsFlags; - if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ - sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); - } - if( (ws & WHERE_INDEXED)!=0 - && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 - && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] - ){ - sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); - } - } -#endif - /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can @@ -158283,11 +160396,16 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){ } } + /* The "break" point is here, just past the end of the outer loop. + ** Set it. + */ + sqlite3VdbeResolveLabel(v, pWInfo->iBreak); + /* Final cleanup */ - if( pWInfo->pExprMods ) whereUndoExprMods(pWInfo); pParse->nQueryLoop = pWInfo->savedNQueryLoop; whereInfoFree(db, pWInfo); + pParse->withinRJSubrtn -= nRJ; return; } @@ -159019,7 +161137,7 @@ SQLITE_PRIVATE void sqlite3WindowUpdate( } } } - pWin->pFunc = pFunc; + pWin->pWFunc = pFunc; } /* @@ -159211,7 +161329,7 @@ static ExprList *exprListAppendList( } } pList = sqlite3ExprListAppend(pParse, pList, pDup); - if( pList ) pList->a[nInit+i].sortFlags = pAppend->a[i].sortFlags; + if( pList ) pList->a[nInit+i].fg.sortFlags = pAppend->a[i].fg.sortFlags; } } return pList; @@ -159331,9 +161449,9 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ ExprList *pArgs; assert( ExprUseXList(pWin->pOwner) ); - assert( pWin->pFunc!=0 ); + assert( pWin->pWFunc!=0 ); pArgs = pWin->pOwner->x.pList; - if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ + if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){ selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist); pWin->iArgCol = (pSublist ? pSublist->nExpr : 0); pWin->bExprArgs = 1; @@ -159715,7 +161833,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ } for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *p = pWin->pFunc; + FuncDef *p = pWin->pWFunc; if( (p->funcFlags & SQLITE_FUNC_MINMAX) && pWin->eStart!=TK_UNBOUNDED ){ /* The inline versions of min() and max() require a single ephemeral ** table and 3 registers. The registers are used as follows: @@ -159732,7 +161850,7 @@ SQLITE_PRIVATE void sqlite3WindowCodeInit(Parse *pParse, Select *pSelect){ pWin->csrApp = pParse->nTab++; pWin->regApp = pParse->nMem+1; pParse->nMem += 3; - if( pKeyInfo && pWin->pFunc->zName[1]=='i' ){ + if( pKeyInfo && pWin->pWFunc->zName[1]=='i' ){ assert( pKeyInfo->aSortFlags[0]==0 ); pKeyInfo->aSortFlags[0] = KEYINFO_ORDER_DESC; } @@ -159955,7 +162073,7 @@ static void windowAggStep( Vdbe *v = sqlite3GetVdbe(pParse); Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; int regArg; int nArg = pWin->bExprArgs ? 0 : windowArgCount(pWin); int i; @@ -160069,7 +162187,7 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ if( pMWin->regStartRowid==0 - && (pWin->pFunc->funcFlags & SQLITE_FUNC_MINMAX) + && (pWin->pWFunc->funcFlags & SQLITE_FUNC_MINMAX) && (pWin->eStart!=TK_UNBOUNDED) ){ sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); @@ -160083,12 +162201,12 @@ static void windowAggFinal(WindowCodeArg *p, int bFin){ int nArg = windowArgCount(pWin); if( bFin ){ sqlite3VdbeAddOp2(v, OP_AggFinal, pWin->regAccum, nArg); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); sqlite3VdbeAddOp2(v, OP_Copy, pWin->regAccum, pWin->regResult); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); }else{ sqlite3VdbeAddOp3(v, OP_AggValue,pWin->regAccum,nArg,pWin->regResult); - sqlite3VdbeAppendP4(v, pWin->pFunc, P4_FUNCDEF); + sqlite3VdbeAppendP4(v, pWin->pWFunc, P4_FUNCDEF); } } } @@ -160217,7 +162335,7 @@ static void windowReturnOneRow(WindowCodeArg *p){ Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; assert( ExprUseXList(pWin->pOwner) ); if( pFunc->zName==nth_valueName || pFunc->zName==first_valueName @@ -160289,7 +162407,7 @@ static int windowInitAccum(Parse *pParse, Window *pMWin){ int nArg = 0; Window *pWin; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; assert( pWin->regAccum ); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regAccum); nArg = MAX(nArg, windowArgCount(pWin)); @@ -160319,7 +162437,7 @@ static int windowCacheFrame(Window *pMWin){ Window *pWin; if( pMWin->regStartRowid ) return 1; for(pWin=pMWin; pWin; pWin=pWin->pNextWin){ - FuncDef *pFunc = pWin->pFunc; + FuncDef *pFunc = pWin->pWFunc; if( (pFunc->zName==nth_valueName) || (pFunc->zName==first_valueName) || (pFunc->zName==leadName) @@ -160412,7 +162530,7 @@ static void windowCodeRangeTest( assert( op==OP_Ge || op==OP_Gt || op==OP_Le ); assert( pOrderBy && pOrderBy->nExpr==1 ); - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_DESC ){ + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_DESC ){ switch( op ){ case OP_Ge: op = OP_Le; break; case OP_Gt: op = OP_Lt; break; @@ -160445,7 +162563,7 @@ static void windowCodeRangeTest( ** Additionally, if either reg1 or reg2 are NULL but the jump to lbl is ** not taken, control jumps over the comparison operator coded below this ** block. */ - if( pOrderBy->a[0].sortFlags & KEYINFO_ORDER_BIGNULL ){ + if( pOrderBy->a[0].fg.sortFlags & KEYINFO_ORDER_BIGNULL ){ /* This block runs if reg1 contains a NULL. */ int addr = sqlite3VdbeAddOp1(v, OP_NotNull, reg1); VdbeCoverage(v); switch( op ){ @@ -160677,7 +162795,7 @@ SQLITE_PRIVATE Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->zBase = sqlite3DbStrDup(db, p->zBase); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); - pNew->pFunc = p->pFunc; + pNew->pWFunc = p->pWFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eFrmType = p->eFrmType; @@ -161563,7 +163681,7 @@ static void updateDeleteLimitError( p->affExpr = 0; p->flags = EP_Leaf; ExprClearVVAProperties(p); - p->iAgg = -1; + /* p->iAgg = -1; // Not required */ p->pLeft = p->pRight = 0; p->pAggInfo = 0; memset(&p->x, 0, sizeof(p->x)); @@ -161896,6 +164014,7 @@ typedef union { With* yy521; const char* yy522; Expr* yy528; + OnOrUsing yy561; struct FrameBound yy595; } YYMINORTYPE; #ifndef YYSTACKDEPTH @@ -161912,18 +164031,18 @@ typedef union { #define sqlite3ParserCTX_FETCH Parse *pParse=yypParser->pParse; #define sqlite3ParserCTX_STORE yypParser->pParse=pParse; #define YYFALLBACK 1 -#define YYNSTATE 574 -#define YYNRULE 402 -#define YYNRULE_WITH_ACTION 340 +#define YYNSTATE 576 +#define YYNRULE 405 +#define YYNRULE_WITH_ACTION 342 #define YYNTOKEN 185 -#define YY_MAX_SHIFT 573 -#define YY_MIN_SHIFTREDUCE 831 -#define YY_MAX_SHIFTREDUCE 1232 -#define YY_ERROR_ACTION 1233 -#define YY_ACCEPT_ACTION 1234 -#define YY_NO_ACTION 1235 -#define YY_MIN_REDUCE 1236 -#define YY_MAX_REDUCE 1637 +#define YY_MAX_SHIFT 575 +#define YY_MIN_SHIFTREDUCE 835 +#define YY_MAX_SHIFTREDUCE 1239 +#define YY_ERROR_ACTION 1240 +#define YY_ACCEPT_ACTION 1241 +#define YY_NO_ACTION 1242 +#define YY_MIN_REDUCE 1243 +#define YY_MAX_REDUCE 1647 /************* End control #defines *******************************************/ #define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0]))) @@ -161990,427 +164109,430 @@ typedef union { ** yy_default[] Default action for each state. ** *********** Begin parsing tables **********************************************/ -#define YY_ACTTAB_COUNT (2070) +#define YY_ACTTAB_COUNT (2098) static const YYACTIONTYPE yy_action[] = { - /* 0 */ 566, 1307, 566, 1286, 201, 201, 566, 116, 112, 222, - /* 10 */ 566, 1307, 377, 566, 116, 112, 222, 397, 408, 409, - /* 20 */ 1260, 378, 1269, 41, 41, 41, 41, 1412, 1517, 71, - /* 30 */ 71, 967, 1258, 41, 41, 491, 71, 71, 272, 968, - /* 40 */ 298, 476, 298, 123, 124, 114, 1210, 1210, 1044, 1047, - /* 50 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 543, 409, - /* 60 */ 1234, 1, 1, 573, 2, 1238, 548, 116, 112, 222, - /* 70 */ 309, 480, 142, 548, 1272, 524, 116, 112, 222, 1320, - /* 80 */ 417, 523, 547, 123, 124, 114, 1210, 1210, 1044, 1047, - /* 90 */ 1036, 1036, 121, 121, 122, 122, 122, 122, 424, 116, - /* 100 */ 112, 222, 120, 120, 120, 120, 119, 119, 118, 118, - /* 110 */ 118, 117, 113, 444, 277, 277, 277, 277, 560, 560, - /* 120 */ 560, 1558, 376, 1560, 1186, 375, 1157, 563, 1157, 563, - /* 130 */ 409, 1558, 537, 252, 219, 1553, 99, 141, 449, 6, - /* 140 */ 365, 233, 120, 120, 120, 120, 119, 119, 118, 118, - /* 150 */ 118, 117, 113, 444, 123, 124, 114, 1210, 1210, 1044, - /* 160 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 138, - /* 170 */ 289, 1186, 1546, 448, 118, 118, 118, 117, 113, 444, - /* 180 */ 125, 1186, 1187, 1188, 144, 465, 334, 566, 150, 127, - /* 190 */ 444, 122, 122, 122, 122, 115, 120, 120, 120, 120, - /* 200 */ 119, 119, 118, 118, 118, 117, 113, 444, 454, 419, - /* 210 */ 13, 13, 215, 120, 120, 120, 120, 119, 119, 118, - /* 220 */ 118, 118, 117, 113, 444, 422, 308, 557, 1186, 1187, - /* 230 */ 1188, 441, 440, 409, 1271, 122, 122, 122, 122, 120, - /* 240 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, - /* 250 */ 444, 1543, 98, 1033, 1033, 1045, 1048, 123, 124, 114, - /* 260 */ 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, - /* 270 */ 122, 122, 566, 406, 405, 1186, 566, 409, 1217, 319, - /* 280 */ 1217, 80, 81, 120, 120, 120, 120, 119, 119, 118, - /* 290 */ 118, 118, 117, 113, 444, 70, 70, 1186, 1604, 71, - /* 300 */ 71, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, - /* 310 */ 121, 121, 122, 122, 122, 122, 120, 120, 120, 120, - /* 320 */ 119, 119, 118, 118, 118, 117, 113, 444, 1037, 210, - /* 330 */ 1186, 365, 1186, 1187, 1188, 245, 548, 399, 504, 501, - /* 340 */ 500, 108, 558, 138, 4, 516, 933, 433, 499, 217, - /* 350 */ 514, 522, 352, 879, 1186, 1187, 1188, 383, 561, 566, - /* 360 */ 120, 120, 120, 120, 119, 119, 118, 118, 118, 117, - /* 370 */ 113, 444, 277, 277, 16, 16, 1598, 441, 440, 153, - /* 380 */ 409, 445, 13, 13, 1279, 563, 1214, 1186, 1187, 1188, - /* 390 */ 1003, 1216, 264, 555, 1574, 186, 566, 427, 138, 1215, - /* 400 */ 308, 557, 472, 138, 123, 124, 114, 1210, 1210, 1044, - /* 410 */ 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, 55, - /* 420 */ 55, 413, 1023, 507, 1217, 1186, 1217, 474, 106, 106, - /* 430 */ 1312, 1312, 1186, 171, 566, 384, 107, 380, 445, 568, - /* 440 */ 567, 430, 1543, 1013, 332, 549, 565, 263, 280, 360, - /* 450 */ 510, 355, 509, 250, 491, 308, 557, 71, 71, 351, - /* 460 */ 308, 557, 374, 120, 120, 120, 120, 119, 119, 118, - /* 470 */ 118, 118, 117, 113, 444, 1013, 1013, 1015, 1016, 27, - /* 480 */ 277, 277, 1186, 1187, 1188, 1152, 566, 528, 409, 1186, - /* 490 */ 1187, 1188, 348, 563, 548, 1260, 533, 517, 1152, 1516, - /* 500 */ 317, 1152, 285, 550, 485, 569, 566, 569, 482, 51, - /* 510 */ 51, 207, 123, 124, 114, 1210, 1210, 1044, 1047, 1036, - /* 520 */ 1036, 121, 121, 122, 122, 122, 122, 171, 1412, 13, - /* 530 */ 13, 409, 277, 277, 1186, 505, 119, 119, 118, 118, - /* 540 */ 118, 117, 113, 444, 429, 563, 518, 220, 515, 1552, - /* 550 */ 365, 546, 1186, 6, 532, 123, 124, 114, 1210, 1210, - /* 560 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 570 */ 145, 120, 120, 120, 120, 119, 119, 118, 118, 118, - /* 580 */ 117, 113, 444, 245, 566, 474, 504, 501, 500, 566, - /* 590 */ 1481, 1186, 1187, 1188, 1310, 1310, 499, 1186, 149, 425, - /* 600 */ 1186, 480, 409, 274, 365, 952, 872, 56, 56, 1186, - /* 610 */ 1187, 1188, 71, 71, 120, 120, 120, 120, 119, 119, - /* 620 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 630 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 640 */ 122, 409, 541, 1552, 83, 865, 98, 6, 928, 529, - /* 650 */ 848, 543, 151, 927, 1186, 1187, 1188, 1186, 1187, 1188, - /* 660 */ 290, 1543, 187, 1633, 395, 123, 124, 114, 1210, 1210, - /* 670 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 680 */ 566, 954, 566, 453, 953, 120, 120, 120, 120, 119, - /* 690 */ 119, 118, 118, 118, 117, 113, 444, 1152, 221, 1186, - /* 700 */ 331, 453, 452, 13, 13, 13, 13, 1003, 365, 463, - /* 710 */ 1152, 193, 409, 1152, 382, 1543, 1170, 32, 297, 474, - /* 720 */ 195, 1527, 5, 952, 120, 120, 120, 120, 119, 119, - /* 730 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 740 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 750 */ 122, 409, 1067, 419, 1186, 1024, 1186, 1187, 1188, 1186, - /* 760 */ 419, 332, 460, 320, 544, 1545, 442, 442, 442, 566, - /* 770 */ 3, 117, 113, 444, 453, 123, 124, 114, 1210, 1210, - /* 780 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 790 */ 1473, 566, 15, 15, 293, 120, 120, 120, 120, 119, - /* 800 */ 119, 118, 118, 118, 117, 113, 444, 1186, 566, 1486, - /* 810 */ 1412, 1186, 1187, 1188, 13, 13, 1186, 1187, 1188, 1544, - /* 820 */ 271, 271, 409, 286, 308, 557, 1008, 1486, 1488, 196, - /* 830 */ 288, 71, 71, 563, 120, 120, 120, 120, 119, 119, - /* 840 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 850 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 860 */ 122, 409, 201, 1087, 1186, 1187, 1188, 1324, 304, 1529, - /* 870 */ 388, 278, 278, 450, 564, 402, 922, 922, 566, 563, - /* 880 */ 566, 426, 491, 480, 563, 123, 124, 114, 1210, 1210, - /* 890 */ 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, 122, - /* 900 */ 1486, 71, 71, 13, 13, 120, 120, 120, 120, 119, - /* 910 */ 119, 118, 118, 118, 117, 113, 444, 566, 545, 566, - /* 920 */ 1577, 573, 2, 1238, 1092, 1092, 488, 1480, 309, 1525, - /* 930 */ 142, 324, 409, 836, 837, 838, 312, 1320, 305, 363, - /* 940 */ 43, 43, 57, 57, 120, 120, 120, 120, 119, 119, - /* 950 */ 118, 118, 118, 117, 113, 444, 123, 124, 114, 1210, - /* 960 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 970 */ 122, 12, 277, 277, 566, 1152, 409, 572, 428, 1238, - /* 980 */ 465, 334, 296, 474, 309, 563, 142, 249, 1152, 308, - /* 990 */ 557, 1152, 321, 1320, 323, 491, 455, 71, 71, 233, - /* 1000 */ 283, 101, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, - /* 1010 */ 121, 122, 122, 122, 122, 120, 120, 120, 120, 119, - /* 1020 */ 119, 118, 118, 118, 117, 113, 444, 1108, 277, 277, - /* 1030 */ 1412, 448, 394, 1230, 439, 277, 277, 248, 247, 246, - /* 1040 */ 1319, 563, 1109, 313, 198, 294, 491, 1318, 563, 464, - /* 1050 */ 566, 1427, 394, 1130, 1023, 233, 414, 1110, 295, 120, - /* 1060 */ 120, 120, 120, 119, 119, 118, 118, 118, 117, 113, - /* 1070 */ 444, 1014, 104, 71, 71, 1013, 322, 496, 908, 566, - /* 1080 */ 277, 277, 277, 277, 1108, 1261, 415, 448, 909, 361, - /* 1090 */ 1571, 1315, 409, 563, 952, 563, 9, 202, 255, 1109, - /* 1100 */ 316, 487, 44, 44, 249, 559, 415, 1013, 1013, 1015, - /* 1110 */ 443, 1231, 409, 1603, 1110, 897, 123, 124, 114, 1210, - /* 1120 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1130 */ 122, 1231, 409, 1207, 215, 554, 123, 124, 114, 1210, - /* 1140 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1150 */ 122, 1131, 1631, 470, 1631, 255, 123, 111, 114, 1210, - /* 1160 */ 1210, 1044, 1047, 1036, 1036, 121, 121, 122, 122, 122, - /* 1170 */ 122, 1131, 1632, 414, 1632, 120, 120, 120, 120, 119, - /* 1180 */ 119, 118, 118, 118, 117, 113, 444, 221, 209, 351, - /* 1190 */ 1207, 1207, 147, 1426, 491, 120, 120, 120, 120, 119, - /* 1200 */ 119, 118, 118, 118, 117, 113, 444, 1256, 539, 519, - /* 1210 */ 888, 551, 952, 12, 566, 120, 120, 120, 120, 119, - /* 1220 */ 119, 118, 118, 118, 117, 113, 444, 538, 566, 860, - /* 1230 */ 1129, 361, 1571, 346, 1356, 409, 1163, 58, 58, 339, - /* 1240 */ 1355, 508, 277, 277, 277, 277, 277, 277, 1207, 889, - /* 1250 */ 1129, 59, 59, 459, 363, 563, 566, 563, 96, 563, - /* 1260 */ 124, 114, 1210, 1210, 1044, 1047, 1036, 1036, 121, 121, - /* 1270 */ 122, 122, 122, 122, 566, 1412, 566, 281, 1186, 60, - /* 1280 */ 60, 110, 392, 392, 391, 266, 389, 860, 1163, 845, - /* 1290 */ 566, 481, 566, 436, 341, 1152, 344, 61, 61, 62, - /* 1300 */ 62, 967, 227, 1550, 315, 431, 540, 6, 1152, 968, - /* 1310 */ 566, 1152, 314, 45, 45, 46, 46, 512, 120, 120, - /* 1320 */ 120, 120, 119, 119, 118, 118, 118, 117, 113, 444, - /* 1330 */ 416, 173, 1532, 47, 47, 1186, 1187, 1188, 108, 558, - /* 1340 */ 325, 4, 229, 1551, 928, 566, 437, 6, 566, 927, - /* 1350 */ 164, 566, 1290, 137, 1190, 561, 566, 1549, 566, 1089, - /* 1360 */ 566, 6, 566, 1089, 531, 566, 868, 8, 49, 49, - /* 1370 */ 228, 50, 50, 566, 63, 63, 566, 457, 445, 64, - /* 1380 */ 64, 65, 65, 14, 14, 66, 66, 407, 129, 129, - /* 1390 */ 555, 566, 458, 566, 1505, 486, 67, 67, 566, 52, - /* 1400 */ 52, 546, 407, 467, 535, 410, 226, 1023, 566, 534, - /* 1410 */ 308, 557, 1190, 407, 68, 68, 69, 69, 566, 1023, - /* 1420 */ 566, 53, 53, 868, 1014, 106, 106, 525, 1013, 566, - /* 1430 */ 1504, 159, 159, 107, 451, 445, 568, 567, 471, 307, - /* 1440 */ 1013, 160, 160, 76, 76, 566, 1548, 466, 407, 407, - /* 1450 */ 6, 1225, 54, 54, 478, 276, 219, 566, 887, 886, - /* 1460 */ 1013, 1013, 1015, 84, 206, 1206, 230, 282, 72, 72, - /* 1470 */ 329, 483, 1013, 1013, 1015, 1016, 27, 1576, 1174, 447, - /* 1480 */ 130, 130, 281, 148, 105, 38, 103, 392, 392, 391, - /* 1490 */ 266, 389, 566, 1126, 845, 396, 566, 108, 558, 566, - /* 1500 */ 4, 311, 566, 30, 17, 566, 279, 227, 566, 315, - /* 1510 */ 108, 558, 468, 4, 561, 73, 73, 314, 566, 157, - /* 1520 */ 157, 566, 131, 131, 526, 132, 132, 561, 128, 128, - /* 1530 */ 566, 158, 158, 566, 31, 291, 566, 445, 330, 521, - /* 1540 */ 98, 152, 152, 420, 136, 136, 1005, 229, 254, 555, - /* 1550 */ 445, 479, 336, 135, 135, 164, 133, 133, 137, 134, - /* 1560 */ 134, 875, 555, 535, 566, 473, 566, 254, 536, 475, - /* 1570 */ 335, 254, 98, 894, 895, 228, 535, 566, 1023, 566, - /* 1580 */ 1074, 534, 210, 232, 106, 106, 1352, 75, 75, 77, - /* 1590 */ 77, 1023, 107, 340, 445, 568, 567, 106, 106, 1013, - /* 1600 */ 74, 74, 42, 42, 566, 107, 343, 445, 568, 567, - /* 1610 */ 410, 497, 1013, 251, 359, 308, 557, 1135, 349, 875, - /* 1620 */ 98, 1070, 345, 251, 358, 1591, 347, 48, 48, 1017, - /* 1630 */ 1303, 1013, 1013, 1015, 1016, 27, 1289, 1287, 1074, 451, - /* 1640 */ 961, 925, 254, 110, 1013, 1013, 1015, 1016, 27, 1174, - /* 1650 */ 447, 970, 971, 281, 108, 558, 1288, 4, 392, 392, - /* 1660 */ 391, 266, 389, 1343, 1086, 845, 1086, 1085, 858, 1085, - /* 1670 */ 146, 561, 926, 354, 110, 303, 364, 553, 227, 1364, - /* 1680 */ 315, 108, 558, 1411, 4, 1339, 492, 1017, 314, 1350, - /* 1690 */ 1565, 552, 1417, 1268, 445, 204, 1259, 1247, 561, 1246, - /* 1700 */ 1248, 1584, 269, 1336, 367, 369, 555, 371, 11, 212, - /* 1710 */ 393, 225, 1393, 284, 1398, 456, 287, 327, 229, 328, - /* 1720 */ 292, 445, 1386, 216, 333, 1403, 164, 477, 373, 137, - /* 1730 */ 1402, 400, 502, 555, 1286, 1023, 357, 1477, 199, 1587, - /* 1740 */ 211, 106, 106, 932, 1476, 1225, 228, 556, 175, 107, - /* 1750 */ 200, 445, 568, 567, 258, 387, 1013, 1524, 1522, 223, - /* 1760 */ 1222, 418, 1023, 83, 208, 79, 82, 184, 106, 106, - /* 1770 */ 1482, 169, 177, 461, 179, 462, 107, 1399, 445, 568, - /* 1780 */ 567, 410, 180, 1013, 495, 181, 308, 557, 1013, 1013, - /* 1790 */ 1015, 1016, 27, 182, 35, 235, 100, 558, 398, 4, - /* 1800 */ 96, 1405, 1404, 36, 484, 469, 1407, 188, 401, 1471, - /* 1810 */ 451, 89, 1493, 561, 239, 1013, 1013, 1015, 1016, 27, - /* 1820 */ 490, 338, 270, 241, 192, 342, 493, 242, 403, 1249, - /* 1830 */ 243, 511, 432, 1297, 1306, 91, 445, 1305, 1304, 879, - /* 1840 */ 217, 434, 435, 1570, 1276, 1602, 520, 1601, 555, 301, - /* 1850 */ 527, 404, 1275, 302, 356, 1274, 1600, 95, 1347, 366, - /* 1860 */ 1296, 362, 1348, 368, 256, 257, 1556, 1555, 438, 1346, - /* 1870 */ 370, 126, 1345, 10, 1371, 546, 381, 1023, 102, 1457, - /* 1880 */ 97, 530, 34, 106, 106, 570, 1180, 372, 265, 1329, - /* 1890 */ 379, 107, 203, 445, 568, 567, 1328, 385, 1013, 1370, - /* 1900 */ 386, 267, 268, 571, 1244, 161, 1239, 162, 1509, 1510, - /* 1910 */ 1508, 143, 1507, 299, 832, 213, 214, 78, 446, 205, - /* 1920 */ 310, 306, 163, 224, 1084, 140, 1082, 318, 165, 176, - /* 1930 */ 1013, 1013, 1015, 1016, 27, 178, 1206, 231, 911, 234, - /* 1940 */ 326, 1098, 183, 421, 166, 167, 411, 185, 85, 423, - /* 1950 */ 412, 86, 174, 87, 168, 88, 1101, 236, 1097, 237, - /* 1960 */ 154, 18, 238, 254, 337, 1219, 489, 1090, 240, 190, - /* 1970 */ 37, 847, 189, 494, 358, 244, 350, 506, 191, 877, - /* 1980 */ 90, 498, 19, 20, 503, 92, 353, 890, 300, 170, - /* 1990 */ 155, 93, 513, 94, 1168, 156, 1050, 1137, 39, 218, - /* 2000 */ 273, 275, 1136, 960, 194, 955, 110, 1154, 1158, 253, - /* 2010 */ 7, 1162, 1156, 21, 22, 1161, 1142, 23, 24, 25, - /* 2020 */ 33, 542, 26, 260, 197, 98, 1065, 1051, 1049, 1053, - /* 2030 */ 1107, 1054, 1106, 259, 28, 40, 562, 1018, 859, 109, - /* 2040 */ 29, 921, 390, 1176, 172, 139, 1175, 1235, 261, 1235, - /* 2050 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 262, 1235, 1235, - /* 2060 */ 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1235, 1593, 1592, + /* 0 */ 568, 208, 568, 118, 115, 229, 568, 118, 115, 229, + /* 10 */ 568, 1314, 377, 1293, 408, 562, 562, 562, 568, 409, + /* 20 */ 378, 1314, 1276, 41, 41, 41, 41, 208, 1526, 71, + /* 30 */ 71, 971, 419, 41, 41, 491, 303, 279, 303, 972, + /* 40 */ 397, 71, 71, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 50 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 476, 409, + /* 60 */ 1241, 1, 1, 575, 2, 1245, 550, 118, 115, 229, + /* 70 */ 317, 480, 146, 480, 524, 118, 115, 229, 529, 1327, + /* 80 */ 417, 523, 142, 125, 126, 80, 1217, 1217, 1050, 1053, + /* 90 */ 1040, 1040, 123, 123, 124, 124, 124, 124, 118, 115, + /* 100 */ 229, 327, 122, 122, 122, 122, 121, 121, 120, 120, + /* 110 */ 120, 119, 116, 444, 284, 284, 284, 284, 442, 442, + /* 120 */ 442, 1567, 376, 1569, 1192, 375, 1163, 565, 1163, 565, + /* 130 */ 409, 1567, 537, 259, 226, 444, 101, 145, 449, 316, + /* 140 */ 559, 240, 122, 122, 122, 122, 121, 121, 120, 120, + /* 150 */ 120, 119, 116, 444, 125, 126, 80, 1217, 1217, 1050, + /* 160 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 142, + /* 170 */ 294, 1192, 339, 448, 120, 120, 120, 119, 116, 444, + /* 180 */ 127, 1192, 1193, 1194, 148, 441, 440, 568, 119, 116, + /* 190 */ 444, 124, 124, 124, 124, 117, 122, 122, 122, 122, + /* 200 */ 121, 121, 120, 120, 120, 119, 116, 444, 454, 113, + /* 210 */ 13, 13, 546, 122, 122, 122, 122, 121, 121, 120, + /* 220 */ 120, 120, 119, 116, 444, 422, 316, 559, 1192, 1193, + /* 230 */ 1194, 149, 1224, 409, 1224, 124, 124, 124, 124, 122, + /* 240 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 250 */ 444, 465, 342, 1037, 1037, 1051, 1054, 125, 126, 80, + /* 260 */ 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, + /* 270 */ 124, 124, 1279, 522, 222, 1192, 568, 409, 224, 514, + /* 280 */ 175, 82, 83, 122, 122, 122, 122, 121, 121, 120, + /* 290 */ 120, 120, 119, 116, 444, 1007, 16, 16, 1192, 133, + /* 300 */ 133, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, + /* 310 */ 123, 123, 124, 124, 124, 124, 122, 122, 122, 122, + /* 320 */ 121, 121, 120, 120, 120, 119, 116, 444, 1041, 546, + /* 330 */ 1192, 373, 1192, 1193, 1194, 252, 1434, 399, 504, 501, + /* 340 */ 500, 111, 560, 566, 4, 926, 926, 433, 499, 340, + /* 350 */ 460, 328, 360, 394, 1237, 1192, 1193, 1194, 563, 568, + /* 360 */ 122, 122, 122, 122, 121, 121, 120, 120, 120, 119, + /* 370 */ 116, 444, 284, 284, 369, 1580, 1607, 441, 440, 154, + /* 380 */ 409, 445, 71, 71, 1286, 565, 1221, 1192, 1193, 1194, + /* 390 */ 85, 1223, 271, 557, 543, 515, 1561, 568, 98, 1222, + /* 400 */ 6, 1278, 472, 142, 125, 126, 80, 1217, 1217, 1050, + /* 410 */ 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, 550, + /* 420 */ 13, 13, 1027, 507, 1224, 1192, 1224, 549, 109, 109, + /* 430 */ 222, 568, 1238, 175, 568, 427, 110, 197, 445, 570, + /* 440 */ 569, 430, 1552, 1017, 325, 551, 1192, 270, 287, 368, + /* 450 */ 510, 363, 509, 257, 71, 71, 543, 71, 71, 359, + /* 460 */ 316, 559, 1613, 122, 122, 122, 122, 121, 121, 120, + /* 470 */ 120, 120, 119, 116, 444, 1017, 1017, 1019, 1020, 27, + /* 480 */ 284, 284, 1192, 1193, 1194, 1158, 568, 1612, 409, 901, + /* 490 */ 190, 550, 356, 565, 550, 937, 533, 517, 1158, 516, + /* 500 */ 413, 1158, 552, 1192, 1193, 1194, 568, 544, 1554, 51, + /* 510 */ 51, 214, 125, 126, 80, 1217, 1217, 1050, 1053, 1040, + /* 520 */ 1040, 123, 123, 124, 124, 124, 124, 1192, 474, 135, + /* 530 */ 135, 409, 284, 284, 1490, 505, 121, 121, 120, 120, + /* 540 */ 120, 119, 116, 444, 1007, 565, 518, 217, 541, 1561, + /* 550 */ 316, 559, 142, 6, 532, 125, 126, 80, 1217, 1217, + /* 560 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 570 */ 1555, 122, 122, 122, 122, 121, 121, 120, 120, 120, + /* 580 */ 119, 116, 444, 485, 1192, 1193, 1194, 482, 281, 1267, + /* 590 */ 957, 252, 1192, 373, 504, 501, 500, 1192, 340, 571, + /* 600 */ 1192, 571, 409, 292, 499, 957, 876, 191, 480, 316, + /* 610 */ 559, 384, 290, 380, 122, 122, 122, 122, 121, 121, + /* 620 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 630 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 640 */ 124, 409, 394, 1136, 1192, 869, 100, 284, 284, 1192, + /* 650 */ 1193, 1194, 373, 1093, 1192, 1193, 1194, 1192, 1193, 1194, + /* 660 */ 565, 455, 32, 373, 233, 125, 126, 80, 1217, 1217, + /* 670 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 680 */ 1433, 959, 568, 228, 958, 122, 122, 122, 122, 121, + /* 690 */ 121, 120, 120, 120, 119, 116, 444, 1158, 228, 1192, + /* 700 */ 157, 1192, 1193, 1194, 1553, 13, 13, 301, 957, 1232, + /* 710 */ 1158, 153, 409, 1158, 373, 1583, 1176, 5, 369, 1580, + /* 720 */ 429, 1238, 3, 957, 122, 122, 122, 122, 121, 121, + /* 730 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 740 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 750 */ 124, 409, 208, 567, 1192, 1028, 1192, 1193, 1194, 1192, + /* 760 */ 388, 852, 155, 1552, 286, 402, 1098, 1098, 488, 568, + /* 770 */ 465, 342, 1319, 1319, 1552, 125, 126, 80, 1217, 1217, + /* 780 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 790 */ 129, 568, 13, 13, 374, 122, 122, 122, 122, 121, + /* 800 */ 121, 120, 120, 120, 119, 116, 444, 302, 568, 453, + /* 810 */ 528, 1192, 1193, 1194, 13, 13, 1192, 1193, 1194, 1297, + /* 820 */ 463, 1267, 409, 1317, 1317, 1552, 1012, 453, 452, 200, + /* 830 */ 299, 71, 71, 1265, 122, 122, 122, 122, 121, 121, + /* 840 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 850 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 860 */ 124, 409, 227, 1073, 1158, 284, 284, 419, 312, 278, + /* 870 */ 278, 285, 285, 1419, 406, 405, 382, 1158, 565, 568, + /* 880 */ 1158, 1196, 565, 1600, 565, 125, 126, 80, 1217, 1217, + /* 890 */ 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, 124, + /* 900 */ 453, 1482, 13, 13, 1536, 122, 122, 122, 122, 121, + /* 910 */ 121, 120, 120, 120, 119, 116, 444, 201, 568, 354, + /* 920 */ 1586, 575, 2, 1245, 840, 841, 842, 1562, 317, 1212, + /* 930 */ 146, 6, 409, 255, 254, 253, 206, 1327, 9, 1196, + /* 940 */ 262, 71, 71, 424, 122, 122, 122, 122, 121, 121, + /* 950 */ 120, 120, 120, 119, 116, 444, 125, 126, 80, 1217, + /* 960 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 970 */ 124, 568, 284, 284, 568, 1213, 409, 574, 313, 1245, + /* 980 */ 349, 1296, 352, 419, 317, 565, 146, 491, 525, 1643, + /* 990 */ 395, 371, 491, 1327, 70, 70, 1295, 71, 71, 240, + /* 1000 */ 1325, 104, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, + /* 1010 */ 123, 124, 124, 124, 124, 122, 122, 122, 122, 121, + /* 1020 */ 121, 120, 120, 120, 119, 116, 444, 1114, 284, 284, + /* 1030 */ 428, 448, 1525, 1213, 439, 284, 284, 1489, 1352, 311, + /* 1040 */ 474, 565, 1115, 971, 491, 491, 217, 1263, 565, 1538, + /* 1050 */ 568, 972, 207, 568, 1027, 240, 383, 1116, 519, 122, + /* 1060 */ 122, 122, 122, 121, 121, 120, 120, 120, 119, 116, + /* 1070 */ 444, 1018, 107, 71, 71, 1017, 13, 13, 912, 568, + /* 1080 */ 1495, 568, 284, 284, 97, 526, 491, 448, 913, 1326, + /* 1090 */ 1322, 545, 409, 284, 284, 565, 151, 209, 1495, 1497, + /* 1100 */ 262, 450, 55, 55, 56, 56, 565, 1017, 1017, 1019, + /* 1110 */ 443, 332, 409, 527, 12, 295, 125, 126, 80, 1217, + /* 1120 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1130 */ 124, 347, 409, 864, 1534, 1213, 125, 126, 80, 1217, + /* 1140 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1150 */ 124, 1137, 1641, 474, 1641, 371, 125, 114, 80, 1217, + /* 1160 */ 1217, 1050, 1053, 1040, 1040, 123, 123, 124, 124, 124, + /* 1170 */ 124, 1495, 329, 474, 331, 122, 122, 122, 122, 121, + /* 1180 */ 121, 120, 120, 120, 119, 116, 444, 203, 1419, 568, + /* 1190 */ 1294, 864, 464, 1213, 436, 122, 122, 122, 122, 121, + /* 1200 */ 121, 120, 120, 120, 119, 116, 444, 553, 1137, 1642, + /* 1210 */ 539, 1642, 15, 15, 892, 122, 122, 122, 122, 121, + /* 1220 */ 121, 120, 120, 120, 119, 116, 444, 568, 298, 538, + /* 1230 */ 1135, 1419, 1559, 1560, 1331, 409, 6, 6, 1169, 1268, + /* 1240 */ 415, 320, 284, 284, 1419, 508, 565, 525, 300, 457, + /* 1250 */ 43, 43, 568, 893, 12, 565, 330, 478, 425, 407, + /* 1260 */ 126, 80, 1217, 1217, 1050, 1053, 1040, 1040, 123, 123, + /* 1270 */ 124, 124, 124, 124, 568, 57, 57, 288, 1192, 1419, + /* 1280 */ 496, 458, 392, 392, 391, 273, 389, 1135, 1558, 849, + /* 1290 */ 1169, 407, 6, 568, 321, 1158, 470, 44, 44, 1557, + /* 1300 */ 1114, 426, 234, 6, 323, 256, 540, 256, 1158, 431, + /* 1310 */ 568, 1158, 322, 17, 487, 1115, 58, 58, 122, 122, + /* 1320 */ 122, 122, 121, 121, 120, 120, 120, 119, 116, 444, + /* 1330 */ 1116, 216, 481, 59, 59, 1192, 1193, 1194, 111, 560, + /* 1340 */ 324, 4, 236, 456, 526, 568, 237, 456, 568, 437, + /* 1350 */ 168, 556, 420, 141, 479, 563, 568, 293, 568, 1095, + /* 1360 */ 568, 293, 568, 1095, 531, 568, 872, 8, 60, 60, + /* 1370 */ 235, 61, 61, 568, 414, 568, 414, 568, 445, 62, + /* 1380 */ 62, 45, 45, 46, 46, 47, 47, 199, 49, 49, + /* 1390 */ 557, 568, 359, 568, 100, 486, 50, 50, 63, 63, + /* 1400 */ 64, 64, 561, 415, 535, 410, 568, 1027, 568, 534, + /* 1410 */ 316, 559, 316, 559, 65, 65, 14, 14, 568, 1027, + /* 1420 */ 568, 512, 932, 872, 1018, 109, 109, 931, 1017, 66, + /* 1430 */ 66, 131, 131, 110, 451, 445, 570, 569, 416, 177, + /* 1440 */ 1017, 132, 132, 67, 67, 568, 467, 568, 932, 471, + /* 1450 */ 1364, 283, 226, 931, 315, 1363, 407, 568, 459, 407, + /* 1460 */ 1017, 1017, 1019, 239, 407, 86, 213, 1350, 52, 52, + /* 1470 */ 68, 68, 1017, 1017, 1019, 1020, 27, 1585, 1180, 447, + /* 1480 */ 69, 69, 288, 97, 108, 1541, 106, 392, 392, 391, + /* 1490 */ 273, 389, 568, 879, 849, 883, 568, 111, 560, 466, + /* 1500 */ 4, 568, 152, 30, 38, 568, 1132, 234, 396, 323, + /* 1510 */ 111, 560, 527, 4, 563, 53, 53, 322, 568, 163, + /* 1520 */ 163, 568, 337, 468, 164, 164, 333, 563, 76, 76, + /* 1530 */ 568, 289, 1514, 568, 31, 1513, 568, 445, 338, 483, + /* 1540 */ 100, 54, 54, 344, 72, 72, 296, 236, 1080, 557, + /* 1550 */ 445, 879, 1360, 134, 134, 168, 73, 73, 141, 161, + /* 1560 */ 161, 1574, 557, 535, 568, 319, 568, 348, 536, 1009, + /* 1570 */ 473, 261, 261, 891, 890, 235, 535, 568, 1027, 568, + /* 1580 */ 475, 534, 261, 367, 109, 109, 521, 136, 136, 130, + /* 1590 */ 130, 1027, 110, 366, 445, 570, 569, 109, 109, 1017, + /* 1600 */ 162, 162, 156, 156, 568, 110, 1080, 445, 570, 569, + /* 1610 */ 410, 351, 1017, 568, 353, 316, 559, 568, 343, 568, + /* 1620 */ 100, 497, 357, 258, 100, 898, 899, 140, 140, 355, + /* 1630 */ 1310, 1017, 1017, 1019, 1020, 27, 139, 139, 362, 451, + /* 1640 */ 137, 137, 138, 138, 1017, 1017, 1019, 1020, 27, 1180, + /* 1650 */ 447, 568, 372, 288, 111, 560, 1021, 4, 392, 392, + /* 1660 */ 391, 273, 389, 568, 1141, 849, 568, 1076, 568, 258, + /* 1670 */ 492, 563, 568, 211, 75, 75, 555, 962, 234, 261, + /* 1680 */ 323, 111, 560, 929, 4, 113, 77, 77, 322, 74, + /* 1690 */ 74, 42, 42, 1373, 445, 48, 48, 1418, 563, 974, + /* 1700 */ 975, 1092, 1091, 1092, 1091, 862, 557, 150, 930, 1346, + /* 1710 */ 113, 1358, 554, 1424, 1021, 1275, 1266, 1254, 236, 1253, + /* 1720 */ 1255, 445, 1593, 1343, 308, 276, 168, 309, 11, 141, + /* 1730 */ 393, 310, 232, 557, 1405, 1027, 335, 291, 1400, 219, + /* 1740 */ 336, 109, 109, 936, 297, 1410, 235, 341, 477, 110, + /* 1750 */ 502, 445, 570, 569, 1393, 1409, 1017, 400, 1293, 365, + /* 1760 */ 223, 1486, 1027, 1485, 1355, 1356, 1354, 1353, 109, 109, + /* 1770 */ 204, 1596, 1232, 558, 265, 218, 110, 205, 445, 570, + /* 1780 */ 569, 410, 387, 1017, 1533, 179, 316, 559, 1017, 1017, + /* 1790 */ 1019, 1020, 27, 230, 1531, 1229, 79, 560, 85, 4, + /* 1800 */ 418, 215, 548, 81, 84, 188, 1406, 173, 181, 461, + /* 1810 */ 451, 35, 462, 563, 183, 1017, 1017, 1019, 1020, 27, + /* 1820 */ 184, 1491, 185, 186, 495, 242, 98, 398, 1412, 36, + /* 1830 */ 1411, 484, 91, 469, 401, 1414, 445, 192, 1480, 246, + /* 1840 */ 1502, 490, 346, 277, 248, 196, 493, 511, 557, 350, + /* 1850 */ 1256, 249, 250, 403, 1313, 1312, 111, 560, 432, 4, + /* 1860 */ 1311, 1304, 93, 1611, 883, 1610, 224, 404, 434, 520, + /* 1870 */ 263, 435, 1579, 563, 1283, 1282, 364, 1027, 306, 1281, + /* 1880 */ 264, 1609, 1565, 109, 109, 370, 1303, 307, 1564, 438, + /* 1890 */ 128, 110, 1378, 445, 570, 569, 445, 546, 1017, 10, + /* 1900 */ 1466, 105, 381, 1377, 34, 572, 99, 1336, 557, 314, + /* 1910 */ 1186, 530, 272, 274, 379, 210, 1335, 547, 385, 386, + /* 1920 */ 275, 573, 1251, 1246, 411, 412, 1518, 165, 178, 1519, + /* 1930 */ 1017, 1017, 1019, 1020, 27, 1517, 1516, 1027, 78, 147, + /* 1940 */ 166, 220, 221, 109, 109, 836, 304, 167, 446, 212, + /* 1950 */ 318, 110, 231, 445, 570, 569, 144, 1090, 1017, 1088, + /* 1960 */ 326, 180, 169, 1212, 182, 334, 238, 915, 241, 1104, + /* 1970 */ 187, 170, 171, 421, 87, 88, 423, 189, 89, 90, + /* 1980 */ 172, 1107, 243, 1103, 244, 158, 18, 245, 345, 247, + /* 1990 */ 1017, 1017, 1019, 1020, 27, 261, 1096, 193, 1226, 489, + /* 2000 */ 194, 37, 366, 851, 494, 251, 195, 506, 92, 19, + /* 2010 */ 498, 358, 20, 503, 881, 361, 94, 894, 305, 159, + /* 2020 */ 513, 39, 95, 1174, 160, 1056, 966, 1143, 96, 174, + /* 2030 */ 1142, 225, 280, 282, 198, 960, 113, 1164, 1160, 260, + /* 2040 */ 21, 22, 23, 1162, 1168, 1167, 1148, 24, 33, 25, + /* 2050 */ 202, 542, 26, 100, 1071, 102, 1057, 103, 7, 1055, + /* 2060 */ 1059, 1113, 1060, 1112, 266, 267, 28, 40, 390, 1022, + /* 2070 */ 863, 112, 29, 564, 1182, 1181, 268, 176, 143, 925, + /* 2080 */ 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, 1242, + /* 2090 */ 1242, 1242, 1242, 1242, 269, 1602, 1242, 1601, }; static const YYCODETYPE yy_lookahead[] = { - /* 0 */ 193, 223, 193, 225, 193, 193, 193, 274, 275, 276, - /* 10 */ 193, 233, 219, 193, 274, 275, 276, 206, 206, 19, - /* 20 */ 193, 219, 216, 216, 217, 216, 217, 193, 295, 216, - /* 30 */ 217, 31, 205, 216, 217, 193, 216, 217, 213, 39, - /* 40 */ 228, 193, 230, 43, 44, 45, 46, 47, 48, 49, + /* 0 */ 193, 193, 193, 274, 275, 276, 193, 274, 275, 276, + /* 10 */ 193, 223, 219, 225, 206, 210, 211, 212, 193, 19, + /* 20 */ 219, 233, 216, 216, 217, 216, 217, 193, 295, 216, + /* 30 */ 217, 31, 193, 216, 217, 193, 228, 213, 230, 39, + /* 40 */ 206, 216, 217, 43, 44, 45, 46, 47, 48, 49, /* 50 */ 50, 51, 52, 53, 54, 55, 56, 57, 193, 19, /* 60 */ 185, 186, 187, 188, 189, 190, 253, 274, 275, 276, - /* 70 */ 195, 193, 197, 253, 216, 262, 274, 275, 276, 204, - /* 80 */ 238, 204, 262, 43, 44, 45, 46, 47, 48, 49, - /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 264, 274, - /* 100 */ 275, 276, 102, 103, 104, 105, 106, 107, 108, 109, + /* 70 */ 195, 193, 197, 193, 261, 274, 275, 276, 253, 204, + /* 80 */ 238, 204, 81, 43, 44, 45, 46, 47, 48, 49, + /* 90 */ 50, 51, 52, 53, 54, 55, 56, 57, 274, 275, + /* 100 */ 276, 262, 102, 103, 104, 105, 106, 107, 108, 109, /* 110 */ 110, 111, 112, 113, 239, 240, 239, 240, 210, 211, /* 120 */ 212, 314, 315, 314, 59, 316, 86, 252, 88, 252, - /* 130 */ 19, 314, 315, 256, 257, 309, 25, 72, 296, 313, - /* 140 */ 193, 266, 102, 103, 104, 105, 106, 107, 108, 109, + /* 130 */ 19, 314, 315, 256, 257, 113, 25, 72, 296, 138, + /* 140 */ 139, 266, 102, 103, 104, 105, 106, 107, 108, 109, /* 150 */ 110, 111, 112, 113, 43, 44, 45, 46, 47, 48, /* 160 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 81, - /* 170 */ 292, 59, 307, 298, 108, 109, 110, 111, 112, 113, - /* 180 */ 69, 116, 117, 118, 72, 128, 129, 193, 241, 22, + /* 170 */ 292, 59, 292, 298, 108, 109, 110, 111, 112, 113, + /* 180 */ 69, 116, 117, 118, 72, 106, 107, 193, 111, 112, /* 190 */ 113, 54, 55, 56, 57, 58, 102, 103, 104, 105, - /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 193, - /* 210 */ 216, 217, 25, 102, 103, 104, 105, 106, 107, 108, + /* 200 */ 106, 107, 108, 109, 110, 111, 112, 113, 120, 25, + /* 210 */ 216, 217, 145, 102, 103, 104, 105, 106, 107, 108, /* 220 */ 109, 110, 111, 112, 113, 231, 138, 139, 116, 117, - /* 230 */ 118, 106, 107, 19, 216, 54, 55, 56, 57, 102, + /* 230 */ 118, 164, 153, 19, 155, 54, 55, 56, 57, 102, /* 240 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 250 */ 113, 304, 25, 46, 47, 48, 49, 43, 44, 45, + /* 250 */ 113, 128, 129, 46, 47, 48, 49, 43, 44, 45, /* 260 */ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, - /* 270 */ 56, 57, 193, 106, 107, 59, 193, 19, 153, 263, - /* 280 */ 155, 67, 24, 102, 103, 104, 105, 106, 107, 108, - /* 290 */ 109, 110, 111, 112, 113, 216, 217, 59, 230, 216, + /* 270 */ 56, 57, 216, 193, 25, 59, 193, 19, 165, 166, + /* 280 */ 193, 67, 24, 102, 103, 104, 105, 106, 107, 108, + /* 290 */ 109, 110, 111, 112, 113, 73, 216, 217, 59, 216, /* 300 */ 217, 43, 44, 45, 46, 47, 48, 49, 50, 51, /* 310 */ 52, 53, 54, 55, 56, 57, 102, 103, 104, 105, - /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 142, - /* 330 */ 59, 193, 116, 117, 118, 119, 253, 204, 122, 123, - /* 340 */ 124, 19, 20, 81, 22, 262, 108, 19, 132, 165, - /* 350 */ 166, 193, 24, 126, 116, 117, 118, 278, 36, 193, + /* 320 */ 106, 107, 108, 109, 110, 111, 112, 113, 121, 145, + /* 330 */ 59, 193, 116, 117, 118, 119, 273, 204, 122, 123, + /* 340 */ 124, 19, 20, 134, 22, 136, 137, 19, 132, 127, + /* 350 */ 128, 129, 24, 22, 23, 116, 117, 118, 36, 193, /* 360 */ 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, - /* 370 */ 112, 113, 239, 240, 216, 217, 215, 106, 107, 241, + /* 370 */ 112, 113, 239, 240, 311, 312, 215, 106, 107, 241, /* 380 */ 19, 59, 216, 217, 223, 252, 115, 116, 117, 118, - /* 390 */ 73, 120, 26, 71, 193, 22, 193, 231, 81, 128, - /* 400 */ 138, 139, 269, 81, 43, 44, 45, 46, 47, 48, - /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 216, - /* 420 */ 217, 198, 100, 95, 153, 59, 155, 193, 106, 107, - /* 430 */ 235, 236, 59, 193, 193, 249, 114, 251, 116, 117, - /* 440 */ 118, 113, 304, 121, 127, 204, 193, 119, 120, 121, - /* 450 */ 122, 123, 124, 125, 193, 138, 139, 216, 217, 131, - /* 460 */ 138, 139, 193, 102, 103, 104, 105, 106, 107, 108, + /* 390 */ 151, 120, 26, 71, 193, 308, 309, 193, 149, 128, + /* 400 */ 313, 216, 269, 81, 43, 44, 45, 46, 47, 48, + /* 410 */ 49, 50, 51, 52, 53, 54, 55, 56, 57, 253, + /* 420 */ 216, 217, 100, 95, 153, 59, 155, 261, 106, 107, + /* 430 */ 25, 193, 101, 193, 193, 231, 114, 25, 116, 117, + /* 440 */ 118, 113, 304, 121, 193, 204, 59, 119, 120, 121, + /* 450 */ 122, 123, 124, 125, 216, 217, 193, 216, 217, 131, + /* 460 */ 138, 139, 230, 102, 103, 104, 105, 106, 107, 108, /* 470 */ 109, 110, 111, 112, 113, 153, 154, 155, 156, 157, - /* 480 */ 239, 240, 116, 117, 118, 76, 193, 193, 19, 116, - /* 490 */ 117, 118, 23, 252, 253, 193, 87, 204, 89, 238, - /* 500 */ 193, 92, 268, 262, 281, 203, 193, 205, 285, 216, + /* 480 */ 239, 240, 116, 117, 118, 76, 193, 23, 19, 25, + /* 490 */ 22, 253, 23, 252, 253, 108, 87, 204, 89, 261, + /* 500 */ 198, 92, 261, 116, 117, 118, 193, 306, 307, 216, /* 510 */ 217, 150, 43, 44, 45, 46, 47, 48, 49, 50, - /* 520 */ 51, 52, 53, 54, 55, 56, 57, 193, 193, 216, - /* 530 */ 217, 19, 239, 240, 59, 23, 106, 107, 108, 109, - /* 540 */ 110, 111, 112, 113, 231, 252, 253, 193, 308, 309, - /* 550 */ 193, 145, 59, 313, 145, 43, 44, 45, 46, 47, + /* 520 */ 51, 52, 53, 54, 55, 56, 57, 59, 193, 216, + /* 530 */ 217, 19, 239, 240, 283, 23, 106, 107, 108, 109, + /* 540 */ 110, 111, 112, 113, 73, 252, 253, 142, 308, 309, + /* 550 */ 138, 139, 81, 313, 145, 43, 44, 45, 46, 47, /* 560 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 570 */ 164, 102, 103, 104, 105, 106, 107, 108, 109, 110, - /* 580 */ 111, 112, 113, 119, 193, 193, 122, 123, 124, 193, - /* 590 */ 283, 116, 117, 118, 235, 236, 132, 59, 241, 264, - /* 600 */ 59, 193, 19, 23, 193, 25, 23, 216, 217, 116, - /* 610 */ 117, 118, 216, 217, 102, 103, 104, 105, 106, 107, + /* 570 */ 307, 102, 103, 104, 105, 106, 107, 108, 109, 110, + /* 580 */ 111, 112, 113, 281, 116, 117, 118, 285, 23, 193, + /* 590 */ 25, 119, 59, 193, 122, 123, 124, 59, 127, 203, + /* 600 */ 59, 205, 19, 268, 132, 25, 23, 22, 193, 138, + /* 610 */ 139, 249, 204, 251, 102, 103, 104, 105, 106, 107, /* 620 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 630 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 640 */ 57, 19, 308, 309, 151, 23, 25, 313, 135, 253, - /* 650 */ 21, 193, 241, 140, 116, 117, 118, 116, 117, 118, - /* 660 */ 268, 304, 22, 301, 302, 43, 44, 45, 46, 47, + /* 640 */ 57, 19, 22, 23, 59, 23, 25, 239, 240, 116, + /* 650 */ 117, 118, 193, 11, 116, 117, 118, 116, 117, 118, + /* 660 */ 252, 269, 22, 193, 15, 43, 44, 45, 46, 47, /* 670 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 680 */ 193, 143, 193, 193, 143, 102, 103, 104, 105, 106, + /* 680 */ 273, 143, 193, 118, 143, 102, 103, 104, 105, 106, /* 690 */ 107, 108, 109, 110, 111, 112, 113, 76, 118, 59, - /* 700 */ 292, 211, 212, 216, 217, 216, 217, 73, 193, 80, - /* 710 */ 89, 25, 19, 92, 193, 304, 23, 22, 231, 193, - /* 720 */ 231, 193, 22, 143, 102, 103, 104, 105, 106, 107, + /* 700 */ 241, 116, 117, 118, 304, 216, 217, 292, 143, 60, + /* 710 */ 89, 241, 19, 92, 193, 193, 23, 22, 311, 312, + /* 720 */ 231, 101, 22, 143, 102, 103, 104, 105, 106, 107, /* 730 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 740 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 750 */ 57, 19, 123, 193, 59, 23, 116, 117, 118, 59, - /* 760 */ 193, 127, 128, 129, 306, 307, 210, 211, 212, 193, - /* 770 */ 22, 111, 112, 113, 284, 43, 44, 45, 46, 47, + /* 750 */ 57, 19, 193, 193, 59, 23, 116, 117, 118, 59, + /* 760 */ 201, 21, 241, 304, 22, 206, 127, 128, 129, 193, + /* 770 */ 128, 129, 235, 236, 304, 43, 44, 45, 46, 47, /* 780 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 790 */ 161, 193, 216, 217, 268, 102, 103, 104, 105, 106, - /* 800 */ 107, 108, 109, 110, 111, 112, 113, 59, 193, 193, - /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 304, - /* 820 */ 239, 240, 19, 263, 138, 139, 23, 211, 212, 231, - /* 830 */ 263, 216, 217, 252, 102, 103, 104, 105, 106, 107, + /* 790 */ 22, 193, 216, 217, 193, 102, 103, 104, 105, 106, + /* 800 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 193, + /* 810 */ 193, 116, 117, 118, 216, 217, 116, 117, 118, 226, + /* 820 */ 80, 193, 19, 235, 236, 304, 23, 211, 212, 231, + /* 830 */ 204, 216, 217, 205, 102, 103, 104, 105, 106, 107, /* 840 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 850 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 860 */ 57, 19, 193, 11, 116, 117, 118, 240, 253, 193, - /* 870 */ 201, 239, 240, 193, 134, 206, 136, 137, 193, 252, - /* 880 */ 193, 264, 193, 193, 252, 43, 44, 45, 46, 47, + /* 860 */ 57, 19, 193, 123, 76, 239, 240, 193, 253, 239, + /* 870 */ 240, 239, 240, 193, 106, 107, 193, 89, 252, 193, + /* 880 */ 92, 59, 252, 141, 252, 43, 44, 45, 46, 47, /* 890 */ 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, - /* 900 */ 284, 216, 217, 216, 217, 102, 103, 104, 105, 106, - /* 910 */ 107, 108, 109, 110, 111, 112, 113, 193, 231, 193, - /* 920 */ 187, 188, 189, 190, 127, 128, 129, 238, 195, 193, - /* 930 */ 197, 16, 19, 7, 8, 9, 193, 204, 253, 193, - /* 940 */ 216, 217, 216, 217, 102, 103, 104, 105, 106, 107, + /* 900 */ 284, 161, 216, 217, 193, 102, 103, 104, 105, 106, + /* 910 */ 107, 108, 109, 110, 111, 112, 113, 231, 193, 16, + /* 920 */ 187, 188, 189, 190, 7, 8, 9, 309, 195, 25, + /* 930 */ 197, 313, 19, 127, 128, 129, 262, 204, 22, 117, + /* 940 */ 24, 216, 217, 263, 102, 103, 104, 105, 106, 107, /* 950 */ 108, 109, 110, 111, 112, 113, 43, 44, 45, 46, /* 960 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 970 */ 57, 213, 239, 240, 193, 76, 19, 188, 232, 190, - /* 980 */ 128, 129, 292, 193, 195, 252, 197, 46, 89, 138, - /* 990 */ 139, 92, 77, 204, 79, 193, 269, 216, 217, 266, + /* 970 */ 57, 193, 239, 240, 193, 59, 19, 188, 253, 190, + /* 980 */ 77, 226, 79, 193, 195, 252, 197, 193, 19, 301, + /* 990 */ 302, 193, 193, 204, 216, 217, 226, 216, 217, 266, /* 1000 */ 204, 159, 45, 46, 47, 48, 49, 50, 51, 52, /* 1010 */ 53, 54, 55, 56, 57, 102, 103, 104, 105, 106, /* 1020 */ 107, 108, 109, 110, 111, 112, 113, 12, 239, 240, - /* 1030 */ 193, 298, 22, 23, 253, 239, 240, 127, 128, 129, - /* 1040 */ 238, 252, 27, 193, 286, 204, 193, 204, 252, 291, - /* 1050 */ 193, 273, 22, 23, 100, 266, 115, 42, 268, 102, + /* 1030 */ 232, 298, 238, 117, 253, 239, 240, 238, 259, 260, + /* 1040 */ 193, 252, 27, 31, 193, 193, 142, 204, 252, 193, + /* 1050 */ 193, 39, 262, 193, 100, 266, 278, 42, 204, 102, /* 1060 */ 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, - /* 1070 */ 113, 117, 159, 216, 217, 121, 161, 19, 63, 193, - /* 1080 */ 239, 240, 239, 240, 12, 208, 209, 298, 73, 311, - /* 1090 */ 312, 238, 19, 252, 25, 252, 22, 24, 24, 27, - /* 1100 */ 193, 264, 216, 217, 46, 208, 209, 153, 154, 155, - /* 1110 */ 253, 101, 19, 23, 42, 25, 43, 44, 45, 46, + /* 1070 */ 113, 117, 159, 216, 217, 121, 216, 217, 63, 193, + /* 1080 */ 193, 193, 239, 240, 115, 116, 193, 298, 73, 238, + /* 1090 */ 238, 231, 19, 239, 240, 252, 22, 24, 211, 212, + /* 1100 */ 24, 193, 216, 217, 216, 217, 252, 153, 154, 155, + /* 1110 */ 253, 16, 19, 144, 213, 268, 43, 44, 45, 46, /* 1120 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1130 */ 57, 101, 19, 59, 25, 63, 43, 44, 45, 46, + /* 1130 */ 57, 238, 19, 59, 193, 59, 43, 44, 45, 46, /* 1140 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1150 */ 57, 22, 23, 115, 25, 24, 43, 44, 45, 46, + /* 1150 */ 57, 22, 23, 193, 25, 193, 43, 44, 45, 46, /* 1160 */ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - /* 1170 */ 57, 22, 23, 115, 25, 102, 103, 104, 105, 106, - /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 118, 150, 131, - /* 1190 */ 59, 117, 22, 273, 193, 102, 103, 104, 105, 106, - /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 66, 204, - /* 1210 */ 35, 204, 143, 213, 193, 102, 103, 104, 105, 106, - /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 85, 193, 59, - /* 1230 */ 101, 311, 312, 16, 193, 19, 94, 216, 217, 238, - /* 1240 */ 193, 66, 239, 240, 239, 240, 239, 240, 117, 74, - /* 1250 */ 101, 216, 217, 193, 193, 252, 193, 252, 149, 252, + /* 1170 */ 57, 284, 77, 193, 79, 102, 103, 104, 105, 106, + /* 1180 */ 107, 108, 109, 110, 111, 112, 113, 286, 193, 193, + /* 1190 */ 193, 117, 291, 117, 232, 102, 103, 104, 105, 106, + /* 1200 */ 107, 108, 109, 110, 111, 112, 113, 204, 22, 23, + /* 1210 */ 66, 25, 216, 217, 35, 102, 103, 104, 105, 106, + /* 1220 */ 107, 108, 109, 110, 111, 112, 113, 193, 268, 85, + /* 1230 */ 101, 193, 309, 309, 240, 19, 313, 313, 94, 208, + /* 1240 */ 209, 193, 239, 240, 193, 66, 252, 19, 268, 244, + /* 1250 */ 216, 217, 193, 74, 213, 252, 161, 19, 263, 254, /* 1260 */ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, - /* 1270 */ 54, 55, 56, 57, 193, 193, 193, 5, 59, 216, - /* 1280 */ 217, 25, 10, 11, 12, 13, 14, 117, 146, 17, - /* 1290 */ 193, 291, 193, 232, 77, 76, 79, 216, 217, 216, - /* 1300 */ 217, 31, 30, 309, 32, 130, 87, 313, 89, 39, - /* 1310 */ 193, 92, 40, 216, 217, 216, 217, 108, 102, 103, + /* 1270 */ 54, 55, 56, 57, 193, 216, 217, 5, 59, 193, + /* 1280 */ 19, 244, 10, 11, 12, 13, 14, 101, 309, 17, + /* 1290 */ 146, 254, 313, 193, 193, 76, 115, 216, 217, 309, + /* 1300 */ 12, 263, 30, 313, 32, 46, 87, 46, 89, 130, + /* 1310 */ 193, 92, 40, 22, 263, 27, 216, 217, 102, 103, /* 1320 */ 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, - /* 1330 */ 299, 300, 193, 216, 217, 116, 117, 118, 19, 20, - /* 1340 */ 193, 22, 70, 309, 135, 193, 264, 313, 193, 140, - /* 1350 */ 78, 193, 226, 81, 59, 36, 193, 309, 193, 29, - /* 1360 */ 193, 313, 193, 33, 145, 193, 59, 48, 216, 217, - /* 1370 */ 98, 216, 217, 193, 216, 217, 193, 244, 59, 216, - /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 254, 216, 217, - /* 1390 */ 71, 193, 244, 193, 193, 65, 216, 217, 193, 216, - /* 1400 */ 217, 145, 254, 244, 85, 133, 15, 100, 193, 90, - /* 1410 */ 138, 139, 117, 254, 216, 217, 216, 217, 193, 100, - /* 1420 */ 193, 216, 217, 116, 117, 106, 107, 19, 121, 193, - /* 1430 */ 193, 216, 217, 114, 162, 116, 117, 118, 244, 244, - /* 1440 */ 121, 216, 217, 216, 217, 193, 309, 129, 254, 254, - /* 1450 */ 313, 60, 216, 217, 19, 256, 257, 193, 120, 121, - /* 1460 */ 153, 154, 155, 149, 150, 25, 24, 99, 216, 217, - /* 1470 */ 152, 193, 153, 154, 155, 156, 157, 0, 1, 2, - /* 1480 */ 216, 217, 5, 22, 158, 24, 160, 10, 11, 12, - /* 1490 */ 13, 14, 193, 23, 17, 25, 193, 19, 20, 193, - /* 1500 */ 22, 133, 193, 22, 22, 193, 22, 30, 193, 32, - /* 1510 */ 19, 20, 129, 22, 36, 216, 217, 40, 193, 216, - /* 1520 */ 217, 193, 216, 217, 116, 216, 217, 36, 216, 217, - /* 1530 */ 193, 216, 217, 193, 53, 152, 193, 59, 23, 19, - /* 1540 */ 25, 216, 217, 61, 216, 217, 23, 70, 25, 71, - /* 1550 */ 59, 116, 193, 216, 217, 78, 216, 217, 81, 216, - /* 1560 */ 217, 59, 71, 85, 193, 23, 193, 25, 90, 23, - /* 1570 */ 23, 25, 25, 7, 8, 98, 85, 193, 100, 193, - /* 1580 */ 59, 90, 142, 141, 106, 107, 193, 216, 217, 216, - /* 1590 */ 217, 100, 114, 193, 116, 117, 118, 106, 107, 121, - /* 1600 */ 216, 217, 216, 217, 193, 114, 193, 116, 117, 118, - /* 1610 */ 133, 23, 121, 25, 121, 138, 139, 97, 23, 117, - /* 1620 */ 25, 23, 193, 25, 131, 141, 193, 216, 217, 59, - /* 1630 */ 193, 153, 154, 155, 156, 157, 226, 193, 117, 162, - /* 1640 */ 23, 23, 25, 25, 153, 154, 155, 156, 157, 1, - /* 1650 */ 2, 83, 84, 5, 19, 20, 226, 22, 10, 11, - /* 1660 */ 12, 13, 14, 258, 153, 17, 155, 153, 23, 155, - /* 1670 */ 25, 36, 23, 193, 25, 255, 193, 236, 30, 193, - /* 1680 */ 32, 19, 20, 193, 22, 193, 288, 117, 40, 193, - /* 1690 */ 318, 193, 193, 193, 59, 242, 193, 193, 36, 193, - /* 1700 */ 193, 193, 287, 255, 255, 255, 71, 255, 243, 214, - /* 1710 */ 191, 297, 267, 245, 271, 259, 259, 293, 70, 246, - /* 1720 */ 246, 59, 267, 229, 245, 271, 78, 293, 259, 81, - /* 1730 */ 271, 271, 220, 71, 225, 100, 219, 219, 249, 196, - /* 1740 */ 243, 106, 107, 108, 219, 60, 98, 280, 297, 114, - /* 1750 */ 249, 116, 117, 118, 141, 245, 121, 200, 200, 297, - /* 1760 */ 38, 200, 100, 151, 150, 294, 294, 22, 106, 107, - /* 1770 */ 283, 43, 234, 18, 237, 200, 114, 272, 116, 117, - /* 1780 */ 118, 133, 237, 121, 18, 237, 138, 139, 153, 154, - /* 1790 */ 155, 156, 157, 237, 270, 199, 19, 20, 246, 22, - /* 1800 */ 149, 272, 272, 270, 200, 246, 234, 234, 246, 246, - /* 1810 */ 162, 158, 290, 36, 199, 153, 154, 155, 156, 157, - /* 1820 */ 62, 289, 200, 199, 22, 200, 221, 199, 221, 200, - /* 1830 */ 199, 115, 64, 227, 218, 22, 59, 218, 218, 126, - /* 1840 */ 165, 24, 113, 312, 218, 224, 305, 224, 71, 282, - /* 1850 */ 144, 221, 220, 282, 218, 218, 218, 115, 261, 260, - /* 1860 */ 227, 221, 261, 260, 200, 91, 317, 317, 82, 261, - /* 1870 */ 260, 148, 261, 22, 265, 145, 200, 100, 158, 277, - /* 1880 */ 147, 146, 25, 106, 107, 202, 13, 260, 194, 250, - /* 1890 */ 249, 114, 248, 116, 117, 118, 250, 247, 121, 265, - /* 1900 */ 246, 194, 6, 192, 192, 207, 192, 207, 213, 213, - /* 1910 */ 213, 222, 213, 222, 4, 214, 214, 213, 3, 22, - /* 1920 */ 163, 279, 207, 15, 23, 16, 23, 139, 130, 151, - /* 1930 */ 153, 154, 155, 156, 157, 142, 25, 24, 20, 144, - /* 1940 */ 16, 1, 142, 61, 130, 130, 303, 151, 53, 37, - /* 1950 */ 303, 53, 300, 53, 130, 53, 116, 34, 1, 141, - /* 1960 */ 5, 22, 115, 25, 161, 75, 41, 68, 141, 115, - /* 1970 */ 24, 20, 68, 19, 131, 125, 23, 96, 22, 59, - /* 1980 */ 22, 67, 22, 22, 67, 22, 24, 28, 67, 37, - /* 1990 */ 23, 149, 22, 25, 23, 23, 23, 23, 22, 141, - /* 2000 */ 23, 23, 97, 116, 22, 143, 25, 88, 75, 34, - /* 2010 */ 44, 75, 86, 34, 34, 93, 23, 34, 34, 34, - /* 2020 */ 22, 24, 34, 22, 25, 25, 23, 23, 23, 23, - /* 2030 */ 23, 11, 23, 25, 22, 22, 25, 23, 23, 22, - /* 2040 */ 22, 135, 15, 1, 25, 23, 1, 319, 141, 319, - /* 2050 */ 319, 319, 319, 319, 319, 319, 319, 141, 319, 319, - /* 2060 */ 319, 319, 319, 319, 319, 319, 319, 319, 141, 141, - /* 2070 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 1330 */ 42, 150, 291, 216, 217, 116, 117, 118, 19, 20, + /* 1340 */ 193, 22, 70, 260, 116, 193, 24, 264, 193, 263, + /* 1350 */ 78, 63, 61, 81, 116, 36, 193, 260, 193, 29, + /* 1360 */ 193, 264, 193, 33, 145, 193, 59, 48, 216, 217, + /* 1370 */ 98, 216, 217, 193, 115, 193, 115, 193, 59, 216, + /* 1380 */ 217, 216, 217, 216, 217, 216, 217, 255, 216, 217, + /* 1390 */ 71, 193, 131, 193, 25, 65, 216, 217, 216, 217, + /* 1400 */ 216, 217, 208, 209, 85, 133, 193, 100, 193, 90, + /* 1410 */ 138, 139, 138, 139, 216, 217, 216, 217, 193, 100, + /* 1420 */ 193, 108, 135, 116, 117, 106, 107, 140, 121, 216, + /* 1430 */ 217, 216, 217, 114, 162, 116, 117, 118, 299, 300, + /* 1440 */ 121, 216, 217, 216, 217, 193, 244, 193, 135, 244, + /* 1450 */ 193, 256, 257, 140, 244, 193, 254, 193, 193, 254, + /* 1460 */ 153, 154, 155, 141, 254, 149, 150, 258, 216, 217, + /* 1470 */ 216, 217, 153, 154, 155, 156, 157, 0, 1, 2, + /* 1480 */ 216, 217, 5, 115, 158, 193, 160, 10, 11, 12, + /* 1490 */ 13, 14, 193, 59, 17, 126, 193, 19, 20, 129, + /* 1500 */ 22, 193, 22, 22, 24, 193, 23, 30, 25, 32, + /* 1510 */ 19, 20, 144, 22, 36, 216, 217, 40, 193, 216, + /* 1520 */ 217, 193, 152, 129, 216, 217, 193, 36, 216, 217, + /* 1530 */ 193, 99, 193, 193, 53, 193, 193, 59, 23, 193, + /* 1540 */ 25, 216, 217, 193, 216, 217, 152, 70, 59, 71, + /* 1550 */ 59, 117, 193, 216, 217, 78, 216, 217, 81, 216, + /* 1560 */ 217, 318, 71, 85, 193, 133, 193, 193, 90, 23, + /* 1570 */ 23, 25, 25, 120, 121, 98, 85, 193, 100, 193, + /* 1580 */ 23, 90, 25, 121, 106, 107, 19, 216, 217, 216, + /* 1590 */ 217, 100, 114, 131, 116, 117, 118, 106, 107, 121, + /* 1600 */ 216, 217, 216, 217, 193, 114, 117, 116, 117, 118, + /* 1610 */ 133, 193, 121, 193, 193, 138, 139, 193, 23, 193, + /* 1620 */ 25, 23, 23, 25, 25, 7, 8, 216, 217, 193, + /* 1630 */ 193, 153, 154, 155, 156, 157, 216, 217, 193, 162, + /* 1640 */ 216, 217, 216, 217, 153, 154, 155, 156, 157, 1, + /* 1650 */ 2, 193, 193, 5, 19, 20, 59, 22, 10, 11, + /* 1660 */ 12, 13, 14, 193, 97, 17, 193, 23, 193, 25, + /* 1670 */ 288, 36, 193, 242, 216, 217, 236, 23, 30, 25, + /* 1680 */ 32, 19, 20, 23, 22, 25, 216, 217, 40, 216, + /* 1690 */ 217, 216, 217, 193, 59, 216, 217, 193, 36, 83, + /* 1700 */ 84, 153, 153, 155, 155, 23, 71, 25, 23, 193, + /* 1710 */ 25, 193, 193, 193, 117, 193, 193, 193, 70, 193, + /* 1720 */ 193, 59, 193, 255, 255, 287, 78, 255, 243, 81, + /* 1730 */ 191, 255, 297, 71, 271, 100, 293, 245, 267, 214, + /* 1740 */ 246, 106, 107, 108, 246, 271, 98, 245, 293, 114, + /* 1750 */ 220, 116, 117, 118, 267, 271, 121, 271, 225, 219, + /* 1760 */ 229, 219, 100, 219, 259, 259, 259, 259, 106, 107, + /* 1770 */ 249, 196, 60, 280, 141, 243, 114, 249, 116, 117, + /* 1780 */ 118, 133, 245, 121, 200, 297, 138, 139, 153, 154, + /* 1790 */ 155, 156, 157, 297, 200, 38, 19, 20, 151, 22, + /* 1800 */ 200, 150, 140, 294, 294, 22, 272, 43, 234, 18, + /* 1810 */ 162, 270, 200, 36, 237, 153, 154, 155, 156, 157, + /* 1820 */ 237, 283, 237, 237, 18, 199, 149, 246, 272, 270, + /* 1830 */ 272, 200, 158, 246, 246, 234, 59, 234, 246, 199, + /* 1840 */ 290, 62, 289, 200, 199, 22, 221, 115, 71, 200, + /* 1850 */ 200, 199, 199, 221, 218, 218, 19, 20, 64, 22, + /* 1860 */ 218, 227, 22, 224, 126, 224, 165, 221, 24, 305, + /* 1870 */ 200, 113, 312, 36, 218, 220, 218, 100, 282, 218, + /* 1880 */ 91, 218, 317, 106, 107, 221, 227, 282, 317, 82, + /* 1890 */ 148, 114, 265, 116, 117, 118, 59, 145, 121, 22, + /* 1900 */ 277, 158, 200, 265, 25, 202, 147, 250, 71, 279, + /* 1910 */ 13, 146, 194, 194, 249, 248, 250, 140, 247, 246, + /* 1920 */ 6, 192, 192, 192, 303, 303, 213, 207, 300, 213, + /* 1930 */ 153, 154, 155, 156, 157, 213, 213, 100, 213, 222, + /* 1940 */ 207, 214, 214, 106, 107, 4, 222, 207, 3, 22, + /* 1950 */ 163, 114, 15, 116, 117, 118, 16, 23, 121, 23, + /* 1960 */ 139, 151, 130, 25, 142, 16, 24, 20, 144, 1, + /* 1970 */ 142, 130, 130, 61, 53, 53, 37, 151, 53, 53, + /* 1980 */ 130, 116, 34, 1, 141, 5, 22, 115, 161, 141, + /* 1990 */ 153, 154, 155, 156, 157, 25, 68, 68, 75, 41, + /* 2000 */ 115, 24, 131, 20, 19, 125, 22, 96, 22, 22, + /* 2010 */ 67, 23, 22, 67, 59, 24, 22, 28, 67, 23, + /* 2020 */ 22, 22, 149, 23, 23, 23, 116, 23, 25, 37, + /* 2030 */ 97, 141, 23, 23, 22, 143, 25, 75, 88, 34, + /* 2040 */ 34, 34, 34, 86, 75, 93, 23, 34, 22, 34, + /* 2050 */ 25, 24, 34, 25, 23, 142, 23, 142, 44, 23, + /* 2060 */ 23, 23, 11, 23, 25, 22, 22, 22, 15, 23, + /* 2070 */ 23, 22, 22, 25, 1, 1, 141, 25, 23, 135, /* 2080 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2090 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2090 */ 319, 319, 319, 319, 141, 141, 319, 141, 319, 319, /* 2100 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2110 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2120 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, @@ -162426,176 +164548,179 @@ static const YYCODETYPE yy_lookahead[] = { /* 2220 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2230 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, /* 2240 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, - /* 2250 */ 319, 319, 319, 319, 319, + /* 2250 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2260 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2270 */ 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, + /* 2280 */ 319, 319, 319, }; -#define YY_SHIFT_COUNT (573) +#define YY_SHIFT_COUNT (575) #define YY_SHIFT_MIN (0) -#define YY_SHIFT_MAX (2045) +#define YY_SHIFT_MAX (2074) static const unsigned short int yy_shift_ofst[] = { - /* 0 */ 1648, 1477, 1272, 322, 322, 262, 1319, 1478, 1491, 1662, - /* 10 */ 1662, 1662, 317, 0, 0, 214, 1093, 1662, 1662, 1662, - /* 20 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 30 */ 271, 271, 1219, 1219, 216, 88, 262, 262, 262, 262, - /* 40 */ 262, 40, 111, 258, 361, 469, 512, 583, 622, 693, + /* 0 */ 1648, 1477, 1272, 322, 322, 1, 1319, 1478, 1491, 1837, + /* 10 */ 1837, 1837, 471, 0, 0, 214, 1093, 1837, 1837, 1837, + /* 20 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 30 */ 271, 271, 1219, 1219, 216, 88, 1, 1, 1, 1, + /* 40 */ 1, 40, 111, 258, 361, 469, 512, 583, 622, 693, /* 50 */ 732, 803, 842, 913, 1073, 1093, 1093, 1093, 1093, 1093, /* 60 */ 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, 1093, /* 70 */ 1093, 1093, 1093, 1113, 1093, 1216, 957, 957, 1635, 1662, - /* 80 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 90 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 100 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, - /* 110 */ 1662, 1662, 1662, 1662, 1777, 1662, 1662, 1662, 1662, 1662, - /* 120 */ 1662, 1662, 1662, 1662, 1662, 1662, 1662, 1662, 137, 181, - /* 130 */ 181, 181, 181, 181, 94, 430, 66, 65, 112, 366, - /* 140 */ 475, 475, 629, 1058, 475, 475, 125, 125, 475, 686, - /* 150 */ 686, 686, 660, 686, 57, 184, 184, 77, 77, 2070, - /* 160 */ 2070, 328, 328, 328, 493, 373, 373, 373, 373, 1015, - /* 170 */ 1015, 409, 366, 1129, 1149, 475, 475, 475, 475, 475, - /* 180 */ 475, 475, 475, 475, 475, 475, 475, 475, 475, 475, - /* 190 */ 475, 475, 475, 475, 475, 621, 621, 475, 852, 899, - /* 200 */ 899, 1295, 1295, 406, 851, 2070, 2070, 2070, 2070, 2070, - /* 210 */ 2070, 2070, 1307, 954, 954, 640, 464, 695, 238, 700, - /* 220 */ 538, 541, 748, 475, 475, 475, 475, 475, 475, 475, - /* 230 */ 475, 475, 475, 634, 475, 475, 475, 475, 475, 475, - /* 240 */ 475, 475, 475, 475, 475, 475, 1175, 1175, 1175, 475, - /* 250 */ 475, 475, 580, 475, 475, 475, 1074, 1142, 475, 475, - /* 260 */ 1072, 475, 475, 475, 475, 475, 475, 475, 475, 797, - /* 270 */ 1330, 740, 1131, 1131, 1131, 1131, 1069, 740, 740, 1209, - /* 280 */ 167, 926, 1391, 1038, 1314, 187, 1408, 1314, 1408, 1435, - /* 290 */ 1109, 1038, 1038, 1109, 1038, 187, 1435, 227, 1090, 941, - /* 300 */ 1270, 1270, 1270, 1408, 1256, 1256, 1326, 1440, 513, 1461, - /* 310 */ 1685, 1685, 1613, 1613, 1722, 1722, 1613, 1612, 1614, 1745, - /* 320 */ 1728, 1755, 1755, 1755, 1755, 1613, 1766, 1651, 1614, 1614, - /* 330 */ 1651, 1745, 1728, 1651, 1728, 1651, 1613, 1766, 1653, 1758, - /* 340 */ 1613, 1766, 1802, 1613, 1766, 1613, 1766, 1802, 1716, 1716, - /* 350 */ 1716, 1768, 1813, 1813, 1802, 1716, 1713, 1716, 1768, 1716, - /* 360 */ 1716, 1675, 1817, 1729, 1729, 1802, 1706, 1742, 1706, 1742, - /* 370 */ 1706, 1742, 1706, 1742, 1613, 1774, 1774, 1786, 1786, 1723, - /* 380 */ 1730, 1851, 1613, 1720, 1723, 1733, 1735, 1651, 1857, 1873, - /* 390 */ 1873, 1896, 1896, 1896, 2070, 2070, 2070, 2070, 2070, 2070, - /* 400 */ 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 2070, 207, - /* 410 */ 915, 1010, 1030, 1217, 910, 1170, 1470, 1368, 1481, 1442, - /* 420 */ 1318, 1383, 1515, 1482, 1523, 1542, 1546, 1547, 1588, 1595, - /* 430 */ 1502, 1338, 1566, 1493, 1520, 1521, 1598, 1617, 1568, 1618, - /* 440 */ 1511, 1514, 1645, 1649, 1570, 1484, 1910, 1915, 1897, 1757, - /* 450 */ 1908, 1909, 1901, 1903, 1788, 1778, 1798, 1911, 1911, 1913, - /* 460 */ 1793, 1918, 1795, 1924, 1940, 1800, 1814, 1911, 1815, 1882, - /* 470 */ 1912, 1911, 1796, 1895, 1898, 1900, 1902, 1824, 1840, 1923, - /* 480 */ 1818, 1957, 1955, 1939, 1847, 1803, 1899, 1938, 1904, 1890, - /* 490 */ 1925, 1827, 1854, 1946, 1951, 1954, 1843, 1850, 1956, 1914, - /* 500 */ 1958, 1960, 1953, 1961, 1917, 1920, 1962, 1881, 1959, 1963, - /* 510 */ 1921, 1952, 1967, 1842, 1970, 1971, 1972, 1973, 1968, 1974, - /* 520 */ 1976, 1905, 1858, 1977, 1978, 1887, 1975, 1982, 1862, 1981, - /* 530 */ 1979, 1980, 1983, 1984, 1919, 1933, 1926, 1966, 1936, 1922, - /* 540 */ 1985, 1993, 1998, 1997, 1999, 2000, 1988, 2003, 1981, 2004, - /* 550 */ 2005, 2006, 2007, 2008, 2009, 2001, 2020, 2012, 2013, 2014, - /* 560 */ 2015, 2017, 2018, 2011, 1906, 1907, 1916, 1927, 1928, 2019, - /* 570 */ 2022, 2027, 2042, 2045, + /* 80 */ 1777, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 90 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 100 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 110 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 120 */ 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, 1837, + /* 130 */ 137, 181, 181, 181, 181, 181, 181, 181, 94, 430, + /* 140 */ 66, 65, 112, 366, 533, 533, 740, 1261, 533, 533, + /* 150 */ 79, 79, 533, 412, 412, 412, 77, 412, 123, 113, + /* 160 */ 113, 22, 22, 2098, 2098, 328, 328, 328, 239, 468, + /* 170 */ 468, 468, 468, 1015, 1015, 409, 366, 1129, 1186, 533, + /* 180 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 190 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 969, + /* 200 */ 621, 621, 533, 642, 788, 788, 1228, 1228, 822, 822, + /* 210 */ 67, 1274, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 1307, + /* 220 */ 954, 954, 585, 472, 640, 387, 695, 538, 541, 700, + /* 230 */ 533, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 240 */ 222, 533, 533, 533, 533, 533, 533, 533, 533, 533, + /* 250 */ 533, 533, 533, 1179, 1179, 1179, 533, 533, 533, 565, + /* 260 */ 533, 533, 533, 916, 1144, 533, 533, 1288, 533, 533, + /* 270 */ 533, 533, 533, 533, 533, 533, 639, 1330, 209, 1076, + /* 280 */ 1076, 1076, 1076, 580, 209, 209, 1313, 768, 917, 649, + /* 290 */ 1181, 1316, 405, 1316, 1238, 249, 1181, 1181, 249, 1181, + /* 300 */ 405, 1238, 1369, 464, 1259, 1012, 1012, 1012, 1368, 1368, + /* 310 */ 1368, 1368, 184, 184, 1326, 904, 1287, 1480, 1712, 1712, + /* 320 */ 1633, 1633, 1757, 1757, 1633, 1647, 1651, 1783, 1764, 1791, + /* 330 */ 1791, 1791, 1791, 1633, 1806, 1677, 1651, 1651, 1677, 1783, + /* 340 */ 1764, 1677, 1764, 1677, 1633, 1806, 1674, 1779, 1633, 1806, + /* 350 */ 1823, 1633, 1806, 1633, 1806, 1823, 1732, 1732, 1732, 1794, + /* 360 */ 1840, 1840, 1823, 1732, 1738, 1732, 1794, 1732, 1732, 1701, + /* 370 */ 1844, 1758, 1758, 1823, 1633, 1789, 1789, 1807, 1807, 1742, + /* 380 */ 1752, 1877, 1633, 1743, 1742, 1759, 1765, 1677, 1879, 1897, + /* 390 */ 1897, 1914, 1914, 1914, 2098, 2098, 2098, 2098, 2098, 2098, + /* 400 */ 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 2098, 207, + /* 410 */ 1095, 331, 620, 903, 806, 1074, 1483, 1432, 1481, 1322, + /* 420 */ 1370, 1394, 1515, 1291, 1546, 1547, 1557, 1595, 1598, 1599, + /* 430 */ 1434, 1453, 1618, 1462, 1567, 1489, 1644, 1654, 1616, 1660, + /* 440 */ 1548, 1549, 1682, 1685, 1597, 742, 1941, 1945, 1927, 1787, + /* 450 */ 1937, 1940, 1934, 1936, 1821, 1810, 1832, 1938, 1938, 1942, + /* 460 */ 1822, 1947, 1824, 1949, 1968, 1828, 1841, 1938, 1842, 1912, + /* 470 */ 1939, 1938, 1826, 1921, 1922, 1925, 1926, 1850, 1865, 1948, + /* 480 */ 1843, 1982, 1980, 1964, 1872, 1827, 1928, 1970, 1929, 1923, + /* 490 */ 1958, 1848, 1885, 1977, 1983, 1985, 1871, 1880, 1984, 1943, + /* 500 */ 1986, 1987, 1988, 1990, 1946, 1955, 1991, 1911, 1989, 1994, + /* 510 */ 1951, 1992, 1996, 1873, 1998, 2000, 2001, 2002, 2003, 2004, + /* 520 */ 1999, 1933, 1890, 2009, 2010, 1910, 2005, 2012, 1892, 2011, + /* 530 */ 2006, 2007, 2008, 2013, 1950, 1962, 1957, 2014, 1969, 1952, + /* 540 */ 2015, 2023, 2026, 2027, 2025, 2028, 2018, 1913, 1915, 2031, + /* 550 */ 2011, 2033, 2036, 2037, 2038, 2039, 2040, 2043, 2051, 2044, + /* 560 */ 2045, 2046, 2047, 2049, 2050, 2048, 1944, 1935, 1953, 1954, + /* 570 */ 1956, 2052, 2055, 2053, 2073, 2074, }; #define YY_REDUCE_COUNT (408) -#define YY_REDUCE_MIN (-267) -#define YY_REDUCE_MAX (1715) +#define YY_REDUCE_MIN (-271) +#define YY_REDUCE_MAX (1740) static const short yy_reduce_ofst[] = { /* 0 */ -125, 733, 789, 241, 293, -123, -193, -191, -183, -187, - /* 10 */ -180, 83, 133, -207, -198, -267, -175, -6, 166, 313, - /* 20 */ 487, 396, 489, 598, 615, 685, 687, 79, 781, 857, - /* 30 */ 490, 616, 240, 334, -188, 796, 841, 843, 1003, 1005, - /* 40 */ 1007, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 50 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 60 */ -260, -260, -260, -260, -260, -260, -260, -260, -260, -260, - /* 70 */ -260, -260, -260, -260, -260, -260, -260, -260, 158, 203, - /* 80 */ 391, 576, 724, 726, 886, 1021, 1035, 1063, 1081, 1083, - /* 90 */ 1097, 1099, 1117, 1152, 1155, 1158, 1163, 1165, 1167, 1169, - /* 100 */ 1172, 1180, 1183, 1198, 1200, 1205, 1215, 1225, 1227, 1236, - /* 110 */ 1252, 1264, 1299, 1303, 1306, 1309, 1312, 1315, 1325, 1328, - /* 120 */ 1337, 1340, 1343, 1371, 1373, 1384, 1386, 1411, -260, -260, - /* 130 */ -260, -260, -260, -260, -260, -260, -260, -53, 138, 302, - /* 140 */ -158, 357, 223, -222, 411, 458, -92, 556, 669, 581, - /* 150 */ 632, 581, -260, 632, 758, 778, 920, -260, -260, -260, - /* 160 */ -260, 161, 161, 161, 307, 234, 392, 526, 790, 195, - /* 170 */ 359, -174, -173, 362, 362, -189, 16, 560, 567, 261, - /* 180 */ 689, 802, 853, -122, -166, 408, 335, 617, 690, 837, - /* 190 */ 1001, 746, 1061, 515, 1082, 994, 1034, -135, 1000, 1048, - /* 200 */ 1137, 877, 897, 186, 627, 1031, 1133, 1148, 1159, 1194, - /* 210 */ 1199, 1195, -194, -142, 18, -152, 68, 201, 253, 269, - /* 220 */ 294, 354, 521, 528, 676, 680, 736, 743, 850, 907, - /* 230 */ 1041, 1047, 1060, 727, 1139, 1147, 1201, 1237, 1278, 1359, - /* 240 */ 1393, 1400, 1413, 1429, 1433, 1437, 1126, 1410, 1430, 1444, - /* 250 */ 1480, 1483, 1405, 1486, 1490, 1492, 1420, 1372, 1496, 1498, - /* 260 */ 1441, 1499, 253, 1500, 1503, 1504, 1506, 1507, 1508, 1398, - /* 270 */ 1415, 1453, 1448, 1449, 1450, 1452, 1405, 1453, 1453, 1465, - /* 280 */ 1495, 1519, 1414, 1443, 1445, 1468, 1456, 1455, 1457, 1424, - /* 290 */ 1473, 1454, 1459, 1474, 1460, 1479, 1434, 1512, 1494, 1509, - /* 300 */ 1517, 1518, 1525, 1469, 1489, 1501, 1467, 1510, 1497, 1543, - /* 310 */ 1451, 1462, 1557, 1558, 1471, 1472, 1561, 1487, 1505, 1524, - /* 320 */ 1538, 1537, 1545, 1548, 1556, 1575, 1596, 1552, 1529, 1530, - /* 330 */ 1559, 1533, 1572, 1562, 1573, 1563, 1604, 1615, 1522, 1532, - /* 340 */ 1622, 1624, 1605, 1625, 1628, 1629, 1631, 1607, 1616, 1619, - /* 350 */ 1620, 1606, 1621, 1623, 1630, 1626, 1632, 1636, 1633, 1637, - /* 360 */ 1638, 1531, 1541, 1567, 1571, 1640, 1597, 1599, 1601, 1603, - /* 370 */ 1608, 1610, 1611, 1627, 1664, 1549, 1550, 1609, 1634, 1639, - /* 380 */ 1641, 1602, 1676, 1642, 1646, 1644, 1650, 1654, 1683, 1694, - /* 390 */ 1707, 1711, 1712, 1714, 1643, 1647, 1652, 1698, 1695, 1696, - /* 400 */ 1697, 1699, 1700, 1689, 1691, 1701, 1702, 1704, 1715, + /* 10 */ 166, 238, 133, -207, -199, -267, -176, -6, 204, 489, + /* 20 */ 576, -175, 598, 686, 615, 725, 860, 778, 781, 857, + /* 30 */ 616, 887, 87, 240, -192, 408, 626, 796, 843, 854, + /* 40 */ 1003, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 50 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 60 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 70 */ -271, -271, -271, -271, -271, -271, -271, -271, 80, 83, + /* 80 */ 313, 886, 888, 996, 1034, 1059, 1081, 1100, 1117, 1152, + /* 90 */ 1155, 1163, 1165, 1167, 1169, 1172, 1180, 1182, 1184, 1198, + /* 100 */ 1200, 1213, 1215, 1225, 1227, 1252, 1254, 1264, 1299, 1303, + /* 110 */ 1308, 1312, 1325, 1328, 1337, 1340, 1343, 1371, 1373, 1384, + /* 120 */ 1386, 1411, 1420, 1424, 1426, 1458, 1470, 1473, 1475, 1479, + /* 130 */ -271, -271, -271, -271, -271, -271, -271, -271, -271, -271, + /* 140 */ -271, 138, 459, 396, -158, 470, 302, -212, 521, 201, + /* 150 */ -195, -92, 559, 630, 632, 630, -271, 632, 901, 63, + /* 160 */ 407, -271, -271, -271, -271, 161, 161, 161, 251, 335, + /* 170 */ 847, 960, 980, 537, 588, 618, 628, 688, 688, -166, + /* 180 */ -161, 674, 790, 794, 799, 851, 852, -122, 680, -120, + /* 190 */ 995, 1038, 415, 1051, 893, 798, 962, 400, 1086, 779, + /* 200 */ 923, 924, 263, 1041, 979, 990, 1083, 1097, 1031, 1194, + /* 210 */ 362, 994, 1139, 1005, 1037, 1202, 1205, 1195, 1210, -194, + /* 220 */ 56, 185, -135, 232, 522, 560, 601, 617, 669, 683, + /* 230 */ 711, 856, 908, 941, 1048, 1101, 1147, 1257, 1262, 1265, + /* 240 */ 392, 1292, 1333, 1339, 1342, 1346, 1350, 1359, 1374, 1418, + /* 250 */ 1421, 1436, 1437, 593, 755, 770, 997, 1445, 1459, 1209, + /* 260 */ 1500, 1504, 1516, 1132, 1243, 1518, 1519, 1440, 1520, 560, + /* 270 */ 1522, 1523, 1524, 1526, 1527, 1529, 1382, 1438, 1431, 1468, + /* 280 */ 1469, 1472, 1476, 1209, 1431, 1431, 1485, 1525, 1539, 1435, + /* 290 */ 1463, 1471, 1492, 1487, 1443, 1494, 1474, 1484, 1498, 1486, + /* 300 */ 1502, 1455, 1530, 1531, 1533, 1540, 1542, 1544, 1505, 1506, + /* 310 */ 1507, 1508, 1521, 1528, 1493, 1537, 1532, 1575, 1488, 1496, + /* 320 */ 1584, 1594, 1509, 1510, 1600, 1538, 1534, 1541, 1574, 1577, + /* 330 */ 1583, 1585, 1586, 1612, 1626, 1581, 1556, 1558, 1587, 1559, + /* 340 */ 1601, 1588, 1603, 1592, 1631, 1640, 1550, 1553, 1643, 1645, + /* 350 */ 1625, 1649, 1652, 1650, 1653, 1632, 1636, 1637, 1642, 1634, + /* 360 */ 1639, 1641, 1646, 1656, 1655, 1658, 1659, 1661, 1663, 1560, + /* 370 */ 1564, 1596, 1605, 1664, 1670, 1565, 1571, 1627, 1638, 1657, + /* 380 */ 1665, 1623, 1702, 1630, 1666, 1667, 1671, 1673, 1703, 1718, + /* 390 */ 1719, 1729, 1730, 1731, 1621, 1622, 1628, 1720, 1713, 1716, + /* 400 */ 1722, 1723, 1733, 1717, 1724, 1727, 1728, 1725, 1740, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 1637, 1637, 1637, 1466, 1233, 1344, 1233, 1233, 1233, 1466, - /* 10 */ 1466, 1466, 1233, 1374, 1374, 1519, 1266, 1233, 1233, 1233, - /* 20 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1465, 1233, 1233, - /* 30 */ 1233, 1233, 1554, 1554, 1233, 1233, 1233, 1233, 1233, 1233, - /* 40 */ 1233, 1233, 1383, 1233, 1390, 1233, 1233, 1233, 1233, 1233, - /* 50 */ 1467, 1468, 1233, 1233, 1233, 1518, 1520, 1483, 1397, 1396, - /* 60 */ 1395, 1394, 1501, 1361, 1388, 1381, 1385, 1461, 1462, 1460, - /* 70 */ 1464, 1468, 1467, 1233, 1384, 1431, 1445, 1430, 1233, 1233, - /* 80 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 90 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 100 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 110 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 120 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1439, 1444, - /* 130 */ 1451, 1443, 1440, 1433, 1432, 1434, 1435, 1233, 1233, 1257, - /* 140 */ 1233, 1233, 1254, 1308, 1233, 1233, 1233, 1233, 1233, 1538, - /* 150 */ 1537, 1233, 1436, 1233, 1266, 1425, 1424, 1448, 1437, 1447, - /* 160 */ 1446, 1526, 1590, 1589, 1484, 1233, 1233, 1233, 1233, 1233, - /* 170 */ 1233, 1554, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 180 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 190 */ 1233, 1233, 1233, 1233, 1233, 1554, 1554, 1233, 1266, 1554, - /* 200 */ 1554, 1262, 1262, 1368, 1233, 1533, 1335, 1335, 1335, 1335, - /* 210 */ 1344, 1335, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 220 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1523, 1521, 1233, - /* 230 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 240 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 250 */ 1233, 1233, 1233, 1233, 1233, 1233, 1340, 1233, 1233, 1233, - /* 260 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1583, 1233, - /* 270 */ 1496, 1322, 1340, 1340, 1340, 1340, 1342, 1323, 1321, 1334, - /* 280 */ 1267, 1240, 1629, 1400, 1389, 1341, 1363, 1389, 1363, 1626, - /* 290 */ 1387, 1400, 1400, 1387, 1400, 1341, 1626, 1283, 1606, 1278, - /* 300 */ 1374, 1374, 1374, 1363, 1368, 1368, 1463, 1341, 1334, 1233, - /* 310 */ 1629, 1629, 1349, 1349, 1628, 1628, 1349, 1484, 1613, 1409, - /* 320 */ 1311, 1317, 1317, 1317, 1317, 1349, 1251, 1387, 1613, 1613, - /* 330 */ 1387, 1409, 1311, 1387, 1311, 1387, 1349, 1251, 1500, 1623, - /* 340 */ 1349, 1251, 1474, 1349, 1251, 1349, 1251, 1474, 1309, 1309, - /* 350 */ 1309, 1298, 1233, 1233, 1474, 1309, 1283, 1309, 1298, 1309, - /* 360 */ 1309, 1572, 1233, 1478, 1478, 1474, 1367, 1362, 1367, 1362, - /* 370 */ 1367, 1362, 1367, 1362, 1349, 1564, 1564, 1377, 1377, 1382, - /* 380 */ 1368, 1469, 1349, 1233, 1382, 1380, 1378, 1387, 1301, 1586, - /* 390 */ 1586, 1582, 1582, 1582, 1634, 1634, 1533, 1599, 1266, 1266, - /* 400 */ 1266, 1266, 1599, 1285, 1285, 1267, 1267, 1266, 1599, 1233, - /* 410 */ 1233, 1233, 1233, 1233, 1233, 1594, 1233, 1528, 1485, 1353, - /* 420 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 430 */ 1233, 1233, 1233, 1233, 1539, 1233, 1233, 1233, 1233, 1233, - /* 440 */ 1233, 1233, 1233, 1233, 1233, 1414, 1233, 1236, 1530, 1233, - /* 450 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1391, 1392, 1354, - /* 460 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1406, 1233, 1233, - /* 470 */ 1233, 1401, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 480 */ 1625, 1233, 1233, 1233, 1233, 1233, 1233, 1499, 1498, 1233, - /* 490 */ 1233, 1351, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 500 */ 1233, 1233, 1233, 1233, 1233, 1281, 1233, 1233, 1233, 1233, - /* 510 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 520 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1379, - /* 530 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 540 */ 1233, 1233, 1233, 1233, 1569, 1369, 1233, 1233, 1616, 1233, - /* 550 */ 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, - /* 560 */ 1233, 1233, 1233, 1610, 1325, 1416, 1233, 1415, 1419, 1255, - /* 570 */ 1233, 1245, 1233, 1233, + /* 0 */ 1647, 1647, 1647, 1475, 1240, 1351, 1240, 1240, 1240, 1475, + /* 10 */ 1475, 1475, 1240, 1381, 1381, 1528, 1273, 1240, 1240, 1240, + /* 20 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1474, 1240, 1240, + /* 30 */ 1240, 1240, 1563, 1563, 1240, 1240, 1240, 1240, 1240, 1240, + /* 40 */ 1240, 1240, 1390, 1240, 1397, 1240, 1240, 1240, 1240, 1240, + /* 50 */ 1476, 1477, 1240, 1240, 1240, 1527, 1529, 1492, 1404, 1403, + /* 60 */ 1402, 1401, 1510, 1369, 1395, 1388, 1392, 1470, 1471, 1469, + /* 70 */ 1473, 1477, 1476, 1240, 1391, 1438, 1454, 1437, 1240, 1240, + /* 80 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 90 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 100 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 110 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 120 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 130 */ 1446, 1453, 1452, 1451, 1460, 1450, 1447, 1440, 1439, 1441, + /* 140 */ 1442, 1240, 1240, 1264, 1240, 1240, 1261, 1315, 1240, 1240, + /* 150 */ 1240, 1240, 1240, 1547, 1546, 1240, 1443, 1240, 1273, 1432, + /* 160 */ 1431, 1457, 1444, 1456, 1455, 1535, 1599, 1598, 1493, 1240, + /* 170 */ 1240, 1240, 1240, 1240, 1240, 1563, 1240, 1240, 1240, 1240, + /* 180 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 190 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1371, + /* 200 */ 1563, 1563, 1240, 1273, 1563, 1563, 1372, 1372, 1269, 1269, + /* 210 */ 1375, 1240, 1542, 1342, 1342, 1342, 1342, 1351, 1342, 1240, + /* 220 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 230 */ 1240, 1240, 1240, 1240, 1532, 1530, 1240, 1240, 1240, 1240, + /* 240 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 250 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 260 */ 1240, 1240, 1240, 1347, 1240, 1240, 1240, 1240, 1240, 1240, + /* 270 */ 1240, 1240, 1240, 1240, 1240, 1592, 1240, 1505, 1329, 1347, + /* 280 */ 1347, 1347, 1347, 1349, 1330, 1328, 1341, 1274, 1247, 1639, + /* 290 */ 1407, 1396, 1348, 1396, 1636, 1394, 1407, 1407, 1394, 1407, + /* 300 */ 1348, 1636, 1290, 1615, 1285, 1381, 1381, 1381, 1371, 1371, + /* 310 */ 1371, 1371, 1375, 1375, 1472, 1348, 1341, 1240, 1639, 1639, + /* 320 */ 1357, 1357, 1638, 1638, 1357, 1493, 1623, 1416, 1318, 1324, + /* 330 */ 1324, 1324, 1324, 1357, 1258, 1394, 1623, 1623, 1394, 1416, + /* 340 */ 1318, 1394, 1318, 1394, 1357, 1258, 1509, 1633, 1357, 1258, + /* 350 */ 1483, 1357, 1258, 1357, 1258, 1483, 1316, 1316, 1316, 1305, + /* 360 */ 1240, 1240, 1483, 1316, 1290, 1316, 1305, 1316, 1316, 1581, + /* 370 */ 1240, 1487, 1487, 1483, 1357, 1573, 1573, 1384, 1384, 1389, + /* 380 */ 1375, 1478, 1357, 1240, 1389, 1387, 1385, 1394, 1308, 1595, + /* 390 */ 1595, 1591, 1591, 1591, 1644, 1644, 1542, 1608, 1273, 1273, + /* 400 */ 1273, 1273, 1608, 1292, 1292, 1274, 1274, 1273, 1608, 1240, + /* 410 */ 1240, 1240, 1240, 1240, 1240, 1603, 1240, 1537, 1494, 1361, + /* 420 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 430 */ 1240, 1240, 1240, 1240, 1548, 1240, 1240, 1240, 1240, 1240, + /* 440 */ 1240, 1240, 1240, 1240, 1240, 1421, 1240, 1243, 1539, 1240, + /* 450 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1398, 1399, 1362, + /* 460 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1413, 1240, 1240, + /* 470 */ 1240, 1408, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 480 */ 1635, 1240, 1240, 1240, 1240, 1240, 1240, 1508, 1507, 1240, + /* 490 */ 1240, 1359, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 500 */ 1240, 1240, 1240, 1240, 1240, 1288, 1240, 1240, 1240, 1240, + /* 510 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 520 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1386, + /* 530 */ 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 540 */ 1240, 1240, 1240, 1240, 1578, 1376, 1240, 1240, 1240, 1240, + /* 550 */ 1626, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, 1240, + /* 560 */ 1240, 1240, 1240, 1240, 1240, 1619, 1332, 1423, 1240, 1422, + /* 570 */ 1426, 1262, 1240, 1252, 1240, 1240, }; /********** End of lemon-generated parsing tables *****************************/ @@ -163147,12 +165272,12 @@ static const char *const yyTokenName[] = { /* 256 */ "seltablist", /* 257 */ "stl_prefix", /* 258 */ "joinop", - /* 259 */ "indexed_opt", - /* 260 */ "on_opt", - /* 261 */ "using_opt", - /* 262 */ "exprlist", - /* 263 */ "xfullname", - /* 264 */ "idlist", + /* 259 */ "on_using", + /* 260 */ "indexed_by", + /* 261 */ "exprlist", + /* 262 */ "xfullname", + /* 263 */ "idlist", + /* 264 */ "indexed_opt", /* 265 */ "nulls", /* 266 */ "with", /* 267 */ "where_opt_ret", @@ -163323,29 +165448,29 @@ static const char *const yyRuleName[] = { /* 106 */ "from ::= FROM seltablist", /* 107 */ "stl_prefix ::= seltablist joinop", /* 108 */ "stl_prefix ::=", - /* 109 */ "seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt", - /* 110 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt", - /* 111 */ "seltablist ::= stl_prefix LP select RP as on_opt using_opt", - /* 112 */ "seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt", - /* 113 */ "dbnm ::=", - /* 114 */ "dbnm ::= DOT nm", - /* 115 */ "fullname ::= nm", - /* 116 */ "fullname ::= nm DOT nm", - /* 117 */ "xfullname ::= nm", - /* 118 */ "xfullname ::= nm DOT nm", - /* 119 */ "xfullname ::= nm DOT nm AS nm", - /* 120 */ "xfullname ::= nm AS nm", - /* 121 */ "joinop ::= COMMA|JOIN", - /* 122 */ "joinop ::= JOIN_KW JOIN", - /* 123 */ "joinop ::= JOIN_KW nm JOIN", - /* 124 */ "joinop ::= JOIN_KW nm nm JOIN", - /* 125 */ "on_opt ::= ON expr", - /* 126 */ "on_opt ::=", - /* 127 */ "indexed_opt ::=", - /* 128 */ "indexed_opt ::= INDEXED BY nm", - /* 129 */ "indexed_opt ::= NOT INDEXED", - /* 130 */ "using_opt ::= USING LP idlist RP", - /* 131 */ "using_opt ::=", + /* 109 */ "seltablist ::= stl_prefix nm dbnm as on_using", + /* 110 */ "seltablist ::= stl_prefix nm dbnm as indexed_by on_using", + /* 111 */ "seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using", + /* 112 */ "seltablist ::= stl_prefix LP select RP as on_using", + /* 113 */ "seltablist ::= stl_prefix LP seltablist RP as on_using", + /* 114 */ "dbnm ::=", + /* 115 */ "dbnm ::= DOT nm", + /* 116 */ "fullname ::= nm", + /* 117 */ "fullname ::= nm DOT nm", + /* 118 */ "xfullname ::= nm", + /* 119 */ "xfullname ::= nm DOT nm", + /* 120 */ "xfullname ::= nm DOT nm AS nm", + /* 121 */ "xfullname ::= nm AS nm", + /* 122 */ "joinop ::= COMMA|JOIN", + /* 123 */ "joinop ::= JOIN_KW JOIN", + /* 124 */ "joinop ::= JOIN_KW nm JOIN", + /* 125 */ "joinop ::= JOIN_KW nm nm JOIN", + /* 126 */ "on_using ::= ON expr", + /* 127 */ "on_using ::= USING LP idlist RP", + /* 128 */ "on_using ::=", + /* 129 */ "indexed_opt ::=", + /* 130 */ "indexed_by ::= INDEXED BY nm", + /* 131 */ "indexed_by ::= NOT INDEXED", /* 132 */ "orderby_opt ::=", /* 133 */ "orderby_opt ::= ORDER BY sortlist", /* 134 */ "sortlist ::= sortlist COMMA expr sortorder nulls", @@ -163423,199 +165548,202 @@ static const char *const yyRuleName[] = { /* 206 */ "expr ::= expr NOT NULL", /* 207 */ "expr ::= expr IS expr", /* 208 */ "expr ::= expr IS NOT expr", - /* 209 */ "expr ::= NOT expr", - /* 210 */ "expr ::= BITNOT expr", - /* 211 */ "expr ::= PLUS|MINUS expr", - /* 212 */ "expr ::= expr PTR expr", - /* 213 */ "between_op ::= BETWEEN", - /* 214 */ "between_op ::= NOT BETWEEN", - /* 215 */ "expr ::= expr between_op expr AND expr", - /* 216 */ "in_op ::= IN", - /* 217 */ "in_op ::= NOT IN", - /* 218 */ "expr ::= expr in_op LP exprlist RP", - /* 219 */ "expr ::= LP select RP", - /* 220 */ "expr ::= expr in_op LP select RP", - /* 221 */ "expr ::= expr in_op nm dbnm paren_exprlist", - /* 222 */ "expr ::= EXISTS LP select RP", - /* 223 */ "expr ::= CASE case_operand case_exprlist case_else END", - /* 224 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", - /* 225 */ "case_exprlist ::= WHEN expr THEN expr", - /* 226 */ "case_else ::= ELSE expr", - /* 227 */ "case_else ::=", - /* 228 */ "case_operand ::= expr", - /* 229 */ "case_operand ::=", - /* 230 */ "exprlist ::=", - /* 231 */ "nexprlist ::= nexprlist COMMA expr", - /* 232 */ "nexprlist ::= expr", - /* 233 */ "paren_exprlist ::=", - /* 234 */ "paren_exprlist ::= LP exprlist RP", - /* 235 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", - /* 236 */ "uniqueflag ::= UNIQUE", - /* 237 */ "uniqueflag ::=", - /* 238 */ "eidlist_opt ::=", - /* 239 */ "eidlist_opt ::= LP eidlist RP", - /* 240 */ "eidlist ::= eidlist COMMA nm collate sortorder", - /* 241 */ "eidlist ::= nm collate sortorder", - /* 242 */ "collate ::=", - /* 243 */ "collate ::= COLLATE ID|STRING", - /* 244 */ "cmd ::= DROP INDEX ifexists fullname", - /* 245 */ "cmd ::= VACUUM vinto", - /* 246 */ "cmd ::= VACUUM nm vinto", - /* 247 */ "vinto ::= INTO expr", - /* 248 */ "vinto ::=", - /* 249 */ "cmd ::= PRAGMA nm dbnm", - /* 250 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", - /* 251 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", - /* 252 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", - /* 253 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", - /* 254 */ "plus_num ::= PLUS INTEGER|FLOAT", - /* 255 */ "minus_num ::= MINUS INTEGER|FLOAT", - /* 256 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", - /* 257 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", - /* 258 */ "trigger_time ::= BEFORE|AFTER", - /* 259 */ "trigger_time ::= INSTEAD OF", - /* 260 */ "trigger_time ::=", - /* 261 */ "trigger_event ::= DELETE|INSERT", - /* 262 */ "trigger_event ::= UPDATE", - /* 263 */ "trigger_event ::= UPDATE OF idlist", - /* 264 */ "when_clause ::=", - /* 265 */ "when_clause ::= WHEN expr", - /* 266 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", - /* 267 */ "trigger_cmd_list ::= trigger_cmd SEMI", - /* 268 */ "trnm ::= nm DOT nm", - /* 269 */ "tridxby ::= INDEXED BY nm", - /* 270 */ "tridxby ::= NOT INDEXED", - /* 271 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", - /* 272 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", - /* 273 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", - /* 274 */ "trigger_cmd ::= scanpt select scanpt", - /* 275 */ "expr ::= RAISE LP IGNORE RP", - /* 276 */ "expr ::= RAISE LP raisetype COMMA nm RP", - /* 277 */ "raisetype ::= ROLLBACK", - /* 278 */ "raisetype ::= ABORT", - /* 279 */ "raisetype ::= FAIL", - /* 280 */ "cmd ::= DROP TRIGGER ifexists fullname", - /* 281 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", - /* 282 */ "cmd ::= DETACH database_kw_opt expr", - /* 283 */ "key_opt ::=", - /* 284 */ "key_opt ::= KEY expr", - /* 285 */ "cmd ::= REINDEX", - /* 286 */ "cmd ::= REINDEX nm dbnm", - /* 287 */ "cmd ::= ANALYZE", - /* 288 */ "cmd ::= ANALYZE nm dbnm", - /* 289 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", - /* 290 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", - /* 291 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", - /* 292 */ "add_column_fullname ::= fullname", - /* 293 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", - /* 294 */ "cmd ::= create_vtab", - /* 295 */ "cmd ::= create_vtab LP vtabarglist RP", - /* 296 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", - /* 297 */ "vtabarg ::=", - /* 298 */ "vtabargtoken ::= ANY", - /* 299 */ "vtabargtoken ::= lp anylist RP", - /* 300 */ "lp ::= LP", - /* 301 */ "with ::= WITH wqlist", - /* 302 */ "with ::= WITH RECURSIVE wqlist", - /* 303 */ "wqas ::= AS", - /* 304 */ "wqas ::= AS MATERIALIZED", - /* 305 */ "wqas ::= AS NOT MATERIALIZED", - /* 306 */ "wqitem ::= nm eidlist_opt wqas LP select RP", - /* 307 */ "wqlist ::= wqitem", - /* 308 */ "wqlist ::= wqlist COMMA wqitem", - /* 309 */ "windowdefn_list ::= windowdefn", - /* 310 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", - /* 311 */ "windowdefn ::= nm AS LP window RP", - /* 312 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", - /* 313 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", - /* 314 */ "window ::= ORDER BY sortlist frame_opt", - /* 315 */ "window ::= nm ORDER BY sortlist frame_opt", - /* 316 */ "window ::= frame_opt", - /* 317 */ "window ::= nm frame_opt", - /* 318 */ "frame_opt ::=", - /* 319 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", - /* 320 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", - /* 321 */ "range_or_rows ::= RANGE|ROWS|GROUPS", - /* 322 */ "frame_bound_s ::= frame_bound", - /* 323 */ "frame_bound_s ::= UNBOUNDED PRECEDING", - /* 324 */ "frame_bound_e ::= frame_bound", - /* 325 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", - /* 326 */ "frame_bound ::= expr PRECEDING|FOLLOWING", - /* 327 */ "frame_bound ::= CURRENT ROW", - /* 328 */ "frame_exclude_opt ::=", - /* 329 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", - /* 330 */ "frame_exclude ::= NO OTHERS", - /* 331 */ "frame_exclude ::= CURRENT ROW", - /* 332 */ "frame_exclude ::= GROUP|TIES", - /* 333 */ "window_clause ::= WINDOW windowdefn_list", - /* 334 */ "filter_over ::= filter_clause over_clause", - /* 335 */ "filter_over ::= over_clause", - /* 336 */ "filter_over ::= filter_clause", - /* 337 */ "over_clause ::= OVER LP window RP", - /* 338 */ "over_clause ::= OVER nm", - /* 339 */ "filter_clause ::= FILTER LP WHERE expr RP", - /* 340 */ "input ::= cmdlist", - /* 341 */ "cmdlist ::= cmdlist ecmd", - /* 342 */ "cmdlist ::= ecmd", - /* 343 */ "ecmd ::= SEMI", - /* 344 */ "ecmd ::= cmdx SEMI", - /* 345 */ "ecmd ::= explain cmdx SEMI", - /* 346 */ "trans_opt ::=", - /* 347 */ "trans_opt ::= TRANSACTION", - /* 348 */ "trans_opt ::= TRANSACTION nm", - /* 349 */ "savepoint_opt ::= SAVEPOINT", - /* 350 */ "savepoint_opt ::=", - /* 351 */ "cmd ::= create_table create_table_args", - /* 352 */ "table_option_set ::= table_option", - /* 353 */ "columnlist ::= columnlist COMMA columnname carglist", - /* 354 */ "columnlist ::= columnname carglist", - /* 355 */ "nm ::= ID|INDEXED", - /* 356 */ "nm ::= STRING", - /* 357 */ "nm ::= JOIN_KW", - /* 358 */ "typetoken ::= typename", - /* 359 */ "typename ::= ID|STRING", - /* 360 */ "signed ::= plus_num", - /* 361 */ "signed ::= minus_num", - /* 362 */ "carglist ::= carglist ccons", - /* 363 */ "carglist ::=", - /* 364 */ "ccons ::= NULL onconf", - /* 365 */ "ccons ::= GENERATED ALWAYS AS generated", - /* 366 */ "ccons ::= AS generated", - /* 367 */ "conslist_opt ::= COMMA conslist", - /* 368 */ "conslist ::= conslist tconscomma tcons", - /* 369 */ "conslist ::= tcons", - /* 370 */ "tconscomma ::=", - /* 371 */ "defer_subclause_opt ::= defer_subclause", - /* 372 */ "resolvetype ::= raisetype", - /* 373 */ "selectnowith ::= oneselect", - /* 374 */ "oneselect ::= values", - /* 375 */ "sclp ::= selcollist COMMA", - /* 376 */ "as ::= ID|STRING", - /* 377 */ "returning ::=", - /* 378 */ "expr ::= term", - /* 379 */ "likeop ::= LIKE_KW|MATCH", - /* 380 */ "exprlist ::= nexprlist", - /* 381 */ "nmnum ::= plus_num", - /* 382 */ "nmnum ::= nm", - /* 383 */ "nmnum ::= ON", - /* 384 */ "nmnum ::= DELETE", - /* 385 */ "nmnum ::= DEFAULT", - /* 386 */ "plus_num ::= INTEGER|FLOAT", - /* 387 */ "foreach_clause ::=", - /* 388 */ "foreach_clause ::= FOR EACH ROW", - /* 389 */ "trnm ::= nm", - /* 390 */ "tridxby ::=", - /* 391 */ "database_kw_opt ::= DATABASE", - /* 392 */ "database_kw_opt ::=", - /* 393 */ "kwcolumn_opt ::=", - /* 394 */ "kwcolumn_opt ::= COLUMNKW", - /* 395 */ "vtabarglist ::= vtabarg", - /* 396 */ "vtabarglist ::= vtabarglist COMMA vtabarg", - /* 397 */ "vtabarg ::= vtabarg vtabargtoken", - /* 398 */ "anylist ::=", - /* 399 */ "anylist ::= anylist LP anylist RP", - /* 400 */ "anylist ::= anylist ANY", - /* 401 */ "with ::=", + /* 209 */ "expr ::= expr IS NOT DISTINCT FROM expr", + /* 210 */ "expr ::= expr IS DISTINCT FROM expr", + /* 211 */ "expr ::= NOT expr", + /* 212 */ "expr ::= BITNOT expr", + /* 213 */ "expr ::= PLUS|MINUS expr", + /* 214 */ "expr ::= expr PTR expr", + /* 215 */ "between_op ::= BETWEEN", + /* 216 */ "between_op ::= NOT BETWEEN", + /* 217 */ "expr ::= expr between_op expr AND expr", + /* 218 */ "in_op ::= IN", + /* 219 */ "in_op ::= NOT IN", + /* 220 */ "expr ::= expr in_op LP exprlist RP", + /* 221 */ "expr ::= LP select RP", + /* 222 */ "expr ::= expr in_op LP select RP", + /* 223 */ "expr ::= expr in_op nm dbnm paren_exprlist", + /* 224 */ "expr ::= EXISTS LP select RP", + /* 225 */ "expr ::= CASE case_operand case_exprlist case_else END", + /* 226 */ "case_exprlist ::= case_exprlist WHEN expr THEN expr", + /* 227 */ "case_exprlist ::= WHEN expr THEN expr", + /* 228 */ "case_else ::= ELSE expr", + /* 229 */ "case_else ::=", + /* 230 */ "case_operand ::= expr", + /* 231 */ "case_operand ::=", + /* 232 */ "exprlist ::=", + /* 233 */ "nexprlist ::= nexprlist COMMA expr", + /* 234 */ "nexprlist ::= expr", + /* 235 */ "paren_exprlist ::=", + /* 236 */ "paren_exprlist ::= LP exprlist RP", + /* 237 */ "cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt", + /* 238 */ "uniqueflag ::= UNIQUE", + /* 239 */ "uniqueflag ::=", + /* 240 */ "eidlist_opt ::=", + /* 241 */ "eidlist_opt ::= LP eidlist RP", + /* 242 */ "eidlist ::= eidlist COMMA nm collate sortorder", + /* 243 */ "eidlist ::= nm collate sortorder", + /* 244 */ "collate ::=", + /* 245 */ "collate ::= COLLATE ID|STRING", + /* 246 */ "cmd ::= DROP INDEX ifexists fullname", + /* 247 */ "cmd ::= VACUUM vinto", + /* 248 */ "cmd ::= VACUUM nm vinto", + /* 249 */ "vinto ::= INTO expr", + /* 250 */ "vinto ::=", + /* 251 */ "cmd ::= PRAGMA nm dbnm", + /* 252 */ "cmd ::= PRAGMA nm dbnm EQ nmnum", + /* 253 */ "cmd ::= PRAGMA nm dbnm LP nmnum RP", + /* 254 */ "cmd ::= PRAGMA nm dbnm EQ minus_num", + /* 255 */ "cmd ::= PRAGMA nm dbnm LP minus_num RP", + /* 256 */ "plus_num ::= PLUS INTEGER|FLOAT", + /* 257 */ "minus_num ::= MINUS INTEGER|FLOAT", + /* 258 */ "cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END", + /* 259 */ "trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause", + /* 260 */ "trigger_time ::= BEFORE|AFTER", + /* 261 */ "trigger_time ::= INSTEAD OF", + /* 262 */ "trigger_time ::=", + /* 263 */ "trigger_event ::= DELETE|INSERT", + /* 264 */ "trigger_event ::= UPDATE", + /* 265 */ "trigger_event ::= UPDATE OF idlist", + /* 266 */ "when_clause ::=", + /* 267 */ "when_clause ::= WHEN expr", + /* 268 */ "trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI", + /* 269 */ "trigger_cmd_list ::= trigger_cmd SEMI", + /* 270 */ "trnm ::= nm DOT nm", + /* 271 */ "tridxby ::= INDEXED BY nm", + /* 272 */ "tridxby ::= NOT INDEXED", + /* 273 */ "trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt", + /* 274 */ "trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt", + /* 275 */ "trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt", + /* 276 */ "trigger_cmd ::= scanpt select scanpt", + /* 277 */ "expr ::= RAISE LP IGNORE RP", + /* 278 */ "expr ::= RAISE LP raisetype COMMA nm RP", + /* 279 */ "raisetype ::= ROLLBACK", + /* 280 */ "raisetype ::= ABORT", + /* 281 */ "raisetype ::= FAIL", + /* 282 */ "cmd ::= DROP TRIGGER ifexists fullname", + /* 283 */ "cmd ::= ATTACH database_kw_opt expr AS expr key_opt", + /* 284 */ "cmd ::= DETACH database_kw_opt expr", + /* 285 */ "key_opt ::=", + /* 286 */ "key_opt ::= KEY expr", + /* 287 */ "cmd ::= REINDEX", + /* 288 */ "cmd ::= REINDEX nm dbnm", + /* 289 */ "cmd ::= ANALYZE", + /* 290 */ "cmd ::= ANALYZE nm dbnm", + /* 291 */ "cmd ::= ALTER TABLE fullname RENAME TO nm", + /* 292 */ "cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist", + /* 293 */ "cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm", + /* 294 */ "add_column_fullname ::= fullname", + /* 295 */ "cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm", + /* 296 */ "cmd ::= create_vtab", + /* 297 */ "cmd ::= create_vtab LP vtabarglist RP", + /* 298 */ "create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm", + /* 299 */ "vtabarg ::=", + /* 300 */ "vtabargtoken ::= ANY", + /* 301 */ "vtabargtoken ::= lp anylist RP", + /* 302 */ "lp ::= LP", + /* 303 */ "with ::= WITH wqlist", + /* 304 */ "with ::= WITH RECURSIVE wqlist", + /* 305 */ "wqas ::= AS", + /* 306 */ "wqas ::= AS MATERIALIZED", + /* 307 */ "wqas ::= AS NOT MATERIALIZED", + /* 308 */ "wqitem ::= nm eidlist_opt wqas LP select RP", + /* 309 */ "wqlist ::= wqitem", + /* 310 */ "wqlist ::= wqlist COMMA wqitem", + /* 311 */ "windowdefn_list ::= windowdefn", + /* 312 */ "windowdefn_list ::= windowdefn_list COMMA windowdefn", + /* 313 */ "windowdefn ::= nm AS LP window RP", + /* 314 */ "window ::= PARTITION BY nexprlist orderby_opt frame_opt", + /* 315 */ "window ::= nm PARTITION BY nexprlist orderby_opt frame_opt", + /* 316 */ "window ::= ORDER BY sortlist frame_opt", + /* 317 */ "window ::= nm ORDER BY sortlist frame_opt", + /* 318 */ "window ::= frame_opt", + /* 319 */ "window ::= nm frame_opt", + /* 320 */ "frame_opt ::=", + /* 321 */ "frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt", + /* 322 */ "frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt", + /* 323 */ "range_or_rows ::= RANGE|ROWS|GROUPS", + /* 324 */ "frame_bound_s ::= frame_bound", + /* 325 */ "frame_bound_s ::= UNBOUNDED PRECEDING", + /* 326 */ "frame_bound_e ::= frame_bound", + /* 327 */ "frame_bound_e ::= UNBOUNDED FOLLOWING", + /* 328 */ "frame_bound ::= expr PRECEDING|FOLLOWING", + /* 329 */ "frame_bound ::= CURRENT ROW", + /* 330 */ "frame_exclude_opt ::=", + /* 331 */ "frame_exclude_opt ::= EXCLUDE frame_exclude", + /* 332 */ "frame_exclude ::= NO OTHERS", + /* 333 */ "frame_exclude ::= CURRENT ROW", + /* 334 */ "frame_exclude ::= GROUP|TIES", + /* 335 */ "window_clause ::= WINDOW windowdefn_list", + /* 336 */ "filter_over ::= filter_clause over_clause", + /* 337 */ "filter_over ::= over_clause", + /* 338 */ "filter_over ::= filter_clause", + /* 339 */ "over_clause ::= OVER LP window RP", + /* 340 */ "over_clause ::= OVER nm", + /* 341 */ "filter_clause ::= FILTER LP WHERE expr RP", + /* 342 */ "input ::= cmdlist", + /* 343 */ "cmdlist ::= cmdlist ecmd", + /* 344 */ "cmdlist ::= ecmd", + /* 345 */ "ecmd ::= SEMI", + /* 346 */ "ecmd ::= cmdx SEMI", + /* 347 */ "ecmd ::= explain cmdx SEMI", + /* 348 */ "trans_opt ::=", + /* 349 */ "trans_opt ::= TRANSACTION", + /* 350 */ "trans_opt ::= TRANSACTION nm", + /* 351 */ "savepoint_opt ::= SAVEPOINT", + /* 352 */ "savepoint_opt ::=", + /* 353 */ "cmd ::= create_table create_table_args", + /* 354 */ "table_option_set ::= table_option", + /* 355 */ "columnlist ::= columnlist COMMA columnname carglist", + /* 356 */ "columnlist ::= columnname carglist", + /* 357 */ "nm ::= ID|INDEXED", + /* 358 */ "nm ::= STRING", + /* 359 */ "nm ::= JOIN_KW", + /* 360 */ "typetoken ::= typename", + /* 361 */ "typename ::= ID|STRING", + /* 362 */ "signed ::= plus_num", + /* 363 */ "signed ::= minus_num", + /* 364 */ "carglist ::= carglist ccons", + /* 365 */ "carglist ::=", + /* 366 */ "ccons ::= NULL onconf", + /* 367 */ "ccons ::= GENERATED ALWAYS AS generated", + /* 368 */ "ccons ::= AS generated", + /* 369 */ "conslist_opt ::= COMMA conslist", + /* 370 */ "conslist ::= conslist tconscomma tcons", + /* 371 */ "conslist ::= tcons", + /* 372 */ "tconscomma ::=", + /* 373 */ "defer_subclause_opt ::= defer_subclause", + /* 374 */ "resolvetype ::= raisetype", + /* 375 */ "selectnowith ::= oneselect", + /* 376 */ "oneselect ::= values", + /* 377 */ "sclp ::= selcollist COMMA", + /* 378 */ "as ::= ID|STRING", + /* 379 */ "indexed_opt ::= indexed_by", + /* 380 */ "returning ::=", + /* 381 */ "expr ::= term", + /* 382 */ "likeop ::= LIKE_KW|MATCH", + /* 383 */ "exprlist ::= nexprlist", + /* 384 */ "nmnum ::= plus_num", + /* 385 */ "nmnum ::= nm", + /* 386 */ "nmnum ::= ON", + /* 387 */ "nmnum ::= DELETE", + /* 388 */ "nmnum ::= DEFAULT", + /* 389 */ "plus_num ::= INTEGER|FLOAT", + /* 390 */ "foreach_clause ::=", + /* 391 */ "foreach_clause ::= FOR EACH ROW", + /* 392 */ "trnm ::= nm", + /* 393 */ "tridxby ::=", + /* 394 */ "database_kw_opt ::= DATABASE", + /* 395 */ "database_kw_opt ::=", + /* 396 */ "kwcolumn_opt ::=", + /* 397 */ "kwcolumn_opt ::= COLUMNKW", + /* 398 */ "vtabarglist ::= vtabarg", + /* 399 */ "vtabarglist ::= vtabarglist COMMA vtabarg", + /* 400 */ "vtabarg ::= vtabarg vtabargtoken", + /* 401 */ "anylist ::=", + /* 402 */ "anylist ::= anylist LP anylist RP", + /* 403 */ "anylist ::= anylist ANY", + /* 404 */ "with ::=", }; #endif /* NDEBUG */ @@ -163753,7 +165881,6 @@ sqlite3SelectDelete(pParse->db, (yypminor->yy47)); case 217: /* expr */ case 246: /* where_opt */ case 248: /* having_opt */ - case 260: /* on_opt */ case 267: /* where_opt_ret */ case 278: /* case_operand */ case 280: /* case_else */ @@ -163773,7 +165900,7 @@ sqlite3ExprDelete(pParse->db, (yypminor->yy528)); case 249: /* orderby_opt */ case 253: /* nexprlist */ case 254: /* sclp */ - case 262: /* exprlist */ + case 261: /* exprlist */ case 268: /* setlist */ case 277: /* paren_exprlist */ case 279: /* case_exprlist */ @@ -163786,7 +165913,7 @@ sqlite3ExprListDelete(pParse->db, (yypminor->yy322)); case 245: /* from */ case 256: /* seltablist */ case 257: /* stl_prefix */ - case 263: /* xfullname */ + case 262: /* xfullname */ { sqlite3SrcListDelete(pParse->db, (yypminor->yy131)); } @@ -163802,8 +165929,7 @@ sqlite3WithDelete(pParse->db, (yypminor->yy521)); sqlite3WindowListDelete(pParse->db, (yypminor->yy41)); } break; - case 261: /* using_opt */ - case 264: /* idlist */ + case 263: /* idlist */ case 270: /* idlist_opt */ { sqlite3IdListDelete(pParse->db, (yypminor->yy254)); @@ -164233,29 +166359,29 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 245, /* (106) from ::= FROM seltablist */ 257, /* (107) stl_prefix ::= seltablist joinop */ 257, /* (108) stl_prefix ::= */ - 256, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - 256, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - 256, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - 256, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - 200, /* (113) dbnm ::= */ - 200, /* (114) dbnm ::= DOT nm */ - 238, /* (115) fullname ::= nm */ - 238, /* (116) fullname ::= nm DOT nm */ - 263, /* (117) xfullname ::= nm */ - 263, /* (118) xfullname ::= nm DOT nm */ - 263, /* (119) xfullname ::= nm DOT nm AS nm */ - 263, /* (120) xfullname ::= nm AS nm */ - 258, /* (121) joinop ::= COMMA|JOIN */ - 258, /* (122) joinop ::= JOIN_KW JOIN */ - 258, /* (123) joinop ::= JOIN_KW nm JOIN */ - 258, /* (124) joinop ::= JOIN_KW nm nm JOIN */ - 260, /* (125) on_opt ::= ON expr */ - 260, /* (126) on_opt ::= */ - 259, /* (127) indexed_opt ::= */ - 259, /* (128) indexed_opt ::= INDEXED BY nm */ - 259, /* (129) indexed_opt ::= NOT INDEXED */ - 261, /* (130) using_opt ::= USING LP idlist RP */ - 261, /* (131) using_opt ::= */ + 256, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + 256, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + 256, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + 256, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + 256, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 200, /* (114) dbnm ::= */ + 200, /* (115) dbnm ::= DOT nm */ + 238, /* (116) fullname ::= nm */ + 238, /* (117) fullname ::= nm DOT nm */ + 262, /* (118) xfullname ::= nm */ + 262, /* (119) xfullname ::= nm DOT nm */ + 262, /* (120) xfullname ::= nm DOT nm AS nm */ + 262, /* (121) xfullname ::= nm AS nm */ + 258, /* (122) joinop ::= COMMA|JOIN */ + 258, /* (123) joinop ::= JOIN_KW JOIN */ + 258, /* (124) joinop ::= JOIN_KW nm JOIN */ + 258, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + 259, /* (126) on_using ::= ON expr */ + 259, /* (127) on_using ::= USING LP idlist RP */ + 259, /* (128) on_using ::= */ + 264, /* (129) indexed_opt ::= */ + 260, /* (130) indexed_by ::= INDEXED BY nm */ + 260, /* (131) indexed_by ::= NOT INDEXED */ 249, /* (132) orderby_opt ::= */ 249, /* (133) orderby_opt ::= ORDER BY sortlist */ 231, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ @@ -164299,8 +166425,8 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 269, /* (172) insert_cmd ::= REPLACE */ 270, /* (173) idlist_opt ::= */ 270, /* (174) idlist_opt ::= LP idlist RP */ - 264, /* (175) idlist ::= idlist COMMA nm */ - 264, /* (176) idlist ::= nm */ + 263, /* (175) idlist ::= idlist COMMA nm */ + 263, /* (176) idlist ::= nm */ 217, /* (177) expr ::= LP expr RP */ 217, /* (178) expr ::= ID|INDEXED */ 217, /* (179) expr ::= JOIN_KW */ @@ -164333,199 +166459,202 @@ static const YYCODETYPE yyRuleInfoLhs[] = { 217, /* (206) expr ::= expr NOT NULL */ 217, /* (207) expr ::= expr IS expr */ 217, /* (208) expr ::= expr IS NOT expr */ - 217, /* (209) expr ::= NOT expr */ - 217, /* (210) expr ::= BITNOT expr */ - 217, /* (211) expr ::= PLUS|MINUS expr */ - 217, /* (212) expr ::= expr PTR expr */ - 275, /* (213) between_op ::= BETWEEN */ - 275, /* (214) between_op ::= NOT BETWEEN */ - 217, /* (215) expr ::= expr between_op expr AND expr */ - 276, /* (216) in_op ::= IN */ - 276, /* (217) in_op ::= NOT IN */ - 217, /* (218) expr ::= expr in_op LP exprlist RP */ - 217, /* (219) expr ::= LP select RP */ - 217, /* (220) expr ::= expr in_op LP select RP */ - 217, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ - 217, /* (222) expr ::= EXISTS LP select RP */ - 217, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ - 279, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - 279, /* (225) case_exprlist ::= WHEN expr THEN expr */ - 280, /* (226) case_else ::= ELSE expr */ - 280, /* (227) case_else ::= */ - 278, /* (228) case_operand ::= expr */ - 278, /* (229) case_operand ::= */ - 262, /* (230) exprlist ::= */ - 253, /* (231) nexprlist ::= nexprlist COMMA expr */ - 253, /* (232) nexprlist ::= expr */ - 277, /* (233) paren_exprlist ::= */ - 277, /* (234) paren_exprlist ::= LP exprlist RP */ - 190, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - 281, /* (236) uniqueflag ::= UNIQUE */ - 281, /* (237) uniqueflag ::= */ - 221, /* (238) eidlist_opt ::= */ - 221, /* (239) eidlist_opt ::= LP eidlist RP */ - 232, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ - 232, /* (241) eidlist ::= nm collate sortorder */ - 282, /* (242) collate ::= */ - 282, /* (243) collate ::= COLLATE ID|STRING */ - 190, /* (244) cmd ::= DROP INDEX ifexists fullname */ - 190, /* (245) cmd ::= VACUUM vinto */ - 190, /* (246) cmd ::= VACUUM nm vinto */ - 283, /* (247) vinto ::= INTO expr */ - 283, /* (248) vinto ::= */ - 190, /* (249) cmd ::= PRAGMA nm dbnm */ - 190, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ - 190, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - 190, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ - 190, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - 211, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ - 212, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ - 190, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - 285, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - 287, /* (258) trigger_time ::= BEFORE|AFTER */ - 287, /* (259) trigger_time ::= INSTEAD OF */ - 287, /* (260) trigger_time ::= */ - 288, /* (261) trigger_event ::= DELETE|INSERT */ - 288, /* (262) trigger_event ::= UPDATE */ - 288, /* (263) trigger_event ::= UPDATE OF idlist */ - 290, /* (264) when_clause ::= */ - 290, /* (265) when_clause ::= WHEN expr */ - 286, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - 286, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ - 292, /* (268) trnm ::= nm DOT nm */ - 293, /* (269) tridxby ::= INDEXED BY nm */ - 293, /* (270) tridxby ::= NOT INDEXED */ - 291, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - 291, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - 291, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - 291, /* (274) trigger_cmd ::= scanpt select scanpt */ - 217, /* (275) expr ::= RAISE LP IGNORE RP */ - 217, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ - 236, /* (277) raisetype ::= ROLLBACK */ - 236, /* (278) raisetype ::= ABORT */ - 236, /* (279) raisetype ::= FAIL */ - 190, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ - 190, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - 190, /* (282) cmd ::= DETACH database_kw_opt expr */ - 295, /* (283) key_opt ::= */ - 295, /* (284) key_opt ::= KEY expr */ - 190, /* (285) cmd ::= REINDEX */ - 190, /* (286) cmd ::= REINDEX nm dbnm */ - 190, /* (287) cmd ::= ANALYZE */ - 190, /* (288) cmd ::= ANALYZE nm dbnm */ - 190, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ - 190, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - 190, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - 296, /* (292) add_column_fullname ::= fullname */ - 190, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - 190, /* (294) cmd ::= create_vtab */ - 190, /* (295) cmd ::= create_vtab LP vtabarglist RP */ - 298, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 300, /* (297) vtabarg ::= */ - 301, /* (298) vtabargtoken ::= ANY */ - 301, /* (299) vtabargtoken ::= lp anylist RP */ - 302, /* (300) lp ::= LP */ - 266, /* (301) with ::= WITH wqlist */ - 266, /* (302) with ::= WITH RECURSIVE wqlist */ - 305, /* (303) wqas ::= AS */ - 305, /* (304) wqas ::= AS MATERIALIZED */ - 305, /* (305) wqas ::= AS NOT MATERIALIZED */ - 304, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ - 241, /* (307) wqlist ::= wqitem */ - 241, /* (308) wqlist ::= wqlist COMMA wqitem */ - 306, /* (309) windowdefn_list ::= windowdefn */ - 306, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - 307, /* (311) windowdefn ::= nm AS LP window RP */ - 308, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - 308, /* (314) window ::= ORDER BY sortlist frame_opt */ - 308, /* (315) window ::= nm ORDER BY sortlist frame_opt */ - 308, /* (316) window ::= frame_opt */ - 308, /* (317) window ::= nm frame_opt */ - 309, /* (318) frame_opt ::= */ - 309, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - 309, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - 313, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ - 315, /* (322) frame_bound_s ::= frame_bound */ - 315, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ - 316, /* (324) frame_bound_e ::= frame_bound */ - 316, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ - 314, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ - 314, /* (327) frame_bound ::= CURRENT ROW */ - 317, /* (328) frame_exclude_opt ::= */ - 317, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ - 318, /* (330) frame_exclude ::= NO OTHERS */ - 318, /* (331) frame_exclude ::= CURRENT ROW */ - 318, /* (332) frame_exclude ::= GROUP|TIES */ - 251, /* (333) window_clause ::= WINDOW windowdefn_list */ - 273, /* (334) filter_over ::= filter_clause over_clause */ - 273, /* (335) filter_over ::= over_clause */ - 273, /* (336) filter_over ::= filter_clause */ - 312, /* (337) over_clause ::= OVER LP window RP */ - 312, /* (338) over_clause ::= OVER nm */ - 311, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ - 185, /* (340) input ::= cmdlist */ - 186, /* (341) cmdlist ::= cmdlist ecmd */ - 186, /* (342) cmdlist ::= ecmd */ - 187, /* (343) ecmd ::= SEMI */ - 187, /* (344) ecmd ::= cmdx SEMI */ - 187, /* (345) ecmd ::= explain cmdx SEMI */ - 192, /* (346) trans_opt ::= */ - 192, /* (347) trans_opt ::= TRANSACTION */ - 192, /* (348) trans_opt ::= TRANSACTION nm */ - 194, /* (349) savepoint_opt ::= SAVEPOINT */ - 194, /* (350) savepoint_opt ::= */ - 190, /* (351) cmd ::= create_table create_table_args */ - 203, /* (352) table_option_set ::= table_option */ - 201, /* (353) columnlist ::= columnlist COMMA columnname carglist */ - 201, /* (354) columnlist ::= columnname carglist */ - 193, /* (355) nm ::= ID|INDEXED */ - 193, /* (356) nm ::= STRING */ - 193, /* (357) nm ::= JOIN_KW */ - 208, /* (358) typetoken ::= typename */ - 209, /* (359) typename ::= ID|STRING */ - 210, /* (360) signed ::= plus_num */ - 210, /* (361) signed ::= minus_num */ - 207, /* (362) carglist ::= carglist ccons */ - 207, /* (363) carglist ::= */ - 215, /* (364) ccons ::= NULL onconf */ - 215, /* (365) ccons ::= GENERATED ALWAYS AS generated */ - 215, /* (366) ccons ::= AS generated */ - 202, /* (367) conslist_opt ::= COMMA conslist */ - 228, /* (368) conslist ::= conslist tconscomma tcons */ - 228, /* (369) conslist ::= tcons */ - 229, /* (370) tconscomma ::= */ - 233, /* (371) defer_subclause_opt ::= defer_subclause */ - 235, /* (372) resolvetype ::= raisetype */ - 239, /* (373) selectnowith ::= oneselect */ - 240, /* (374) oneselect ::= values */ - 254, /* (375) sclp ::= selcollist COMMA */ - 255, /* (376) as ::= ID|STRING */ - 272, /* (377) returning ::= */ - 217, /* (378) expr ::= term */ - 274, /* (379) likeop ::= LIKE_KW|MATCH */ - 262, /* (380) exprlist ::= nexprlist */ - 284, /* (381) nmnum ::= plus_num */ - 284, /* (382) nmnum ::= nm */ - 284, /* (383) nmnum ::= ON */ - 284, /* (384) nmnum ::= DELETE */ - 284, /* (385) nmnum ::= DEFAULT */ - 211, /* (386) plus_num ::= INTEGER|FLOAT */ - 289, /* (387) foreach_clause ::= */ - 289, /* (388) foreach_clause ::= FOR EACH ROW */ - 292, /* (389) trnm ::= nm */ - 293, /* (390) tridxby ::= */ - 294, /* (391) database_kw_opt ::= DATABASE */ - 294, /* (392) database_kw_opt ::= */ - 297, /* (393) kwcolumn_opt ::= */ - 297, /* (394) kwcolumn_opt ::= COLUMNKW */ - 299, /* (395) vtabarglist ::= vtabarg */ - 299, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ - 300, /* (397) vtabarg ::= vtabarg vtabargtoken */ - 303, /* (398) anylist ::= */ - 303, /* (399) anylist ::= anylist LP anylist RP */ - 303, /* (400) anylist ::= anylist ANY */ - 266, /* (401) with ::= */ + 217, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + 217, /* (210) expr ::= expr IS DISTINCT FROM expr */ + 217, /* (211) expr ::= NOT expr */ + 217, /* (212) expr ::= BITNOT expr */ + 217, /* (213) expr ::= PLUS|MINUS expr */ + 217, /* (214) expr ::= expr PTR expr */ + 275, /* (215) between_op ::= BETWEEN */ + 275, /* (216) between_op ::= NOT BETWEEN */ + 217, /* (217) expr ::= expr between_op expr AND expr */ + 276, /* (218) in_op ::= IN */ + 276, /* (219) in_op ::= NOT IN */ + 217, /* (220) expr ::= expr in_op LP exprlist RP */ + 217, /* (221) expr ::= LP select RP */ + 217, /* (222) expr ::= expr in_op LP select RP */ + 217, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + 217, /* (224) expr ::= EXISTS LP select RP */ + 217, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + 279, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + 279, /* (227) case_exprlist ::= WHEN expr THEN expr */ + 280, /* (228) case_else ::= ELSE expr */ + 280, /* (229) case_else ::= */ + 278, /* (230) case_operand ::= expr */ + 278, /* (231) case_operand ::= */ + 261, /* (232) exprlist ::= */ + 253, /* (233) nexprlist ::= nexprlist COMMA expr */ + 253, /* (234) nexprlist ::= expr */ + 277, /* (235) paren_exprlist ::= */ + 277, /* (236) paren_exprlist ::= LP exprlist RP */ + 190, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + 281, /* (238) uniqueflag ::= UNIQUE */ + 281, /* (239) uniqueflag ::= */ + 221, /* (240) eidlist_opt ::= */ + 221, /* (241) eidlist_opt ::= LP eidlist RP */ + 232, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + 232, /* (243) eidlist ::= nm collate sortorder */ + 282, /* (244) collate ::= */ + 282, /* (245) collate ::= COLLATE ID|STRING */ + 190, /* (246) cmd ::= DROP INDEX ifexists fullname */ + 190, /* (247) cmd ::= VACUUM vinto */ + 190, /* (248) cmd ::= VACUUM nm vinto */ + 283, /* (249) vinto ::= INTO expr */ + 283, /* (250) vinto ::= */ + 190, /* (251) cmd ::= PRAGMA nm dbnm */ + 190, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + 190, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + 190, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + 190, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + 211, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + 212, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + 190, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + 285, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + 287, /* (260) trigger_time ::= BEFORE|AFTER */ + 287, /* (261) trigger_time ::= INSTEAD OF */ + 287, /* (262) trigger_time ::= */ + 288, /* (263) trigger_event ::= DELETE|INSERT */ + 288, /* (264) trigger_event ::= UPDATE */ + 288, /* (265) trigger_event ::= UPDATE OF idlist */ + 290, /* (266) when_clause ::= */ + 290, /* (267) when_clause ::= WHEN expr */ + 286, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + 286, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + 292, /* (270) trnm ::= nm DOT nm */ + 293, /* (271) tridxby ::= INDEXED BY nm */ + 293, /* (272) tridxby ::= NOT INDEXED */ + 291, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + 291, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + 291, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + 291, /* (276) trigger_cmd ::= scanpt select scanpt */ + 217, /* (277) expr ::= RAISE LP IGNORE RP */ + 217, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + 236, /* (279) raisetype ::= ROLLBACK */ + 236, /* (280) raisetype ::= ABORT */ + 236, /* (281) raisetype ::= FAIL */ + 190, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + 190, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + 190, /* (284) cmd ::= DETACH database_kw_opt expr */ + 295, /* (285) key_opt ::= */ + 295, /* (286) key_opt ::= KEY expr */ + 190, /* (287) cmd ::= REINDEX */ + 190, /* (288) cmd ::= REINDEX nm dbnm */ + 190, /* (289) cmd ::= ANALYZE */ + 190, /* (290) cmd ::= ANALYZE nm dbnm */ + 190, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + 190, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + 190, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + 296, /* (294) add_column_fullname ::= fullname */ + 190, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + 190, /* (296) cmd ::= create_vtab */ + 190, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + 298, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 300, /* (299) vtabarg ::= */ + 301, /* (300) vtabargtoken ::= ANY */ + 301, /* (301) vtabargtoken ::= lp anylist RP */ + 302, /* (302) lp ::= LP */ + 266, /* (303) with ::= WITH wqlist */ + 266, /* (304) with ::= WITH RECURSIVE wqlist */ + 305, /* (305) wqas ::= AS */ + 305, /* (306) wqas ::= AS MATERIALIZED */ + 305, /* (307) wqas ::= AS NOT MATERIALIZED */ + 304, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + 241, /* (309) wqlist ::= wqitem */ + 241, /* (310) wqlist ::= wqlist COMMA wqitem */ + 306, /* (311) windowdefn_list ::= windowdefn */ + 306, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + 307, /* (313) windowdefn ::= nm AS LP window RP */ + 308, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + 308, /* (316) window ::= ORDER BY sortlist frame_opt */ + 308, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + 308, /* (318) window ::= frame_opt */ + 308, /* (319) window ::= nm frame_opt */ + 309, /* (320) frame_opt ::= */ + 309, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + 309, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + 313, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + 315, /* (324) frame_bound_s ::= frame_bound */ + 315, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + 316, /* (326) frame_bound_e ::= frame_bound */ + 316, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + 314, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + 314, /* (329) frame_bound ::= CURRENT ROW */ + 317, /* (330) frame_exclude_opt ::= */ + 317, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + 318, /* (332) frame_exclude ::= NO OTHERS */ + 318, /* (333) frame_exclude ::= CURRENT ROW */ + 318, /* (334) frame_exclude ::= GROUP|TIES */ + 251, /* (335) window_clause ::= WINDOW windowdefn_list */ + 273, /* (336) filter_over ::= filter_clause over_clause */ + 273, /* (337) filter_over ::= over_clause */ + 273, /* (338) filter_over ::= filter_clause */ + 312, /* (339) over_clause ::= OVER LP window RP */ + 312, /* (340) over_clause ::= OVER nm */ + 311, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + 185, /* (342) input ::= cmdlist */ + 186, /* (343) cmdlist ::= cmdlist ecmd */ + 186, /* (344) cmdlist ::= ecmd */ + 187, /* (345) ecmd ::= SEMI */ + 187, /* (346) ecmd ::= cmdx SEMI */ + 187, /* (347) ecmd ::= explain cmdx SEMI */ + 192, /* (348) trans_opt ::= */ + 192, /* (349) trans_opt ::= TRANSACTION */ + 192, /* (350) trans_opt ::= TRANSACTION nm */ + 194, /* (351) savepoint_opt ::= SAVEPOINT */ + 194, /* (352) savepoint_opt ::= */ + 190, /* (353) cmd ::= create_table create_table_args */ + 203, /* (354) table_option_set ::= table_option */ + 201, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + 201, /* (356) columnlist ::= columnname carglist */ + 193, /* (357) nm ::= ID|INDEXED */ + 193, /* (358) nm ::= STRING */ + 193, /* (359) nm ::= JOIN_KW */ + 208, /* (360) typetoken ::= typename */ + 209, /* (361) typename ::= ID|STRING */ + 210, /* (362) signed ::= plus_num */ + 210, /* (363) signed ::= minus_num */ + 207, /* (364) carglist ::= carglist ccons */ + 207, /* (365) carglist ::= */ + 215, /* (366) ccons ::= NULL onconf */ + 215, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + 215, /* (368) ccons ::= AS generated */ + 202, /* (369) conslist_opt ::= COMMA conslist */ + 228, /* (370) conslist ::= conslist tconscomma tcons */ + 228, /* (371) conslist ::= tcons */ + 229, /* (372) tconscomma ::= */ + 233, /* (373) defer_subclause_opt ::= defer_subclause */ + 235, /* (374) resolvetype ::= raisetype */ + 239, /* (375) selectnowith ::= oneselect */ + 240, /* (376) oneselect ::= values */ + 254, /* (377) sclp ::= selcollist COMMA */ + 255, /* (378) as ::= ID|STRING */ + 264, /* (379) indexed_opt ::= indexed_by */ + 272, /* (380) returning ::= */ + 217, /* (381) expr ::= term */ + 274, /* (382) likeop ::= LIKE_KW|MATCH */ + 261, /* (383) exprlist ::= nexprlist */ + 284, /* (384) nmnum ::= plus_num */ + 284, /* (385) nmnum ::= nm */ + 284, /* (386) nmnum ::= ON */ + 284, /* (387) nmnum ::= DELETE */ + 284, /* (388) nmnum ::= DEFAULT */ + 211, /* (389) plus_num ::= INTEGER|FLOAT */ + 289, /* (390) foreach_clause ::= */ + 289, /* (391) foreach_clause ::= FOR EACH ROW */ + 292, /* (392) trnm ::= nm */ + 293, /* (393) tridxby ::= */ + 294, /* (394) database_kw_opt ::= DATABASE */ + 294, /* (395) database_kw_opt ::= */ + 297, /* (396) kwcolumn_opt ::= */ + 297, /* (397) kwcolumn_opt ::= COLUMNKW */ + 299, /* (398) vtabarglist ::= vtabarg */ + 299, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + 300, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 303, /* (401) anylist ::= */ + 303, /* (402) anylist ::= anylist LP anylist RP */ + 303, /* (403) anylist ::= anylist ANY */ + 266, /* (404) with ::= */ }; /* For rule J, yyRuleInfoNRhs[J] contains the negative of the number @@ -164640,29 +166769,29 @@ static const signed char yyRuleInfoNRhs[] = { -2, /* (106) from ::= FROM seltablist */ -2, /* (107) stl_prefix ::= seltablist joinop */ 0, /* (108) stl_prefix ::= */ - -7, /* (109) seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ - -9, /* (110) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ - -7, /* (111) seltablist ::= stl_prefix LP select RP as on_opt using_opt */ - -7, /* (112) seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ - 0, /* (113) dbnm ::= */ - -2, /* (114) dbnm ::= DOT nm */ - -1, /* (115) fullname ::= nm */ - -3, /* (116) fullname ::= nm DOT nm */ - -1, /* (117) xfullname ::= nm */ - -3, /* (118) xfullname ::= nm DOT nm */ - -5, /* (119) xfullname ::= nm DOT nm AS nm */ - -3, /* (120) xfullname ::= nm AS nm */ - -1, /* (121) joinop ::= COMMA|JOIN */ - -2, /* (122) joinop ::= JOIN_KW JOIN */ - -3, /* (123) joinop ::= JOIN_KW nm JOIN */ - -4, /* (124) joinop ::= JOIN_KW nm nm JOIN */ - -2, /* (125) on_opt ::= ON expr */ - 0, /* (126) on_opt ::= */ - 0, /* (127) indexed_opt ::= */ - -3, /* (128) indexed_opt ::= INDEXED BY nm */ - -2, /* (129) indexed_opt ::= NOT INDEXED */ - -4, /* (130) using_opt ::= USING LP idlist RP */ - 0, /* (131) using_opt ::= */ + -5, /* (109) seltablist ::= stl_prefix nm dbnm as on_using */ + -6, /* (110) seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ + -8, /* (111) seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ + -6, /* (112) seltablist ::= stl_prefix LP select RP as on_using */ + -6, /* (113) seltablist ::= stl_prefix LP seltablist RP as on_using */ + 0, /* (114) dbnm ::= */ + -2, /* (115) dbnm ::= DOT nm */ + -1, /* (116) fullname ::= nm */ + -3, /* (117) fullname ::= nm DOT nm */ + -1, /* (118) xfullname ::= nm */ + -3, /* (119) xfullname ::= nm DOT nm */ + -5, /* (120) xfullname ::= nm DOT nm AS nm */ + -3, /* (121) xfullname ::= nm AS nm */ + -1, /* (122) joinop ::= COMMA|JOIN */ + -2, /* (123) joinop ::= JOIN_KW JOIN */ + -3, /* (124) joinop ::= JOIN_KW nm JOIN */ + -4, /* (125) joinop ::= JOIN_KW nm nm JOIN */ + -2, /* (126) on_using ::= ON expr */ + -4, /* (127) on_using ::= USING LP idlist RP */ + 0, /* (128) on_using ::= */ + 0, /* (129) indexed_opt ::= */ + -3, /* (130) indexed_by ::= INDEXED BY nm */ + -2, /* (131) indexed_by ::= NOT INDEXED */ 0, /* (132) orderby_opt ::= */ -3, /* (133) orderby_opt ::= ORDER BY sortlist */ -5, /* (134) sortlist ::= sortlist COMMA expr sortorder nulls */ @@ -164740,199 +166869,202 @@ static const signed char yyRuleInfoNRhs[] = { -3, /* (206) expr ::= expr NOT NULL */ -3, /* (207) expr ::= expr IS expr */ -4, /* (208) expr ::= expr IS NOT expr */ - -2, /* (209) expr ::= NOT expr */ - -2, /* (210) expr ::= BITNOT expr */ - -2, /* (211) expr ::= PLUS|MINUS expr */ - -3, /* (212) expr ::= expr PTR expr */ - -1, /* (213) between_op ::= BETWEEN */ - -2, /* (214) between_op ::= NOT BETWEEN */ - -5, /* (215) expr ::= expr between_op expr AND expr */ - -1, /* (216) in_op ::= IN */ - -2, /* (217) in_op ::= NOT IN */ - -5, /* (218) expr ::= expr in_op LP exprlist RP */ - -3, /* (219) expr ::= LP select RP */ - -5, /* (220) expr ::= expr in_op LP select RP */ - -5, /* (221) expr ::= expr in_op nm dbnm paren_exprlist */ - -4, /* (222) expr ::= EXISTS LP select RP */ - -5, /* (223) expr ::= CASE case_operand case_exprlist case_else END */ - -5, /* (224) case_exprlist ::= case_exprlist WHEN expr THEN expr */ - -4, /* (225) case_exprlist ::= WHEN expr THEN expr */ - -2, /* (226) case_else ::= ELSE expr */ - 0, /* (227) case_else ::= */ - -1, /* (228) case_operand ::= expr */ - 0, /* (229) case_operand ::= */ - 0, /* (230) exprlist ::= */ - -3, /* (231) nexprlist ::= nexprlist COMMA expr */ - -1, /* (232) nexprlist ::= expr */ - 0, /* (233) paren_exprlist ::= */ - -3, /* (234) paren_exprlist ::= LP exprlist RP */ - -12, /* (235) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ - -1, /* (236) uniqueflag ::= UNIQUE */ - 0, /* (237) uniqueflag ::= */ - 0, /* (238) eidlist_opt ::= */ - -3, /* (239) eidlist_opt ::= LP eidlist RP */ - -5, /* (240) eidlist ::= eidlist COMMA nm collate sortorder */ - -3, /* (241) eidlist ::= nm collate sortorder */ - 0, /* (242) collate ::= */ - -2, /* (243) collate ::= COLLATE ID|STRING */ - -4, /* (244) cmd ::= DROP INDEX ifexists fullname */ - -2, /* (245) cmd ::= VACUUM vinto */ - -3, /* (246) cmd ::= VACUUM nm vinto */ - -2, /* (247) vinto ::= INTO expr */ - 0, /* (248) vinto ::= */ - -3, /* (249) cmd ::= PRAGMA nm dbnm */ - -5, /* (250) cmd ::= PRAGMA nm dbnm EQ nmnum */ - -6, /* (251) cmd ::= PRAGMA nm dbnm LP nmnum RP */ - -5, /* (252) cmd ::= PRAGMA nm dbnm EQ minus_num */ - -6, /* (253) cmd ::= PRAGMA nm dbnm LP minus_num RP */ - -2, /* (254) plus_num ::= PLUS INTEGER|FLOAT */ - -2, /* (255) minus_num ::= MINUS INTEGER|FLOAT */ - -5, /* (256) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ - -11, /* (257) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ - -1, /* (258) trigger_time ::= BEFORE|AFTER */ - -2, /* (259) trigger_time ::= INSTEAD OF */ - 0, /* (260) trigger_time ::= */ - -1, /* (261) trigger_event ::= DELETE|INSERT */ - -1, /* (262) trigger_event ::= UPDATE */ - -3, /* (263) trigger_event ::= UPDATE OF idlist */ - 0, /* (264) when_clause ::= */ - -2, /* (265) when_clause ::= WHEN expr */ - -3, /* (266) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ - -2, /* (267) trigger_cmd_list ::= trigger_cmd SEMI */ - -3, /* (268) trnm ::= nm DOT nm */ - -3, /* (269) tridxby ::= INDEXED BY nm */ - -2, /* (270) tridxby ::= NOT INDEXED */ - -9, /* (271) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ - -8, /* (272) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ - -6, /* (273) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ - -3, /* (274) trigger_cmd ::= scanpt select scanpt */ - -4, /* (275) expr ::= RAISE LP IGNORE RP */ - -6, /* (276) expr ::= RAISE LP raisetype COMMA nm RP */ - -1, /* (277) raisetype ::= ROLLBACK */ - -1, /* (278) raisetype ::= ABORT */ - -1, /* (279) raisetype ::= FAIL */ - -4, /* (280) cmd ::= DROP TRIGGER ifexists fullname */ - -6, /* (281) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ - -3, /* (282) cmd ::= DETACH database_kw_opt expr */ - 0, /* (283) key_opt ::= */ - -2, /* (284) key_opt ::= KEY expr */ - -1, /* (285) cmd ::= REINDEX */ - -3, /* (286) cmd ::= REINDEX nm dbnm */ - -1, /* (287) cmd ::= ANALYZE */ - -3, /* (288) cmd ::= ANALYZE nm dbnm */ - -6, /* (289) cmd ::= ALTER TABLE fullname RENAME TO nm */ - -7, /* (290) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ - -6, /* (291) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ - -1, /* (292) add_column_fullname ::= fullname */ - -8, /* (293) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ - -1, /* (294) cmd ::= create_vtab */ - -4, /* (295) cmd ::= create_vtab LP vtabarglist RP */ - -8, /* (296) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ - 0, /* (297) vtabarg ::= */ - -1, /* (298) vtabargtoken ::= ANY */ - -3, /* (299) vtabargtoken ::= lp anylist RP */ - -1, /* (300) lp ::= LP */ - -2, /* (301) with ::= WITH wqlist */ - -3, /* (302) with ::= WITH RECURSIVE wqlist */ - -1, /* (303) wqas ::= AS */ - -2, /* (304) wqas ::= AS MATERIALIZED */ - -3, /* (305) wqas ::= AS NOT MATERIALIZED */ - -6, /* (306) wqitem ::= nm eidlist_opt wqas LP select RP */ - -1, /* (307) wqlist ::= wqitem */ - -3, /* (308) wqlist ::= wqlist COMMA wqitem */ - -1, /* (309) windowdefn_list ::= windowdefn */ - -3, /* (310) windowdefn_list ::= windowdefn_list COMMA windowdefn */ - -5, /* (311) windowdefn ::= nm AS LP window RP */ - -5, /* (312) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ - -6, /* (313) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ - -4, /* (314) window ::= ORDER BY sortlist frame_opt */ - -5, /* (315) window ::= nm ORDER BY sortlist frame_opt */ - -1, /* (316) window ::= frame_opt */ - -2, /* (317) window ::= nm frame_opt */ - 0, /* (318) frame_opt ::= */ - -3, /* (319) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ - -6, /* (320) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ - -1, /* (321) range_or_rows ::= RANGE|ROWS|GROUPS */ - -1, /* (322) frame_bound_s ::= frame_bound */ - -2, /* (323) frame_bound_s ::= UNBOUNDED PRECEDING */ - -1, /* (324) frame_bound_e ::= frame_bound */ - -2, /* (325) frame_bound_e ::= UNBOUNDED FOLLOWING */ - -2, /* (326) frame_bound ::= expr PRECEDING|FOLLOWING */ - -2, /* (327) frame_bound ::= CURRENT ROW */ - 0, /* (328) frame_exclude_opt ::= */ - -2, /* (329) frame_exclude_opt ::= EXCLUDE frame_exclude */ - -2, /* (330) frame_exclude ::= NO OTHERS */ - -2, /* (331) frame_exclude ::= CURRENT ROW */ - -1, /* (332) frame_exclude ::= GROUP|TIES */ - -2, /* (333) window_clause ::= WINDOW windowdefn_list */ - -2, /* (334) filter_over ::= filter_clause over_clause */ - -1, /* (335) filter_over ::= over_clause */ - -1, /* (336) filter_over ::= filter_clause */ - -4, /* (337) over_clause ::= OVER LP window RP */ - -2, /* (338) over_clause ::= OVER nm */ - -5, /* (339) filter_clause ::= FILTER LP WHERE expr RP */ - -1, /* (340) input ::= cmdlist */ - -2, /* (341) cmdlist ::= cmdlist ecmd */ - -1, /* (342) cmdlist ::= ecmd */ - -1, /* (343) ecmd ::= SEMI */ - -2, /* (344) ecmd ::= cmdx SEMI */ - -3, /* (345) ecmd ::= explain cmdx SEMI */ - 0, /* (346) trans_opt ::= */ - -1, /* (347) trans_opt ::= TRANSACTION */ - -2, /* (348) trans_opt ::= TRANSACTION nm */ - -1, /* (349) savepoint_opt ::= SAVEPOINT */ - 0, /* (350) savepoint_opt ::= */ - -2, /* (351) cmd ::= create_table create_table_args */ - -1, /* (352) table_option_set ::= table_option */ - -4, /* (353) columnlist ::= columnlist COMMA columnname carglist */ - -2, /* (354) columnlist ::= columnname carglist */ - -1, /* (355) nm ::= ID|INDEXED */ - -1, /* (356) nm ::= STRING */ - -1, /* (357) nm ::= JOIN_KW */ - -1, /* (358) typetoken ::= typename */ - -1, /* (359) typename ::= ID|STRING */ - -1, /* (360) signed ::= plus_num */ - -1, /* (361) signed ::= minus_num */ - -2, /* (362) carglist ::= carglist ccons */ - 0, /* (363) carglist ::= */ - -2, /* (364) ccons ::= NULL onconf */ - -4, /* (365) ccons ::= GENERATED ALWAYS AS generated */ - -2, /* (366) ccons ::= AS generated */ - -2, /* (367) conslist_opt ::= COMMA conslist */ - -3, /* (368) conslist ::= conslist tconscomma tcons */ - -1, /* (369) conslist ::= tcons */ - 0, /* (370) tconscomma ::= */ - -1, /* (371) defer_subclause_opt ::= defer_subclause */ - -1, /* (372) resolvetype ::= raisetype */ - -1, /* (373) selectnowith ::= oneselect */ - -1, /* (374) oneselect ::= values */ - -2, /* (375) sclp ::= selcollist COMMA */ - -1, /* (376) as ::= ID|STRING */ - 0, /* (377) returning ::= */ - -1, /* (378) expr ::= term */ - -1, /* (379) likeop ::= LIKE_KW|MATCH */ - -1, /* (380) exprlist ::= nexprlist */ - -1, /* (381) nmnum ::= plus_num */ - -1, /* (382) nmnum ::= nm */ - -1, /* (383) nmnum ::= ON */ - -1, /* (384) nmnum ::= DELETE */ - -1, /* (385) nmnum ::= DEFAULT */ - -1, /* (386) plus_num ::= INTEGER|FLOAT */ - 0, /* (387) foreach_clause ::= */ - -3, /* (388) foreach_clause ::= FOR EACH ROW */ - -1, /* (389) trnm ::= nm */ - 0, /* (390) tridxby ::= */ - -1, /* (391) database_kw_opt ::= DATABASE */ - 0, /* (392) database_kw_opt ::= */ - 0, /* (393) kwcolumn_opt ::= */ - -1, /* (394) kwcolumn_opt ::= COLUMNKW */ - -1, /* (395) vtabarglist ::= vtabarg */ - -3, /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ - -2, /* (397) vtabarg ::= vtabarg vtabargtoken */ - 0, /* (398) anylist ::= */ - -4, /* (399) anylist ::= anylist LP anylist RP */ - -2, /* (400) anylist ::= anylist ANY */ - 0, /* (401) with ::= */ + -6, /* (209) expr ::= expr IS NOT DISTINCT FROM expr */ + -5, /* (210) expr ::= expr IS DISTINCT FROM expr */ + -2, /* (211) expr ::= NOT expr */ + -2, /* (212) expr ::= BITNOT expr */ + -2, /* (213) expr ::= PLUS|MINUS expr */ + -3, /* (214) expr ::= expr PTR expr */ + -1, /* (215) between_op ::= BETWEEN */ + -2, /* (216) between_op ::= NOT BETWEEN */ + -5, /* (217) expr ::= expr between_op expr AND expr */ + -1, /* (218) in_op ::= IN */ + -2, /* (219) in_op ::= NOT IN */ + -5, /* (220) expr ::= expr in_op LP exprlist RP */ + -3, /* (221) expr ::= LP select RP */ + -5, /* (222) expr ::= expr in_op LP select RP */ + -5, /* (223) expr ::= expr in_op nm dbnm paren_exprlist */ + -4, /* (224) expr ::= EXISTS LP select RP */ + -5, /* (225) expr ::= CASE case_operand case_exprlist case_else END */ + -5, /* (226) case_exprlist ::= case_exprlist WHEN expr THEN expr */ + -4, /* (227) case_exprlist ::= WHEN expr THEN expr */ + -2, /* (228) case_else ::= ELSE expr */ + 0, /* (229) case_else ::= */ + -1, /* (230) case_operand ::= expr */ + 0, /* (231) case_operand ::= */ + 0, /* (232) exprlist ::= */ + -3, /* (233) nexprlist ::= nexprlist COMMA expr */ + -1, /* (234) nexprlist ::= expr */ + 0, /* (235) paren_exprlist ::= */ + -3, /* (236) paren_exprlist ::= LP exprlist RP */ + -12, /* (237) cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + -1, /* (238) uniqueflag ::= UNIQUE */ + 0, /* (239) uniqueflag ::= */ + 0, /* (240) eidlist_opt ::= */ + -3, /* (241) eidlist_opt ::= LP eidlist RP */ + -5, /* (242) eidlist ::= eidlist COMMA nm collate sortorder */ + -3, /* (243) eidlist ::= nm collate sortorder */ + 0, /* (244) collate ::= */ + -2, /* (245) collate ::= COLLATE ID|STRING */ + -4, /* (246) cmd ::= DROP INDEX ifexists fullname */ + -2, /* (247) cmd ::= VACUUM vinto */ + -3, /* (248) cmd ::= VACUUM nm vinto */ + -2, /* (249) vinto ::= INTO expr */ + 0, /* (250) vinto ::= */ + -3, /* (251) cmd ::= PRAGMA nm dbnm */ + -5, /* (252) cmd ::= PRAGMA nm dbnm EQ nmnum */ + -6, /* (253) cmd ::= PRAGMA nm dbnm LP nmnum RP */ + -5, /* (254) cmd ::= PRAGMA nm dbnm EQ minus_num */ + -6, /* (255) cmd ::= PRAGMA nm dbnm LP minus_num RP */ + -2, /* (256) plus_num ::= PLUS INTEGER|FLOAT */ + -2, /* (257) minus_num ::= MINUS INTEGER|FLOAT */ + -5, /* (258) cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + -11, /* (259) trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + -1, /* (260) trigger_time ::= BEFORE|AFTER */ + -2, /* (261) trigger_time ::= INSTEAD OF */ + 0, /* (262) trigger_time ::= */ + -1, /* (263) trigger_event ::= DELETE|INSERT */ + -1, /* (264) trigger_event ::= UPDATE */ + -3, /* (265) trigger_event ::= UPDATE OF idlist */ + 0, /* (266) when_clause ::= */ + -2, /* (267) when_clause ::= WHEN expr */ + -3, /* (268) trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + -2, /* (269) trigger_cmd_list ::= trigger_cmd SEMI */ + -3, /* (270) trnm ::= nm DOT nm */ + -3, /* (271) tridxby ::= INDEXED BY nm */ + -2, /* (272) tridxby ::= NOT INDEXED */ + -9, /* (273) trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + -8, /* (274) trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + -6, /* (275) trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + -3, /* (276) trigger_cmd ::= scanpt select scanpt */ + -4, /* (277) expr ::= RAISE LP IGNORE RP */ + -6, /* (278) expr ::= RAISE LP raisetype COMMA nm RP */ + -1, /* (279) raisetype ::= ROLLBACK */ + -1, /* (280) raisetype ::= ABORT */ + -1, /* (281) raisetype ::= FAIL */ + -4, /* (282) cmd ::= DROP TRIGGER ifexists fullname */ + -6, /* (283) cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + -3, /* (284) cmd ::= DETACH database_kw_opt expr */ + 0, /* (285) key_opt ::= */ + -2, /* (286) key_opt ::= KEY expr */ + -1, /* (287) cmd ::= REINDEX */ + -3, /* (288) cmd ::= REINDEX nm dbnm */ + -1, /* (289) cmd ::= ANALYZE */ + -3, /* (290) cmd ::= ANALYZE nm dbnm */ + -6, /* (291) cmd ::= ALTER TABLE fullname RENAME TO nm */ + -7, /* (292) cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + -6, /* (293) cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + -1, /* (294) add_column_fullname ::= fullname */ + -8, /* (295) cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + -1, /* (296) cmd ::= create_vtab */ + -4, /* (297) cmd ::= create_vtab LP vtabarglist RP */ + -8, /* (298) create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + 0, /* (299) vtabarg ::= */ + -1, /* (300) vtabargtoken ::= ANY */ + -3, /* (301) vtabargtoken ::= lp anylist RP */ + -1, /* (302) lp ::= LP */ + -2, /* (303) with ::= WITH wqlist */ + -3, /* (304) with ::= WITH RECURSIVE wqlist */ + -1, /* (305) wqas ::= AS */ + -2, /* (306) wqas ::= AS MATERIALIZED */ + -3, /* (307) wqas ::= AS NOT MATERIALIZED */ + -6, /* (308) wqitem ::= nm eidlist_opt wqas LP select RP */ + -1, /* (309) wqlist ::= wqitem */ + -3, /* (310) wqlist ::= wqlist COMMA wqitem */ + -1, /* (311) windowdefn_list ::= windowdefn */ + -3, /* (312) windowdefn_list ::= windowdefn_list COMMA windowdefn */ + -5, /* (313) windowdefn ::= nm AS LP window RP */ + -5, /* (314) window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + -6, /* (315) window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + -4, /* (316) window ::= ORDER BY sortlist frame_opt */ + -5, /* (317) window ::= nm ORDER BY sortlist frame_opt */ + -1, /* (318) window ::= frame_opt */ + -2, /* (319) window ::= nm frame_opt */ + 0, /* (320) frame_opt ::= */ + -3, /* (321) frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + -6, /* (322) frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + -1, /* (323) range_or_rows ::= RANGE|ROWS|GROUPS */ + -1, /* (324) frame_bound_s ::= frame_bound */ + -2, /* (325) frame_bound_s ::= UNBOUNDED PRECEDING */ + -1, /* (326) frame_bound_e ::= frame_bound */ + -2, /* (327) frame_bound_e ::= UNBOUNDED FOLLOWING */ + -2, /* (328) frame_bound ::= expr PRECEDING|FOLLOWING */ + -2, /* (329) frame_bound ::= CURRENT ROW */ + 0, /* (330) frame_exclude_opt ::= */ + -2, /* (331) frame_exclude_opt ::= EXCLUDE frame_exclude */ + -2, /* (332) frame_exclude ::= NO OTHERS */ + -2, /* (333) frame_exclude ::= CURRENT ROW */ + -1, /* (334) frame_exclude ::= GROUP|TIES */ + -2, /* (335) window_clause ::= WINDOW windowdefn_list */ + -2, /* (336) filter_over ::= filter_clause over_clause */ + -1, /* (337) filter_over ::= over_clause */ + -1, /* (338) filter_over ::= filter_clause */ + -4, /* (339) over_clause ::= OVER LP window RP */ + -2, /* (340) over_clause ::= OVER nm */ + -5, /* (341) filter_clause ::= FILTER LP WHERE expr RP */ + -1, /* (342) input ::= cmdlist */ + -2, /* (343) cmdlist ::= cmdlist ecmd */ + -1, /* (344) cmdlist ::= ecmd */ + -1, /* (345) ecmd ::= SEMI */ + -2, /* (346) ecmd ::= cmdx SEMI */ + -3, /* (347) ecmd ::= explain cmdx SEMI */ + 0, /* (348) trans_opt ::= */ + -1, /* (349) trans_opt ::= TRANSACTION */ + -2, /* (350) trans_opt ::= TRANSACTION nm */ + -1, /* (351) savepoint_opt ::= SAVEPOINT */ + 0, /* (352) savepoint_opt ::= */ + -2, /* (353) cmd ::= create_table create_table_args */ + -1, /* (354) table_option_set ::= table_option */ + -4, /* (355) columnlist ::= columnlist COMMA columnname carglist */ + -2, /* (356) columnlist ::= columnname carglist */ + -1, /* (357) nm ::= ID|INDEXED */ + -1, /* (358) nm ::= STRING */ + -1, /* (359) nm ::= JOIN_KW */ + -1, /* (360) typetoken ::= typename */ + -1, /* (361) typename ::= ID|STRING */ + -1, /* (362) signed ::= plus_num */ + -1, /* (363) signed ::= minus_num */ + -2, /* (364) carglist ::= carglist ccons */ + 0, /* (365) carglist ::= */ + -2, /* (366) ccons ::= NULL onconf */ + -4, /* (367) ccons ::= GENERATED ALWAYS AS generated */ + -2, /* (368) ccons ::= AS generated */ + -2, /* (369) conslist_opt ::= COMMA conslist */ + -3, /* (370) conslist ::= conslist tconscomma tcons */ + -1, /* (371) conslist ::= tcons */ + 0, /* (372) tconscomma ::= */ + -1, /* (373) defer_subclause_opt ::= defer_subclause */ + -1, /* (374) resolvetype ::= raisetype */ + -1, /* (375) selectnowith ::= oneselect */ + -1, /* (376) oneselect ::= values */ + -2, /* (377) sclp ::= selcollist COMMA */ + -1, /* (378) as ::= ID|STRING */ + -1, /* (379) indexed_opt ::= indexed_by */ + 0, /* (380) returning ::= */ + -1, /* (381) expr ::= term */ + -1, /* (382) likeop ::= LIKE_KW|MATCH */ + -1, /* (383) exprlist ::= nexprlist */ + -1, /* (384) nmnum ::= plus_num */ + -1, /* (385) nmnum ::= nm */ + -1, /* (386) nmnum ::= ON */ + -1, /* (387) nmnum ::= DELETE */ + -1, /* (388) nmnum ::= DEFAULT */ + -1, /* (389) plus_num ::= INTEGER|FLOAT */ + 0, /* (390) foreach_clause ::= */ + -3, /* (391) foreach_clause ::= FOR EACH ROW */ + -1, /* (392) trnm ::= nm */ + 0, /* (393) tridxby ::= */ + -1, /* (394) database_kw_opt ::= DATABASE */ + 0, /* (395) database_kw_opt ::= */ + 0, /* (396) kwcolumn_opt ::= */ + -1, /* (397) kwcolumn_opt ::= COLUMNKW */ + -1, /* (398) vtabarglist ::= vtabarg */ + -3, /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ + -2, /* (400) vtabarg ::= vtabarg vtabargtoken */ + 0, /* (401) anylist ::= */ + -4, /* (402) anylist ::= anylist LP anylist RP */ + -2, /* (403) anylist ::= anylist ANY */ + 0, /* (404) with ::= */ }; static void yy_accept(yyParser*); /* Forward Declaration */ @@ -164992,7 +167124,7 @@ static YYACTIONTYPE yy_reduce( case 5: /* transtype ::= DEFERRED */ case 6: /* transtype ::= IMMEDIATE */ yytestcase(yyruleno==6); case 7: /* transtype ::= EXCLUSIVE */ yytestcase(yyruleno==7); - case 321: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==321); + case 323: /* range_or_rows ::= RANGE|ROWS|GROUPS */ yytestcase(yyruleno==323); {yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/} break; case 8: /* cmd ::= COMMIT|END trans_opt */ @@ -165029,7 +167161,7 @@ static YYACTIONTYPE yy_reduce( case 72: /* defer_subclause_opt ::= */ yytestcase(yyruleno==72); case 81: /* ifexists ::= */ yytestcase(yyruleno==81); case 98: /* distinct ::= */ yytestcase(yyruleno==98); - case 242: /* collate ::= */ yytestcase(yyruleno==242); + case 244: /* collate ::= */ yytestcase(yyruleno==244); {yymsp[1].minor.yy394 = 0;} break; case 16: /* ifnotexists ::= IF NOT EXISTS */ @@ -165213,9 +167345,9 @@ static YYACTIONTYPE yy_reduce( break; case 63: /* init_deferred_pred_opt ::= INITIALLY DEFERRED */ case 80: /* ifexists ::= IF EXISTS */ yytestcase(yyruleno==80); - case 214: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==214); - case 217: /* in_op ::= NOT IN */ yytestcase(yyruleno==217); - case 243: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==243); + case 216: /* between_op ::= NOT BETWEEN */ yytestcase(yyruleno==216); + case 219: /* in_op ::= NOT IN */ yytestcase(yyruleno==219); + case 245: /* collate ::= COLLATE ID|STRING */ yytestcase(yyruleno==245); {yymsp[-1].minor.yy394 = 1;} break; case 64: /* init_deferred_pred_opt ::= INITIALLY IMMEDIATE */ @@ -165300,7 +167432,7 @@ static YYACTIONTYPE yy_reduce( Token x; x.n = 0; parserDoubleLinkSelect(pParse, pRhs); - pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); + pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0); pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0); } if( pRhs ){ @@ -165365,9 +167497,9 @@ static YYACTIONTYPE yy_reduce( case 99: /* sclp ::= */ case 132: /* orderby_opt ::= */ yytestcase(yyruleno==132); case 142: /* groupby_opt ::= */ yytestcase(yyruleno==142); - case 230: /* exprlist ::= */ yytestcase(yyruleno==230); - case 233: /* paren_exprlist ::= */ yytestcase(yyruleno==233); - case 238: /* eidlist_opt ::= */ yytestcase(yyruleno==238); + case 232: /* exprlist ::= */ yytestcase(yyruleno==232); + case 235: /* paren_exprlist ::= */ yytestcase(yyruleno==235); + case 240: /* eidlist_opt ::= */ yytestcase(yyruleno==240); {yymsp[1].minor.yy322 = 0;} break; case 100: /* selcollist ::= sclp scanpt expr scanpt as */ @@ -165392,9 +167524,9 @@ static YYACTIONTYPE yy_reduce( } break; case 103: /* as ::= AS nm */ - case 114: /* dbnm ::= DOT nm */ yytestcase(yyruleno==114); - case 254: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==254); - case 255: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==255); + case 115: /* dbnm ::= DOT nm */ yytestcase(yyruleno==115); + case 256: /* plus_num ::= PLUS INTEGER|FLOAT */ yytestcase(yyruleno==256); + case 257: /* minus_num ::= MINUS INTEGER|FLOAT */ yytestcase(yyruleno==257); {yymsp[-1].minor.yy0 = yymsp[0].minor.yy0;} break; case 105: /* from ::= */ @@ -165404,7 +167536,7 @@ static YYACTIONTYPE yy_reduce( case 106: /* from ::= FROM seltablist */ { yymsp[-1].minor.yy131 = yymsp[0].minor.yy131; - sqlite3SrcListShiftJoinType(yymsp[-1].minor.yy131); + sqlite3SrcListShiftJoinType(pParse,yymsp[-1].minor.yy131); } break; case 107: /* stl_prefix ::= seltablist joinop */ @@ -165412,35 +167544,43 @@ static YYACTIONTYPE yy_reduce( if( ALWAYS(yymsp[-1].minor.yy131 && yymsp[-1].minor.yy131->nSrc>0) ) yymsp[-1].minor.yy131->a[yymsp[-1].minor.yy131->nSrc-1].fg.jointype = (u8)yymsp[0].minor.yy394; } break; - case 109: /* seltablist ::= stl_prefix nm dbnm as indexed_opt on_opt using_opt */ + case 109: /* seltablist ::= stl_prefix nm dbnm as on_using */ { - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,&yymsp[-5].minor.yy0,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - sqlite3SrcListIndexedBy(pParse, yymsp[-6].minor.yy131, &yymsp[-2].minor.yy0); + yymsp[-4].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-4].minor.yy131,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); } break; - case 110: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_opt using_opt */ + case 110: /* seltablist ::= stl_prefix nm dbnm as indexed_by on_using */ { - yymsp[-8].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-8].minor.yy131,&yymsp[-7].minor.yy0,&yymsp[-6].minor.yy0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - sqlite3SrcListFuncArgs(pParse, yymsp[-8].minor.yy131, yymsp[-4].minor.yy322); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-1].minor.yy0); } break; - case 111: /* seltablist ::= stl_prefix LP select RP as on_opt using_opt */ + case 111: /* seltablist ::= stl_prefix nm dbnm LP exprlist RP as on_using */ { - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,yymsp[-4].minor.yy47,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + yymsp[-7].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-7].minor.yy131,&yymsp[-6].minor.yy0,&yymsp[-5].minor.yy0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + sqlite3SrcListFuncArgs(pParse, yymsp[-7].minor.yy131, yymsp[-3].minor.yy322); +} + break; + case 112: /* seltablist ::= stl_prefix LP select RP as on_using */ +{ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,yymsp[-3].minor.yy47,&yymsp[0].minor.yy561); } break; - case 112: /* seltablist ::= stl_prefix LP seltablist RP as on_opt using_opt */ + case 113: /* seltablist ::= stl_prefix LP seltablist RP as on_using */ { - if( yymsp[-6].minor.yy131==0 && yymsp[-2].minor.yy0.n==0 && yymsp[-1].minor.yy528==0 && yymsp[0].minor.yy254==0 ){ - yymsp[-6].minor.yy131 = yymsp[-4].minor.yy131; - }else if( yymsp[-4].minor.yy131->nSrc==1 ){ - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,0,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); - if( yymsp[-6].minor.yy131 ){ - SrcItem *pNew = &yymsp[-6].minor.yy131->a[yymsp[-6].minor.yy131->nSrc-1]; - SrcItem *pOld = yymsp[-4].minor.yy131->a; + if( yymsp[-5].minor.yy131==0 && yymsp[-1].minor.yy0.n==0 && yymsp[0].minor.yy561.pOn==0 && yymsp[0].minor.yy561.pUsing==0 ){ + yymsp[-5].minor.yy131 = yymsp[-3].minor.yy131; + }else if( yymsp[-3].minor.yy131->nSrc==1 ){ + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,0,&yymsp[0].minor.yy561); + if( yymsp[-5].minor.yy131 ){ + SrcItem *pNew = &yymsp[-5].minor.yy131->a[yymsp[-5].minor.yy131->nSrc-1]; + SrcItem *pOld = yymsp[-3].minor.yy131->a; pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pNew->pSelect && (pNew->pSelect->selFlags & SF_NestedFrom)!=0 ){ + pNew->fg.isNestedFrom = 1; + } if( pOld->fg.isTabFunc ){ pNew->u1.pFuncArg = pOld->u1.pFuncArg; pOld->u1.pFuncArg = 0; @@ -165450,94 +167590,78 @@ static YYACTIONTYPE yy_reduce( pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } - sqlite3SrcListDelete(pParse->db, yymsp[-4].minor.yy131); + sqlite3SrcListDelete(pParse->db, yymsp[-3].minor.yy131); }else{ Select *pSubquery; - sqlite3SrcListShiftJoinType(yymsp[-4].minor.yy131); - pSubquery = sqlite3SelectNew(pParse,0,yymsp[-4].minor.yy131,0,0,0,0,SF_NestedFrom,0); - yymsp[-6].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-6].minor.yy131,0,0,&yymsp[-2].minor.yy0,pSubquery,yymsp[-1].minor.yy528,yymsp[0].minor.yy254); + sqlite3SrcListShiftJoinType(pParse,yymsp[-3].minor.yy131); + pSubquery = sqlite3SelectNew(pParse,0,yymsp[-3].minor.yy131,0,0,0,0,SF_NestedFrom,0); + yymsp[-5].minor.yy131 = sqlite3SrcListAppendFromTerm(pParse,yymsp[-5].minor.yy131,0,0,&yymsp[-1].minor.yy0,pSubquery,&yymsp[0].minor.yy561); } } break; - case 113: /* dbnm ::= */ - case 127: /* indexed_opt ::= */ yytestcase(yyruleno==127); + case 114: /* dbnm ::= */ + case 129: /* indexed_opt ::= */ yytestcase(yyruleno==129); {yymsp[1].minor.yy0.z=0; yymsp[1].minor.yy0.n=0;} break; - case 115: /* fullname ::= nm */ + case 116: /* fullname ::= nm */ { yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } yymsp[0].minor.yy131 = yylhsminor.yy131; break; - case 116: /* fullname ::= nm DOT nm */ + case 117: /* fullname ::= nm DOT nm */ { yylhsminor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); if( IN_RENAME_OBJECT && yylhsminor.yy131 ) sqlite3RenameTokenMap(pParse, yylhsminor.yy131->a[0].zName, &yymsp[0].minor.yy0); } yymsp[-2].minor.yy131 = yylhsminor.yy131; break; - case 117: /* xfullname ::= nm */ + case 118: /* xfullname ::= nm */ {yymsp[0].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[0].minor.yy0,0); /*A-overwrites-X*/} break; - case 118: /* xfullname ::= nm DOT nm */ + case 119: /* xfullname ::= nm DOT nm */ {yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0); /*A-overwrites-X*/} break; - case 119: /* xfullname ::= nm DOT nm AS nm */ + case 120: /* xfullname ::= nm DOT nm AS nm */ { yymsp[-4].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,&yymsp[-2].minor.yy0); /*A-overwrites-X*/ if( yymsp[-4].minor.yy131 ) yymsp[-4].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 120: /* xfullname ::= nm AS nm */ + case 121: /* xfullname ::= nm AS nm */ { yymsp[-2].minor.yy131 = sqlite3SrcListAppend(pParse,0,&yymsp[-2].minor.yy0,0); /*A-overwrites-X*/ if( yymsp[-2].minor.yy131 ) yymsp[-2].minor.yy131->a[0].zAlias = sqlite3NameFromToken(pParse->db, &yymsp[0].minor.yy0); } break; - case 121: /* joinop ::= COMMA|JOIN */ + case 122: /* joinop ::= COMMA|JOIN */ { yymsp[0].minor.yy394 = JT_INNER; } break; - case 122: /* joinop ::= JOIN_KW JOIN */ + case 123: /* joinop ::= JOIN_KW JOIN */ {yymsp[-1].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-1].minor.yy0,0,0); /*X-overwrites-A*/} break; - case 123: /* joinop ::= JOIN_KW nm JOIN */ + case 124: /* joinop ::= JOIN_KW nm JOIN */ {yymsp[-2].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0,0); /*X-overwrites-A*/} break; - case 124: /* joinop ::= JOIN_KW nm nm JOIN */ + case 125: /* joinop ::= JOIN_KW nm nm JOIN */ {yymsp[-3].minor.yy394 = sqlite3JoinType(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0);/*X-overwrites-A*/} break; - case 125: /* on_opt ::= ON expr */ - case 145: /* having_opt ::= HAVING expr */ yytestcase(yyruleno==145); - case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); - case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); - case 226: /* case_else ::= ELSE expr */ yytestcase(yyruleno==226); - case 247: /* vinto ::= INTO expr */ yytestcase(yyruleno==247); -{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + case 126: /* on_using ::= ON expr */ +{yymsp[-1].minor.yy561.pOn = yymsp[0].minor.yy528; yymsp[-1].minor.yy561.pUsing = 0;} break; - case 126: /* on_opt ::= */ - case 144: /* having_opt ::= */ yytestcase(yyruleno==144); - case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); - case 151: /* where_opt ::= */ yytestcase(yyruleno==151); - case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); - case 227: /* case_else ::= */ yytestcase(yyruleno==227); - case 229: /* case_operand ::= */ yytestcase(yyruleno==229); - case 248: /* vinto ::= */ yytestcase(yyruleno==248); -{yymsp[1].minor.yy528 = 0;} + case 127: /* on_using ::= USING LP idlist RP */ +{yymsp[-3].minor.yy561.pOn = 0; yymsp[-3].minor.yy561.pUsing = yymsp[-1].minor.yy254;} break; - case 128: /* indexed_opt ::= INDEXED BY nm */ + case 128: /* on_using ::= */ +{yymsp[1].minor.yy561.pOn = 0; yymsp[1].minor.yy561.pUsing = 0;} + break; + case 130: /* indexed_by ::= INDEXED BY nm */ {yymsp[-2].minor.yy0 = yymsp[0].minor.yy0;} break; - case 129: /* indexed_opt ::= NOT INDEXED */ + case 131: /* indexed_by ::= NOT INDEXED */ {yymsp[-1].minor.yy0.z=0; yymsp[-1].minor.yy0.n=1;} break; - case 130: /* using_opt ::= USING LP idlist RP */ -{yymsp[-3].minor.yy254 = yymsp[-1].minor.yy254;} - break; - case 131: /* using_opt ::= */ - case 173: /* idlist_opt ::= */ yytestcase(yyruleno==173); -{yymsp[1].minor.yy254 = 0;} - break; case 133: /* orderby_opt ::= ORDER BY sortlist */ case 143: /* groupby_opt ::= GROUP BY nexprlist */ yytestcase(yyruleno==143); {yymsp[-2].minor.yy322 = yymsp[0].minor.yy322;} @@ -165570,6 +167694,22 @@ static YYACTIONTYPE yy_reduce( case 140: /* nulls ::= NULLS LAST */ {yymsp[-1].minor.yy394 = SQLITE_SO_DESC;} break; + case 144: /* having_opt ::= */ + case 146: /* limit_opt ::= */ yytestcase(yyruleno==146); + case 151: /* where_opt ::= */ yytestcase(yyruleno==151); + case 153: /* where_opt_ret ::= */ yytestcase(yyruleno==153); + case 229: /* case_else ::= */ yytestcase(yyruleno==229); + case 231: /* case_operand ::= */ yytestcase(yyruleno==231); + case 250: /* vinto ::= */ yytestcase(yyruleno==250); +{yymsp[1].minor.yy528 = 0;} + break; + case 145: /* having_opt ::= HAVING expr */ + case 152: /* where_opt ::= WHERE expr */ yytestcase(yyruleno==152); + case 154: /* where_opt_ret ::= WHERE expr */ yytestcase(yyruleno==154); + case 228: /* case_else ::= ELSE expr */ yytestcase(yyruleno==228); + case 249: /* vinto ::= INTO expr */ yytestcase(yyruleno==249); +{yymsp[-1].minor.yy528 = yymsp[0].minor.yy528;} + break; case 147: /* limit_opt ::= LIMIT expr */ {yymsp[-1].minor.yy528 = sqlite3PExpr(pParse,TK_LIMIT,yymsp[0].minor.yy528,0);} break; @@ -165595,7 +167735,18 @@ static YYACTIONTYPE yy_reduce( { sqlite3SrcListIndexedBy(pParse, yymsp[-5].minor.yy131, &yymsp[-4].minor.yy0); sqlite3ExprListCheckLength(pParse,yymsp[-2].minor.yy322,"set list"); - yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, yymsp[-1].minor.yy131); + if( yymsp[-1].minor.yy131 ){ + SrcList *pFromClause = yymsp[-1].minor.yy131; + if( pFromClause->nSrc>1 ){ + Select *pSubquery; + Token as; + pSubquery = sqlite3SelectNew(pParse,0,pFromClause,0,0,0,0,SF_NestedFrom,0); + as.n = 0; + as.z = 0; + pFromClause = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&as,pSubquery,0); + } + yymsp[-5].minor.yy131 = sqlite3SrcListAppendList(pParse, yymsp[-5].minor.yy131, pFromClause); + } sqlite3Update(pParse,yymsp[-5].minor.yy131,yymsp[-2].minor.yy322,yymsp[0].minor.yy528,yymsp[-6].minor.yy394,0,0,0); } break; @@ -165653,6 +167804,9 @@ static YYACTIONTYPE yy_reduce( case 170: /* returning ::= RETURNING selcollist */ {sqlite3AddReturning(pParse,yymsp[0].minor.yy322);} break; + case 173: /* idlist_opt ::= */ +{yymsp[1].minor.yy254 = 0;} + break; case 174: /* idlist_opt ::= LP idlist RP */ {yymsp[-2].minor.yy254 = yymsp[-1].minor.yy254;} break; @@ -165838,17 +167992,29 @@ static YYACTIONTYPE yy_reduce( binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-3].minor.yy528, TK_NOTNULL); } break; - case 209: /* expr ::= NOT expr */ - case 210: /* expr ::= BITNOT expr */ yytestcase(yyruleno==210); + case 209: /* expr ::= expr IS NOT DISTINCT FROM expr */ +{ + yymsp[-5].minor.yy528 = sqlite3PExpr(pParse,TK_IS,yymsp[-5].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-5].minor.yy528, TK_ISNULL); +} + break; + case 210: /* expr ::= expr IS DISTINCT FROM expr */ +{ + yymsp[-4].minor.yy528 = sqlite3PExpr(pParse,TK_ISNOT,yymsp[-4].minor.yy528,yymsp[0].minor.yy528); + binaryToUnaryIfNull(pParse, yymsp[0].minor.yy528, yymsp[-4].minor.yy528, TK_NOTNULL); +} + break; + case 211: /* expr ::= NOT expr */ + case 212: /* expr ::= BITNOT expr */ yytestcase(yyruleno==212); {yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major, yymsp[0].minor.yy528, 0);/*A-overwrites-B*/} break; - case 211: /* expr ::= PLUS|MINUS expr */ + case 213: /* expr ::= PLUS|MINUS expr */ { yymsp[-1].minor.yy528 = sqlite3PExpr(pParse, yymsp[-1].major==TK_PLUS ? TK_UPLUS : TK_UMINUS, yymsp[0].minor.yy528, 0); /*A-overwrites-B*/ } break; - case 212: /* expr ::= expr PTR expr */ + case 214: /* expr ::= expr PTR expr */ { ExprList *pList = sqlite3ExprListAppend(pParse, 0, yymsp[-2].minor.yy528); pList = sqlite3ExprListAppend(pParse, pList, yymsp[0].minor.yy528); @@ -165856,11 +168022,11 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy528 = yylhsminor.yy528; break; - case 213: /* between_op ::= BETWEEN */ - case 216: /* in_op ::= IN */ yytestcase(yyruleno==216); + case 215: /* between_op ::= BETWEEN */ + case 218: /* in_op ::= IN */ yytestcase(yyruleno==218); {yymsp[0].minor.yy394 = 0;} break; - case 215: /* expr ::= expr between_op expr AND expr */ + case 217: /* expr ::= expr between_op expr AND expr */ { ExprList *pList = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); pList = sqlite3ExprListAppend(pParse,pList, yymsp[0].minor.yy528); @@ -165873,7 +168039,7 @@ static YYACTIONTYPE yy_reduce( if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 218: /* expr ::= expr in_op LP exprlist RP */ + case 220: /* expr ::= expr in_op LP exprlist RP */ { if( yymsp[-1].minor.yy322==0 ){ /* Expressions of the form @@ -165885,7 +168051,8 @@ static YYACTIONTYPE yy_reduce( ** regardless of the value of expr1. */ sqlite3ExprUnmapAndDelete(pParse, yymsp[-4].minor.yy528); - yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_INTEGER, yymsp[-3].minor.yy394 ? "1" : "0"); + yymsp[-4].minor.yy528 = sqlite3Expr(pParse->db, TK_STRING, yymsp[-3].minor.yy394 ? "true" : "false"); + if( yymsp[-4].minor.yy528 ) sqlite3ExprIdToTrueFalse(yymsp[-4].minor.yy528); }else{ Expr *pRHS = yymsp[-1].minor.yy322->a[0].pExpr; if( yymsp[-1].minor.yy322->nExpr==1 && sqlite3ExprIsConstant(pRHS) && yymsp[-4].minor.yy528->op!=TK_VECTOR ){ @@ -165913,20 +168080,20 @@ static YYACTIONTYPE yy_reduce( } } break; - case 219: /* expr ::= LP select RP */ + case 221: /* expr ::= LP select RP */ { yymsp[-2].minor.yy528 = sqlite3PExpr(pParse, TK_SELECT, 0, 0); sqlite3PExprAddSelect(pParse, yymsp[-2].minor.yy528, yymsp[-1].minor.yy47); } break; - case 220: /* expr ::= expr in_op LP select RP */ + case 222: /* expr ::= expr in_op LP select RP */ { yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_IN, yymsp[-4].minor.yy528, 0); sqlite3PExprAddSelect(pParse, yymsp[-4].minor.yy528, yymsp[-1].minor.yy47); if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 221: /* expr ::= expr in_op nm dbnm paren_exprlist */ + case 223: /* expr ::= expr in_op nm dbnm paren_exprlist */ { SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&yymsp[-2].minor.yy0,&yymsp[-1].minor.yy0); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); @@ -165936,14 +168103,14 @@ static YYACTIONTYPE yy_reduce( if( yymsp[-3].minor.yy394 ) yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_NOT, yymsp[-4].minor.yy528, 0); } break; - case 222: /* expr ::= EXISTS LP select RP */ + case 224: /* expr ::= EXISTS LP select RP */ { Expr *p; p = yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_EXISTS, 0, 0); sqlite3PExprAddSelect(pParse, p, yymsp[-1].minor.yy47); } break; - case 223: /* expr ::= CASE case_operand case_exprlist case_else END */ + case 225: /* expr ::= CASE case_operand case_exprlist case_else END */ { yymsp[-4].minor.yy528 = sqlite3PExpr(pParse, TK_CASE, yymsp[-3].minor.yy528, 0); if( yymsp[-4].minor.yy528 ){ @@ -165955,32 +168122,32 @@ static YYACTIONTYPE yy_reduce( } } break; - case 224: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ + case 226: /* case_exprlist ::= case_exprlist WHEN expr THEN expr */ { yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[-2].minor.yy528); yymsp[-4].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-4].minor.yy322, yymsp[0].minor.yy528); } break; - case 225: /* case_exprlist ::= WHEN expr THEN expr */ + case 227: /* case_exprlist ::= WHEN expr THEN expr */ { yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,0, yymsp[-2].minor.yy528); yymsp[-3].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-3].minor.yy322, yymsp[0].minor.yy528); } break; - case 228: /* case_operand ::= expr */ + case 230: /* case_operand ::= expr */ {yymsp[0].minor.yy528 = yymsp[0].minor.yy528; /*A-overwrites-X*/} break; - case 231: /* nexprlist ::= nexprlist COMMA expr */ + case 233: /* nexprlist ::= nexprlist COMMA expr */ {yymsp[-2].minor.yy322 = sqlite3ExprListAppend(pParse,yymsp[-2].minor.yy322,yymsp[0].minor.yy528);} break; - case 232: /* nexprlist ::= expr */ + case 234: /* nexprlist ::= expr */ {yymsp[0].minor.yy322 = sqlite3ExprListAppend(pParse,0,yymsp[0].minor.yy528); /*A-overwrites-Y*/} break; - case 234: /* paren_exprlist ::= LP exprlist RP */ - case 239: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==239); + case 236: /* paren_exprlist ::= LP exprlist RP */ + case 241: /* eidlist_opt ::= LP eidlist RP */ yytestcase(yyruleno==241); {yymsp[-2].minor.yy322 = yymsp[-1].minor.yy322;} break; - case 235: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ + case 237: /* cmd ::= createkw uniqueflag INDEX ifnotexists nm dbnm ON nm LP sortlist RP where_opt */ { sqlite3CreateIndex(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, sqlite3SrcListAppend(pParse,0,&yymsp[-4].minor.yy0,0), yymsp[-2].minor.yy322, yymsp[-10].minor.yy394, @@ -165990,48 +168157,48 @@ static YYACTIONTYPE yy_reduce( } } break; - case 236: /* uniqueflag ::= UNIQUE */ - case 278: /* raisetype ::= ABORT */ yytestcase(yyruleno==278); + case 238: /* uniqueflag ::= UNIQUE */ + case 280: /* raisetype ::= ABORT */ yytestcase(yyruleno==280); {yymsp[0].minor.yy394 = OE_Abort;} break; - case 237: /* uniqueflag ::= */ + case 239: /* uniqueflag ::= */ {yymsp[1].minor.yy394 = OE_None;} break; - case 240: /* eidlist ::= eidlist COMMA nm collate sortorder */ + case 242: /* eidlist ::= eidlist COMMA nm collate sortorder */ { yymsp[-4].minor.yy322 = parserAddExprIdListTerm(pParse, yymsp[-4].minor.yy322, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); } break; - case 241: /* eidlist ::= nm collate sortorder */ + case 243: /* eidlist ::= nm collate sortorder */ { yymsp[-2].minor.yy322 = parserAddExprIdListTerm(pParse, 0, &yymsp[-2].minor.yy0, yymsp[-1].minor.yy394, yymsp[0].minor.yy394); /*A-overwrites-Y*/ } break; - case 244: /* cmd ::= DROP INDEX ifexists fullname */ + case 246: /* cmd ::= DROP INDEX ifexists fullname */ {sqlite3DropIndex(pParse, yymsp[0].minor.yy131, yymsp[-1].minor.yy394);} break; - case 245: /* cmd ::= VACUUM vinto */ + case 247: /* cmd ::= VACUUM vinto */ {sqlite3Vacuum(pParse,0,yymsp[0].minor.yy528);} break; - case 246: /* cmd ::= VACUUM nm vinto */ + case 248: /* cmd ::= VACUUM nm vinto */ {sqlite3Vacuum(pParse,&yymsp[-1].minor.yy0,yymsp[0].minor.yy528);} break; - case 249: /* cmd ::= PRAGMA nm dbnm */ + case 251: /* cmd ::= PRAGMA nm dbnm */ {sqlite3Pragma(pParse,&yymsp[-1].minor.yy0,&yymsp[0].minor.yy0,0,0);} break; - case 250: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ + case 252: /* cmd ::= PRAGMA nm dbnm EQ nmnum */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,0);} break; - case 251: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ + case 253: /* cmd ::= PRAGMA nm dbnm LP nmnum RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,0);} break; - case 252: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ + case 254: /* cmd ::= PRAGMA nm dbnm EQ minus_num */ {sqlite3Pragma(pParse,&yymsp[-3].minor.yy0,&yymsp[-2].minor.yy0,&yymsp[0].minor.yy0,1);} break; - case 253: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ + case 255: /* cmd ::= PRAGMA nm dbnm LP minus_num RP */ {sqlite3Pragma(pParse,&yymsp[-4].minor.yy0,&yymsp[-3].minor.yy0,&yymsp[-1].minor.yy0,1);} break; - case 256: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ + case 258: /* cmd ::= createkw trigger_decl BEGIN trigger_cmd_list END */ { Token all; all.z = yymsp[-3].minor.yy0.z; @@ -166039,50 +168206,50 @@ static YYACTIONTYPE yy_reduce( sqlite3FinishTrigger(pParse, yymsp[-1].minor.yy33, &all); } break; - case 257: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ + case 259: /* trigger_decl ::= temp TRIGGER ifnotexists nm dbnm trigger_time trigger_event ON fullname foreach_clause when_clause */ { sqlite3BeginTrigger(pParse, &yymsp[-7].minor.yy0, &yymsp[-6].minor.yy0, yymsp[-5].minor.yy394, yymsp[-4].minor.yy180.a, yymsp[-4].minor.yy180.b, yymsp[-2].minor.yy131, yymsp[0].minor.yy528, yymsp[-10].minor.yy394, yymsp[-8].minor.yy394); yymsp[-10].minor.yy0 = (yymsp[-6].minor.yy0.n==0?yymsp[-7].minor.yy0:yymsp[-6].minor.yy0); /*A-overwrites-T*/ } break; - case 258: /* trigger_time ::= BEFORE|AFTER */ + case 260: /* trigger_time ::= BEFORE|AFTER */ { yymsp[0].minor.yy394 = yymsp[0].major; /*A-overwrites-X*/ } break; - case 259: /* trigger_time ::= INSTEAD OF */ + case 261: /* trigger_time ::= INSTEAD OF */ { yymsp[-1].minor.yy394 = TK_INSTEAD;} break; - case 260: /* trigger_time ::= */ + case 262: /* trigger_time ::= */ { yymsp[1].minor.yy394 = TK_BEFORE; } break; - case 261: /* trigger_event ::= DELETE|INSERT */ - case 262: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==262); + case 263: /* trigger_event ::= DELETE|INSERT */ + case 264: /* trigger_event ::= UPDATE */ yytestcase(yyruleno==264); {yymsp[0].minor.yy180.a = yymsp[0].major; /*A-overwrites-X*/ yymsp[0].minor.yy180.b = 0;} break; - case 263: /* trigger_event ::= UPDATE OF idlist */ + case 265: /* trigger_event ::= UPDATE OF idlist */ {yymsp[-2].minor.yy180.a = TK_UPDATE; yymsp[-2].minor.yy180.b = yymsp[0].minor.yy254;} break; - case 264: /* when_clause ::= */ - case 283: /* key_opt ::= */ yytestcase(yyruleno==283); + case 266: /* when_clause ::= */ + case 285: /* key_opt ::= */ yytestcase(yyruleno==285); { yymsp[1].minor.yy528 = 0; } break; - case 265: /* when_clause ::= WHEN expr */ - case 284: /* key_opt ::= KEY expr */ yytestcase(yyruleno==284); + case 267: /* when_clause ::= WHEN expr */ + case 286: /* key_opt ::= KEY expr */ yytestcase(yyruleno==286); { yymsp[-1].minor.yy528 = yymsp[0].minor.yy528; } break; - case 266: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ + case 268: /* trigger_cmd_list ::= trigger_cmd_list trigger_cmd SEMI */ { assert( yymsp[-2].minor.yy33!=0 ); yymsp[-2].minor.yy33->pLast->pNext = yymsp[-1].minor.yy33; yymsp[-2].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 267: /* trigger_cmd_list ::= trigger_cmd SEMI */ + case 269: /* trigger_cmd_list ::= trigger_cmd SEMI */ { assert( yymsp[-1].minor.yy33!=0 ); yymsp[-1].minor.yy33->pLast = yymsp[-1].minor.yy33; } break; - case 268: /* trnm ::= nm DOT nm */ + case 270: /* trnm ::= nm DOT nm */ { yymsp[-2].minor.yy0 = yymsp[0].minor.yy0; sqlite3ErrorMsg(pParse, @@ -166090,39 +168257,39 @@ static YYACTIONTYPE yy_reduce( "statements within triggers"); } break; - case 269: /* tridxby ::= INDEXED BY nm */ + case 271: /* tridxby ::= INDEXED BY nm */ { sqlite3ErrorMsg(pParse, "the INDEXED BY clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 270: /* tridxby ::= NOT INDEXED */ + case 272: /* tridxby ::= NOT INDEXED */ { sqlite3ErrorMsg(pParse, "the NOT INDEXED clause is not allowed on UPDATE or DELETE statements " "within triggers"); } break; - case 271: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ + case 273: /* trigger_cmd ::= UPDATE orconf trnm tridxby SET setlist from where_opt scanpt */ {yylhsminor.yy33 = sqlite3TriggerUpdateStep(pParse, &yymsp[-6].minor.yy0, yymsp[-2].minor.yy131, yymsp[-3].minor.yy322, yymsp[-1].minor.yy528, yymsp[-7].minor.yy394, yymsp[-8].minor.yy0.z, yymsp[0].minor.yy522);} yymsp[-8].minor.yy33 = yylhsminor.yy33; break; - case 272: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ + case 274: /* trigger_cmd ::= scanpt insert_cmd INTO trnm idlist_opt select upsert scanpt */ { yylhsminor.yy33 = sqlite3TriggerInsertStep(pParse,&yymsp[-4].minor.yy0,yymsp[-3].minor.yy254,yymsp[-2].minor.yy47,yymsp[-6].minor.yy394,yymsp[-1].minor.yy444,yymsp[-7].minor.yy522,yymsp[0].minor.yy522);/*yylhsminor.yy33-overwrites-yymsp[-6].minor.yy394*/ } yymsp[-7].minor.yy33 = yylhsminor.yy33; break; - case 273: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ + case 275: /* trigger_cmd ::= DELETE FROM trnm tridxby where_opt scanpt */ {yylhsminor.yy33 = sqlite3TriggerDeleteStep(pParse, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy528, yymsp[-5].minor.yy0.z, yymsp[0].minor.yy522);} yymsp[-5].minor.yy33 = yylhsminor.yy33; break; - case 274: /* trigger_cmd ::= scanpt select scanpt */ + case 276: /* trigger_cmd ::= scanpt select scanpt */ {yylhsminor.yy33 = sqlite3TriggerSelectStep(pParse->db, yymsp[-1].minor.yy47, yymsp[-2].minor.yy522, yymsp[0].minor.yy522); /*yylhsminor.yy33-overwrites-yymsp[-1].minor.yy47*/} yymsp[-2].minor.yy33 = yylhsminor.yy33; break; - case 275: /* expr ::= RAISE LP IGNORE RP */ + case 277: /* expr ::= RAISE LP IGNORE RP */ { yymsp[-3].minor.yy528 = sqlite3PExpr(pParse, TK_RAISE, 0, 0); if( yymsp[-3].minor.yy528 ){ @@ -166130,7 +168297,7 @@ static YYACTIONTYPE yy_reduce( } } break; - case 276: /* expr ::= RAISE LP raisetype COMMA nm RP */ + case 278: /* expr ::= RAISE LP raisetype COMMA nm RP */ { yymsp[-5].minor.yy528 = sqlite3ExprAlloc(pParse->db, TK_RAISE, &yymsp[-1].minor.yy0, 1); if( yymsp[-5].minor.yy528 ) { @@ -166138,118 +168305,118 @@ static YYACTIONTYPE yy_reduce( } } break; - case 277: /* raisetype ::= ROLLBACK */ + case 279: /* raisetype ::= ROLLBACK */ {yymsp[0].minor.yy394 = OE_Rollback;} break; - case 279: /* raisetype ::= FAIL */ + case 281: /* raisetype ::= FAIL */ {yymsp[0].minor.yy394 = OE_Fail;} break; - case 280: /* cmd ::= DROP TRIGGER ifexists fullname */ + case 282: /* cmd ::= DROP TRIGGER ifexists fullname */ { sqlite3DropTrigger(pParse,yymsp[0].minor.yy131,yymsp[-1].minor.yy394); } break; - case 281: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ + case 283: /* cmd ::= ATTACH database_kw_opt expr AS expr key_opt */ { sqlite3Attach(pParse, yymsp[-3].minor.yy528, yymsp[-1].minor.yy528, yymsp[0].minor.yy528); } break; - case 282: /* cmd ::= DETACH database_kw_opt expr */ + case 284: /* cmd ::= DETACH database_kw_opt expr */ { sqlite3Detach(pParse, yymsp[0].minor.yy528); } break; - case 285: /* cmd ::= REINDEX */ + case 287: /* cmd ::= REINDEX */ {sqlite3Reindex(pParse, 0, 0);} break; - case 286: /* cmd ::= REINDEX nm dbnm */ + case 288: /* cmd ::= REINDEX nm dbnm */ {sqlite3Reindex(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 287: /* cmd ::= ANALYZE */ + case 289: /* cmd ::= ANALYZE */ {sqlite3Analyze(pParse, 0, 0);} break; - case 288: /* cmd ::= ANALYZE nm dbnm */ + case 290: /* cmd ::= ANALYZE nm dbnm */ {sqlite3Analyze(pParse, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0);} break; - case 289: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ + case 291: /* cmd ::= ALTER TABLE fullname RENAME TO nm */ { sqlite3AlterRenameTable(pParse,yymsp[-3].minor.yy131,&yymsp[0].minor.yy0); } break; - case 290: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ + case 292: /* cmd ::= ALTER TABLE add_column_fullname ADD kwcolumn_opt columnname carglist */ { yymsp[-1].minor.yy0.n = (int)(pParse->sLastToken.z-yymsp[-1].minor.yy0.z) + pParse->sLastToken.n; sqlite3AlterFinishAddColumn(pParse, &yymsp[-1].minor.yy0); } break; - case 291: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ + case 293: /* cmd ::= ALTER TABLE fullname DROP kwcolumn_opt nm */ { sqlite3AlterDropColumn(pParse, yymsp[-3].minor.yy131, &yymsp[0].minor.yy0); } break; - case 292: /* add_column_fullname ::= fullname */ + case 294: /* add_column_fullname ::= fullname */ { disableLookaside(pParse); sqlite3AlterBeginAddColumn(pParse, yymsp[0].minor.yy131); } break; - case 293: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ + case 295: /* cmd ::= ALTER TABLE fullname RENAME kwcolumn_opt nm TO nm */ { sqlite3AlterRenameColumn(pParse, yymsp[-5].minor.yy131, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); } break; - case 294: /* cmd ::= create_vtab */ + case 296: /* cmd ::= create_vtab */ {sqlite3VtabFinishParse(pParse,0);} break; - case 295: /* cmd ::= create_vtab LP vtabarglist RP */ + case 297: /* cmd ::= create_vtab LP vtabarglist RP */ {sqlite3VtabFinishParse(pParse,&yymsp[0].minor.yy0);} break; - case 296: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ + case 298: /* create_vtab ::= createkw VIRTUAL TABLE ifnotexists nm dbnm USING nm */ { sqlite3VtabBeginParse(pParse, &yymsp[-3].minor.yy0, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-4].minor.yy394); } break; - case 297: /* vtabarg ::= */ + case 299: /* vtabarg ::= */ {sqlite3VtabArgInit(pParse);} break; - case 298: /* vtabargtoken ::= ANY */ - case 299: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==299); - case 300: /* lp ::= LP */ yytestcase(yyruleno==300); + case 300: /* vtabargtoken ::= ANY */ + case 301: /* vtabargtoken ::= lp anylist RP */ yytestcase(yyruleno==301); + case 302: /* lp ::= LP */ yytestcase(yyruleno==302); {sqlite3VtabArgExtend(pParse,&yymsp[0].minor.yy0);} break; - case 301: /* with ::= WITH wqlist */ - case 302: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==302); + case 303: /* with ::= WITH wqlist */ + case 304: /* with ::= WITH RECURSIVE wqlist */ yytestcase(yyruleno==304); { sqlite3WithPush(pParse, yymsp[0].minor.yy521, 1); } break; - case 303: /* wqas ::= AS */ + case 305: /* wqas ::= AS */ {yymsp[0].minor.yy516 = M10d_Any;} break; - case 304: /* wqas ::= AS MATERIALIZED */ + case 306: /* wqas ::= AS MATERIALIZED */ {yymsp[-1].minor.yy516 = M10d_Yes;} break; - case 305: /* wqas ::= AS NOT MATERIALIZED */ + case 307: /* wqas ::= AS NOT MATERIALIZED */ {yymsp[-2].minor.yy516 = M10d_No;} break; - case 306: /* wqitem ::= nm eidlist_opt wqas LP select RP */ + case 308: /* wqitem ::= nm eidlist_opt wqas LP select RP */ { yymsp[-5].minor.yy385 = sqlite3CteNew(pParse, &yymsp[-5].minor.yy0, yymsp[-4].minor.yy322, yymsp[-1].minor.yy47, yymsp[-3].minor.yy516); /*A-overwrites-X*/ } break; - case 307: /* wqlist ::= wqitem */ + case 309: /* wqlist ::= wqitem */ { yymsp[0].minor.yy521 = sqlite3WithAdd(pParse, 0, yymsp[0].minor.yy385); /*A-overwrites-X*/ } break; - case 308: /* wqlist ::= wqlist COMMA wqitem */ + case 310: /* wqlist ::= wqlist COMMA wqitem */ { yymsp[-2].minor.yy521 = sqlite3WithAdd(pParse, yymsp[-2].minor.yy521, yymsp[0].minor.yy385); } break; - case 309: /* windowdefn_list ::= windowdefn */ + case 311: /* windowdefn_list ::= windowdefn */ { yylhsminor.yy41 = yymsp[0].minor.yy41; } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 310: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ + case 312: /* windowdefn_list ::= windowdefn_list COMMA windowdefn */ { assert( yymsp[0].minor.yy41!=0 ); sqlite3WindowChain(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy41); @@ -166258,7 +168425,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 311: /* windowdefn ::= nm AS LP window RP */ + case 313: /* windowdefn ::= nm AS LP window RP */ { if( ALWAYS(yymsp[-1].minor.yy41) ){ yymsp[-1].minor.yy41->zName = sqlite3DbStrNDup(pParse->db, yymsp[-4].minor.yy0.z, yymsp[-4].minor.yy0.n); @@ -166267,90 +168434,90 @@ static YYACTIONTYPE yy_reduce( } yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 312: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ + case 314: /* window ::= PARTITION BY nexprlist orderby_opt frame_opt */ { yymsp[-4].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, 0); } break; - case 313: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ + case 315: /* window ::= nm PARTITION BY nexprlist orderby_opt frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, yymsp[-2].minor.yy322, yymsp[-1].minor.yy322, &yymsp[-5].minor.yy0); } yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 314: /* window ::= ORDER BY sortlist frame_opt */ + case 316: /* window ::= ORDER BY sortlist frame_opt */ { yymsp[-3].minor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, 0); } break; - case 315: /* window ::= nm ORDER BY sortlist frame_opt */ + case 317: /* window ::= nm ORDER BY sortlist frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, yymsp[-1].minor.yy322, &yymsp[-4].minor.yy0); } yymsp[-4].minor.yy41 = yylhsminor.yy41; break; - case 316: /* window ::= frame_opt */ - case 335: /* filter_over ::= over_clause */ yytestcase(yyruleno==335); + case 318: /* window ::= frame_opt */ + case 337: /* filter_over ::= over_clause */ yytestcase(yyruleno==337); { yylhsminor.yy41 = yymsp[0].minor.yy41; } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 317: /* window ::= nm frame_opt */ + case 319: /* window ::= nm frame_opt */ { yylhsminor.yy41 = sqlite3WindowAssemble(pParse, yymsp[0].minor.yy41, 0, 0, &yymsp[-1].minor.yy0); } yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 318: /* frame_opt ::= */ + case 320: /* frame_opt ::= */ { yymsp[1].minor.yy41 = sqlite3WindowAlloc(pParse, 0, TK_UNBOUNDED, 0, TK_CURRENT, 0, 0); } break; - case 319: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ + case 321: /* frame_opt ::= range_or_rows frame_bound_s frame_exclude_opt */ { yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-2].minor.yy394, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, TK_CURRENT, 0, yymsp[0].minor.yy516); } yymsp[-2].minor.yy41 = yylhsminor.yy41; break; - case 320: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ + case 322: /* frame_opt ::= range_or_rows BETWEEN frame_bound_s AND frame_bound_e frame_exclude_opt */ { yylhsminor.yy41 = sqlite3WindowAlloc(pParse, yymsp[-5].minor.yy394, yymsp[-3].minor.yy595.eType, yymsp[-3].minor.yy595.pExpr, yymsp[-1].minor.yy595.eType, yymsp[-1].minor.yy595.pExpr, yymsp[0].minor.yy516); } yymsp[-5].minor.yy41 = yylhsminor.yy41; break; - case 322: /* frame_bound_s ::= frame_bound */ - case 324: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==324); + case 324: /* frame_bound_s ::= frame_bound */ + case 326: /* frame_bound_e ::= frame_bound */ yytestcase(yyruleno==326); {yylhsminor.yy595 = yymsp[0].minor.yy595;} yymsp[0].minor.yy595 = yylhsminor.yy595; break; - case 323: /* frame_bound_s ::= UNBOUNDED PRECEDING */ - case 325: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==325); - case 327: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==327); + case 325: /* frame_bound_s ::= UNBOUNDED PRECEDING */ + case 327: /* frame_bound_e ::= UNBOUNDED FOLLOWING */ yytestcase(yyruleno==327); + case 329: /* frame_bound ::= CURRENT ROW */ yytestcase(yyruleno==329); {yylhsminor.yy595.eType = yymsp[-1].major; yylhsminor.yy595.pExpr = 0;} yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 326: /* frame_bound ::= expr PRECEDING|FOLLOWING */ + case 328: /* frame_bound ::= expr PRECEDING|FOLLOWING */ {yylhsminor.yy595.eType = yymsp[0].major; yylhsminor.yy595.pExpr = yymsp[-1].minor.yy528;} yymsp[-1].minor.yy595 = yylhsminor.yy595; break; - case 328: /* frame_exclude_opt ::= */ + case 330: /* frame_exclude_opt ::= */ {yymsp[1].minor.yy516 = 0;} break; - case 329: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ + case 331: /* frame_exclude_opt ::= EXCLUDE frame_exclude */ {yymsp[-1].minor.yy516 = yymsp[0].minor.yy516;} break; - case 330: /* frame_exclude ::= NO OTHERS */ - case 331: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==331); + case 332: /* frame_exclude ::= NO OTHERS */ + case 333: /* frame_exclude ::= CURRENT ROW */ yytestcase(yyruleno==333); {yymsp[-1].minor.yy516 = yymsp[-1].major; /*A-overwrites-X*/} break; - case 332: /* frame_exclude ::= GROUP|TIES */ + case 334: /* frame_exclude ::= GROUP|TIES */ {yymsp[0].minor.yy516 = yymsp[0].major; /*A-overwrites-X*/} break; - case 333: /* window_clause ::= WINDOW windowdefn_list */ + case 335: /* window_clause ::= WINDOW windowdefn_list */ { yymsp[-1].minor.yy41 = yymsp[0].minor.yy41; } break; - case 334: /* filter_over ::= filter_clause over_clause */ + case 336: /* filter_over ::= filter_clause over_clause */ { if( yymsp[0].minor.yy41 ){ yymsp[0].minor.yy41->pFilter = yymsp[-1].minor.yy528; @@ -166361,7 +168528,7 @@ static YYACTIONTYPE yy_reduce( } yymsp[-1].minor.yy41 = yylhsminor.yy41; break; - case 336: /* filter_over ::= filter_clause */ + case 338: /* filter_over ::= filter_clause */ { yylhsminor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( yylhsminor.yy41 ){ @@ -166373,13 +168540,13 @@ static YYACTIONTYPE yy_reduce( } yymsp[0].minor.yy41 = yylhsminor.yy41; break; - case 337: /* over_clause ::= OVER LP window RP */ + case 339: /* over_clause ::= OVER LP window RP */ { yymsp[-3].minor.yy41 = yymsp[-1].minor.yy41; assert( yymsp[-3].minor.yy41!=0 ); } break; - case 338: /* over_clause ::= OVER nm */ + case 340: /* over_clause ::= OVER nm */ { yymsp[-1].minor.yy41 = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window)); if( yymsp[-1].minor.yy41 ){ @@ -166387,72 +168554,73 @@ static YYACTIONTYPE yy_reduce( } } break; - case 339: /* filter_clause ::= FILTER LP WHERE expr RP */ + case 341: /* filter_clause ::= FILTER LP WHERE expr RP */ { yymsp[-4].minor.yy528 = yymsp[-1].minor.yy528; } break; default: - /* (340) input ::= cmdlist */ yytestcase(yyruleno==340); - /* (341) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==341); - /* (342) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=342); - /* (343) ecmd ::= SEMI */ yytestcase(yyruleno==343); - /* (344) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==344); - /* (345) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=345); - /* (346) trans_opt ::= */ yytestcase(yyruleno==346); - /* (347) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==347); - /* (348) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==348); - /* (349) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==349); - /* (350) savepoint_opt ::= */ yytestcase(yyruleno==350); - /* (351) cmd ::= create_table create_table_args */ yytestcase(yyruleno==351); - /* (352) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=352); - /* (353) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==353); - /* (354) columnlist ::= columnname carglist */ yytestcase(yyruleno==354); - /* (355) nm ::= ID|INDEXED */ yytestcase(yyruleno==355); - /* (356) nm ::= STRING */ yytestcase(yyruleno==356); - /* (357) nm ::= JOIN_KW */ yytestcase(yyruleno==357); - /* (358) typetoken ::= typename */ yytestcase(yyruleno==358); - /* (359) typename ::= ID|STRING */ yytestcase(yyruleno==359); - /* (360) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=360); - /* (361) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=361); - /* (362) carglist ::= carglist ccons */ yytestcase(yyruleno==362); - /* (363) carglist ::= */ yytestcase(yyruleno==363); - /* (364) ccons ::= NULL onconf */ yytestcase(yyruleno==364); - /* (365) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==365); - /* (366) ccons ::= AS generated */ yytestcase(yyruleno==366); - /* (367) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==367); - /* (368) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==368); - /* (369) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=369); - /* (370) tconscomma ::= */ yytestcase(yyruleno==370); - /* (371) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=371); - /* (372) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=372); - /* (373) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=373); - /* (374) oneselect ::= values */ yytestcase(yyruleno==374); - /* (375) sclp ::= selcollist COMMA */ yytestcase(yyruleno==375); - /* (376) as ::= ID|STRING */ yytestcase(yyruleno==376); - /* (377) returning ::= */ yytestcase(yyruleno==377); - /* (378) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=378); - /* (379) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==379); - /* (380) exprlist ::= nexprlist */ yytestcase(yyruleno==380); - /* (381) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=381); - /* (382) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=382); - /* (383) nmnum ::= ON */ yytestcase(yyruleno==383); - /* (384) nmnum ::= DELETE */ yytestcase(yyruleno==384); - /* (385) nmnum ::= DEFAULT */ yytestcase(yyruleno==385); - /* (386) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==386); - /* (387) foreach_clause ::= */ yytestcase(yyruleno==387); - /* (388) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==388); - /* (389) trnm ::= nm */ yytestcase(yyruleno==389); - /* (390) tridxby ::= */ yytestcase(yyruleno==390); - /* (391) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==391); - /* (392) database_kw_opt ::= */ yytestcase(yyruleno==392); - /* (393) kwcolumn_opt ::= */ yytestcase(yyruleno==393); - /* (394) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==394); - /* (395) vtabarglist ::= vtabarg */ yytestcase(yyruleno==395); - /* (396) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==396); - /* (397) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==397); - /* (398) anylist ::= */ yytestcase(yyruleno==398); - /* (399) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==399); - /* (400) anylist ::= anylist ANY */ yytestcase(yyruleno==400); - /* (401) with ::= */ yytestcase(yyruleno==401); + /* (342) input ::= cmdlist */ yytestcase(yyruleno==342); + /* (343) cmdlist ::= cmdlist ecmd */ yytestcase(yyruleno==343); + /* (344) cmdlist ::= ecmd (OPTIMIZED OUT) */ assert(yyruleno!=344); + /* (345) ecmd ::= SEMI */ yytestcase(yyruleno==345); + /* (346) ecmd ::= cmdx SEMI */ yytestcase(yyruleno==346); + /* (347) ecmd ::= explain cmdx SEMI (NEVER REDUCES) */ assert(yyruleno!=347); + /* (348) trans_opt ::= */ yytestcase(yyruleno==348); + /* (349) trans_opt ::= TRANSACTION */ yytestcase(yyruleno==349); + /* (350) trans_opt ::= TRANSACTION nm */ yytestcase(yyruleno==350); + /* (351) savepoint_opt ::= SAVEPOINT */ yytestcase(yyruleno==351); + /* (352) savepoint_opt ::= */ yytestcase(yyruleno==352); + /* (353) cmd ::= create_table create_table_args */ yytestcase(yyruleno==353); + /* (354) table_option_set ::= table_option (OPTIMIZED OUT) */ assert(yyruleno!=354); + /* (355) columnlist ::= columnlist COMMA columnname carglist */ yytestcase(yyruleno==355); + /* (356) columnlist ::= columnname carglist */ yytestcase(yyruleno==356); + /* (357) nm ::= ID|INDEXED */ yytestcase(yyruleno==357); + /* (358) nm ::= STRING */ yytestcase(yyruleno==358); + /* (359) nm ::= JOIN_KW */ yytestcase(yyruleno==359); + /* (360) typetoken ::= typename */ yytestcase(yyruleno==360); + /* (361) typename ::= ID|STRING */ yytestcase(yyruleno==361); + /* (362) signed ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=362); + /* (363) signed ::= minus_num (OPTIMIZED OUT) */ assert(yyruleno!=363); + /* (364) carglist ::= carglist ccons */ yytestcase(yyruleno==364); + /* (365) carglist ::= */ yytestcase(yyruleno==365); + /* (366) ccons ::= NULL onconf */ yytestcase(yyruleno==366); + /* (367) ccons ::= GENERATED ALWAYS AS generated */ yytestcase(yyruleno==367); + /* (368) ccons ::= AS generated */ yytestcase(yyruleno==368); + /* (369) conslist_opt ::= COMMA conslist */ yytestcase(yyruleno==369); + /* (370) conslist ::= conslist tconscomma tcons */ yytestcase(yyruleno==370); + /* (371) conslist ::= tcons (OPTIMIZED OUT) */ assert(yyruleno!=371); + /* (372) tconscomma ::= */ yytestcase(yyruleno==372); + /* (373) defer_subclause_opt ::= defer_subclause (OPTIMIZED OUT) */ assert(yyruleno!=373); + /* (374) resolvetype ::= raisetype (OPTIMIZED OUT) */ assert(yyruleno!=374); + /* (375) selectnowith ::= oneselect (OPTIMIZED OUT) */ assert(yyruleno!=375); + /* (376) oneselect ::= values */ yytestcase(yyruleno==376); + /* (377) sclp ::= selcollist COMMA */ yytestcase(yyruleno==377); + /* (378) as ::= ID|STRING */ yytestcase(yyruleno==378); + /* (379) indexed_opt ::= indexed_by (OPTIMIZED OUT) */ assert(yyruleno!=379); + /* (380) returning ::= */ yytestcase(yyruleno==380); + /* (381) expr ::= term (OPTIMIZED OUT) */ assert(yyruleno!=381); + /* (382) likeop ::= LIKE_KW|MATCH */ yytestcase(yyruleno==382); + /* (383) exprlist ::= nexprlist */ yytestcase(yyruleno==383); + /* (384) nmnum ::= plus_num (OPTIMIZED OUT) */ assert(yyruleno!=384); + /* (385) nmnum ::= nm (OPTIMIZED OUT) */ assert(yyruleno!=385); + /* (386) nmnum ::= ON */ yytestcase(yyruleno==386); + /* (387) nmnum ::= DELETE */ yytestcase(yyruleno==387); + /* (388) nmnum ::= DEFAULT */ yytestcase(yyruleno==388); + /* (389) plus_num ::= INTEGER|FLOAT */ yytestcase(yyruleno==389); + /* (390) foreach_clause ::= */ yytestcase(yyruleno==390); + /* (391) foreach_clause ::= FOR EACH ROW */ yytestcase(yyruleno==391); + /* (392) trnm ::= nm */ yytestcase(yyruleno==392); + /* (393) tridxby ::= */ yytestcase(yyruleno==393); + /* (394) database_kw_opt ::= DATABASE */ yytestcase(yyruleno==394); + /* (395) database_kw_opt ::= */ yytestcase(yyruleno==395); + /* (396) kwcolumn_opt ::= */ yytestcase(yyruleno==396); + /* (397) kwcolumn_opt ::= COLUMNKW */ yytestcase(yyruleno==397); + /* (398) vtabarglist ::= vtabarg */ yytestcase(yyruleno==398); + /* (399) vtabarglist ::= vtabarglist COMMA vtabarg */ yytestcase(yyruleno==399); + /* (400) vtabarg ::= vtabarg vtabargtoken */ yytestcase(yyruleno==400); + /* (401) anylist ::= */ yytestcase(yyruleno==401); + /* (402) anylist ::= anylist LP anylist RP */ yytestcase(yyruleno==402); + /* (403) anylist ::= anylist ANY */ yytestcase(yyruleno==403); + /* (404) with ::= */ yytestcase(yyruleno==404); break; /********** End reduce actions ************************************************/ }; @@ -167899,6 +170067,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ mxSqlLen -= n; if( mxSqlLen<0 ){ pParse->rc = SQLITE_TOOBIG; + pParse->nErr++; break; } #ifndef SQLITE_OMIT_WINDOWFUNC @@ -167995,7 +170164,7 @@ SQLITE_PRIVATE int sqlite3RunParser(Parse *pParse, const char *zSql){ if( pParse->pNewTrigger && !IN_RENAME_OBJECT ){ sqlite3DeleteTrigger(db, pParse->pNewTrigger); } - sqlite3DbFree(db, pParse->pVList); + if( pParse->pVList ) sqlite3DbFreeNN(db, pParse->pVList); db->pParse = pParentParse; assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; @@ -172624,6 +174793,28 @@ SQLITE_API int sqlite3_test_control(int op, ...){ volatile int x = 0; assert( /*side-effects-ok*/ (x = va_arg(ap,int))!=0 ); rc = x; +#if defined(SQLITE_DEBUG) + /* Invoke these debugging routines so that the compiler does not + ** issue "defined but not used" warnings. */ + if( x==9999 ){ + sqlite3ShowExpr(0); + sqlite3ShowExpr(0); + sqlite3ShowExprList(0); + sqlite3ShowIdList(0); + sqlite3ShowSrcList(0); + sqlite3ShowWith(0); + sqlite3ShowUpsert(0); + sqlite3ShowTriggerStep(0); + sqlite3ShowTriggerStepList(0); + sqlite3ShowTrigger(0); + sqlite3ShowTriggerList(0); +#ifndef SQLITE_OMIT_WINDOWFUNC + sqlite3ShowWindow(0); + sqlite3ShowWinFunc(0); +#endif + sqlite3ShowSelect(0); + } +#endif break; } @@ -172885,8 +175076,8 @@ SQLITE_API int sqlite3_test_control(int op, ...){ ** ** "ptr" is a pointer to a u32. ** - ** op==0 Store the current sqlite3SelectTrace in *ptr - ** op==1 Set sqlite3SelectTrace to the value *ptr + ** op==0 Store the current sqlite3TreeTrace in *ptr + ** op==1 Set sqlite3TreeTrace to the value *ptr ** op==3 Store the current sqlite3WhereTrace in *ptr ** op==3 Set sqlite3WhereTrace to the value *ptr */ @@ -172894,10 +175085,10 @@ SQLITE_API int sqlite3_test_control(int op, ...){ int opTrace = va_arg(ap, int); u32 *ptr = va_arg(ap, u32*); switch( opTrace ){ - case 0: *ptr = sqlite3SelectTrace; break; - case 1: sqlite3SelectTrace = *ptr; break; - case 2: *ptr = sqlite3WhereTrace; break; - case 3: sqlite3WhereTrace = *ptr; break; + case 0: *ptr = sqlite3TreeTrace; break; + case 1: sqlite3TreeTrace = *ptr; break; + case 2: *ptr = sqlite3WhereTrace; break; + case 3: sqlite3WhereTrace = *ptr; break; } break; } @@ -172914,10 +175105,12 @@ SQLITE_API int sqlite3_test_control(int op, ...){ case SQLITE_TESTCTRL_LOGEST: { double rIn = va_arg(ap, double); LogEst rLogEst = sqlite3LogEstFromDouble(rIn); - u64 iInt = sqlite3LogEstToInt(rLogEst); - va_arg(ap, int*)[0] = rLogEst; - va_arg(ap, u64*)[0] = iInt; - va_arg(ap, int*)[0] = sqlite3LogEst(iInt); + int *pI1 = va_arg(ap,int*); + u64 *pU64 = va_arg(ap,u64*); + int *pI2 = va_arg(ap,int*); + *pI1 = rLogEst; + *pU64 = sqlite3LogEstToInt(rLogEst); + *pI2 = sqlite3LogEst(*pU64); break; } @@ -173132,6 +175325,24 @@ SQLITE_PRIVATE Btree *sqlite3DbNameToBtree(sqlite3 *db, const char *zDbName){ return iDb<0 ? 0 : db->aDb[iDb].pBt; } +/* +** Return the name of the N-th database schema. Return NULL if N is out +** of range. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N){ +#ifdef SQLITE_ENABLE_API_ARMOR + if( !sqlite3SafetyCheckOk(db) ){ + (void)SQLITE_MISUSE_BKPT; + return 0; + } +#endif + if( N<0 || N>=db->nDb ){ + return 0; + }else{ + return db->aDb[N].zDbSName; + } +} + /* ** Return the filename of the database associated with a database ** connection. @@ -174819,7 +177030,7 @@ struct Fts3MultiSegReader { int nAdvance; /* How many seg-readers to advance */ Fts3SegFilter *pFilter; /* Pointer to filter object */ char *aBuffer; /* Buffer to merge doclists in */ - int nBuffer; /* Allocated size of aBuffer[] in bytes */ + i64 nBuffer; /* Allocated size of aBuffer[] in bytes */ int iColFilter; /* If >=0, filter for this column */ int bRestart; @@ -177515,7 +179726,7 @@ static int fts3TermSelectMerge( ** ** Similar padding is added in the fts3DoclistOrMerge() function. */ - pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); + pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1); pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); @@ -178935,8 +181146,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ char *aPoslist = 0; /* Position list for deferred tokens */ int nPoslist = 0; /* Number of bytes in aPoslist */ int iPrev = -1; /* Token number of previous deferred token */ - - assert( pPhrase->doclist.bFreeList==0 ); + char *aFree = (pPhrase->doclist.bFreeList ? pPhrase->doclist.pList : 0); for(iToken=0; iTokennToken; iToken++){ Fts3PhraseToken *pToken = &pPhrase->aToken[iToken]; @@ -178950,6 +181160,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ if( pList==0 ){ sqlite3_free(aPoslist); + sqlite3_free(aFree); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; return SQLITE_OK; @@ -178970,6 +181181,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ nPoslist = (int)(aOut - aPoslist); if( nPoslist==0 ){ sqlite3_free(aPoslist); + sqlite3_free(aFree); pPhrase->doclist.pList = 0; pPhrase->doclist.nList = 0; return SQLITE_OK; @@ -179002,13 +181214,14 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ nDistance = iPrev - nMaxUndeferred; } - aOut = (char *)sqlite3_malloc(nPoslist+8); + aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING); if( !aOut ){ sqlite3_free(aPoslist); return SQLITE_NOMEM; } pPhrase->doclist.pList = aOut; + assert( p1 && p2 ); if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){ pPhrase->doclist.bFreeList = 1; pPhrase->doclist.nList = (int)(aOut - pPhrase->doclist.pList); @@ -179021,6 +181234,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){ } } + if( pPhrase->doclist.pList!=aFree ) sqlite3_free(aFree); return SQLITE_OK; } #endif /* SQLITE_DISABLE_FTS4_DEFERRED */ @@ -179369,7 +181583,7 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); + char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); @@ -180195,11 +182409,10 @@ static int fts3EvalTestExpr( default: { #ifndef SQLITE_DISABLE_FTS4_DEFERRED - if( pCsr->pDeferred - && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred) - ){ + if( pCsr->pDeferred && (pExpr->bDeferred || ( + pExpr->iDocid==pCsr->iPrevId && pExpr->pPhrase->doclist.pList + ))){ Fts3Phrase *pPhrase = pExpr->pPhrase; - assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 ); if( pExpr->bDeferred ){ fts3EvalInvalidatePoslist(pPhrase); } @@ -183606,7 +185819,7 @@ static int porterNext( if( n>c->nAllocated ){ char *pNew; c->nAllocated = n+20; - pNew = sqlite3_realloc(c->zToken, c->nAllocated); + pNew = sqlite3_realloc64(c->zToken, c->nAllocated); if( !pNew ) return SQLITE_NOMEM; c->zToken = pNew; } @@ -184358,7 +186571,7 @@ static int simpleNext( if( n>c->nTokenAllocated ){ char *pNew; c->nTokenAllocated = n+20; - pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); + pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated); if( !pNew ) return SQLITE_NOMEM; c->pToken = pNew; } @@ -185520,7 +187733,7 @@ static int fts3PendingListAppendVarint( /* Allocate or grow the PendingList as required. */ if( !p ){ - p = sqlite3_malloc(sizeof(*p) + 100); + p = sqlite3_malloc64(sizeof(*p) + 100); if( !p ){ return SQLITE_NOMEM; } @@ -185529,14 +187742,14 @@ static int fts3PendingListAppendVarint( p->nData = 0; } else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ - int nNew = p->nSpace * 2; - p = sqlite3_realloc(p, sizeof(*p) + nNew); + i64 nNew = p->nSpace * 2; + p = sqlite3_realloc64(p, sizeof(*p) + nNew); if( !p ){ sqlite3_free(*pp); *pp = 0; return SQLITE_NOMEM; } - p->nSpace = nNew; + p->nSpace = (int)nNew; p->aData = (char *)&p[1]; } @@ -186093,7 +188306,7 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock( int nByte = sqlite3_blob_bytes(p->pSegments); *pnBlob = nByte; if( paBlob ){ - char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); + char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); if( !aByte ){ rc = SQLITE_NOMEM; }else{ @@ -186210,7 +188423,7 @@ static int fts3SegReaderNext( int nTerm = fts3HashKeysize(pElem); if( (nTerm+1)>pReader->nTermAlloc ){ sqlite3_free(pReader->zTerm); - pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); + pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2); if( !pReader->zTerm ) return SQLITE_NOMEM; pReader->nTermAlloc = (nTerm+1)*2; } @@ -186218,7 +188431,7 @@ static int fts3SegReaderNext( pReader->zTerm[nTerm] = '\0'; pReader->nTerm = nTerm; - aCopy = (char*)sqlite3_malloc(nCopy); + aCopy = (char*)sqlite3_malloc64(nCopy); if( !aCopy ) return SQLITE_NOMEM; memcpy(aCopy, pList->aData, nCopy); pReader->nNode = pReader->nDoclist = nCopy; @@ -186505,7 +188718,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( nExtra = nRoot + FTS3_NODE_PADDING; } - pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); + pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); if( !pReader ){ return SQLITE_NOMEM; } @@ -186597,7 +188810,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( if( nElem==nAlloc ){ Fts3HashElem **aElem2; nAlloc += 16; - aElem2 = (Fts3HashElem **)sqlite3_realloc( + aElem2 = (Fts3HashElem **)sqlite3_realloc64( aElem, nAlloc*sizeof(Fts3HashElem *) ); if( !aElem2 ){ @@ -186931,7 +189144,7 @@ static int fts3NodeAddTerm( ** this is not expected to be a serious problem. */ assert( pTree->aData==(char *)&pTree[1] ); - pTree->aData = (char *)sqlite3_malloc(nReq); + pTree->aData = (char *)sqlite3_malloc64(nReq); if( !pTree->aData ){ return SQLITE_NOMEM; } @@ -186949,7 +189162,7 @@ static int fts3NodeAddTerm( if( isCopyTerm ){ if( pTree->nMalloczMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -186975,7 +189188,7 @@ static int fts3NodeAddTerm( ** now. Instead, the term is inserted into the parent of pTree. If pTree ** has no parent, one is created here. */ - pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); + pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize); if( !pNew ){ return SQLITE_NOMEM; } @@ -187113,7 +189326,7 @@ static int fts3SegWriterAdd( ){ int nPrefix; /* Size of term prefix in bytes */ int nSuffix; /* Size of term suffix in bytes */ - int nReq; /* Number of bytes required on leaf page */ + i64 nReq; /* Number of bytes required on leaf page */ int nData; SegmentWriter *pWriter = *ppWriter; @@ -187122,13 +189335,13 @@ static int fts3SegWriterAdd( sqlite3_stmt *pStmt; /* Allocate the SegmentWriter structure */ - pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); + pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter)); if( !pWriter ) return SQLITE_NOMEM; memset(pWriter, 0, sizeof(SegmentWriter)); *ppWriter = pWriter; /* Allocate a buffer in which to accumulate data */ - pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); + pWriter->aData = (char *)sqlite3_malloc64(p->nNodeSize); if( !pWriter->aData ) return SQLITE_NOMEM; pWriter->nSize = p->nNodeSize; @@ -187203,7 +189416,7 @@ static int fts3SegWriterAdd( ** the buffer to make it large enough. */ if( nReq>pWriter->nSize ){ - char *aNew = sqlite3_realloc(pWriter->aData, nReq); + char *aNew = sqlite3_realloc64(pWriter->aData, nReq); if( !aNew ) return SQLITE_NOMEM; pWriter->aData = aNew; pWriter->nSize = nReq; @@ -187228,7 +189441,7 @@ static int fts3SegWriterAdd( */ if( isCopyTerm ){ if( nTerm>pWriter->nMalloc ){ - char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); + char *zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm*2); if( !zNew ){ return SQLITE_NOMEM; } @@ -187536,12 +189749,12 @@ static void fts3ColumnFilter( static int fts3MsrBufferData( Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */ char *pList, - int nList + i64 nList ){ if( nList>pMsr->nBuffer ){ char *pNew; pMsr->nBuffer = nList*2; - pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); + pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); if( !pNew ) return SQLITE_NOMEM; pMsr->aBuffer = pNew; } @@ -187597,7 +189810,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pMsr, pList, nList+1); + rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1); if( rc!=SQLITE_OK ) return rc; assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); pList = pMsr->aBuffer; @@ -187734,11 +189947,11 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ return SQLITE_OK; } -static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){ +static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ if( nReq>pCsr->nBuffer ){ char *aNew; pCsr->nBuffer = nReq*2; - aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); + aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer); if( !aNew ){ return SQLITE_NOMEM; } @@ -187829,7 +190042,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( ){ pCsr->nDoclist = apSegment[0]->nDoclist; if( fts3SegReaderIsPending(apSegment[0]) ){ - rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); + rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, + (i64)pCsr->nDoclist); pCsr->aDoclist = pCsr->aBuffer; }else{ pCsr->aDoclist = apSegment[0]->aDoclist; @@ -187882,7 +190096,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); - rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, + (i64)nByte+nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; if( isFirst ){ @@ -187908,7 +190123,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( fts3SegReaderSort(apSegment, nMerge, j, xCmp); } if( nDoclist>0 ){ - rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING); + rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING); if( rc ) return rc; memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); pCsr->aDoclist = pCsr->aBuffer; @@ -188621,7 +190836,7 @@ struct NodeReader { static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ int nAlloc = nMin; - char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); + char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc); if( a ){ pBlob->nAlloc = nAlloc; pBlob->a = a; @@ -188770,6 +190985,8 @@ static int fts3IncrmergePush( pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nPrefix); } pBlk->n += sqlite3Fts3PutVarint(&pBlk->a[pBlk->n], nSuffix); + assert( nPrefix+nSuffix<=nTerm ); + assert( nPrefix>=0 ); memcpy(&pBlk->a[pBlk->n], &zTerm[nPrefix], nSuffix); pBlk->n += nSuffix; @@ -188892,6 +191109,7 @@ static int fts3IncrmergeAppend( pLeaf = &pWriter->aNodeWriter[0]; nPrefix = fts3PrefixCompress(pLeaf->key.a, pLeaf->key.n, zTerm, nTerm); nSuffix = nTerm - nPrefix; + if(nSuffix<=0 ) return FTS_CORRUPT_VTAB; nSpace = sqlite3Fts3VarintLen(nPrefix); nSpace += sqlite3Fts3VarintLen(nSuffix) + nSuffix; @@ -189415,7 +191633,7 @@ static int fts3RepackSegdirLevel( if( nIdx>=nAlloc ){ int *aNew; nAlloc += 16; - aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); + aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int)); if( !aNew ){ rc = SQLITE_NOMEM; break; @@ -189789,7 +192007,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ /* Allocate space for the cursor, filter and writer objects */ const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); - pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); + pWriter = (IncrmergeWriter *)sqlite3_malloc64(nAlloc); if( !pWriter ) return SQLITE_NOMEM; pFilter = (Fts3SegFilter *)&pWriter[1]; pCsr = (Fts3MultiSegReader *)&pFilter[1]; @@ -190425,7 +192643,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( return SQLITE_OK; } - pRet = (char *)sqlite3_malloc(p->pList->nData); + pRet = (char *)sqlite3_malloc64(p->pList->nData); if( !pRet ) return SQLITE_NOMEM; nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); @@ -190445,7 +192663,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( int iCol /* Column that token must appear in (or -1) */ ){ Fts3DeferredToken *pDeferred; - pDeferred = sqlite3_malloc(sizeof(*pDeferred)); + pDeferred = sqlite3_malloc64(sizeof(*pDeferred)); if( !pDeferred ){ return SQLITE_NOMEM; } @@ -194849,7 +197067,7 @@ static JsonNode *jsonMergePatch( if( pPatch->eType!=JSON_OBJECT ){ return pPatch; } - assert( iTarget>=0 && iTargetnNode ); + assert( iTargetnNode ); pTarget = &pParse->aNode[iTarget]; assert( (pPatch->jnFlags & JNODE_APPEND)==0 ); if( pTarget->eType!=JSON_OBJECT ){ @@ -202024,7 +204242,7 @@ static int geopolyUpdate( sqlite3_free(p); nChange = 1; } - for(jj=1; jjnAux; jj++){ + for(jj=1; jjorderByConsumed = 1; } - sqlite3VtabWriteAll(pIdxInfo); + sqlite3VtabUsesAllSchemas(pIdxInfo); return SQLITE_OK; } @@ -210345,7 +212564,7 @@ static int dbpageUpdate( goto update_fail; } pBt = pTab->db->aDb[iDb].pBt; - if( pgno<1 || pBt==0 || pgno>(int)sqlite3BtreeLastPage(pBt) ){ + if( pgno<1 || pBt==0 || pgno>sqlite3BtreeLastPage(pBt) ){ zErr = "bad page number"; goto update_fail; } @@ -222895,6 +225114,9 @@ static Fts5ExprNearset *sqlite3Fts5ParseNearset( }else{ if( pRet->nPhrase>0 ){ Fts5ExprPhrase *pLast = pRet->apPhrase[pRet->nPhrase-1]; + assert( pParse!=0 ); + assert( pParse->apPhrase!=0 ); + assert( pParse->nPhrase>=2 ); assert( pLast==pParse->apPhrase[pParse->nPhrase-2] ); if( pPhrase->nTerm==0 ){ fts5ExprPhraseFree(pPhrase); @@ -225194,7 +227416,7 @@ struct Fts5Index { sqlite3_stmt *pWriter; /* "INSERT ... %_data VALUES(?,?)" */ sqlite3_stmt *pDeleter; /* "DELETE FROM %_data ... id>=? AND id<=?" */ sqlite3_stmt *pIdxWriter; /* "INSERT ... %_idx VALUES(?,?,?,?)" */ - sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=? */ + sqlite3_stmt *pIdxDeleter; /* "DELETE FROM %_idx WHERE segid=?" */ sqlite3_stmt *pIdxSelect; int nRead; /* Total number of blocks read */ @@ -234511,7 +236733,7 @@ static void fts5SourceIdFunc( ){ assert( nArg==0 ); UNUSED_PARAM2(nArg, apUnused); - sqlite3_result_text(pCtx, "fts5: 2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe", -1, SQLITE_TRANSIENT); + sqlite3_result_text(pCtx, "fts5: 2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309", -1, SQLITE_TRANSIENT); } /* @@ -239182,6 +241404,16 @@ SQLITE_EXTENSION_INIT1 #ifndef SQLITE_OMIT_VIRTUALTABLE + +#define STMT_NUM_INTEGER_COLUMN 10 +typedef struct StmtRow StmtRow; +struct StmtRow { + sqlite3_int64 iRowid; /* Rowid value */ + char *zSql; /* column "sql" */ + int aCol[STMT_NUM_INTEGER_COLUMN+1]; /* all other column values */ + StmtRow *pNext; /* Next row to return */ +}; + /* stmt_vtab is a subclass of sqlite3_vtab which will ** serve as the underlying representation of a stmt virtual table */ @@ -239199,8 +241431,7 @@ typedef struct stmt_cursor stmt_cursor; struct stmt_cursor { sqlite3_vtab_cursor base; /* Base class - must be first */ sqlite3 *db; /* Database connection for this cursor */ - sqlite3_stmt *pStmt; /* Statement cursor is currently pointing at */ - sqlite3_int64 iRowid; /* The rowid */ + StmtRow *pRow; /* Current row */ }; /* @@ -239244,7 +241475,7 @@ static int stmtConnect( "CREATE TABLE x(sql,ncol,ro,busy,nscan,nsort,naidx,nstep," "reprep,run,mem)"); if( rc==SQLITE_OK ){ - pNew = sqlite3_malloc( sizeof(*pNew) ); + pNew = sqlite3_malloc64( sizeof(*pNew) ); *ppVtab = (sqlite3_vtab*)pNew; if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(*pNew)); @@ -239266,7 +241497,7 @@ static int stmtDisconnect(sqlite3_vtab *pVtab){ */ static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ stmt_cursor *pCur; - pCur = sqlite3_malloc( sizeof(*pCur) ); + pCur = sqlite3_malloc64( sizeof(*pCur) ); if( pCur==0 ) return SQLITE_NOMEM; memset(pCur, 0, sizeof(*pCur)); pCur->db = ((stmt_vtab*)p)->db; @@ -239274,10 +241505,21 @@ static int stmtOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ return SQLITE_OK; } +static void stmtCsrReset(stmt_cursor *pCur){ + StmtRow *pRow = 0; + StmtRow *pNext = 0; + for(pRow=pCur->pRow; pRow; pRow=pNext){ + pNext = pRow->pNext; + sqlite3_free(pRow); + } + pCur->pRow = 0; +} + /* ** Destructor for a stmt_cursor. */ static int stmtClose(sqlite3_vtab_cursor *cur){ + stmtCsrReset((stmt_cursor*)cur); sqlite3_free(cur); return SQLITE_OK; } @@ -239288,8 +241530,9 @@ static int stmtClose(sqlite3_vtab_cursor *cur){ */ static int stmtNext(sqlite3_vtab_cursor *cur){ stmt_cursor *pCur = (stmt_cursor*)cur; - pCur->iRowid++; - pCur->pStmt = sqlite3_next_stmt(pCur->db, pCur->pStmt); + StmtRow *pNext = pCur->pRow->pNext; + sqlite3_free(pCur->pRow); + pCur->pRow = pNext; return SQLITE_OK; } @@ -239303,39 +241546,11 @@ static int stmtColumn( int i /* Which column to return */ ){ stmt_cursor *pCur = (stmt_cursor*)cur; - switch( i ){ - case STMT_COLUMN_SQL: { - sqlite3_result_text(ctx, sqlite3_sql(pCur->pStmt), -1, SQLITE_TRANSIENT); - break; - } - case STMT_COLUMN_NCOL: { - sqlite3_result_int(ctx, sqlite3_column_count(pCur->pStmt)); - break; - } - case STMT_COLUMN_RO: { - sqlite3_result_int(ctx, sqlite3_stmt_readonly(pCur->pStmt)); - break; - } - case STMT_COLUMN_BUSY: { - sqlite3_result_int(ctx, sqlite3_stmt_busy(pCur->pStmt)); - break; - } - default: { - assert( i==STMT_COLUMN_MEM ); - i = SQLITE_STMTSTATUS_MEMUSED + - STMT_COLUMN_NSCAN - SQLITE_STMTSTATUS_FULLSCAN_STEP; - /* Fall thru */ - } - case STMT_COLUMN_NSCAN: - case STMT_COLUMN_NSORT: - case STMT_COLUMN_NAIDX: - case STMT_COLUMN_NSTEP: - case STMT_COLUMN_REPREP: - case STMT_COLUMN_RUN: { - sqlite3_result_int(ctx, sqlite3_stmt_status(pCur->pStmt, - i-STMT_COLUMN_NSCAN+SQLITE_STMTSTATUS_FULLSCAN_STEP, 0)); - break; - } + StmtRow *pRow = pCur->pRow; + if( i==STMT_COLUMN_SQL ){ + sqlite3_result_text(ctx, pRow->zSql, -1, SQLITE_TRANSIENT); + }else{ + sqlite3_result_int(ctx, pRow->aCol[i]); } return SQLITE_OK; } @@ -239346,7 +241561,7 @@ static int stmtColumn( */ static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ stmt_cursor *pCur = (stmt_cursor*)cur; - *pRowid = pCur->iRowid; + *pRowid = pCur->pRow->iRowid; return SQLITE_OK; } @@ -239356,7 +241571,7 @@ static int stmtRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ */ static int stmtEof(sqlite3_vtab_cursor *cur){ stmt_cursor *pCur = (stmt_cursor*)cur; - return pCur->pStmt==0; + return pCur->pRow==0; } /* @@ -239371,9 +241586,53 @@ static int stmtFilter( int argc, sqlite3_value **argv ){ stmt_cursor *pCur = (stmt_cursor *)pVtabCursor; - pCur->pStmt = 0; - pCur->iRowid = 0; - return stmtNext(pVtabCursor); + sqlite3_stmt *p = 0; + sqlite3_int64 iRowid = 1; + StmtRow **ppRow = 0; + + stmtCsrReset(pCur); + ppRow = &pCur->pRow; + for(p=sqlite3_next_stmt(pCur->db, 0); p; p=sqlite3_next_stmt(pCur->db, p)){ + const char *zSql = sqlite3_sql(p); + sqlite3_int64 nSql = zSql ? strlen(zSql)+1 : 0; + StmtRow *pNew = (StmtRow*)sqlite3_malloc64(sizeof(StmtRow) + nSql); + + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(StmtRow)); + if( zSql ){ + pNew->zSql = (char*)&pNew[1]; + memcpy(pNew->zSql, zSql, nSql); + } + pNew->aCol[STMT_COLUMN_NCOL] = sqlite3_column_count(p); + pNew->aCol[STMT_COLUMN_RO] = sqlite3_stmt_readonly(p); + pNew->aCol[STMT_COLUMN_BUSY] = sqlite3_stmt_busy(p); + pNew->aCol[STMT_COLUMN_NSCAN] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_FULLSCAN_STEP, 0 + ); + pNew->aCol[STMT_COLUMN_NSORT] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_SORT, 0 + ); + pNew->aCol[STMT_COLUMN_NAIDX] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_AUTOINDEX, 0 + ); + pNew->aCol[STMT_COLUMN_NSTEP] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_VM_STEP, 0 + ); + pNew->aCol[STMT_COLUMN_REPREP] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_REPREPARE, 0 + ); + pNew->aCol[STMT_COLUMN_RUN] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_RUN, 0 + ); + pNew->aCol[STMT_COLUMN_MEM] = sqlite3_stmt_status( + p, SQLITE_STMTSTATUS_MEMUSED, 0 + ); + pNew->iRowid = iRowid++; + *ppRow = pNew; + ppRow = &pNew->pNext; + } + + return SQLITE_OK; } /* diff --git a/src/lib/sqlite/source/sqlite3.h b/src/lib/sqlite/source/sqlite3.h index de393da9d..9b284d276 100644 --- a/src/lib/sqlite/source/sqlite3.h +++ b/src/lib/sqlite/source/sqlite3.h @@ -146,9 +146,9 @@ extern "C" { ** [sqlite3_libversion_number()], [sqlite3_sourceid()], ** [sqlite_version()] and [sqlite_source_id()]. */ -#define SQLITE_VERSION "3.38.5" -#define SQLITE_VERSION_NUMBER 3038005 -#define SQLITE_SOURCE_ID "2022-05-06 15:25:27 78d9c993d404cdfaa7fdd2973fa1052e3da9f66215cff9c5540ebe55c407d9fe" +#define SQLITE_VERSION "3.39.4" +#define SQLITE_VERSION_NUMBER 3039004 +#define SQLITE_SOURCE_ID "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309" /* ** CAPI3REF: Run-Time Library Version Numbers @@ -5593,7 +5593,8 @@ SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*); ** object D and returns a pointer to that copy. ^The [sqlite3_value] returned ** is a [protected sqlite3_value] object even if the input is not. ** ^The sqlite3_value_dup(V) interface returns NULL if V is NULL or if a -** memory allocation fails. +** memory allocation fails. ^If V is a [pointer value], then the result +** of sqlite3_value_dup(V) is a NULL value. ** ** ^The sqlite3_value_free(V) interface frees an [sqlite3_value] object ** previously obtained from [sqlite3_value_dup()]. ^If V is a NULL pointer @@ -6275,6 +6276,28 @@ SQLITE_API int sqlite3_get_autocommit(sqlite3*); */ SQLITE_API sqlite3 *sqlite3_db_handle(sqlite3_stmt*); +/* +** CAPI3REF: Return The Schema Name For A Database Connection +** METHOD: sqlite3 +** +** ^The sqlite3_db_name(D,N) interface returns a pointer to the schema name +** for the N-th database on database connection D, or a NULL pointer of N is +** out of range. An N value of 0 means the main database file. An N of 1 is +** the "temp" schema. Larger values of N correspond to various ATTACH-ed +** databases. +** +** Space to hold the string that is returned by sqlite3_db_name() is managed +** by SQLite itself. The string might be deallocated by any operation that +** changes the schema, including [ATTACH] or [DETACH] or calls to +** [sqlite3_serialize()] or [sqlite3_deserialize()], even operations that +** occur on a different thread. Applications that need to +** remember the string long-term should make their own copy. Applications that +** are accessing the same database connection simultaneously on multiple +** threads should mutex-protect calls to this API and should make their own +** private copy of the result prior to releasing the mutex. +*/ +SQLITE_API const char *sqlite3_db_name(sqlite3 *db, int N); + /* ** CAPI3REF: Return The Filename For A Database Connection ** METHOD: sqlite3 @@ -9554,8 +9577,8 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** of a [virtual table] implementation. The result of calling this ** interface from outside of xBestIndex() is undefined and probably harmful. ** -** ^The sqlite3_vtab_distinct() interface returns an integer that is -** either 0, 1, or 2. The integer returned by sqlite3_vtab_distinct() +** ^The sqlite3_vtab_distinct() interface returns an integer between 0 and +** 3. The integer returned by sqlite3_vtab_distinct() ** gives the virtual table additional information about how the query ** planner wants the output to be ordered. As long as the virtual table ** can meet the ordering requirements of the query planner, it may set @@ -9587,6 +9610,13 @@ SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_ ** that have the same value for all columns identified by "aOrderBy". ** ^However omitting the extra rows is optional. ** This mode is used for a DISTINCT query. +**

  • +** ^(If the sqlite3_vtab_distinct() interface returns 3, that means +** that the query planner needs only distinct rows but it does need the +** rows to be sorted.)^ ^The virtual table implementation is free to omit +** rows that are identical in all aOrderBy columns, if it wants to, but +** it is not required to omit any rows. This mode is used for queries +** that have both DISTINCT and ORDER BY clauses. ** ** ** ^For the purposes of comparing virtual table output values to see if the From bd51fbdac5af7d6a272622a881137c5150185883 Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch Date: Sun, 9 Oct 2022 07:38:08 +0200 Subject: [PATCH 7/9] fixed frame layout detection --- src/emucore/tia/frame-manager/FrameLayoutDetector.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emucore/tia/frame-manager/FrameLayoutDetector.cxx b/src/emucore/tia/frame-manager/FrameLayoutDetector.cxx index 6f1916794..edce60eb9 100644 --- a/src/emucore/tia/frame-manager/FrameLayoutDetector.cxx +++ b/src/emucore/tia/frame-manager/FrameLayoutDetector.cxx @@ -238,7 +238,7 @@ void FrameLayoutDetector::finalizeFrame() // 1.0 (>=312) and added to PAL and (inverted) NTSC sums. constexpr double ODD_PENALTY = 0.5; // guessed value :) const double palFrame = BSPF::clamp(((myCurrentFrameFinalLines % 2) ? ODD_PENALTY : 1.0) - * static_cast(myCurrentFrameFinalLines - frameLinesNTSC) + * (static_cast(myCurrentFrameFinalLines) - frameLinesNTSC) / static_cast(frameLinesPAL - frameLinesNTSC), 0.0, 1.0); myPalFrameSum += palFrame; myNtscFrameSum += 1.0 - palFrame; From 7736d65c841d0a604d1904ddd627d6d6330a5acf Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch Date: Sun, 9 Oct 2022 12:15:01 +0200 Subject: [PATCH 8/9] fixed jitter emulation --- src/emucore/tia/frame-manager/JitterEmulation.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emucore/tia/frame-manager/JitterEmulation.cxx b/src/emucore/tia/frame-manager/JitterEmulation.cxx index b31a20852..f6d2020f2 100644 --- a/src/emucore/tia/frame-manager/JitterEmulation.cxx +++ b/src/emucore/tia/frame-manager/JitterEmulation.cxx @@ -84,7 +84,7 @@ void JitterEmulation::frameComplete(Int32 scanlineCount, Int32 vsyncCycles) { const Int32 scanlineDifference = scanlineCount - myLastFrameScanlines; - if(abs(scanlineDifference) < myScanlineDelta + if(abs(scanlineDifference) >= myScanlineDelta && abs(myJitter) < static_cast(myRandom.next() % myJitterLines)) { // Repeated invalid frames cause randomly repeated jitter From 44161326adc3d6417d73b5a561e5112f59498001 Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch Date: Sun, 9 Oct 2022 15:00:29 +0200 Subject: [PATCH 9/9] updated debugger doc for timers (screenshots) --- docs/graphics/debugger_main.png | Bin 64326 -> 64988 bytes docs/graphics/debugger_romcmenu.png | Bin 8710 -> 15084 bytes docs/graphics/resources/debugger_main.pdn | Bin 258756 -> 278863 bytes src/debugger/TimerMap.hxx | 41 ---------------------- 4 files changed, 41 deletions(-) diff --git a/docs/graphics/debugger_main.png b/docs/graphics/debugger_main.png index d6831b9ad70c276d6d1d641ae57d28c5801998ec..88e7c445f6c1fa714378c39471e88edf2ce0d9d9 100644 GIT binary patch literal 64988 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


    rV&VI6q3K_=9wohFZHY zuma;iZ&k>o1=U{G`7#zqQK3iDYS#zK_8R)!SSI5$6?;t}cjSv1acdCt7zhA!k=qS| zmNd!Zq@yvzcys(!1hxcj=5o<|Y}vH&4D)aDFlrmJ@?(3=@9wH<7G z-RQzp#$sAC#iMv#`4@%5Y?*r) ztatmlzDVNi;G^r4IKXrfP_&E_3?{q8qh#IZIa1&J^IWb$Z8+uBG-^HMdS}}snivV4 z(^nz5$AN>YgE4fkq1X1uCyLiF#A}pL96WI)>G2>qioRoIqyR#^XG+!_5<@AphI+GJ zI+lpkA6NBfO_9GG#80cQ$c3;+=d|s>G|H;3=eDvuvhtU{HEe&%m77-{TE;iyGT=o# zotM~3`_>R>uzx;QD%^JdtYSdDY;gogyF*7IF=X=fxDJhFaVO zOlLdcYBik>Gmu_=;Za%9#BXtonGv0Q3uyIyTgKYwTBb$6qMb(f)>;f2nCA)5qf0gI zqCMxnB5$wenHe(%ENoMvXf(-gH7ZkV?(9!IXvJ2_Ggj5{q1d#c9wVt}6!?LNazUN6 zClCEYjHM(L<_ zV=<<-X(QXusl2=*j)Df>uj#y`_*d%`*L)OET-2m}tYLeHL+_Z}khZD0*WpY(FF_=F zJI1S^2&np(&;;HyF}2AJ@S<;{iOQJzB{H;#Xw@_Y6tOJ+fF*GuP4jRRiJ=>GT)mDB zu<$!xY-kFuFKl!!?b%TCB9e}wlwHwrO#Px59ZAI-RQ(h~&l>G%#}J14AcNW|q6n&F zfgN?A+!p$+K+4yl^5UTtnh%8CP1q`X}wJ<$JBQUtJInmom$g8EW$&I=vqz zNNVcxU6m{K1hX8X7%iZv5KtU(Cy3sc#IE8pG%Ovfzp97`+evDUtl7U?wnrEnGtw6i zJ>Go?m}vYVmsD^N-fE@lmuj-o)*J!Cth6Qc6~ski=$XDfmX1dM;37z^#-GrF1i1#UEmbl2 z)XA2a7MB~&U`aY>XF;tMbjB6#1btchMF}*iXU8X~=@MhvC+{!JJEbWu0veGbQN_!2 z3_Rc6ge1qXnH`aqru|(Wk5xF(5jdo|y!>Q6T`lGV0#3Y5qC(9Sd55{#l37{zRP-Vf zq!+F&-HL3F#^YLJ#If#Ulf+}gKPC@6y9l^gMpVJplJldD^M8;AlvX&f*i`T9H2+>y zPz;LxGhU9XU>TgX<}9NyBX9tuKXRWzG;%!;ES)-~Li4>c)o^}ZW~S?_Hs0%3nwU$L zuYte~&kf#rWGn}7FSev&@d(jgOM81nEJw%H3tf4u@uDYUXEv{;->{(lT7dCDeAqr zx`0o`r~Li=_2bSUXYUi(KN3ffQW${$#%XtZ2l4B!`da&E=|(lkFg0KJR|BOVtx}mc zCozF{kpuxhVsq9pNA?yZ&@fpp1>!ZdH;hnI@wfI&X6GM8Y~2k1gKz>ED6?1ciw8M~ zkskNa?vYHG@weuvkF#PhCnK4DrcVY5K;eyaBoue18uPJPj^=Dg)H$ZSqv~hx5XJaA zdYKPM%|2OrW7qQ*o(V_`jE$w!nR80HWZ&R}LXNaNT!v}z*deQBFVFg6IY{-;$6W!d zVLL|$YQ1t|M-cn=@>xL-2sJ*Z94vv8gDmvFf0l?cjLqf$=#VkiwF#BNnb) zwml?s)1XNZJ8G2|GJeeGiL*(^>1}SqoI1xIK2!L8eIf{)*2;nm?>Fi!^}#3%Z?kc9t%PMw1H-k>4b5IvYCy*q@t zO%A&}gT_^=_ubVULGq+z%IfH3947q;h%o*|kL3IF_IJ%@5xr6=` z=I@x3bU^4=HZ%TuH;#xQ4oNg${gCtzI``aioMv%B1E z)wch1LCLO+7e8Ar36)~&UvpVTqX%4V$blXxJxLD^;&|Rd3mPaUfz_{H*E{9*h!9yj zW6hn>-WRSdFsXbRGxrHkK_KA$l)NL3iVp zg}~62-6Od1eUn&+{0!dh-r>n=N?*R$xWPydra?YDvrcc7*(2*HJiroyKwQSXa0 zwzjXeLzF|OScXQ;OkZw)-Z-H5z+Aogy|s3xQ_TMZ!LtXj72jehHd%0bs7EY;0S!x9 z=7;<*JPxr1CXx|Ia~oKYr0unYSow6qcJIL*^Pb-LOL^2@VGkQS3k{xixRnekZLr&a zMoDKMkuZP0FTceapiWVc=GF}OV7~bB|I|V3t>B0*l7MB?@`h4UiRK$gKXo8#9e%>+ z0}LKQXFcnQCv5;&=?@!<;S0>6z@-jc(2xato<<`qDEC`SE2&8GCH;Q%s^^^zQK_eJ z(aZ|#Lr9@p{V*RIH2rf^ce!h;fPqOW(FW~)=nsa@IR$v+TTndpiJw!Hrh~oyVM;(0 z-ML*BmDGpdr3fW;N0=)D)B+#v+0;_1$C)OcUtGwcG*|o*d`*m~>$Aa1TaATm?C^f^ zJ-mvbsRfznp7ylgXaTY}iFUmez1m2;#Cb3z(juKwKzH>GL}bc&;*ygTp1>D#+$P-Q zzS0wj!okb!Mf=dHg$Ox?!9+9E{8F$$iW$*1)$2@6K{lk1msF}FA5mkL4P@E~WP7IF zJ!%Ih_d5C5tE~5gM%&(ktCAN4D(934kpm}o1&&(}#K; z$;JZ#dT(>01@u#9Tj)>MVICFl6%=w!D?siOrx}uBL4GGE|DUAC2cAL6?;yhxbFTt@ zS;sH&WK-{qy>0|wPE6;LOhDL#o}r>V(@q$4ieG$fOoO*A1!A!f;Dss89;e?WrhWL< ztn#~9=@x(dZ)PKhpd9OG--rcO3k`Qux_zEUkYLP1LrvcBw@Y#qr?XV;h)pX-;LegP zr(G~)lc7&%3VWjqp?dx+(-x{>TLNNX}!xl8W7?$5seK$BZJlZLLIJn~r zRSR`*$qYque-*sQKQ)|avVa|Mn)m!!p%@oSPyn&_!Fx~txGd$(H-?7jWts;oXirdx z_YVsE&d4_WL#f678k@CdEg4IC1cJBiB&A9ZB?T>=v8skCB*k6 z`p?)gz&y{W6sJw9{8AULQ20*{MRcOpjB|1OdhkeumXLjNdP@JhewAQq(F8pz_Tkd& z+nHuxgXVCXFP)_pFCWR#)XaB?z_sCc5aGX4*htKIARUo%{y=GA*nfdrC8s8P`y7J6 zN3=j>@#<(qfhY0(6@pv*U{SSaVUacye(&o~*FJP4QKyj_R2Xi|yFNA4LX{2Aud3qW zcG(2WLN3dNQ%HLxQa{(tJ72#3EwXB0U-afHk&;G3-P-!+3eK(Z*BZDVB^sR>kDB#g zbX%}-R?AzOeVW*RF;&v{;_3BU<-PDpa~!VTfOQ0?ty}F{z4fOgt+rAQg`)L? zY3I+eB$PG-PpfFL=4|BsR_!I<4RK${LF}fQO?5jDkkrJC#PSP@N7lfBLSPW-UlND?>oQsVZ5T0S#PMFxpqaJ5%GRUcBAe56r zP&%^R6Zc8ZY4*zg)M9Rz*cqENU@sD7Yk>~$x>9jj%HHSb5QxW{}N%Ed&;!EbX z#o<5bcu6#~5lG#i{?UVpk3maM?$UCj4@0VZS*Or8LGq78^J~kX4;v>Gqw=~Jy+0+J zTFs`p3cvgsX2Bv<)-w$vM%s5^?Ljjeu35n3BLi`@?lS@Fx=f+ zM)1{ZkUM5DE=();MvEc3g2^p40_ztGN{Tsswr+Kab5(wuGWZr+MBN>J>zGPX&~8j5vB-aT|3$X<+Jhn=92u+lq+-(<_@V%~0R#-_P$TI(Xc3ME*m%SkoDFl7^^J*Ez|d! ze9=J1r(SF4xP4_=wpLIYXqK_Tfj!D@y;e|>w~_}kS9jXZpJK&5vQ)8Ko$-pw%>(>7 znN2eTWn~_FvMh}7U)KnjhZxkiA2V2S;>B1TRO^&B*4VL5-?3cdRz2R&DpV9KlgzX* zCAh{c6q4IYr_ohQdlb)M^wYIzq~jN*PJXkO=je;{){>Vw^gCL~t&|;W?&cWVhdU2F zb!&>gZq^8@`V?C{Frp)xZM~^;_;>@GDQ|s5_#0P-dsvNv1~+1+Uy`S*Y+G*B>DP5>N$p-h8ddA@$+8#Jxs1F;yfAAE$%(o$WiUFY^nE%| z8E#Vu&Yzr8i;q8QG~+tylC54}SZ9yT|DDQ3u?RH9+s_`Lh~c=SEk5OVS~4bI77 z+D%JG^bw13rWDF=JuBWOuLb*^1-Bn{o!0z6Mot+D_HWtSI~q{KAXSq*8-C|%7OYUlH{?dXFI4;k7=qPUh0|xGNv2pjCTsB851``jzFGX_>6V672_sC5jNdW zB&+L)(uS9HksD>(a#U29u)#&dMVc=51VYlCCb=3E9dGDl=1Pf=q&@2WBF^ZQB7Uva zZ`L95BGfD8leqD~MR^oSYtx|0$NVZmCI&wX(}me>6pe*dh51XfPg#!@*6i=>5%8;h zKgGtrQyET>Lv9?a@$mU`dNRNve@QR5_`+;*s90s(#)@zzI#Vir=Np>r^_p7Gw-{-qVp0Y*)Tz?$9hni`!~nJ?#d% zPnXs!wnAZVNAe|3G7fl~9DjfA86 zo-4lYn5!0h1-MP1@_Tu@yHD<-{%s}non8_~%~~372Q)19Cy}2Yv4s$AF;Kh?4TKTF zxKHp#(NS{EbyCL*JXEv{8=SQ8btSfM=vEGLv1!j6mVVvTZYfq2h#ULV;cc>I85hGA zWlS z(|r2n4hWPtjkIT7+Zd4n&|TA4#@4=bgCa9IT`eMO(J>E)V+5oaj4Ym=mJe$ek@Oe# zp=gcaIk?8PqZ187f*eawiaZ#eLFXZ(5Q!Y8l0 zEKR>-N+uE&MQy|m4&iR40O`G?il|#BguAL@7yftX_5b-6Qlx{ae zg}tw=ERmV-r)pOl1o(1c^(Q{Ug+}C0ru9Or=|S8e_`2Ry{?j&S2q!S}xwa-mz4#&t zy=@H>8@I5-y=rxJjrQ%uEf!W#3%t2{e{Tack zmXOn!{cd@p0mE*0jZ1^!>J!Yn3fuMImmXbE0$fn4<;(oz>YL*Icb{-wg?|08l~3X= z&P0MNta*p!&&WA>BR4{Zp^?5!3n3EEqixP}5>1K{4T@B%OFKJB4}?DrN(KHgff3zR zII5`v)Z-E%2!!}3^BH7k;D2>?-ce0q`|W-9p|}ap zh+MXmfL93gIe-C15rjlvV2Na*LqTIe_7I*k&XD@%?6nE)))(K`Gr1w5_aT{lONuc= zD)^M+oK#Rss64R`amy**PWNd|GeXUfw>)O*rC3JPpA9>bx34x46HNvAG(h)!}6nu;QAY_A~!l4v(!kZ-gw zsCcQf9Z?>?DRtjxh)C%5D7=DKvW%Hxu>vwCmBp1l(Q3@f@<3hPk`scm4opS0&c2J8 z`tVq(XP1h`2~u48<0J^gZJ)ydwmCGS8a4iX@q@AF#qYgi{bnDt|a z)M`H(*toDB;<4PS8Ha9mx_kw(*jtR{Ps1aBk(CW)0@G$iMxJ*kAvJM<0vpvz zl!4rHQ^7wxPfY1Ip)qDQ4y>GO@3taA@=>@ucT&t$BUQRdpdq}sUU~0tKggytquA?lqW{H!bAqyQpw=((Hx%cKk zSMuoI4JLmotpc6Qh1D~zkv~{)rqzR`Zv)m}bp2sG{%Pgt67w85f5Z<~UuhsOiVJ#{ zA0G!@X)IK_o>68070>>|xKbCa`Z1%OqKW)Hc~|K}KR17LeA*lA{gv$JCuDmP9KC+v zI*M1keV69*6;Ei#f%(c1=J;SY@Y1GIqrv^UAoFO-Vg=WlO&Ft8HIm+m!6aZg43=uo zs9MS-l;kt(;4hT zq|_?4%hnD_Y`Sa{8WwYNSl@+HRuLlS!L$ z<-b9Rj>`hAosP~xDO_92m3u@PHtR&+dHb#-%^xm;y^+2Kqg$eqzN9HmN&E#wbsyy#xX9T&us&DOhA4Eb*TyU2z9=Q0xst;psC$zocnypi3YAiv)jKE zN)3N`AW`T?nVzg<491m+BS|C7M5EHc@$!aZ)e<&*!lcW9XLQ~$$38KvJc#s zxoSwPzgY5|RXsE3TZ?l_%`x2>-Rwg0$UwZ3={IB=DeF0&6+ybwua#D)SiEtWZ%MH1 zYev%V(wR`F)6Q^`-N^h!Cs`x$t(jo65y-$f*!}hF>kkTVsZbBtw%@H9dahfp8DZHYT22BZ{T9z+mE-8xj` z0v!qPjza8AbxP{b)9#uazuN>V>*G#4(O^!vT%qXC8bKL3bUcBs`#@(4PGFyVc`^Am zAr?5G=DiIihAyWdN{!cnJNde+C*mMRkF^udFc~3Qdna|%pPK;}xisOq&+V>${hqo> zWyHtr>H$q5$NHQi#}sF45{r)fb(fBm*?RZ3{Sm1y`afcghj$%6zYFEx;ug~zmO5ok zlqGCsTW4TLOH&%xq~#j1ei;<5p7ja)@6Xqo5!J5?iT&DD$lT9IQ&wRANMW)e7h0#FfAnM)s>8kH389?by!zk*wE-YR_tM!(H55e4Mv zb*-2j%_AR$dHfYv=4|Vyooac^X+L9Yz8|2-7Xk^c+EUJ9-CRw)41suid3j-g5iV0p zS0binZ$6nFDoNCy8gr~;njO+HcH_h zJFU}NB-+mvO=2paN9#Y^T`~RqIeAKOrYJT<&J}CbT*rqqu~It^WB9mlsYjC8_K5GyT7knYbl?Dx(+sSEQ%oPdhSTG2YOac`Feu`kp1{z3o+PDuU-Pw_3TBu zNacZ0pbVdR&LNby`aMaPD^XIn#*R6^7?UWM!piF9DR%2p;huuw+Z>N^;)brR+1?D6|Pn$6o%% z5NR#gnj7iiY1x)^i|x0=&p(uZKu+ zuUE8-37TC~z*c`;YKqA}p8t;%O~Ee=yk4i43tP&-@UrsyiOT05mQ5oBgRnz$EP<-4~wHN}xWaxy^SUnbm%?RkXv z{#2O``68c#Gkn@QlHu(Od}R3;W&K<1_TO(0>A;TSFAg-a2zRA@l-oBLHw)#l9mnl+ z%%gr02ft@SUx{?Eb-ymw-HvghTMcwgNyD}2%l$_5H_YAd$Y^-4)J%_?8Qqp^`sJBe zEdXIJ22<8Qr@(L7w6taO6^RVnzC4Z8n=ZOLYw0Q0!NNAtYLLIuT4^~r5qD~{NH)Fr zNG0{)8&Pk!97emxIxjvu6@aH^U}St#j;(i0ImL=FqoOHrKifGk8-_2@eGbuy8g29) zlFDq;ho_Z@0n(@~PDyodZ=`WzVlO*dDLeHq1$(cAdu^k#Z8tmXQI?lIpoYs(CC+dh zujYSl+EtIWvr_uH!S_R?w`xJU<`0&j80{;Oa=iL${(tsWLyDhqJRqTqTi1 zCfTJqeW?uGi%zJLg3ZfxXsmujvYR5VywCb(;#(Jijr==R2`eUuZycvfLb@{rO`m68_s`}IG5>6@OT5Flb-6?1&TO`-=dzFg zIIm#eGb=&lXqS+2C6jC_|5~k9&t-&eB5+Wh>q+zvDxe`1T-o>v_VjrhGGM4=PtWtQ z)y?=wHThUDRiMSABF6HrW9R8q!#4fsLN9-4S_Ww4g(MH=H9`&zpa{=>Z(JotoQsL(-^I zYwt4rikv%}n?CNf{bDy0Lq0&aJDnLk?LE|m*Qpd9mcuIIu?gr(){dqg0L*;8Km=5k?h zPs9#QeTB-2tdTPg3Y|kj!`%{pe0QYWg}Cvvo-}TqwNf&VPkekG*M^m}!Nza2YYIGo zMc8@3TNQ&EB&14Egg?_D>pmDXJ0u#0gP3cz?H>+91Gv#Rt7IO^;8gb3H?L z$bG!pc@d%;8|uQJ+lzKS1&*4pL_6Hd-;If0vpv zd>7`x`OJz>$ZX};Jl@dGSjABs1!y}b4`T$ZXFi_=s?t=9JKN5_xC~9`mG(zGJd>g zT+y#^JG32-uRS6(zh+(RUe~@dq?Iut1@c~t;!&tM3-LYT8h#|fk|!mKw`iCcgNtrT zpQpkPq_zhkEuA_ye^H)2bB*cCwP15666h1@vB7AI$yjgbfk|`J<(J0 z_z}a(h)Fq6bXRyoj_F)ZExI`Iz0Z1v38RKLU7X2( z>TC*$wAqyGvF+hrd$&ipX?!~!F&}RA6<+Z(ZQ8ZxMSZ``-yMU+H)qVG2ywtY5dM8t zK=C2h;#(VA0Yh8kz6cIkxpVCsP^}yuA^vp%+x_{ciN#;ar0dFGcm&5rI?l^f0){)X z5GyT3zUSF!>TL-f{C#SsOh;A$+Y$6z!QD0iMI#Pl4p`uDteDWkS58@uU}_QA4{3gi zWr5vG&TN>=2AVoU%K|kd^oT=Ze-)buDs%~qZw4Plsf&w;;p94M=2uV`9j;N`$yp-~ zonFe60wdN-^{@Iem*vkjxR_y=RQz9v-~AJ4<9MLOB*vjPG^~VQDt=}~2l}*%o}`*Z zR|^vur)gQxv4U>E#b?0MnaY|w9P@=ym^ID4r?!gb0Xh%u=V?6q`0sr{6w1C7^K_h~ znZ=8a7_z=5MilY=_)ZKnZ`l66m|lP0oB7*rOOz#5@;bh%q;bF5Gn(6AP*lTq%S2;m-rm7% z!;L41%T*6xxAj1FlJav3V_xnnk&8OnaGl$U#oM=FhtT%VOU3gIj=D%mCr?L*eWmk! zi@gh&ds+z`kFU=sXdk?Y@QI*|8l6i_K~18G*+uBgWS8qjfEH@Um9D7i7jHh{6mU%# zQMp%@CX*No%NEMX_eY+7w6NkKipyr&$VxgAf#?QukJ;N-UUQa{g&5?T9%rAjoHCf$ zNAoRl7P*URRkrCnYS{q!nEZHVez{Oeuy1Y-STo$ulq-*$)IV&l}0t zWc^9mp}H;?c6t&ZA0=`Y=nYL~78LxO15jxNo{xIgym9^8$L~ALt?i~X*q5hD`lRFJ zcsO7ZN{R>BI;Hvppl0iRRHZ+Rxy~VRtdiax278^iCpDlkj3I5Qk;Ho`$+lO4kNy~w z#pmz?tXnJhwJ|-S1z)}c2Tg&(50DpQCPp5T!c`P@f?@mK;YfXl9`5-b-@~3V%8(VP zRwW{6z%t`Z^`)?L6=E5(-fG!#`R7f3rVe%O;J|g(4vPuiqK)Vkv{-yUTNa?6rIq^S zCP=FoeT$>^^9h$IU+VjYdt$n62=?72$_wu0&x^;wi%!RId_4V9pFZLE^=nUJt`SY? z3C?UfKbyK-T;-zxYMK`tEwLh0!u3qhu(6F~_y-lsp!!@*YUXs68$R{4bCXk3X&|fFbi_7)L%M85?d&A0QMio~# zVlW9~sbOsWk~mXDiPhVw_{PcYEyETL9|;~P5jp;d%lFwsbQAmp^w1XNav}7)i-ec= z?(cge`u~JKqEM#towON0tpam|3*Qg@yjM2E#!>jt=4r@N` z&<05AO`o5rr`8HOtS zBQZ({iR%5v#?Q2jo;*N6CCCD5d!@?xREI=;-$K{#a3~^gHoM?VHL%EQ?<<9 zZE^_Rc}KZ6^ouu2@ZNT6TjlYEuZ|jV&Wk%;tuDsaPEC3G)9o}eX-qC(Tp(kcxEg%s zL{cMdh3o{{56eMQ#qc-Cnlh2vqa%J2dF&B?{tQ)7=?A)^Q+4*lv~s;oUF56YqFC4a zC9YGfLUo}7Fg!KgYZ_z4;DbFQW5rdMznU8PRH67`e~Xs_&($03A%b+0$o-fh?b?qs zE{4mFq?n|&gAX2 z25axz6-a1(o!YQwBm4e=DW1QFwB!N|0%C#Kxgk>W-2pKhMwyL^p#F*i4}P$458Fx5 zmn*XzvS{0zgd1e9-@rL#Yn=*rUEp5m%JZ&v!xwVxOCU%TnbWJlrE#Jsk93)FA$C^R zV;L98m*@hThJPx1#PrSUmiuB?KwtQ{&{aWpRwrLwlP%fZ&L8?<>QTUFKuYMyWhX%6K-`=F82QiJ2jhDOe|SL} z97G63l-WJS-Ki1{6-QMZSrXUVqCDjbocZX%zYuo}&sdBvyB?rbaYFVz5zboT6PTZo zsx66;rOzpct@mD^fCMapla^9bIiNo^H(mv*we&h!wF;ztna=@-xD1AivxXJd>ln1? z*N0a5PkU5pH;+LAs6fEp-P+>Ec#JhHsr+SJW&fC^4aPR~Y*`4ftRSeTYX_|Wrp_F} zmOXhJTw~E3vGrZF5-7YHY{h7L@>c|!%T_9d{EdK`O7`DoZC6zpet)p8BZD&_wn6?(*S5gYyXe8&R4Mw*e2Tcw0wI9Dj+Vv5S)A z0rIgf_<$&7!nL*PDf_kh5~u8ALyXyN*VdA#Og;CEGx#-wpBHWf1n*k^wuKGbW#EZc z)SyMxZH5Rv#yZZ>Y?-g3I?I%Rz8^(`AonkC^wWsai0*BhovpxzWynB;J#*rG7+Ou; zSa&Ar%Z|=d1Rf_Ay7nca*g|7ImvUMy!4(($+`$IUEGfe2WDQ=RBlJ#~@AoGH-hU=O z@9br-}DN(KffN2QYrcjPMqU8!s zd?QpA?u~kAEe>|z3ZqOM;J%J8#H~ewNE)V1b5)yBrGKk!(d0i-oc>$C z^@fh+6n)go+D`G`6Ix1bTlPN?pu0!mUV!~#e6c~uF?V$w)c+KXUZuV~!t?4rcK9Ka zKawbZ8u0$}BiYGL^{Fg;J?9d?hpjcPO5VB$R&*)1$gOs+OJed*>`+h6eC z=a};x{_&m2d4g)5FlI>y9!(1>BX!h=0_DU`nY1~D9_o(5q&lMYU@U2_nbq!N*;%r? znRe2Pb$TARmrA+rqkirYW8}lZN=#<^<22hEO@(Q~_VC8LzQxBrkuDnz*6zTCba+I> zT^aPlc422TI|&cSk`?|a@HW-9kJ?-qnt(ks68j~chlsoO9t5JzBE0utGQ&gVSD3Ud z=aVrrPWvNMf)vWDBr1~ zRPvF#`Q_f@&8y5#PG?fT^u_)enmpFA@#@{i+EHzgwm2wdYHZ9XGFhBfsMZTG1+1nz zP^Ts6)ln+;d<>aqZqZ*@lUjx!fg;GKqW{fSH2S}g%DPaTqf>1L@t8G*!&`u*y0W39 z9T_AlY)-(?Hyu02ixk5~xZ(7a(Gz}B~_Jx5c8{LB(fL~NI&Mbay>(XxBxz#(H9x3SQQODM! z3We(EyjwVF^QO>x0`wr;w*<0% zJ(M2&hfC$XWzfIXWOlxyuh5x^G#5m61rAI|2v z=03SM^|o1>L1`v@?6Dt)_s~zMH}JJVFF*PCGkE z%8-2o6+2G${_4(_pn6_@A@cpR_ksIIi>A1~?fK1xfB>i?0i$rTQ4}$!_pqteXVv?( zl_QKk2><1yQ*AjA?U(48ZPjg=RofWsI3hW09I^DJWWr~4Q)41T{@j0*Qv^7S@_#D+ zVNfXaKGq`q{*p^ER;`ITZRhk%49x#@R*nz{N%Gfb$USlr5fp(bI{phe2521P5}W!v zq@6+8Ux4_()^UcBQ-5F@$Ny++arylDf<>^YA5gk6fxF9}~_I3D)KW-J;d%1d=1pUhBnx z3MkE>eE?)Y6~IgwfuOKdJ+E??v9hLEsGu--bso+#cK(XV1c3IB-VRjJyFYUq|BKE$ zx&E;V#+6F6zcU3MnX={-D7O!yO_MM>&bmF#FO`qCp;LPO+7VU3y11*g0|^s#+Z`HY z$a?`40O-+;8F9RSDIB9Wa`A&@UE~w{KHX{`3bTp1_iT}OYKO1z+!`!7aWuqB-HO=< zJ5+*c^YZwXrZvmeu=M3M6(GaeC}NpJqrI4JLmQqQSy$gPHstoyn9?Xx?SanF#H&kl zcN=KPdeh`>y}v!M$Y*eBqdv!KLOEo|RwTr0gF9u%xS7M)y?rw?r6*ER5>E~6_Kw)T z1>)eR!dNop3Z?5g#y1cyDq^GTh)7fKwPhBj&-dr$-y8JG?d`N>WM*P+F7|8aEZXm5 z`=>AkNBSVM_j31lSx&kgbS_BOBv=zM0uA=Cp%-FpOh`2CRzfj+E4!#1T$KVGW^_1EL^}8De=vs6VKNJbg1<-$Pxcw4-*ee#iALcN zAR`Vck)I#s#1F4>9TS_9Ullq2>~8@k8P!WF+?B-w(}`yk4FOtvcS<=6)WU;=mcrc! z=l&Fpq1!V8zXIi;2^OL+Nz4Ti2H5VppB($GY8#qw#}};T2}vvH?C4 z7&oPgrtd&iS-J=;lRM*PqLPcb=iHL0U@sH&EedN-{qx5s<`Xe%U*uO_WM}e+i<6Y^ z?0@(wh&YE*8i=Dl-vbtiB_pYb9e|`-ov*%@A1c>~BN^J(6iKwKW%gTh{y#K4&Ymf- zpkdTI)a65PO3R;UsdyiC%ZA8}OhC$i_Hi|n3E-y-f(t1xdb^G*jx(@F2vK)ITShHc zUYwC{BP2+_STo>v-(mI9md{j4R;MW_~>UI+M3Y)cE z!HPl*JP$g!?Hd^?NfVxi4ish$)F1fFlv6sjlts5_7e_O)rQAgWRxJX6Q_Sd&aqJi> zA$?%ANTv5_kSD!d_xQc0=ft$U+8V9(hlA?gj?scdsVNfQQz zu1MDM=6sXbfx(kBm?|ek%MSb49Ovv7@5Ahyr;K$dIMpqKhyXTdNw)z`1yZ&M#>woS zG!cS!*S+ATAhvS7oFcx=%|yLYIH;OZ5tmcSv*^v6m2u^iV`546QY|r75w19(2la~wn6n?nxe`r2*95VUlVD@lZgG+F)>+okoFj#xnMZ@ee r9>62%3yqDXfTTbm)hUYm^M@xUnjb58(7hQWf29h2bhlW^;?@5FlSil; literal 64326 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 literal 258756 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%0DV&D4Nb-hKm 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

    #KaKYnD<(R9ZbC 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�LJEk>|FyTkM4Q7LC&QsoYwgc1*M&n+)bntcvrW^orx~Hke(tsy)^N8 ziK=ku(!t)I3;2Ev5!3(diGSG`vdT}-(1cqx^G*0!$~BWwD&$eNMp=1uJ(|3W9q_Gf zmxvupC+8?5@CZ|cay!6VHIb9PCTKt(QXGdK_O;kHHa-2Ow3mn%jlPX z$jm!fXH8$}O+0ec2^Y==)q^cmmojtR$I5@>*Oa=uX^jIKiq0zW^=Id1t;d%756I9N z$z%BXNYC!3ik8^$X>%uhRJ8~olBMz%AQJn*EGi3X?v)fRL}1 zBM2oMCvg)VJ5m^qDWx3IR|f_|GeRCV*Xnp$3hR!!)Q7|B&CZ5s=QyydErRtKpFGuO zJS)rB5JHy+T!k>9SE7D@1ktOetBNNvKZSct4>%8(mKTJR!sM@>d5k$5hNnHvl-3gMR(Q2vM$;V{X1)Y3^}_5 zdt#UE8d4CoyvmjstmHj%AqK8r%Ju1dgc|Rt4}^~+M^}?v;rkiW-A`OIGkQ5*;iOBl zZqT|v7=BGn2RJEJ=a|SYu61dcm5|H6Frt)dJeiaR&8^__aj&+_0FdkS1z6B^#dk8^aY}-^1Yd|b(LU{MM4s; zCiNF}%~C=fp-v%HkwbRCbxSzS^;%F9O-6Metvk-^792nw23h@adj}B73u7IFZxS+~ zNomKrSNl3NZ3f26S$VB9IWWQHRW)?T{RBYuw;z0M=Kz|TcgV1))Dp2V|G z^vz`xvMSqn8@4O(2t+J(IR8M6#VQT>-oQPPZ|2N5H`%Ogg=i1K8J3E4~MfQb7?3t*XGCVBBl(uHsAg}96{nHT&yVrK`Y>r6H#`I#UsE0lr;xtqlRZ? zRLlzL)Dd~zl-BcKq`FE3LF0wgaEb{SDf~(4%pobJ%wA>%d+e087lw%A`8V=tNv}q1%K$~vKtU^2!1hn>9{_z$Nxj+D0|6;H% zqalg6($7&kEAbIB@a~~#8@w@OyOOzh`u^YS6+R+xaOEz zln#ZzfRs`U?O^QCX2m)pnwJEX%@{SWOsFCTIa&f)vW;R<6_L!chrx-=%d~jN$6Ixb z29zeyf)$oAv+|fNggq)ywAPNK@!6`bamv3~udc?)ND(V)BjUN?My)ALD=qr!%;5r6 z=}(i3HnKJJPVVBS_q&yYxDh*#JO(%fU!rDDO_h^yY}Yvbma0fMwzcqC)3${}!-rFtiirY3`uNFk#_t%;hyB3vxuZXL-M&b;}@Rvn?<-v zdtsRYM0Q?3i4{CvhZnr5I+gR$UfxThw@*`pQK4hj%F~yJ{?i3t!0RQ?Z?y@URwK*e zhk8)?%<2aJ^67+UjK#^`g0h}f0|$%|K^GVO=66&I_-A!;0fDD-#Rxz%sCq+h0LBhe zG+R={0lHO!&h<@*qUE}ZZc`e{ZQP;D8EXxJM{Ah(#MxtqJ6=0p%<8Wpk;^h|N2$OA zi8C-#_`07rOetn8J{OEq*JPKbpJEamM;l>qgy9a81?s$uI)4wGSB)yqqQr>4s#iIk zMPPg~ub0lSlg+ZfKdy!4YdEbpTVkDC3`*=+fqkP@PSjEe$BnPG) zc0J>2zY4d(L*fWWglfP6`$R&4yJv9gYz8{e%fu~elsdC|Nj7(7s?3&WvlLIM*t^?^ z;3{_27HQcM%-bHNKdHYbcr#QwMX_oJ++rWADjAiLNI?8oG0Jn}9w}u!o7J+_RE2Ie zNSzCHD>7F}X&6sMI!rJAh|FmSmN)?_gbY{54S*FxjVZQ?m{jysgK11R&R05W8Z6VC|Lj$gj_g zTE}SE0Ni&F#q?l;8FNd>o_He+wCuivp=~3UWMU#H_wpQ}&MeII4i_+{TV4*L769Ab zR>G%OUfqK_$+o#>*GjEOxBZ99hGWQ;ZnaCu8kD-qaSuJ%zA|dfVer&;mt-R)msuqJ zT)4oU&~H`S$fyL8&%J1DWY18AGU?96JDv&3Os&!2M32~2od}+m=~1{=`fF8ilI&t- zEGac+t(xbws=STj79&TBG>JppHyncyB)!p2fQJ?p97h_!*ml)R>R+S!+YQ7SLR}bp zjoT9rX!cg5K`eL>u`aEM--g=wOMr$J9?f{IWCu{Tu1#N#FJHV&bBi4(>xi^|SGQM0 z>ksd9Xm3A#ixFI$`ufL=ci-(WMWJ0W5fA#KEC;u+qk@=I{lBd!zQD>alxNw(*vSP> zl}pZo$Q;^}u_i-yW>v(6G6KF~0U3?+h&Zn;+Uh74y{Fpp_CA~dcQ2R$1;Np8M-Gi|exZk0L>6{| zbHwI_*k7%ri93(JElRDW?XgL={4ih-GzE7uqV}}0ilqD`MfUCuJgRz4ElF~q3>-d> zA(zf0rAx(0^xzdz#z@@pgXqNmMR)y{EdVkzU~G$X`XQZBtiG-F-D~pN4BN%Jk^A=X zsbeC3nlbtEtHadWGQdrk$il9ybl^Hh3WEC;6uQiBhm!P5Hxrtrz^T8PIwJ684<@54_*F22TG%zTWH{jWqfL|L%fBQUIrb z0^=`C1j<34L;zGU;G2Tam1^K?K-0Ay+!oXZ1)sqdmX#O16__R25?>twOdnt|!&Uii zzWgkJ`VffkE0DVi+S@kq_HtMYY8>eqygK=`QKIm~R8+YgZ))QwtTQ~3oxK_Y8IiuW z4nST7a%1lweRy;#qGb;#o)A(xRakf(mKowxAWy5KTPEPI*B!JDppVT`@WjHw?T|0G z|IxMoy2(C*-(Z#*-*=YM#dthOzU$m+?k+16QzxUbt-WHn6L0h%@3#B_Ibg=LwgPdo!+2&gMzGH`&;ABWJVN5OPw+4n`p))y6~ zLQ261)nC+~3S@I2RQU#!MX!POT-IWW;xcFrXa?njLn>(Esue0%ic^-yI4QgTI;KkQBO49{4^F? zs~vQ;$;eSBXmW4h!mTjv{F|mBS}CbI{KL3iv(%=wbUzCOc9qSoG}8*~sRolRn}RYc zos03$1SO`;Xgz|i$+#Eb6e>J%f zjpyvCG3|-%;+1JL!AOt;s1FtIZ%djFjapyZV+&JV_+=+hNVGWn2wa9N$!a9G#(5q& z8}1QTjeW~jwwe?`4Ay+uA`OTGqwrN={Mo zxe#2Bqlw4)V_kxGmI6eh2U?sh4$@4I|BQ9YayeSlTwDCTC?^-N`blqf;C^NV+h~Wm zPD~aw*VI1jP~lntS~-3RjL=VDrGtFw`$x}R1N@g?`<+ovT3UD*QdsCNoqKL~MEZz( z%rOCKk;UV=O&h$o2#jyTkGB4fa%g&CUr(;Alzt9nKFJ%X(S0fuci!+0hEmu01yZc<*CkkC17?-9Y}Vduj)JQRE&ycR=m|_PTB} z8cK}dYp%=yGBEg#g4LbLYX6c5G_02iIo9LPC4_84<@Z+iEP8*adfJ)FHLY3do=vY! zG_^J93N11!?>WQxGW_kn-Hn7?UVI;S_tIj=Qp+^Q7>b^)DSon{erj=3Q~!gobpbHL zxy=`pE8cezB!Z>$)U8+7u4om&p8OYT&HeK+YHmP@g}#JIWZ~PSiF^7`uxD_w*UoM@)?l!iv;y>Bl(p*c z^>gvT&23zte8QQ!edUbrs$BrnR{GzD#RdfUS~M2Zv?iWrI!?_=?#?u6sD*JX{;!y9 z#%ZySFIo>``v7ttKxpxN?_V7co}yx~6WzFI3bd@jbVu3$J09C%NTbNkE#55weRe5N zfTi)h*4B$s7ap@5Y-sO0RFdVBwuSJiyAqle(v!lfUBZSdnmUP9!+XvRve1?60NvMW z#@*@+@{-#M8U??{yIf=uQx@&e{$>}w`*|(E&ElPe@hKvyJ*c?blEmdM2ItvNWV1j1 z4$Q35z6+AIhpjPZu%tBac!Q0%1aoH(EKRjrfXi!az3Pyd1x~ zbW45ICEsgDojhMD`pvjno_Ae`)jPV);w^r(n+m<%hjM3>x}DcgJg9P9or7o&r!AQh z%tk7L(ZC+oD!@I%#Z)Y9nAmi;rwcf4%oZmfv&HqROR-|#Nawvc9-|(unW;1E3U#n3 z3@Q@bVf-A3SVpSuK-U`F(UUMWY2#oS?Vlew2M8Mc^fw`uO=?Iu$mLAqhyM}K*+1sw1{p4q*&({}+WSfUAG zD26_A(oJ4HpPde(*s7}#5j_iVz`{hUfX-Y?IqZ6+3?yw2ZbN2{_eHEB+nk(al+^G zpsN`BEroP6+v5%{(tH}s8r}~mgX9g3MW(+a&7^S#+W8%jyhtAIqnlG3UhDtK6)eO@uC}fO{ zTtH70udGqD64sMt3sAR&YQJ`r$!K-EeV6CrL$O+f{eT^(o;a704fA5;cFgoT53b8c z30~IY9)4JUmY=q`uwG!zS*7z6gyA*(Rh;{=@TQcpOU67~V*iEs^3g_7Vo*Pu=5_Z`Gxb?h*;`{(rW&LP*Y@%s4^s#qHwmHtxbhj9 zI`QH618=)dvSoexEVYQqR1TIFPK$iZNGoWpt9^~?MEMh!htgY}9hjmqs%e6w2e5bk zbNg5<3A--cdoTP~*V3B9{>yXDEs|wZl|aE4!?JHyzwL z@0Yq)>ZOA1P<>}_3T7PBHchpzUdB4}Im@?b;ePIIaXK<*6+)Dj5&5Y0A#oqLuQTu; zSAkEf)tP&`W&l5US3Arr4Fkx{UN}OT)1>OKtA>E^XhvpY zL;z*XS-exP+?STixnTx}(gCYFAQG?P69~1ewBBn#>h%`bIbRSY=Y6{7-3*B}7p;vL zz%cf()<2ank7RL=4WGvEe7?quZi+2YdVOClo^E7 zJumWZERORwOnR_|`LXI_4r$cIcyCZa1bbPsJkw+B{sNqR0lKO?3Yg-dK3z+0X2d|1lss3Kku7Y_A?tg`(k=V_IFCmB0H^B_goAX@uI! z&Maxl`UC>X7O=IQ)<3}hqi)&(+a%<@7h-wf0{v*`iO9JRXaD;<;Ku;ANu{3ywDq{s zhXtuoyZ@ss7M1LD5XhT9JszMoEjzh+J^vfo$RS3J@zST&$FB~>b~t&*rS-WN1G`sw zAvU!QH7rl-Gy6b&{|RA_Gt;ws@B7Z{qafY?OiSCljSfR@(10QBj{6rB4X#>1!c^rD zRfM{E587)OkpRMqjUCitA1SPK@vH zAK*o((A#0+$k63-FJl!4;?)A&{;4dbU924ayW~CaOg22j&-1!IhPFMry4kl*Ug=9* z>pQ|s@C-Mk(L{&KzvP`7bwYe)?y=W5`=*XJW{itvASVCQjRj<8Od&~;1fHMsc`1@@ zX#&ffSVg=!I)=&!D-3glLYex`R>Ms2ECRb%tuF37Ezmxk*gbpW-MUZe#{DKY9B#tyG zu{yB?e-LIgw$OC1%kK0#;+pwduY!+LFvGs}A66aGEk2&|G ztK_c`TDKXNn_-!2GJAq5vywAjQZ!DI;_U{!=irxndym3Yms-7-Jb-udKJpKsJOdk9VdO^H z*iSEj+8|C5=UMTci%4y`UcGryJ*VMG_PWC^yH)&Gfcy9_e3by&uFUklwh`SscChW< z(wpOt>KKRVl#GmrrSKToOVm_XsU|9>dUXAet$tTvc1fjny>tob4C@!-C~;X%9#BvU z;Tlx9d-O2?RZbi&eAB#Yk0jL>9!6x@wu6LR!9q#?O&zH$upm12AZdg;=chYf75n+f zPUo8f`LB{K7eOfI3%K+6Lf&iC0AqC01UggCvHVr@%G&F60J>gjeSio4eIy3z)VQOp zB{dVICC`mIn`}wpF}+v3e{+5eXLm^U{cZJ^ajdT`sT-UYTn9w+{{{hdVAU7QBP$M* zalW&Sha82{lJD<*qD0KSloiCtkbgZfLqL3xbGVMEYTMLWG?s z)1<$(j~1R!Ncz7tCk(ZW`Px!ilHP)H=Oy=GC^T&bxaZmb_ynw1v{y&u$<=sJN{8m@U(xf9NYH+9+5A z%X?4N387^4PyCP+{}M_vp7W;>ilZ)N#?LODeK&yGbb1#KY^A-ZkDvH$V^GIz-35n! zDc(l98KqU%uIz$PhOnA-zZ!~Ai>Q&2qvTu*`<$&XcELu7^8F$FR!#5`BevtWN-BPh*{Nf%O0(cq6m2P^RAt#;4%7!79JobIP3caBb z-}*BnqCwTF0S5_v8OssqD%|JPU zv6Lty2NeBS1HiAVmK6KC_jNCOoJNrYxcm6xe;RAJ$53~dv48lI5StU5vsx(KKL(V+ z`^}?XM9O5%0q`WIHXsdHs+H@r{d&*^n9wK6R`e=OD7smV_ace{De^;j-B!G^GLx++ zDg@WsxZ^LJZpdNukbWwTx@*_e-QbtsEvq;U_MoCnV?lKU2^uB2oLiTKo#vFFgXHIa zC-GiMaNYKI*R7MRTfg1b=bz_aS{&bOH{!MB=+3XYe)rsb{+0K+!|5--s{1MF z(AL%cho0Fx1ccofblv6j_-WcluVD^-O-83HE-KABy+X9MX|%yIcJ1TBsMIG>7V<_K zftFey^Qbk%vECe+EfQ58vk^(#gIAB-jro|E=)i;Tf`tH6a_ArEz$5fbSsRP4SmV$Y zIvCM0uE-<&yP2yjrZ=T)21YvCu2;h;xL;uIH0$nd$@a8wttq)GX^k^ox0=>AuN*uc zWNP4`8Kmf@M*8+rt&cTN4eKu?s6r-7XE!l%PGx696F2{OYABH2TP_)9I;UAS-fv5> zM9enV!j>z{Q54sJXefLBE%kAiNq?k?)1XdBPhezPWlvZJX{)LxI$EQ;!Ouw5)X$$= zsF~Xzi2J5y&#cxttnPSm$Vo;|ssjTP?06B^_Ux2{)jCX!HnUK z*Vt?73m*-UP#5sw-Q(?+RpN>>M#R3c7rP7tGw}V>NoF?05c)xBftQwnfa>4+`!qe9 z>i!$5^L3sMn-;II<@4E8TW)T#<|NXxavEvkM;F1f<5b5=mXAP(DddtgOA$raA?@%p2p0|i&`G>C`tFzg6Q*(gFoSmQFfYT zCC(1Bk5TzI4`%gFcw|RZRi>oD>e)t4&4xkDZ=@Mxtv~Knr}-v5?+!l6z5J^bpDRfp zr{zSQwN8-t`m7iG$7q(Z6K1Z846$U(%oTm=Fw>pPeRY3_PK&4hLLj|1aT1B{Ld8i? zdvXHMvg>NZesTDdPVnKI$EcJpXUTLR6Fk(o?lEUQA+Xx@BMr{UqUV9tp7p#t&=D#C z`wWpimzyszD#vcUdsUD{^VVdpWpK5|AHc~@7t5m)kA*JxI3AEZN&Q9v_6R9rA(5-Iq#tq!xIW68F%%zQ2SQI936@sN5b zy6#t#)69ZQ?Pwd5c!tq4muM%UCc#;&KOUJxP9oo*T8?G4p0{LIfn+wJOk=j{idL|| zUe`}oIUzO2&~lTWGXF?Ysv>&PsEP5-!SjTDQ#nh&5YOi@%_os;S}60g<%$yOmYAFP z+xSndeLwxu_{;px`>tUS;Br3!k|lKyzZ zvCi9Ux#1I#eiN?UQ+^5gamVC_{agV$s;~SK^1|ZRKjPiWmNveG2yXm;X=oslL`Vt6 zNFCdaa{|tYs8{h63WXRuuuz#r7SWnBaFmSUHlrVpa4op^M!iXP`@IM{vy$no*XIvv z)&8eD*^#7@a-IH1Buj*|(M{TX7tvUNV%J(T-KS?J_8#9IqTz{xf6<01>dx?&9i)y* zNc{JE54CgfNRr73#v+Fr>=(VbH7`l`AiU;?sFw2;*)C0t@{Vx(As|co zk3Yuh?%Pi#`I*tJP6My9E%cTteSiC-q|Vx?i5R514H~z7{`5W*4>;qZf2|RXrAw38 z2XEFan{$g)deX8+-JPdp+U<$m@*D3K_^E+>KE4ERf_8eQ4En%$hxaQz>KN9$!yMaln#>wr)Vr;rI9(L<$rQG%gJgY0V)EjP zrs~PM8j`pB6y~7=pw)|pt}JXHi(WN_eD{iXX!$_f!>u!uZjq$MlZ>C=yi4Zk zTLVyd81k#X!J6+bDLf%HB3YG+?M_ZsfVNrnfIx8;f~zPC_|I?*Y)Gwah@`PMUocR&nl{; zE4!j14Q8$y(P{R^R0#2tW?8QMTKNa0C%9}_a8(6Xn07Af- z_p3`0_1!Bycg(gzCSUmMUq2i5CS*uQ! zQE`H1zrNH-RnsYbOHlZunTCHXSGc`$+4~koS-ZUKx3nWK&N-OZrXMltp( zi1jy*QCN?iuBc$ui^MOJ)ij+7oim6vejcKH*XFNM?50eT@e+S}H#L6b<+RLR6FuR+ z3k&8OOya)h7UrM5yFDm4q%?BMd#J%21A$BB&@T&tI_ zqK)H(lO+a1KBFhl%z67cF>m4YW1+k0quwZkyNJVg!`fuH+jze?P>ATFX4&ggE{BCF z1vl|g|ADfJMg2s9CNPBR^s-e7RxqDw3gbeG{QNAz2D4FYS5F&Z|~72X-dm|w&EAi1Eu5(LRl`19(M9^!fm|dJbgumTn%uV z_@z&(N_*Ob(64IWVaZneH{9kh0o;N|M~6FE+Z660^-4P9sC5R*npe zH}-LgEGMNPf55n=(xh41M-A?qPMITc55%cjBCfwxrjU$W-QGFQsf#2b)(^C4(xf-R zst?Ahdc{OqpLwQbA4TfUGvM!`VRMXYluZkfq03mXa>MzaT_&?T7Iv%rTS?TfO&6oc zLv*n6OWq~x^ft!W(J>!crx=xA&Nl8o@h5m>ZkWV}nD)f(%FVKGR|~FPGHQ_PjjRmo zyx7tiGuk*p{VYy4b*uh9{x*DOybgrM(|8qUSl6{c|ckY8pAE|1#WjxEEPF@H^2He2! zaqcV`Hv>U|omMTt2mp|pK4JV95Z%y}-@`|lv-yz)C#prEdS!S&!@+wdgn;j^o6>PX z@*Vzle1rb3@9wXE7NoydvaWd%eKxuc_W@T#tvl6JJ#msUn^t4Ly2EoIiC1Ne-~R8G zyX)uY>KDjz;C@H~>>YL=DcSQ3f1S=~b2M94aZQ zDT?IM_2Y@_(RbBSp7^>a6*cflgqQ**TSDvTwNZ2xZD{);M^#N>V>8>vp7F2UqrvjUKB`UvPgi<-&6kk7M?f_YJslK)SyEa6?!Tf2z|SA`Q={A3Oy!wN zTQ#>v>qZPAC;9`oS9az9^+SNL?q+2d;HFBIo5uGkMmdDU!nSl3#x&a-`&1nWDNDkS zPnEbR=YON+4M?tTuU%IyX78A}xfF9OE&QTq_S-zhQ;E~FeMpAylWjvS-yDq2$x>}f zaGRVe*}ZY?3roa0eUo?Xrs(|`Ytd_lPdD}qWzJ5nZ)*B=_NM^33y{XA=MI6A%C6!#}qLd?0Tsxk@>h(RStj`iXtU z`_o)o(xxw3Cf|&6K5&SNyp|f!CsM2qhSC*ZKokrk`r5?=6=xlFjx&wEF0@gMie*}g zwK}2(!7Z$bzU=Kb_L)3(wQM=F*!7=T>5^nfpem@f(4p=?`kp_Hex5?8(bT_>0(pg21tR7=|6s zp%gAzxHC304TGU-iA&H%G44qf+AogOSaDzY=4wi-#mLcq<3+Ocwz zBr|nE_eTo;CdU&W{?f&NJfR5{VU|5-o|fy@!ib<}F2<738-eq_jb{WBUQue!?&Hh0 z1(TD%`13&^R`2$|=Xd_TUMy*p)s1CFeo;_a7zXD#`Q~96l=**Ep~|egvDbC&L|;dA z4Z)L47J2EQA|d*FF_L(!`F>YTwI7KyS+iO8*1D=pv;|T=+7>Y^+lC3&cs7b5amurz z#Yks;bMa|ayRn7y{j;S6JDmVG!BrKem3kp6V8`TjLch>1GO-z>D49?8RrNwhscg6a~%-0&Ff(+t<4S*pLJydXY8)Rga9iU(EenI5W_pf>aJp?55TeXT(B*<>@GdVo1`AV{;tV&QAj^sk$xeT zY7_`NmLF6}P5j5Zx+rtGRhJ!#oh|lpmIq9*s_qfrGQE(aQ7~1_q{;e>qs=!-dC9L= z@E=LMh%x9q(i&`Mz-{``h45qI%N2Ts0b?DWH4FpndB~e_2WZ(Wp*XZEAT`FP!YQwO zA_S_x3hmr6n;-YM8+(o>))p1@{aX~Rw~Gpfg#*UiN3$=nqrtf4l-8A*=K`Jql~`kD z85;CTy_aOXXC*h)xj-EAnsJdIt_fpDJ&h&ZajR@bo1u4SNwzgX(Zw2&zDnk0N%<%o zHxbd5RW4|t7oHoLZhruYasvqhIk&Nm zCYj&X50c1~Imajd*r(sX@;~#{r{<%3x9!66Xyp-g^^Ol zI7o0$rEBzIh<-!vd(m~F|>;Aezs_MizCiffYYAZ9x+BimB9xchqITrPr5C9FYB$Z?=_cX$1+(Ys zv+tVZUXJg88oxB*E%8|JMu&(`HKXZAgy+}ru;D%l|LJR!D_J9?OIU7G#hL0!Wi1*Bk8g%AfjVB)NRz#a-z-9 z=^E(>MpsH&x%gqzGt}-*uQJ9nyvP+5FBNo6=47%;N5K)%J_S8{HqVq!$Y_z-Ei z*p|@G1k=$Z{H4SC&;_;Jj3KZSoe69IX0&s_oo+Boy3A02)o8QT^?M1DPb70Ht5X;~ z-?ae;1dL_Mzu7n#3FbeT@j$BDnM+2NLv1o^ zOwH2NP|=zer>rbZMck%PQOPU~7Z7cxyInCYF;^-x7eGQqa{+6*6L-=C5)~>%QdCj| zR7Bs4n)QC4_jerc^ZfDjPlv$w`kvQvF4uXT*XKiRV;G$NIEDHz;Iptb24Bh7msLK zg?#!Tj7^ z+I%eqNzPxLLjY&ZB5 zKl%q_FYj5pKd3ktW{$8@CIh6`37c#o5IG8+iuD?5!9jLxdB<3-X5Hg-#GhuVlhMb$ zayN|?6FYCi`L_ulJ@2aDokPmVz++XTA~L92f{rj9Z!Xtl%=B-hbA;bFo--mr%h)cF zfd`$d5&8T0^05%&Wr_9P_=NnCkFHtNLIgFAMImEE;V;_9)9Kbp)}{1%JDIXw17|lS z_C{HHRTmouK1tmQ8xp}&$MGuj@`QuIFPatc#ZFs3#snA9_jMO;+)_rUhR=iHi{*Id zwW-X-X6)u!MGI?m&T!fLa#vAYuKObnGUXLWu^7q-eiM1EMG1k5kDbPzOkz*=%m+B3 zjzslUfw0r>v8+c08D z8O7MrfR4yXOX5v55y67EwqlO~Id|bXd49(Jt_-Z7cY>uB9}p@sRr!Y)_jbd=DZWR2YA~RUw`h8Mc?dz4ouqHeFPl@0JIrAMdMQeJ;>TX|yoU6(>FA z&CSgy>a7N#h0iQUWS9iYmVhZX$vSo)*EIu z1~hDTPOT^9cQ}MD$4ukiwy$!~9Gpes6}P6~;TNE;y+TPoLaL4eW1$6Gdx7Nx!CA53 zb`3i;;sL>1ablODFi7_5kT5~L8To*D382OQ`jh+seGORv>aE4qc&RT|1vX2LYBrPb z7*IDk=dEa#oeA6AzM_8og>Oyhitm@f-Ezk_H2ZBPr0VmAA2N;**LVb0+IF%jGe2Z6 z_c`ii6^e>qQ6yURdU2HbwW*IaN>LuYuR=t+oXe;wsGz7#M~%5YV%#|@`1E^gfL=iB zf1nh7k&;+FY}U*O7iHW@yMuQSJMis~5t++$Kw!6i$+4!c0yPyElr0RAY8R703|Y8s z!a=f}6RS>OxHzsw5`8$&h{wbp8L+r++tuKf66ZFOdChzyaswq6;6PNeE5;{A)OlVx zc0>QphElMjw6>q%Vz7N|dD3*b5mK43oo|EpRQSwO-oua7q0JG-P-49oR9?UC(jOtkk z0xfaso6=E-$O2>r>JWVDQM<1ZQad^7v1JoeZ=%ebXfl!JqDMpHL7Ay_wxx2{oqEf> z!+fYrqv&N+lbac;kI2Lu4Rr(9G3|FMk{gX97WQDmRSm&4JurTS-xVlj$YQwG*@IZv zzWJbarnxXVPGHPI`Wzfswkj|_=tz1ZPK{YtA5GobC8bqHghlQAhqT^oqgKB2A@RfP z(EMLMAbQynL#7o|jCbl95w@J(B?=F#u%e`exMnkUyem2)M6hHNa5+D@1!q~QM)VF{ zTXir&)ES8wnRfpQRXgrSFW=uz#+hYCX_Proo}O_6{|nh%T$AU8CUNpbNm8T zKW;1yoU&O|{3l1gV`0A7+gb5Kotr1K@^ZI-~W;KI|TH6-v>qlg-+@8F>f8t=|C; z+3*{(=bL_R-(5aqnkYWqy|JO$@4r+#f|Pr?V94 z2?bsuK?cRj=%As2EMBO{E+mm#7Xi`q;n?`@ftSBmasY!c5 z6Jw)HWa=R%OX~SUOe<0qWOFD>GOSz^CqV?Dj+aNaKFF&s6U#s)zX>P1Cb8A;50%%a zH^5xf11BSpNfnXb&g4uTYBVU)8=WhM3d&}N@a-P>&Z76sIUas zs~llpwcWBXk*pFIYE!1P6z*H=?<)XzETgFKrpo-*M`k`Ngpjz?TJzB__G6M90NX)p z#fh%A8&KJqdR0u(5Q0Q_bn<3EUXSt;VFGt76iec5tHThPhh5DE5j&L!Ft@LV!b3v8 z>t9v52=XKcP%)@+5e5<);hENS^4{%0Vg2)W7Ar9i`--m=M11zs2UWj0T{P*)|I)%` zH;iKsiv$J-QhXjoG-c~yv0YDOLv#wQ|wGi+-*hMrdXpvR=&Mp0q8*`Jd9EyrN| z_Z8kk8Tj!KLQfq;5(v!Dywfi28!cIAQl%5=j?Y`~unmSVulO^SN&4*-M1l@42y(IF zwJ8TjD#^%547kNzlYeQj!U5b_)LvK{PN)uYO;1z{)7gd>?U0GX@vZ|ERMDNbyo#~ethN}Rq5hUo%&~n*go#~EkVps|O z*Ygd==q$JlkXZ(deR`OA@T-h}EQkNSuhRw*%!y5=#-`|qn@~*TU$zc_DSB#>jKnRW zf=Ez5-HK(g;}vHL`1#6w-vx39Up<>LBD4>gaChA>ya2a<2QLZqiZjizg*ZF_=*?EO z6#Q!G&)yHBsXh^DC<$N|`O8ktD7m*YVEoW4%Ao>1cBkWa>PIP6CJq8~3ozGP+~-9vt9v@M+YU~%mLiymhY|`W z?iJbUM<$0aerzlfE6Un$x5zeQeS0@?T3+0Mx+A4%Lv*C0n8dtWs6+WTCthv@Fh6GAiq13QATDFGwsLkah5W*<1)?05*PXIRvcy~vT6ReR+TCMCv_Kh*4=p9P&6#(H!W~kBqo_5?LjiTW zJl+SNraAUTNAylkmbP7mwho!mymztF>N$++%e{{i${x?do$>W z)!ApituV}*S$^FGUPt`cSo{z|C=18lLgkTBDfyY<1%yaciX)kSGk!a(^l}R5DwI} zPEaz|ON(ATxE~B)!efeM3;R$&G_AhMa2PWZR(q*qhtc&&WN-{;GK(bC+|4|;HCbW~ z^Sb`w~V9l<8h4u?>6HdkVb1|Ep@!hnVbrATmsbn-!a{rYn3TFRb zu4Yw4xl(5@HtK@b_5icP0%n0`0%=e*xaOYXM|qzq`|;p^Dx%CO9d+TW7`a0m!T=80 z_NSPHyj`TfyO@1mmuw;Vw@`Z@szc~&ni)SY8AMDf1`+2zE1GE>SZD$9o=jK^9BUeC zY!Qs__g}BYNf3OSsWMFD%bms?;j?wXK!q6?jy;X9hX4BW(1O^) zxlv+?%n23q5>~JH=p`m6=4d)6VHQob6SXjfq5k4<*H6xkDhfB~ZC*z@U(in`_T5gi zI=2q)Hfn3j{Ama^jK8Cs0I-to&OTr^@2@npuDm|JObE(V+iw6RS3Sx&fbRb*#0G>1 zdAZfVazMHP^fEws=*#_hgR2mu(wPLv8?V1i6+puTpX@pIfBFe%`sM=tYtYu&zr{xY zZz`Cgd*#ozf0;7uRj6zxazETrtt%+|=5G`Q3lAF4?$O zX5j{6Ei=xf{-yMU@T(Jv0B_7;h%okEzss5v?qBeWZWw>IjOk#AT5h5GUHB}IM{K%q zL9Oa8QaGo-9Q^}xb_L*1kp6As*xyN$Jz2BlrQmS*A#3`zlea?LUD%H@hByAQ?8z_2 zh}DPEhG5;Zh&}n{1|F+}Z#by(oag5h&Ph97&;uLhqnI>_Qb=G+)N*mPrm%>780*R* z;^^13v(bId^Gf+byjByLv;Z<^)%2({VxFpwlV=cJ9hjQfcs$Iv-N|Ac2%ZoqSM)cb zU#JH#nA|Z{HF7s>>6q?-dbfnhYy8zqV6zYxhA3!eYRx>vethC8U!KsVQKlx{Mj!4|L@ikTc5% z5##{5HlP0<-4rQ7FgY1jiy=D?G&6AQ4W2nJU`J#d9#M@U@+SLB`0OX8daQ*e*?24i zr^>Uy6W5ej`pz;h^i9N@dJvUtw^nuq`FntD_tgJH6qP*SiId!^nnlZggFRYmxTj)Ae^OIN1zwKe|b%jwfH@2AD;dwGZ1U zAs3(I1Ae2#s*vO?kWAbjPRw9fHlI2eqaR!!($07=6&Tq-B04x(2DdWG6OClSCxN&D z6uK$o_*M@hPovq>VAj{$2H2Qp&w#Ib*Xe1JpOmo|_t+CLs_VM~Tm})Gh*)mqellIv z4K-7M{AC!}A4dUv|H3iIo+BWDR};$SJMi2@0GT};t*ZOQP1Ak04(aA{K4u)=9pVde z!0|*KcYtiP1CLSBD^qy%o+v6m;r;jo1VRDUGfW5e=Y`f2x^#t;Lt%J<}*fKym2jkQU#;M`eaX<|_g-_$?6v<6?p3>WJdw@CJ z%|UCPti9uSsxSHO&4Wsh_MJXupnE{M)4)?lN^Ap1+VA5;H(w7TWEoLrf?qphHrN?Q zQ$4Yp0=@&SKMeo{dd61NI_5P%br;}9l-R#Ce)Xgz0@y>d5u11%QCYjiI2@W1?mMW0 zsqc>6#Fbggg2QA~8FT{YJX5h~)3t0=e~)@3_A1y>@P824 z`7Vk@_c=(TALQqzv63CdSxhvQfcDGjB*12o++w?eW1xQrHy8(E$TtT@_J01m>UJjx zN{0vl3m(vR5P<-giflz0j1B-1udq$3-lK|@iihgh%hr?AdE*kW{cSU#h6g#bpUgMIxmY(-W@z+2l{l5Ji=Cw|09eRb`naw2_i! zAno_NeaJw;i*yZD$Fhz@c)Gz6hk!!MbOOtYp)zU1^O>>`as@%$YdstPp+wg(izN#V zr{G4O9sW~v7byb0;MD7-n6v#KeuW0yTp;_v=l?^J1Fehzo5VW-4*J@FTQ9h?(&+|Q zjX!VOn0LjhwsOTZCGRFXo;>~`Ya_>9UiuGFP2Gvgd{f?#D+_j#i{HE78{mhE{laJ- zb>KC*8vmmVf!(n>$nbwzfqh_tsl=jB~AQ&Kv1Zu{t z&R+uWPSq`pF@N32c&zfek&e8~M>AZ)UDc@cx26~_`z1LHtCJNA4zVc&Ldu}_QrPa-Ql(Z51nS(JZHD{#d-+y=2*=He!I+k8}2e)K;j1=02X4};5PFLbI20^5>* zj9>cSyy`nc!lBiTn@&*kd++fv^<{}(pIOV;PCzWni<-D|yJD+6I` zf;S4DgtzR<{JeI<3e}?N0LQ|9y$|#+wqG;uNN8A41SZX|+#`%^(5j>j3)992hH4>@ zxbGT|(`pk*4q{8K1cbTt5xgDPCD;L0Nl@m8D)s_d3lQ1w(s6nmPu+Qv0+K!8@9gd< zD%YM3>f?jYRLll!K=gxJ$f)M7p}v*7ar+t=#Ctd?;a?J5u)Y!ue-}3>tBB~QndRK`YC`%N=_nOGPg-YpH>|BsK z7T-^VT+E23wk-z$v<9oC2#4!!6xh~lh!QbE&9qzTQ$}xrx+=i~+Ip!*NnhAeQ~JE8 z-#WgNaE4}#*}w~t?8uVt?Ma>u7K}H~$`i^Ky&;AZZMyiAHP4$W0$;Atn&-sA!^`s9 zKNxxsp)WNtcKjw(d%d@gs z+=}ewt?v&9D4ZjGZMY+>f$}-Wa?4nm&;6>Gk3?7NliaM>MrM>_4*so!2xs|Beg~sm z+ChrPH_peY!c?r-Mm6d{Kt<5W0voSla`1u$Cj!n-*2j<7}51&fZh5 zw~8uAjyTYl5j2ZdpLQYYs|pKwL9Qvpeb-~7)=C;lh*q>h`pc|o^L(E<#8J0Dzlck|kHq%x1mTET5CY-_I6)zM;GaYW>E2Ks zvFHC}HU4ZL95?|ha#YueZq#yK>Bo%8#Vt&zY+620C34u%zgBToNm!s|jA)-ObR3W+ zoMXQ^Kk9+zX-Fo~(3aB9l>#de`hdN{ALitN-s&D+Vz<;i^1S1!SZNSv`Df9r`wc-U zhkTeq37B(`{dnEl0$Z!M_MRl%37;4tK!@!Rv}j+{%Jl}il9$WInVx0AI>9coiUBi7 z1RiJr0OJbYj#c{YmG^w6tnuNW4^9f8D3@QA%&e@>EL`O+FHj?p&Sam)LJ>CGr^x@0 z2B>#YKJ0xIC6cek?7azKv2(8WThN`H>+Ee?oqUI0>-l(LW^_wt?9NW{STv>qk2*1^ zSJG)ecFsaakOUb$V8XdEc(@Zy8;_!m;3JY5PN`UR_N6^q67fV1ycbI zu5UzcKsGT(<+o9%mbDOmi1I&>&nd5r*8pR3`Acu{sYRn#WLJ>eO6N7H=!6celJ)NV z4Bx&(9>`3s=l5>s?=a@LlgU1+iDqbP1yR>GX1)&+7F#uriG-HVr?fmF!eu9%*L6;4 z6D;RuK$6$1t?+T3Pfsg7Nz0KPcO66i`06l>&p1jM^W5Hx@g|T{cDJHq>*>s)SK*G_ zP(Op-WVAU>`YfvBgA77Pd7ni$!6C7fqt&9NV{Gz;Dt%h^#5QnapxY+V;hMf31UslW%;ql zX>X^>%Yd7U9;?S@pRkLf#{T7n$!!d3JeQ~b4p$xQ!v#A~K=D-(&eBFim__-e*^)G} z5q!eWkJgm0hu`N)5ot)AaDOTsm*jswaFyeM@A0sCwI*5y z+k_##YVq$F^KGSr+;=#ybc_n6#C9|>K8y|U)Bu;E-ar>i0Iq31xa{tis(uYjDxV={ z-s}tX77r}8_C#B<08^belLT*wg&N1SFb-O8bKT%ZEc9~yn^{2*BJ^f%V|^`bO;$0^ zp!ql|r+-%a#KLWiI>wSd6E;RA`4duCwVljkCG<%)NyTX327A1)7R`*un+l<_yQV&h z!qAm#de-hT<&sYlwXe6ACl?(J^1XPuIx<+L+!`c7_z3O=!_EBU+hBa3T}IFJ@4B9f z_3UZ2lZR>(J6zdRpN>$c=xVlqw7DBg-XZ9>uU8I6%JI}(RB#ZYK=vb?S980I;cT-Y zZ!h_!_$P78sH{hmXaY`~YL{Bbd?YyFr5@Yq1|*os+z?*k?;7gf4uAuYPO(i2gyxB+ z{+VY^G`_XAG?g1Q>NAFmuwWYY*oxZm{XVnd7iOraFl|DJ-c_97&21P-`g$Ai#Ggf* zjuJ-?INfY{(MB<{w zBE;07wR^s@SPJ+u{;B5ar~~Y3!l2?8$5du2wWhxeL`gH{O%>}qwTm|$B)_;(Y0%@= z8spW*04UB+8vkw~(ouv=b=g4uktsa0shppYhlwDa$bt*3srKU_L<$ zxUmOJ1S8}n4TRA6NVUv=KjPMu zvAsWsyq{h5E#-Uf-}fj0wB`%--}fk;?E@_><&y->Yly zXO7=OoR{VecHjfjbroka*$_NTR!PO+mJ9&w{3Q;THIBAACT~} zlEx!J@zp}#!o0L$UYp4gyv-V${^hLG&PKUx4!}U1hlTspk-9GoVJk4_AiEo(NJ<%C z26|uk{+P<$0e`}^7C6;CPSK&X+7`y$`kae(_?dIqp_fQ(25RR%%LB1yXiKh$+OB;rnnNBHaRB%^OM2 zyO7m6Yp)K_olQ^vtx?a8fc)U&y=r4v^8lXCXR2pB0aYyWz=%P~v(DgyGFczqfENYg z;>1x_bp|2tNPh2_sFsBtz(O3+H2Fh5 zcnBMCHfKO(O{^0x)|B_P2tWvvfOpP9wFiZN&1`w1SHn4fVdafn4Ljc1iznVsJg^ij znBZVbK%Y2i2+3c?MH_l>$R_gc5v+S|DK@I|goHtq+qk2HPPz_RiPufJ~Y0@Qd@7FGa zdfA=QGeoDGw`&$$FjLp(ccr@|&l&nXuVcI<)Ys=+B0?Q1n18KBw_r=}LJ}5p=%`w3 zuR(rO96=AH@hi%!%u-Et`hJ#vS)P=M`lb*lJqp?cQmOZTHA5p}|IpM_x7fzrw{+>4 zKka}ac|7_2M%{_WpXvm6>en0Cqs#67Wfl@@ts8$i0!(HTdL_*hq2{DJluKw5_0}w&wNR278jG*uDRG{~BqL1hh2GZCl@$d>VvD8PVo?YXL2>BAQyDU8wW>ifC_D)d7{EBQ@6Yp^7Fg3T<%7 zSXL4f*cJ`ZVYYWW z3{}*>3$zo5K_ftUo1V-KzJ|6FxYKF|I}4SP>uuc(tk>^im~iZ)BD*^s4~Ott(-LJo z44&@2OGxJqE_Rt6$OvyncCw4_SIT&pgI#v zMTb8@8u+yK42*lAl-ty(lu^{uza9Y$a>t0CmKm3f;tHZ zt*hkRQSp0Rsi7vy-0J80I4!M6`Am<_rN){vT_EzKN_zUv<{?r{%l5EHyF;NN5! zbEIkYk49c6&m~>%9FS498+_cDIH1|%e`xk6VL)&)eWz5r=7Wp3lUMui4)PDhxM}tz zDsnmH$?W;?|6cii&v+Wty+1we|L3~?zo2lXBvij(0wrhBMrA>heP^qk*K7S$Dl#af zRGF4Hq}dym*yI)}rX8ZUJ5Y`pbbRsGxc*ITbcGg95z%aKjY0GC2U&UvKdL8U`F=58 zd9}G9PyXi`)%mcApNPr@&D02sB?(}y^;zl^ESXr>-(fveQ8CgzoV$^;>C&em_25A< zAw5meSM!gKq6d32z11cM#(hf%c}@q)DY48A@hf-Mt(@9{>+>{Bav?r%a$F6++RiU| z1p`E~OMh3(kM4=7Mh5Beqj|YQ{;AMriM`+|_5wh$*L>GgZ5;iw4y6v=BL2sVfA>6! zA7EZ?-tA$V)VO+CL25Vpvhbx~+d$;td`AVSX%%Zypp=owO}`5~p`2Sczu|1g@8KV) zQ2D&)@8RDwTJP?!m;PLxj;u;&u{OCs+vI;{k*~|KFcX8#=PoXbTjHbdUXK2Wa8>?w z&tyU4!yo2v<o@^dW)J7Sbf^}qeFH2BGcvMsIlaF)vM1?h z+u7Z>hFf6Z2AYl3J{!d>>n)8tgQ{HWLL~ea*U(PqYZ}!bYyVkxWkp^9O>=MUb|_a3Xe)h36W!For7B z%a2aMaymg`s?M%J`J^Kuz$_az*6;C~P5YGjNQD!dr@8@h*4(U&hIPQ%KlMA<#@N(w zpUFH*w8_lJUnC~P*tFV&U{=1Y5D_bbEj^$mjrA^@Ir=83fGV4=ac`{?KdmY`~Ks7ASU&aCY>lkxwO4K>5ZAb}FEo zpLEbA!jext1m%XQ!rm><^?h4$7!2GLux6%VWQqArakOnhzV}=QK2j$j2Ak5iPnSzA z4tod%*A-kqAwE+b9EgrS0^k7Bm{AgRP(HJU>4cBxr9ml$iN@V`)vsmN#wo3a=(!G! z4>mi@+?gU1o!6Z!g_nXfoekXgm6w0DRhgOEH2S?pR?8FUQj#{{2gPq%^!Rz7!lqB3 z{1HU`|N5(+-U@+CH%LGbqpO>{IHGI6W`15}34tt1g?YvJLLg-uHKGK_#Wcc@E*%Ov z-X95B+JE5g4Ujd4d;}2Defp*H?^eztbu-6c*&E~UuYR^qyTTl{_xrTTZ<04w9It;z=d$N_QX;|w-OzQ?Xwd4Lm^sy|q@(V29Sk{p;q4^H zSxbnCN37+;M&iKve=7N^`PLvSal-V>%+0AI;gQ5OR@A~H?<*d6^a?UF=|48AhNAWp zGwQe#@hfWh>*(8kdi!tVonk@X&bk~v$U9A36IHq}r%t-xzA9+ z;|4ezbH0>0vk8h$hLjKA#%bx7cE_hE8oI~EU%<%@ppEJR0o3en3*~SS;u#17Kb$!+ zcceQG+W(>NMAO;rnMO&r^XE)C`i);TYOb-2z%{MOw+N4Tq~9y#&@Sl0FfV77as@YF zMIbk@KC2&n?2+AQ>}#=muOmB7d#dMUhX*(Ag)>KkPpEDu1rON2i_s(d`k{6g710~A zq5JgYNqzY>SYDztzyW-kogYoz*g-oSjCh75+O$nLWdcT5r6C%=Z##oj@$a^+gBwh_ zsCJg2>KpEL=B~yaHk=#QHE-+P)ipL8WO&YT?qlvPiQ{GTlP$vVKH{mm`<6dG+Ew{V zSYBxVNO;O`V28Kx@ma^Kucu!RD4J;$6jTW$Te z#Fb_Nq}!+^Z(-Rbqp0oQWw$ckDF@oNimIegGg0i}-hY!b^WWNU;~XwQh53{~F%jE$ z0?9*9$YEaX=Py5xMhx_AlSpeEWfL!+yTDrG>VHPq+Sx{I=iK1De=)!vs`77%yMm35 zrn(P&$w9p*3AZE?a>rgM!0mQ(b+VbCtbl3TswZDh=90i6H{>1`4yxm&@u}qJH^|jD zr1;b%L%JO{w+7aK=~TX|Bwke1NIfb6IJc7CR>|<#1>(2z=-nMBVEpcxh&(A=#OYq& zTv+vmg5qZ2Y#6IIR7c)$8QtK_L(1({X3^qgv zZ2uFT(>}g$3?ygwelVcPz>^L7e5~F z*)-V`x%M4rBVqh_0^nHw)XXL7z%+GWR7FDN393K-ls}`!uqgdkXrcF4A&VD5s?xDg zGB&qg1a_RWUc@EmB#QUoCrr!}>1^bEi$<8&nEv?QvC$_%9f-PPZ)_!VD@*g%O_>+b zT$yUW6|<`8m=$y&{2&5EVk|s;VXbhJ)7h_V`Yy>>@0{z>G>pEYq!R_Hb6V$^VXdC6t{abWB>_Jd20EqBXHutTaGMH^pe?ObD% z(R3?HShru~K7w!+G?C`rhHoPW)`4Fn1#*0 zMo&pjvM?~O!$zq|t42%SCfn|Qm!MK%KlS4sD4R7A>^|-H_T({}OzdFy6T5Y~-fRtQ z@vo91&H6u0rB|Ig#&_g6GbgdI2B36o`joBrs6vo?wSwDYzuH*bO(JuaSi=D zBg|P=36>Pz(c^|WoDgyZrY;FC8LMH=ce4?)hHlw#8>ad~;C7a6CaUmEPVZ7vn>$h6 zGtg7OIw&4?CjgI=k$$KlsC}iDTVrnn`>+j3!+XE zu|ZcraV!$#5Qd)Mtsds8wx?C!vFDSj`s|0!MT$wG0)900`y_pbaM;s(-A{h&Rt{Ai znn@hr?Mv)`$MP>LR2&N{x>MEfo7A$isvDeNR6!}gFjf_oc{Q%dR|dF&VlBt38CK&v zwps(tvtc?q^Z8Uvgpo<3;iGN>9meNFqa(=={me{ynF6Tn2PSt_s7pH(Q}$>=6)mhsHC2AXgGA3NOAjJB8x=9E=+;(RaWy`2B@5;?UJpQy1c@L{wgB_^ z!sl7vbRDShhG`DzU8=J2J_NUfdErPIQ7ax!^`8)ALtTkW?s%JVvXO=W3yW|JP6O8p zv!hOGeP=BTRjjcJP<}2&MB7NKBw5nLlSvsn0HbAAH9-bNf>pm26knI!L)I~UOqtqDCrgJS9( zi;`5`><0VkTj7PMf5DS6wHR1a$3d&x#}Jt!TGaBMN@ABOroiUei&J_KadvO zwC$%B?8irz>;(sjbt+)=?hIKU0gK<1KN}mS?IvVW8_?*WbPw&WOq2oE;NfUdArw%}E(*9m%v07&$-wjk9e-3{lGUIcLfCjFb3kVZr!PW-P(qBL+Qwye3 zNnii6GYQ|Zpz)}?f-n1MtCWm|#o_vS`+kppK}Eu<(Z2=1d92RO)!*#V`_=tc?4qB( zIR3rg=To7kpXpb6F8{^Q-?Q1?^^2cK?lsGgG3$}xyY(Uc)5At@^yuStKIV@)Uwzfa zjtpTN%}>ZJoy`X|@`i=UcDsec&&>kbUwaL$gmherH`z`{DXxOhavLctE z=jSAR_p9@Qf?P7u5$NTVFn98W1N;50hMfrfsK7|R{unXos-K^F!}nLd)1kCAoeH@A z)kk^`N3YEvb_{aA;~Q#}TOCBO!G?kmXYgf7Q4Yx-ZMm%bH}Fyi#D!upz|OQ>(?{- z5P9^4=4lp6_)EWR>AU+SCXtbsIYrSL7wF^XRzyab^b95AnKts(2F`mzVge|}0OiAAWVq5E&>+u}e%cuV;HLNp z9F@|LEh&#Fi;Q3gM*kGa2H0HGe$$y^QW4;?Os-HM4ZZ9%H30h2$- z3B252A0FKg*!t>h)~29`l?VYBVRq%aUcegOjFvkYIkl&z+um9X27L1joBO?vjNI{6 zE&c0Mo5pd&D|0EGG7~DlS2OP=Pr@$fIr38j*>jE88sb_CvD)KqD9*x4L)r3FDBA9&byYr|-o}O$Wjsms#rbEb z7r_D<1LvRqpA&~vfR+;S*kn>c+^ltG)#%zC(lte2YrIGW}=0ovpTg!K^a z1E&iBZ}FC2z08?S@~*ha!Qr&*qgF#}0NwQxy|*(zzxl$@mCZ#O+DKQ4&V~=xLLK?> z%E|{TanS+~XY1YI7V&8g>ctt*xm8p+>9X_dB}ds42rUr%+-I}~K{3JT;!;Oa0@=DT zA8`5Au9W8QJ9Nw?)l|8w!SI2Tl(1$ij_TE?7LbLmLY++6pH@`mjHnsq-`f|)Oq)WT zxEg1E?LYl4hZdY$QH1H~l9mzmB}+3nAM4DLjcK)o^Whqtuq>?i({P?p+MClFZVh6* zHjIS1rLMXB%F!#Ly_iW!0sNg~Vl(QCxTp=7RL>iQHr2FT*|T+E1$zyGWLn-*!>=BI zp13{0Q}ND)>|JzcrkTX0H+2w9l84fsYM8XsxTq_l`&G97hg$lMZ@U_X?GCR_l^ozI z5pO)ai`p06Tb#NEvUs7z%krn4d+d=*1Mjv}MaNZeQodPl+cxwqB+C%;b{(*97GSq`@0Tf^6IGz36rUM!QCb-Is8g$w|~U6Ju9?e-Iv@+He2g9nPNp;8c`W zc3w2mhP)Xle}>!D-Bx()%!sY;>;f(lriebMHU2hRji-& z+&3ScpfB)dtKR)4Tny=qZ}-gCaQ-n99}sfFvpLykfP((bsV1ZUT#h~gxz>hdPu_TY zGF3T{Y1!b8AG?n1?J;!iq6aP1sQ^jyVd*+I@_^8GShLXy7(=h_++ZEO;qj%ZFXT55 zCfR+C=9lr-(-j%$d^ZKc-K8taQV>C#uLN9Tmkv7mHYQRX`PzzYGf-zjnTgIwnK$f) zPo{9n9oRZ0r@t|IfQ_zwQhs~0AI`_;*DgR! zxI+AhV_8lo@o03O+b}^GL7PxF7S}kPDM~aSDHQ(FqaqmU7^8)r?^65nfpSr$b>^g4A*bT7ol8D)8M=$*U!`s`3C4Kh)!?dog zwzeMDm1QBW%&gQ}nH36Bn`zV1Wu>U8YowNBrichAw6(1=g|yTxg-tUvK}L$^1KMhd z&*T&26I4E+qM{;@AaI{pyRKc=_xrn#<34`Jar4KHC7e(1^L@U~_xt>O&ezKs1~#>Y zLch;|y}&~QQ=i(|CFf3ZJA055A>^GyfP)UjL>Vn5%g>ov4FGbj>uK}|;&!kNUyA$8 zPBnlp-ea{KkpVr*KRfnkE-kF<{5`F-8-pAY*-G!|KJla+jEOq!Mh|@*IEBW}I0fuW z6S9Vt&{2mKN_n2BOdS*ql!e4!`4d@WM9(@>@o3K<7$lJas6iiOI{&eNNlAo+whG0e8f)JK7(UkfO6eCNOQ^d#B=DnV@~aGrHEmmX)fGVFPtL zm@OD&q;3DstAaGLT?79Ld#^asVe<6(=f9Z)2~>L5*YcXLfbE(+==gr`3CGAPNqhvh zQcX_WTq;c`*RF`DU4gW?sVkFU0(;9I`R~j zN$>W^JYKH3xEXY$ScFOM8Q_Xm{(&L3fy7IjWLJ z!=yUvYvFrnjGpx1wXspyY5xA*@pcuikHlJ{B`A0$8e&FzsCoUj> zD$%C0MkP{*u#H5TM?>`CQ<*@bP&6@?*ph^=)A@=o(3_klob6yuA0d1hl}?e%Ar|p= z$O00}-|#W$-bJ%i22c#s%+~mX06leVrACu%-kIR4!0$VT@GWAnA`U4HS-Uu_AVh|p zkXO6UaoK-w8At8evtK*t{}|J|BvQ!psrVYt=))Svfv8m(J*-*uo$1;6#6Nv3OsuW* zhTz{ygSK55mA5nK1yC4 z`w@)DTi;v%*6R7~)HUx+GKHo9OOQJ;KOlgL&k()6Y)rU)!SK-V+{5 zbJ=%IMwb0n5XW;o0QR8jM9+Kc9DwjC_Fd@>^iV>=H2RB0^bc*GRGg*ILqA?XTqJw> z6uPFy`rq4bDl6IppmXCQ*fJ6z9RK*@jwHd;kiie>p_%`u{r1s)Y*sx#x z1oL|5%%c(kNqCGM=}T-K+mM_5F7H_iTgLj$<$clv7WzEq1C;6ahm>nq*2YbvjRQ_h zTB-lg2HzBRS@GGPWRl%C!QK~exq^pXIrl#s_qQy-5UF_@WTx}ft>Xx@Y7k`z{z17| z3|NSVcYZ;c2=|&v}LV7;Xb2;?9o{o7C|DMUuH+rLP30CKezTRhWO3lyR+!jB;` z&Ol29#nWgp#Z$Mx0;FdoL9~8u)Ik@!+=tBWq@SsIQNtmGyeMAr4Y+=?@*Ae-phf0p zua_GTB3NHya)uA8sJ#458x6MyRia)3KmFN1E{#+VZx`wZxQ#Hm$0(Aw7YV~Y-}RE0 z^0R$U&keY-9BE+Oj`%hjptDHW(29K(55pzONhH0kp1ISN< zB>qg}YkbbU6kJrJ>3Fk-%00tL0@dTvvK}WECPE%H^w_qXwaYgVZ;2a(@+Yn4$Y)Mn zkAILSd&JnhH%!M}`_la5-*Q(m=;iy+i4Ra}CsYICi%h=JAbQ^lAJoXn=v(C)?NsAx2)zI<40DF&AWnn zE$C|;wj>G0a)fEM;l&oV-=D5Vk+_nY17jc$D$CTnt|&Ar^{!9wq!O47My$eKH8MBHktRM-!PC*Z5mG8WvU970yOeA$~pz{=O z-*8*MxRaUmCVdM1>!O`M-2Kg$2=B%mdUFnBXpFWbEIY(!Nugkj&p{%$PC~E&1q{68#F4emH-|8LJDcv#QBQ_fb5?&TvW#c(7#KW1eC8^;@iSi}?g5r;8h)ybX4!!f@% z;|}q8$?F>@In~hHL|xk-fCCXWVx3tKFsz^_Ok}xDkPOZy zE}7j4Zjb+w5F)Hge!DozeNzL@Wb~~q*3tXLw=*=`h&mD0YT)c>%SQIWq7~EVIbb+I z)4png{EA#F+WXCssH(kTTPTArueSAJ3k%a{_n#UF(9PD}OvX*@!S`=boL`{gSV%n58?4W@cR`e>d}_pZsb!W3QW& zI0<;cv4>VLc>>+~T4E3UvS3DKpBmE)Hkvr_|4kivl3-X-TuYTAL{}yI)h*(;26E|w zW!~hM_7cc;^0_beRk_gf&AnG!HG~i8MaLg>fhp6Ff6fDOjIk8=5q(G=xM}FN>EsLi ze`bL@ABpfCRmt}@Nbe-vJ6w0O^_svbb8E0iRgnA&OT9t$okUn^v|jOq367eW8G4Cm$&I@PD=eu%I34J|jw|3qFXNIHrK1BsU( z0@>)x&;G#hAcGiW6q#N^)=(A2xF)MUBPgQ%rH#k_{<)Sdr$#h; z(NB_U&*pUSUY^|bY8k9)r#GF1MVK{r0Wo@zN*p{h_4#A-i1f@h@GSgM(TYj2ta~+o6RV8?=5R=$@ zf+H#4eERkW0T3?tA6zuB(4{cFcNDZpG1oP0sW(^xC5DfyH4sQ?_iK_Dh~^j2IW7^l z?A2#5Ig}onz9g9$2oRsEMP$S>f(EeV;IhruKgcT}2R8h*QvfgrVUaluyLW{`y4?8( zpQF=g*(TLa(=n~-lDYOtgysA7V3{~+DPRzGQ zgXr%E@-fJzz43M-($4|L0(swk&WMaZ%aiwKWuT^7J=0|8`F>s4;g?@k0nh-~=)q|P zj3M2)|6F9AT+=%G4==@rt5@!4mI^hZ;s>{Cw+MrFcpjH!k?6yxcZqL4P;CTf`v)eu z)ru>C-G>1KioM^@kf<*Zy^4#j`5KnpyN%ZjhrAYGY04O4O=R(q`fuXsLlcmVE)rxT zd{Ntr*|gaTi4x~^2SFGrDpWQ*xha3YE&rxdyAq@{rfDI&P4cX!0fQAjNsMb8S3q~w zSqiRRJoQMU8G*mfS^Veorx>Dfvh%^sZoPAG(HMWz3Qu}hA zUInNLVKo?~ZB^Sg$3x3@Ciu=VTV2$6m z=p1&!Y$w;PqIs$fFr-a2?$Tp4k!5k=!O)7`gB6t$2jZC-^eWk(n1lZWM~47KA?Ta> zthMwtgyf|HYciG2SS^7cIAw1k29y}9MFOB1P)6S2^5Sool6G&f$C zvtBaC4wfAkuh<37(=It$X?pUb!`_538#cZDybdH0udiW0f{S2HJ!@Lx?G)1KM-MfJ zVO3PiqBR6#)f(~Lj)?8Gpqw}8V zyDfQ+tq&1)$c#NJmK7X-_-wiHSGbLvu%-P@1QyC)ers4++ZxWZZh5V!7PV~37AQh+uaK-rA*2a_0D-k>5 z&LVwx-rrju2UTD{oadr8b0sc^|B4qCBQUuI${7YG=8NSfdjqJ%t3W320M>^g2ZjaL zgX%(Fb4kkby2$4fl{+r6{$~XwKEr$k@RXHHOxDM!_)q0(TQlJqd%7ylFMzIUCGb$- z@d$6Awgb~o_mtnx2KwcC>GeX3eJKTxC#_oeybGfNd&Hl-T=EXp-PLIEW06Y$o%ihA zYv8qG@g$an5HZ(kkN(Oy@oa`5!RpwQE!afPw{MOBb2`IzoEKrfsWB3h1OaOtVkQCF z3}=i&xT&XYJ_M+f#EAHROkT48}8=i@_*7#=9Y#`s8VqSrNff9 z?Q^AY(byyH?Mu+>xDP}Y8xX!AS%ySLxIB~C*%fSw;JZ zzu~`)XGLGZgVEwIoU40=`JoK;#YgWBrh81!!KD5OGhr^sCZ|q})Fz@S;2|0Fc_IpC zdqvQ`-)>YkNPDs5SjQNOLc_)czm8uR7jto z7O)q>oN`tOKLQRWIzzn=9t~MoJ&kUVNb_Vr5tgr9t6lu$BQTRsKt~tg;zZPwpI%?zo>(WoJytD$9L`n9R8--P=#?^nJ-Lel9w_)BxR1G7KKm!WToHU`ck5z0|O9^_-kL(~e2~ z8Q9=g8rU!o($mFl!G&d4+A+}?fBR!5?7H17*sJj1KPyPAYBedpsJ2+}#tuyC0Slzr zlgr@AH`2_1#I$fnxMg}h-Dv3Q<}4KPn6wExDcgukR*QN7#piOvL+cGtc%$2rY&Gx3tQBT9`)+n#Ktiajb{aQ_2=}rG|>R0gAj&m;tDXldq z+jjA1oic}dB&S^hE4oDrFL|ePxklqXxSmF_cS}p85h|ru3j`m;zrZYF=Ztb0ihdIN z%#oe^)=)kmW;>pC_ne;8Pqpfov1z?Cy6~TP&^c1_W*ro~RGYZt&koEY#0dA2XcL)L zRCg-6hL<6z0xw|6ZmZt1ACZDGugaxP`^L1TtpQ`HZCb7C;2FM)y<+EZ=_ELH2yYYq z1_>Vp#dE1J>|9R~CzDo)l-lwTajwHNl+ox(_M_l_BU@Y~=D)Bi5F`M8f$*T(V5W0S zUFBqRlkk1x;Hln_oKq8b=19w2aN!WwN*OS8tIv6OHF<>{U20o2Os4##lB+6KSGW<- z_W`{oo;ghun!5 zTqIGBrgnfFo_8Tt3~q2AR0zE%kJ248#*yEumEjjicE9pgkyt}>T1;=Gy$cH1oY@3ONK=jp1`#B2vlFu#VvKGU2oBR>zQZnrH` zRTsM$e8ZYBn%mxr>|k+zs4qvpdM>dC>*6oA|K5c?=`fu8ezv+Xq{yt%U|6)MKg}^`!FEB$f1uC(rbQW9C)4R+a ztn06#ND*-BioSDt)w?x`Q|&JiT9%D)-`Bz93$**Gkor2Ru!mC!E6V96XLrk11bU$8 zsJcU_WlDc}u!kaDuBF+Lq=e@+)3qplXCKp`T>+07tWUL)85#Wz-I^M$qC1MB@%BoR z2%ANiMb&wNMr>*Dm>0ik>0~LRP3MBlfSO7)+|CoM_nf7;Ev%FOe|{6zkLj8e<}$xt z)Y^_2atzpsFOY=(gAgDbNt6PLl~dgqwyaWhgu5?HUh!aa-Yg=laoaJ{XPz;^78p4h zGmGza^181(K+9&q$w-kzOj4sQu`{O?ydoM~Fr!320l=hu;c2ozU7|q>F?v}K43M9& z!*5s#?G%jb845BXIc-f@L&5~t>g3Nd(!Mc-KvRx7+xf(q4VE73SaU>4!4SWLg37H zY+p=2sii=i_=P(yTMt4XdlK09o&=3@8+nt3x#YaII!*9SqF{!0nl1$xD~3(}v50(qe4s>wAPAi|k)-A09GC3weKlk+G>o9g`abH^ zsDk|vnaP)NL~v`t)}Rh6Wp~rVETM#$Sv;{+b8r-2zsC|D^Jw^toSTu;UKBif)}0r( z8T$)Rri6d~MG~y&l$`NuOtMM$b{r|}SJJLZG(p@bg!0qq6Qi{nFxxaJ95;AooI7a; zh&vZxGDwUum&R3Bb7xGy9_5-a$K9(A;2Jtt<3O^zv;+wx-$^;$bxj*=6<0?RnJ`aK zOU&Sz<~B@<^BBVD7bBh=!|AOZj9YCzwsJB&3uP2G-(87v*)K3L7S z1lT>orLFs4+siH@+r@NX+Bzg92WRJY?fZ|ukCV^62gz&oZ5XbEZbxSIgx?*JeOq^5 z@ckJuMR_Wxl9bGSzLHhlns$=i0s^m2%@cgjx13g@XLJAdtEe15Y}uSeYT{0|AZ@|0 ztKcL%k!}^zj6aUt;L5bbbpS+olq?h}`w}Vc$-id?GlW@*168u0hN7``X$qLa_q#p{1?=s&RUlI7Wix}t!IUv-Oci6u`4f=87y zVJ($$BdW%T&m5UM9a)nwH={!t^vthe11^c$(mn3f%#(DNv(V*^SzMM>_1UZEbL>aZ$u3Whi?j)4x!%qnhGr(<60_rj?UR9!*=5uQF<~G+P zLd1NCQN^TAy>-$;uaR-Fd#^GqMQ(z|@Y3Rvp0}c!o*dbv+;(G(w7li@2sz&ZTP2Wa zV(Oqd*Wq1NF3R=rr{^cHo;&pMiC>MEGz|`$cqKo8M3NBJ(l&DZvk=5{a;2iibjBs zlPHZn<4?2fdIQf#)@rKISW=X|W(=49wZqCxuD?DYmFzMUL?5PB)Ek@mX$kezMk>;Wd4;0oj zx{hCdAl5q_GdsSBKY892BCjjxqA@5X0Ma4OCCO_tIk~)fZACCJZvN}Bqebm z%fWRUd12@

    ?;XE89rsv<&8qXL`-(RjN-nJRj%2R39v7Fwz)8J6Y%D55&{PDLr4{?jA^ql&|ME^B@;vS3uiD#j{jQJ0kN5!lr|c@G1>yQtn> z5Rf@y^51S}VZT`X1{Zb$rj+Uw&%nXwcbzmmFA~X_PL`h+H1bVj_nSAaDRz%Fd7yl9 z_gzjW2h-KRPcmAoP)>nQ^XsfaOn&0n19J<0Tr4wfOS*%l#WKk7K|!O9X%v*%;?CXz z%)2>8V2N&{=of$!cyp|sYgCxjF1y!S=_4<;RqTs^#kqat-xwvCGp14z1nt;r{MjXjTg<9j-VgA%~D)JTy3!| zdIT*8K7(!JmhmPMcZN5&EqL6O@F4FA+RqhjT*#}%7R!z;{3?^;SkRt0kn_GlTzstE zJ>4o`j99xrf5Wh!oh6S(23zauoZrDi{P5HW`mn|dI64^a*I>A9>h|7h4|NK`Y3=ko z+qQ9UOu8@l#L6o)-tso`C_%Zs8(9C;p9{Wo#a-}Kr6uUa0l`;LCy|ruWPUju3f8bv z;q~4f;Rq+QcKuagRVTAIFSw%DGz(iK89@aosCZXPN%6mH`QQa(gg;wFOb0Pp&T58& z5c+UZA(Roxp{RRCn9K*Ymc&VPn{v^mwl;2KVZU_%fz>0g=$-$o zKfL!q@UQ+HaB=d5JBj$iQc}XK-2Pf0HWK$(JEs8%_b>k^XsWBcKl3JW@)RwzHT?}Y zmEmF%vO?(u7}xyg#)AKHk+~7{Q0L@FC4^tQW$&u10MB?Q`2|d)|qKTj8~tnV1&1_DrOU#__A(IWE9dGlgqp;5%x;(JcLkOt#uet)eO~? z{r2x(efY}GN%U6s4UFM8C{d1)!Zi29)m1Lx%}a#`6|zW0r5PifR2x;niTum!2JCL03i5}0-8#5@p15) zk{Gwonz0v)-SMAd|F|2MJDV6Xf2Q;TI!{3l;>+i~?uaXx^%5Cq~FgV0>c z$m0!BqHd}BT5jSd`WctA@#ja-m{t9>cV+>*+A1esk5QSljX3g0`mPEY0>;Q-@M{GQ z#j<{Wj0iD9ntTPuY0Z&g9zu8!^L0;E00J#(i-I zgm^0BRmO_3UAkaT!JF6Mb8X5smNlWh>U9rep)kQBaJ8?nu`C@}@$$b`d~!S24Qz{$ z>aYIwU6TUSrJ7&y%8YR0eP{{}T|c$_duZCi9(=s!m)9GUUS__k-7_YnKzG*oJrT>=qv; zLz!p3*!1{ zty$;#HYGkLQQ}3aGt82DXZ6PnhZ?>zY!0bV2m*4B-^Jua0vN-HiDuzRq>Pi5Kf#@sR&l2T1gZT9%nSJ=P>2Yie*C(hm7iLS`6dBpZ z97jgzjyqrQn=Kf6Y!M{JQsP}Yj_1a<*bpBnMpu<2a8`nw&5y1A>R_HGATYAAn95VN z%7wJn-lFS|7=EoHqC&7qRytKWBFu`edW3Qm9vtpDA`Ki)Mqo*~itp}yRz%KKoKst5 zU|ODom%LlGcDly-c<9R3x0?t zZBAujeZib-Wm)0&02@e--e;=I4JnA3dhYP|v2i9M6{rIsk(m7BJh;rR^?SIM!8qLF ze|&9MCx$JrW>w`Elrfsi^ht)&gyp+29Z!{?2xajRB6G$|Ubo7N=D0Sm#LC1o256ce z46Tk~olSg%xAR$>Q+PR`i)gPsE^km5i05b5myf@6ZN*OOrir52GtBOKIP+Cu&dogK z5E{43$r)T%Jg^+FJqG~tNO>+xwiGUUYv^=YlFGeClXhqS1fnQ)R!X+=V@5r`y9`Xy zYiOQ)7ijlSKnU_6vRL@fpv;muh>n-i0sX}n zG;qz_9;}Bh(MtbZsnr5B&3#ITE>q}M{nhusude@>Z$R2?nWq8H1i5M@_+a?W3gg?R zZ+A!X0pz{U4xZu;(Nq%!mJdv+2w1-GLG+VT^;~T+m43$*;Fu=-Z{M83401f6 zjM+s3lo!CIV(h-#F^EnS*QWpLThcIEQF|8~8@9&^ByC_I^&7!JzM^#z^nrySU;v+r zD+PW)KqIIDXg@)I|KMFEDnxI(zfnE*lZ;P`xF+U4U|-MG><^^23=*j{Qaou^_AuI+ zw8U>+`FiiTBb$`79}n!!v+?*77pp%n_o72R!%WgZCxM^fqQS$RCh)!rnv5Lb7TShh*IrxL{+Y4~==RV*)I_zvt1r13QT zXBx%kuvS|lZ4%dcKiM0Y8Vi`j!AMRDOM$=b%1lWe*n6DDOSed;_-bpuPa*F-e!Wk3KEv^EhV+1U zbe-vO0)8njZq}Cj;i?Vrr)_iLW7TW}ueg>(e1z$F0UHPV5y#3`OBhP7h%2!)CxDTvzg0J|?MR5*J8QKa7L#r1ed%u zi?BFWhSVOKV*$|KC%1^ zCb~S>13;4S4)*X9I9Q@kXcMx{s{A^QMvbxzM`=sqW@ZHbX~MO3!{3Kq|mC)yvJix=aMDZ37&0< zA+qZWvTJJ*yH;JC;#53!s*O1U4@V$}ZM3XYjwrw6KwIxw7$2dKNvDZe_yq@ID=Vs- zaIq}<=HK@VNN0?O?;H79sCcSL|PazN>39yhDy2TgQb8Gaoi__ox5N4LDgItVq^@S?MNgX}Nx1SBqfzcdUJCC%a5%Ln_8nz7DrV5D-amLoP`rK4{>2M5eSFfxh#< zP?h&N*bqWcWf4~oC#JDamzmI!LGu1dqKDtau=k>@n3vlTox?!qk!SwS$jhq(Sa=`8t8bx)oyn{Vx^XF{x-Fy&YD+H z&JXzp3Opu4_^ku4=S~Q9(|6``>u`gQpFL&|pPPod4r^3~RYDeAlxGY~ZZ%PYUh*>) zO~tT}fh3AG0@z#|%?8m}(j#T;;I-E1KOM-llTM<$MZI5E!WMRKQ$NE1&trWlbyy1~ z$0oz}eCVfqT-w>XUC$mTriEW;**Mg;VF!UYsb&uF0UUt7FVb4}zQknVInV2cGd+6- z9vy{|S> zL6YvECjXp8&TioP-eqPnF1Jgu+SPN!(RrXAfdnK@fHK<5R602r#lSzc?N(<-q#f?} zc^IU5Hy1*YPFjTujNCfsMhE^-|I&TfdJJBOm?4|Wf zf28c#X7C7){<7mFsdDr4@2`dU@eM;vqd~g!%g0gD8hq5^FAKWG^nAUPI{#pDCskMF zH1;5m<}@~cfoN<9%OlyJ*{R2Hl6Hz6d#%JI$>s?9Y zqT4_4KCgGwX*UXd+%52(#|qqY%mJgt{MLQPld_$)C4kR{P~!VRMOX+>9e&ru>;tf0 zq~DE92WLRj>$7|nI&-+$f%RDH8(6jKYg#_&#e+OAx)YG|l?ygWKddGToySc57(M1rbIg#KVuDM1-W9t7^)z+RJqLy# zL}S1xKu~cQ!~RE1OAV#||F&3x8|^uguP`Mq(Wd5>$^~MvSP|1>+3k?fN}YWx!L=nG zn}u3yLV8K^z2^_f?`7xx`FPYjfa=o|P>FJs;foBVq#RnOCBD5iRqJG*gW0tYnB|Uy zs#(;`mT7sdoR~+fe0?hNnI!m({$-bB8*AEP^k4*$`mjIk@zSTUh;OQ})k!RH+GZmR4c&y#~SlE^P* zi_UJdsS0rJ`8uJs>SRnvsXnVnxN4kd#q%0Oq#{X*K6g{4>S`BxQ$Git2DEKxo^T$=}?Jxy?&05e3qm48v_rV!vhtyo5)i| zPTSx|S|5)JU&1q-#;Wnb?o8eOMs6m*y|F9NB5L$X?PH1Jk6YG&B7qT1>#DUF zMnKqo4ZoWaa4eXv!NHnZ>+Q88vm_In3M$g+4gO`CU;1R{^v7)Uihaeyf3yK=f1T!p znl`F8c=`h|3&rRVTHkxRb@7WNXwkSq?nU(xwtbH(L}_G!*PP&j2xRAqWGFVr0c^G zjp*GPCAwR{&3bjIXK7vEQ-cETu^sDFY`AYL6zG~o3_F>Mo_u5hcKfh@gUh=TonS|T zRc(fg;BepIT9Ds4s)7lS+c*Ed!p|$*JplU=3cRsMXP~rR0j-)ApBkwz=9DM+vkV*R z&&RQD2{)xMF!{sL?l^~`s#_Hm0Sf$*OYnxj!NGGiI6Um~qnLA1I25o|fCI-+K5=uaRG!I@4h&bcVk6~5e@_))VRwRPG z5YUp5V}Mk4;i(a?kB&PPTnmE}v^O09B{V2{g99`wki+NcOdtlK(YXt{)`<_h@$f3J zZsERTeJ*knEnxF~JdNkFgMg~dTr|{KQm~VWu?UTY`=1!Yd+}ybypT3QYmbFR-eDjmUirHOO$FTcjxL!>U!Duy@p8VA-}|CO0qXj4!@rj5NSBGX@OBDR-cKgMeT{Lm zV+*Z?)j^vWHBi%EZY#krR$BdiAweL2*8k13!S}o5P`Qq7$?4KL&32N<7rlxk)oK<) znj>;BstYF4N(gizOoM#67{tfml6>n&gq zf;X}=kfAUTqj`iHq zIM1}>%i7OJ%m-5;-|Ywq38^)oKx~uUeQns>UeHNdEc_PxS#NQHy*Q&Jd#D5a=XC$D zv!Jt?tFF_WP4=Wy&m>r3)>eFEU)*sPw@Ic%du~a;Q-HJ=L`)M|*`E@A(YZptxKIk{ z))MlhOqMRDlT*Lzi9=VbKh1Ee%G-K(N*=~aP};~Xh868n`weU`uS)Cg$dT`PlU=U| zS9PGaP6ASxh@CiW@J1Qee_kO;jiwEX>^XmQa2$kY{w1_vTq=<{L*jQB>gQs{2D4H5 zZjHACu1=&%9P}?ENgW>oO2G(y3FKjC)seZE+^OAf)haS8QI94-EZPq)U zjm~k)S)B)7mM<}<9Zy{5EA#I57C9MD)+%Up-Y>_7T3fQk zK5X)(34MdwaV=cjHeD#IaH5uSM4!gfSH)yh3C2~UXB931VbO#HD-9`C<}=B`q3CPO zIWY0LQuwY$8Mh3#QA63N!ow=UyP4%U3e1*}jZ>WFh*Ii#hl3ox+su>2HYpYC4Sw>5 zexe9)tsAah0<<9- zxn=+qR0G%w>>u4&>QB0K3D5%FFQYZ|V_!2;yYI2={W#?%%7WtS6%#1u5U(5`O%$Q7 z_RswXj}|JyJ(k0K_sW1wpI`?#5Y2JkWTb{CxL5DYZZIxd#qIZbA9eyP`V{&1uoL-c z+|B%>S0(@0dFdyMmGO)JY3}^R=Bn#oe*D|@OUQ4}+<*Cz>%N$}O_R%yG?d>*SbL6f zjGgwQA2Vhu!bt(_C{jQ>wk2C(&`X&$mp9DKjvmjXpj=!iakEw8+H$CBb$5XEI9zF` z4L;IRIFj8Iv@FAEHl7pNqK~T4Z`@q@QRxHkQm;a_HI|^L{Mr+oxXJfA>Mixf1fyf` zHVf+Hu1$}AL1S*8JaeIpv~#F>MNChz(Az^oC(CwP%jn36C4J&g;l3A8sfl+sg8UG0 zIo2Mb{l#1(=zTwrmyz4&s*0R2Ld zI{pKPtwHV)w2IUTS#@|=D>pZ>^yTu4N5hBg>^VWlT4d!Ai+FCtDY z-_r}+mI6|mZ*l#pPQtU%{e&SM*9Y&S)H8bPh*o~9vq~J5mCs4Oz0{UCQqJA<;m=~pj**viqd6t_L>XpSjmRZ3^i#5W_cgX4rYAcU z(*^7BXgy>Fe_gpFRs5=1d~O&Xov-7@40}hStZ_UbYB3N0vZy|Roz;=AD9O-^&le1y z+8FN4@A-g83d)0ilS8E!e|*uxO7y#fdYk4>&01AH0qBrZSe)Lgdg||ofAP850gaT8 zX)qRD@R*vlNShE@6htXE997ip_nf5!Dqum3Qf=3IQ*VaRUG zQvt=c0ovx*%f(+<$o1-yFxr%2tH*wxJkkG zU0UQa$W-gx#}`8hr=Ep1`gdl6g|epabuhT2RP}hk@slYi_`*YxH4++&oD7!QdUWm6 zP*`oa?>`y?8Rk~1-4l1NYW2ffLtPkjVt75kLfk3cJeWJieb^PwIH`{ z_Z2t#5AyYV!}KYT-f+rx7alH4Z+ukzuCf@r2s_-_*>#VL+vJu)a8CIaXd_bLW)~g* z`)66tLrOD zJU2lbyRCaGi4WulH$it(>spz2;BlQUl`9-|@6FXbk_^Qv2-`|>o|VCb=XLuq_R`)% z44f+4&3G}AO`{U51zHvUyh5(>)eF*H8Y2wxCVt<{dFdl8ObX zJaWcfvf$+%O!Oos94d{#u~vzP^JXpu_omE}!|pp9=iY960L7lU+m7oWQI^f*rx`ZsS)9clV>lZ>;knrrAV?Ti*PnB)HR}Kqb&K(bs@oQ*hCB@zo+3OP%O#ak-n6_pu zG58E3)sU;dS9hY4A-I$_kqIl0(b&%5nzZ-II+`8;%n{2|<>QAb z-}ZP9R-#mjKFX%KgWH=9^NJdv>X@Y_s}-`v5(SASOEf%L3KXaII0<@u+P%H*wk!MV zl>s?;T6eWfZCBbR_9#k!+z0#yR5Pz zF)n@cp-S2Oj z@!(vs>P@2Yp5MmlM!C|qY1d#*HuUMdxid%~H6w%=JBBOmc`{>4^Be%qMN7_r<|K|~ z6Onk7ddP$ZzZC7J4x*E-1V2WX8H~*%yB0x0-JnfF=%K-tF|75&bm;YHP!MtvFz!3q zyD0IY3#DuwsCAql5GDm7NbxtcLn;3WY>6sE%|88NMCN~E&P)V8qfPfoX@^b`HD>t= zIBh3-_{GSsi$Qr}6a$Xr0Gtj>S~)TR`(m*`BEJ^ZL}3n zJ28Q(TbLBNB?R)A-UGE&ncwZyY;iCC(9;Fn$)F66IF69n>f(>Zy)KoMBfM0Mih5MD zyQl{tADLszvy_zWh2DFp4_i24&D;c`F3xD`;&-KYptg9$S6+r&B{}Vp94hl}=tPjM z+oK|OwI|?-t&IroIN_UqH~dhKrjaYs!Stt2J#@(@o;as#Q`!@b-T+|^$oiD&fSY-y zAVYtv^qa1SCjry%c5omO+;P?|y|Ex>rkDX2Nsz9Ns&lE{LxVwivcO5eyPbyl<2YXw z2f0+j5*`AIt2mY>E`~J&kBg)6GX2;_$k14VZM9$! z-6q%g!bNR~zH(_3w{aNVB;Esb*{AjXVDa?aiR>y+X+rup3Y;pJOpXv2rZAFdTm%WP zB-8M*M~QWMbf9@UwCIRXJbOWd8LF-YauPLF;IL%E@@$iC1!R9mKd6Y}!}A2kO%*2x zCH8P%9lT5vAOUezjC8F%j&&k9{bqOyBMQlT`{`ptlWs}RjA1dPb+f<;B}hWJ)4HN) z6Z{N&6l&c$Y5~+%Ln%58toGTZb#g~A2GILW_?Euy)PVA$hCCnry@<@ld>>Pv5-7X` zFm(lK!ewqu)F#2hLT|aE)&ohM{eSrS^0*|k_idYIYNpMW(Mki`%qh3YH4(I?+_G}g zMAXEJT*=H`z@?d{tW+peOmnHU%tQ?p%>}I~B{d~AKyfQKR6ue8Qe57H&3tFRzu)`5 z{G%T}Jm;L}EZ4o9`@Zg|mG|oV5Iu;Bl<5qa1TUo#BQx;{LFLhP)j4<@v?`5f_U{W}FUNI_- zrPeIdtF9mBm#S2|k9RfEydi>h#k~m&t;lBAhAox*ZY9v2?}t^pj(>ZloMXmG+5w1* zfs%{UB@DUP;5aGcv%t>dfBkpm`wn5(ogIStN$?BE>(k+(-o&sG`Py^d!PF`qI1&#d zV(8M?=Sw#Ee;Ek2{ho5gfZ0k!m-I*cu+H&{EFE{rM zd~2Jew|lpi=5C((rJpwwR(|wsb0k#+xH!91UXpE%N|((=bWa3_RVk!AI*mWOFHEjbx;fNa9bvhvH~dLCDfdKSCV3jnYOOcX_1Hq;HgpP| zvj{-xM@DGqq5G~_WaVUVaIKtfI8)K>4?jFLVht+jmT_&yLd5i zFtZk)k}vV2pg=*AZ%ASK;bO~}H6S4yJbSi`)%Sr@VThwrYg>N~&k6psLtRqS*a|I3 z#e#(Y5yc})ibvqfNu75i&AtiPJ~oFE&PA-H2W2Hs^6(9R5Q@zbcgbPF8Ey-cGY8rO$l#&tHn9c`AxKh6CUEAs zCS&8d;z%8w&;Y^ljGc{pD6H9l;B@sbetx|X>CV+ySQydoUw5AV1vRjJ_Uy>GWaZ0L z+idNzl<64nk&jK779O_^qq#pK4_xcocefK$M?%D40`iRcaFABss-$FojajwT98f&% z*r3hx$rO0*&x(6}Tk6W6^SSBp2KMPDzbR|%=~6*)-Im{&-*l?C2CAFmZe|jPZ!uRZ zJzt*m*BH@}v7(x2j&rnjeQBsmpM~IA?e+nus{M^i^~Xo5!0L4V&>D!S#@+2D0;_kV zp&R3xwWn_GY`Zn~{_w1~z0e=~XNiaduH{ydR4ktu`-E|Q=u#OmZ@6pM$*A1Lv7)+k zHijL{3WmJKtay3qN{oWASjl=|jD{DOC&spyVFKhey&V|49(IcOPfTxfu{nkp;_Q~K zxnE-#Fq3V-Md}o=$jPkM3InD;%U!`Gq2v%Zt*)>#28L;m=97F744-lx+H^1=-Eb%3 z67xTtmdqzNL|B2m^3tPyQ2X&bqgrkA{xUOecX5OWa3H^Y2F3wuZ`gvwZ+}ZH#z%tU z2S@4<6c0;#U$wiq_E{!G6+hpa^b^T>+LdxeczMV_||7VL}tnGJ^sB~VvAf}YycATH?%>U2j!(D(Kf;nOIPx>^5>Pjl-# zJ|$FzHk+I}4bs*Nj4ZG=B=)qkT6RiiVEVnR3cCyOUmsHXyn^&NKBXRGCk0zrT`Q3E zIJ)n+V~p0a^UtWcp4;0x0D+yvWplPM57V1S%Bv$QUNL^?5L(wE|L@D&NUN9tC@}3MGV0%#p`(m zUMl7_U}lNKUHVq?fLTEd*Vf{GCQ4j950=I{Aui-Lup zceoKvssquHJ=d}}YLQ+X@3Hu=#=Kfgaq@!caz$f#Bll|-*f@7-kWGW(6vDo5@Y~Kf zR|F@sgd*E8i4t_U7uaRlyNN0vb84y*ZfROj43v;%IJ*0W;}b{PvG;5;!YlVB2Nil~ zHP;ddRD)9tRjLlPC&yUI)PFA><57%~G>)D~WDVXjU8+U@EAha+sVTf51WbHg5cIgof{iBakhc?3h%_7=4gk&h06Qs3TMI6WiLPP6*_id(yKh93Q(T8yvNo z@1kpg)bP^H&J5)3=y;hD;OkD~99H3g?B)HH%2+WwlKSOf3hY@{cKes2OgQC(gI|@-E| z0BUrLhufgYh zMcJANqB8Y0F1l?FUY&jVSfmd2U3k^Lk2D_3_AJ}aqoZPk5=lL@o0-g~%}wG!sxEm4 z5F&@a)y7dnwl`M)PA{ReCf%@(_g&nY>;&nzDA~I$o^Phi_v~M)>C>LM&C&zoq&OfV z_>{u=wq!rBn&tIYy}JmR>Sj+IS1%(cJqMJNJCF!QYwCAGmsStbCz8_uJiIwLIJf!1 zP$RAh5nA+O07#uk9YDyr*CI=-e7wnrf8Xc{r4x|u9A2Yy zoOf9QVTf6ao0EHkK?OW}kUs6<_{0QY5Fjr;SZJozEdRY-0jU((caP=&v$35T6Awe` z*&P_hPrWwcX`UL*rAWtJexjXwvvRmHFrw)!co7q5bKnVkZYbB&E()2-bz=aUc|MkxC8=pwH`KrV&9>xzZ6hdZa`PSOi5jIvyG2N;h_Z) ztz`paL6Elq)f<4a@V_Aq+8m*?XW@Tft+_!Kl=~ZXZpFDBfR4eXZUG7~^4w36)aVh4 zDkpOez zH(}>%L)>r{KkAWjYBDG2{Ty}Zavfq&>F3+L{!=BCv4HAl4(*l!u}XO1J=1pi9cfMF z7HvCsG{2<0&}}K zZ!hd4g-PukD?+(PaFsu!u0go9?SuX)`?)vN`q|iGu6MZb93otjO_slB9;XplDb3L`rDzf`%Df$66ONd zVHgaTyT$klXsx=MX8T**;ov5glfm}LX7l>Zv(l&k+^mrwTO}w4VhpU`w&vSVd-*zN zaOrPOz3#m}*CV2^1X)`;lGN~Pi5`a<;&Mwj;k9-J(h9H9{$}hHwN>sx-(R`Ux4Uho z66tMCV!Ioutv z`5*$%b@|kH{t2k!V`6$7mj*xGbAt*ln^P<*EC4CA)tpu_-p#9QLxD*}S)ZXBCXsnt z!zn*!e0G1LxJioAWPFMIqWHJ9!nUX{|L&b$agJCmPIJMd>ZGGXv3~o)XVlLtOCzb6 z*nn7o+#ZAY?7+kmKwiGjb$Ur|Htz+Bv$YWS;4w>Sb$X9mN+05Pi36Qs2cCf1VH2NAe<8+k1N9mVP$x-%UGP>~kyb4F(d; zNv`JEIFjfIWhB6==xs`3Pq}4@{_H{Z*bU9;3nCGu-p$$O*wa^4%}11>1)ikb7&xV0 zhH>424EUe0u5C>Y$y3!3i|gE8Vf=z8Cg?{Ag{^;fU{b{MI5P#O_?zR<=5Z<@-^O^X zOgy{f_2#gXHC|Zw1y}Y1YXrWPLTQ;O)iSJg=`1)(IQbl!`XmPM7-4X*13xS;X7s=` zDm`Q(AAIFeS~P%@xn*9jV8WURu)i7?oPFYql(+7LVxx;jQphD_yaBgq>ARRJtH!@< z>K~Mp)_?rBP5mly_{FBf=6{@gWp?SC8#z~2h1~zv+u`yP zH!nKVz7*KjzFzrcNz4Ai-OY`r;9jt9X)(M1+oc5qwYh{iO0Og95GVh@7tF^xP3z!K59Y=J0G-$gE%j)yq`vx>*Gz~61hbY zc4=Rza$$5*`tIZ{N!H{${wM>s#(^Z!ks)n1Gaao#iiyr! zK+dJ4v=a)aC~rq_tgv-5X>@=?C$Jz=b}$F3sMu!yL7S!;Nn5lKkPaqT=z4TKRTvH_ z2+s1~(Mc0>2eg`?bIbfdEG1^&tvx{=Wc+`%3-nLBD1V(nnng#d;kV4hgEq73dG4H;G;fl^laV>$B9O~?3A-kxNKDW~6= zcuSdY-XF~0703>PI$rNc*DeNSDX{h@HCDXzc|U)u99^juNtL`M#~xB%woKsf9#&4> zW~#ZnXHA`5qXbA1-AFpKant{909@3uN=jHnJkw}pTV)Kh3yJ@E$|5A?GPrsP1Hbi$GD63I1TOAm#Zb~*A?HWPLZED){1Xg@HviPjNg1}8lX~4A$^Xd7= zKMDQGK^o<2R7qB~ul^(sJ~37HD=Kc|=jcdEqzd{ipdIL!;Hh^@c(U&%QCJKvwM9)! zJ&@&XD=lLgWQkY#AvkNyZm@Pi2-QUOX84Ed5$j^FF~qKr>}3@}NqWHwL}W%IH}h2( zt*gu_K0lUC8aPcHqz5F=cL(dK1#Zhc`u4YmRNv;clPLLaT%5H$D^cQ+@mA^{Vl*(X6FrI4gT>vs)_1Qn zx@Tr2hbMU~>EzX-7Tg-XK5n%S>{K&9QFiHs$N7_|piW7~cuf9}23w-D-1e5qZgUzIZ8iZk9WE?p?zm zPTXpws9Z_?HpI86hJyVd;9r8qN51LSMDI+Ku7e6@eAeX1EqVI^!|Af7w^3Qq+yL#SO%1C)es2dOqP_+gL0UsF zP{QQ@+n5IeDGF3~Wzke#3$~qJ=nt`=Tii*$o7@rQsU6RB``1weO1qJKXN$$Y>eQXk z$-d7s-=q(wEa`PSRx8^sF5Vmxo7yimOuu7Hy33ncd%bjK@Ara*u}_M>8+2%MKNgM( z(U+hKS$$2BZ}RJ-WAw~SfPSZ#z^jo8SYUT!B+?D-(XG=_HQZ}&_VfuO+Xb)UH<2Ds zIt|y+z5HdFu9c$_n>53C=G?{VNtDIlt8}?7X*f*B?h+iSx9oeE{5fud+Kz@g~P5z`kF#)H|N-wzyX`b2%cJ*X_#|4`j0Uf8`tv}_C&)Z|z z9TiP=?BYbpPxz3#BRveB=B>M$v7DOn@f5*hSFs9M)`;WqM#--+7Qrnu13dw>o_?eR z*q}a)t%L%pb_BJDZBAhDzqtB z=dGO-app$3WwYyeMwZXp-@6^u6VUhRTqGlyVI+{%3@&$EEI3lN znu$r|vj=ER7M#97-NB$4XyA79&8EJPVi4#qL+N^+k@t+#th1G0V}^ZzTK?&|HRcGs zOZMw_-UMyQ(u}o{VXv-)iUMO9?Zcqb1v!2phaUML%8Zp1A4}7($!Nf$GKeA2i!LL{@COSgLW3O^FEvR zvtyAnlFU~L`5yP4xLvgPr{hQx@FTFM7y>v3O2-ATwYm0@Is=;mb^54+BaX$YD}nzo zJrh(=!{#pS<=!xoxp9p;EbRttvp0bk@dk`U(@yCx0$DMiXq-1#K+(I@{63r%%!n48 zGW!D_iPK3GHyW8dhGJ)6^qEHAw0B?oD1{?kPdRGEE6#~gq=zzv1%$*bW2m+#K8{&J zVzv=#G(B0YEMMk=djc|}%^=XrMzLl3A`7^3^t4WD862v;)fIRNX7kYyY-L}F`}0-p z(e8l?uA6-Ugu-`EHJ$@rpzUQ1>2Yi051X%cEp{q~`@DN-gU*&TN!m{UH9~uTcD?;Z zQluKZcy*!W9XvJNX%u(hmUz5ZdlDs`JcK8$CQQ&b_^#e&ISFPdB03;}Q;Jlx0Y&z< z!Z{iJ7~P;V06ShbpHKXd_M6v+lCybzm5pReR!tx1f(#saXX`eRBCFp3xS5NsufY$o zUSnKuw)SoS#I?aft74UGi46iNhWx_99Nl0fH)&kTv#RhZ6YUvx3j>ttD+1$;9a(_x zGi$lQ&5A>Ie~Ui(gkVW!IvtR^URts-*MxJ@mIc6Z^{t!>Pnb=$meW%x4&$>BVU%Gd zW~>z*q9ivOSrDf0%=8dgS#EO|%TA0epBzAD4-UT;fK{o|f5B?KPxM%bQ(*~Nw#Hbz zg#JE@FM7qdRC+D!yLI*QxtIO2T$*)zm4`}pHc`A5TDa_Eo#lk`?I)u449?t_^oy` z=tv1;GGDanDoTMZcYaHPaK2N(b`cQUyKmJlSAQp`tzd=i(N$gzKS-t|S!jb*nXQY4q%|-WBO4-ux~BBvPZX2bbGAxzHxq zI0d{gpMRSyV!0?#VTrga>|~_Q3qX(BF@>D@F0!=y#pDd?bdZ6x@ds#g$)bp@1)YQo z`opY?Uz6oo9dp7KI+nGdOVn&20$yqx>*5gm=!R-y3WCD6`9za`OHv`#W7?F@oqrs( z2f<|{kQ@uMdW;|EWqTD^eBa)Z*3mH3qe)aDObuK&4b9VO_@b8X*9=L46z6e^>0dwN z->ic)V{H#W(?sMDO4-Toa5#lX1#lx==uPUAMHWi#&XGA$=?e?@koVpBJ^rcTg%3s7 zkW`i6b=gN@Qsg$%K(4pAM-%LC=t$RAa!g~7mKLa?2t&D(BHxsLC}3}AY_Qh>u8*`I z?Rzbi@N^_Z*Y174&gWC%3g)L2r?hnq zFIJv?p(BXPeY#sSv;Ih(izaRF?YU18f?7q!&zvZAjb+UIm&`W$CN*3c+sOZ>doit>h@wuf4I75&uv!k4{qnDcwxhg zr8~743$*ZJ7qrv9^g#7G(FdvhROw?~uWD=2sylDqoC?ZGQ`XQS{Oad44NvUl&>;

    pj{*qU`7;rD{wKv>m@Idd9QILuG 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

    &L@Dy~mF<>78DTE7y_@ zM|N|&Vs7=1rqIq#cZH!8qX?+5TlmAsq*}hWvVk156Qb>wy%D00ohZq=VY?S9Nc?$X zpmBg^A)yD@W+Xpe_u*AD#-rJf;qaukIJu+YeY2*L@8{NPkIDnC%AWb7w6f@goji;v zqt5HHKFp*I$8FB>g} zl7-X5M63FHN6_A^Y2Rs-M7<(pn%xZWFKr|g*bU332#5;=Hh^O1 zmYVSRzCLoBfL7_z^|^J}$pcBZ(EYktdpl6gnVhBk62hbTNsL`XoW^Non6P1(ZJm2b z!BHiY)yPX60UH%!D5p- zU?Wk$(BW05!cqNKlz|Ii4OGxltGMBQu=*d|OYdDa3Nx1T6~98^?d2Qzx66_Fe}D7L zen$S>UDd<>i-BfRkUO#syzGyjiuLqbn^vs-?rOZamL9JNt%YwVHZIhpg zC(FT5t{$olSyafe4GnnsKjH!V9Vw;qKl;!s_C|FjhySPe`R@r;s0gnW@H&YKYc!&i z)T_80y`%&OF_ggcV|~?k72V)o{{45uF>P|*p%*UJy=1JJ^7 z?XRhX=0v~+#@wMYBfiTZjOX3>`1GY*Or)kPcXsNSo>%<(!&XMi(ksEmoC30Kr;-{m z9+~71`mPAdFzU|z1VLWMHk@`5gnH!{Vq|X|`~tlr*7;UJ1ye16aE<9U7B7heGzIA$ z>G0S;G4#pjkyLEON2c6*4s{{GvARE>LbFX zhQnRl_q>83tA1TQcZkX>3#mArRz6QHOu!n5V-iPRY4Z(v`?^;1cQt+*4f!DTnyIu3 z)<{ou3M6SRoO&At@+S!09g);DpS0O+`4wg@m}m?8;QiI$0{T#Xby6~IXgw%19t*OG zv~$Yw!}vj@;Pq$JEI8b`G5#DqF%!Ravu7|r&{|?x+=7oz$|${<7%*1tEvg=9{+MYC zM?S7;t9sDIu$_Vot7x^z&P%Z%FxPHAA$)NJ0i=t1WeVENZ=H8Hp2?fNloOtStBp9Z zS?~^8z}2@y`vt!@G)eD4B`z;bLH%o8x@2#FJBW#HvQi}(6Jq?&_=KtJ2_Uu^jlS+9 zVfX0$WSBXeGBW?H0dgUqY|4`qm9t942eBD_Mih{_*H&&CNxhr;IpK&ZNwYN(K0pXRPF4qZvY%?YW}J!s39O!ab9y8Vy0_N7{(j1m{B=v>;fx ziz37sszpTDf=s59f^Erf%EwU+7*T*j@PuRD&mk9b4t_MN0EO8SrhFs%GKOf@Ub&Tz z8r2(R>R9(f>zl=Ey6YxU=UM<^!vNg^x|RxLpnMYbd6fY_(d#UZ`Vep~d{qSC6lyGG z8){s_dx>H6V+toy8?5EM4LsFTuYp!z&ZF&E3*z?`Nqae8JU(p~eg;r}F+Ik9PEy9i z$6J0ITeMVHQ&B97@HP@?1em8!GVra=OprtzNN5kqp4DnD|DN<1f>D7ZpIF$J4pgwMa2frW%a_m(p_e( z(+RnKF9mKrDe*)Qvqsqx$Wm{qb~U28F;v;iU{w-(_kKh75CUtpuEc1=Wsbhxl3}Dy z%eI06TGnXNkXmuVR(p$<3x;a<`)Dhk-h6{$Yy#M$$lxBjXhdqR3csG7k>R93Eq3$& zO`^P6wR6M2H0FzOlJ$Q>YzL}I)#dDZ+KSI05oP(%0MhwG5QP$XoB7QC2`yQ-=!M#a zl^+3s?gl3OKLDvha!x&g+3$WfNMU&;^;PFP?1V}4mUEhK#{Gp?n;GSeH5?q~t7-Kw zWmg5xxgV_vChZc+VM1Cyps`D$dmR znnKM3iw<1L9ssF(9^2s@+!>UOm24qjvUKU>`g8SU@Z3c7L_}nyPVvE?a1GCzI%BGt zO`PRutIH*L9c)*Zc!SOGBR=ok(JA$Z=A=Cf(H@~od!uCsOtrDI2;}uczia@cVL$ce z?Jwn}w((UPqkTfpmsDcEMDS;}8-NXA-sjql}2SEAyvOl2u1+~hS6F`=r>wRw3 zASiDp{kmJAN8escWws9uxAuI%_je&|r#+LwX~r{4;Od%T$Vh6$AibPW0IpaKAJgv9)BaC;ZyuLqy7!OMG*fe?Z9I*Yh1#*H zrqnFW3Kgv>wX(7@6gR9;DbY+(Nf33W)2d=tYVM_(3m_q(p`y)HVxo{6lsP_xn8O^}L?n_I-vwl$-m$w$Jt1uIu{T?+-lk_-eZN@0nq)ImHOL(24OR z_-AgJiijskpuu73j(Tw=ov>35OW|#xo@nt$@90VBlM6B3tAyNkG$OqEzKEU}OxfW9 z-xU3&tfD=Ul4lh!KVamt=OtQR5-#%0*iRr(Pv|bwSX#IA0R~mzzwcO>H9#N&FKwSS zf=`<8_D5{}xMW=hk|lf^G~M|dgHofl=ymcr89L8azt)P?05V!$TOuJ z)oqJ1ydbhEWB`PdF=INb$bQ)gWf(&GicpO&@dz~8s)((K>^~NGti@F6)<2y;V&T5c zfZJ9ThF29$SV?kNBxZH1m z<7oheuwOF>KbWv3Vn8|#fiM9|>uGE8YY!6bE?Vw;T+18+sXPke$i`vU`iHQIP|1ba z?+}Y2Z`~^s0BX!ka?;xNs@1rOE|dVnSf#R#&*_=0HGQAcr;G|s5clNk(JmU%)6up* zj zM}(4dmwrw{HwHPxZ>~$YK0bPVsiX;uAon3~;APmn+ElcBTl+NUPGVKs*iK{BsHa`o zuNBwd6b;C*8GQ{1DQT)Q31&r%-M~tZ7m%B3tZBhUJg~Ocn<7kfUH$~t_wf#1j+3;WD=k!b)y5h1=rcBn!9F( z!r;6d$gFo213JnYC^iwZrzYSfY-I}CcH(>@8UT4i9wz~)d6_&=U}mmEXR;m1p_O&z z6?;s%LnFABE;Ete_#<-wdEdWvXwq$PzJ6Qs%dNf05gCtx`~}<=hf|Y$G9!&_;9SB; z{PnfO6KI~5b$cc*!nHKio3j2@J1KqJEoYS(4oPkdeV;?Qol&XZ<&nTH;3hl|5NQz8x}^e1lAxQySzw zSM0MXM^S&B5NY!3+R79(2Nwp9bf(CeZb@k*+R>~ocIbp#Zg>N(!-HePVLD2Uo-@_zSkuy+j+5?%ZVW9h+aF{_0M6`31{X15miUmxBWOtcs3 z1<5SWb{|lh61?K`cV{2#hhkr>F_U4dR`(3;TLh%Y^iuFu`8#MTh2Darat5ZgdSVJ! zdt$stPPFTB0*m<>CseNFL`wVyKTKA;c9hAlNB$5!Low2QL-6GqOr%}h4)+y?^5EXc z8(m#T+RNzXrh&YYEPH=hlQ>M#9kcxpA##BU=R`LmuAVsnvb9qid3CtW(PdUKhWC{X3^^3|Z zN)UmiFB!^c@KqJPkOG&p5+E-3VZEvV%>$VWo{B`Kot*U@d1T%Z~7S1;J$b z1s#}h+?#{1eKOKrHfK|wcNGQ483q?c?LR=)4qaMeMRD%Cl$C+z5EXQv6i40#?n)AT zvROUct~UABI0RgN`VkcfTrsBG(#q|Eg0+j}R=Htf8yBY9cC1>(aO{b5llr%2%Fu{` z4KNS5w8+;8&Wmv3g%1p`iLFVJTA>qZc{I|@ldf69;4!j%Q0z!&c~seYt*~Z&-rck0 zmfMcHoPJml>q$o`t3!qeFS(D2a7nhToh%a8ckLeo!!4@g9l?zcLqq!Toh^|bBSFn$ zI@1JoGbF*)M(TU68}qY{ZE+yWnX@fx;W{nlvhQjcLpS-1t`tt3OUVpB7*D*UG<#q> zQNc5H0Zi^nc+(`xkt;+FIaMxCTY_g+{VO>)i;+w^?Z%F=aOyBX{M9BNTDGCM$!MJA zM^4O*;>`DA=X7^?72$tX90q`?BwfdOGJMm1)1E zcRFH#A4e?CO&YOQQH7(=EbYhp{4aQ>U|hw%yzqSaWEqoW&ndbD(h)XWQe4hchiIN^ zzI9sRTMJC~dw(6=t-v6lWByf0fPi|x?_DZ+sW!)bNI}78rT;L-09`b$BGSp^(P#7U zi6~28pO54ZJ@db>b1Ro{>@&{z4`lftR=s6#zg=93(XLt$O>P**x^qB1F=Hg?CB;dS2kPeTa*t9LIeg_Wh zlmL^E2E|t9bktU^Z}S`9WXerNZ0@lJn(gAts0G(xrDGqx(d7`xlJQRtP&y@AJtf+U zjwioe)p*(RpqcyM4G$V;9@3pkbnf`cY%JFIyKVZbSA4Vj?Nm^8`CliWZT#V{SzAVA zbF%`ks)YqJlcPQKx!EbqYMO*#Jcr_nvo?%iOPk8JjZOA}#J^!K#34Td0>k}jtyx^! zK&9g8B6*=hJ)v0dPFq=JQhS%lOb>Vyuzi5I8xp;lmx^XRAyp{{{aj(f582_bgow0; znVX6!|180D=&9t?N*?2!mM+mOHid&5_v_vux<7zH3eY=LLF)V~R3DI=_lGPCH?G1Q zCQRk`A7_nosN=;PQf%EFb?8wydDy{QYPp{@m3e!I+4HAc;QD?=`w~3Le7fnVn2O!0 zKv$nOb`7R7#d$?ZY;gJ&+^d*?Qo>R!)#*aM&|=1B+&)qO0Cy?J3^RDa)H&JyxCRwx zEqC7x6Va-TiQrg?!eiO4RcxEG``0>%zlO-lBUVMrjQGvDOZF}s9_LV&gbG>$?|b{w=VEIv07QY3>sPy`<4&&J(W>8xK1uf<=t)eG;hh@mOgTl|@#JA77@zDWIR(Kz zMwe+T@|zBei=h%R(HiF5X&qOgEP^ek++LXEUSI+-NeMPupO*s*P)r$)hmYM0URIBA z0ohjpM1Gr=t4l~4tKGs67s6Q=D(f`l-c)QMq`Ud0b0XVC1~c0R1F>-q@jWdBzv`9G ze)z-3Ser^I3Z_N^O~=L!GTm4zr(#EZH&HoBqNa)rbP(7$vu2axxr9i2Ra;K=#?Syb z22!jx{FjOzu!pvChm@AGjjfHl`+GOyCQ^c_6cU{laFo9TOV%b;7Wi~Tn2BgGl&R5a zwOg}BV7}AE69A11(6*U|Tk6Y;N?e%$x7jty9i#-d-dPq2H_I7V6F>`+1i=X)jba^0 z!~p4GU+piXKq*q<6}*5;Z|uWB6C zC>v1GRCjVCIpYO^%}>4EK{50v#ma)oEhiU4uQfEw^uW+I{V_C`dWK(Ym#k&a@}cBI zGFkl>5to1Ol}H z>HhGtUok&xnu7|oeusvRN;FDtGr>J)UMDEH#_jo8)-$G)x6tiPI6%V{llWaJx}!#Kq(Vb zHyX%_(w)4U6+**xe|KiamY)!y<@ut+S$_dD5zVrKac`fYJ#ZnL^U{a?s{{%qwev8} zS-6XL&(flsuka#=t^n@oGdJH_hCvE~hpjU-b&NPmMwljVqx}Z@vdu+cRBzFrt$pXN`7x)a^#91E}yg39&~yrU^ZWwN{^%E1XVQdiA7yL z%9oEw*El4I`tp$i+y~j*HVG2^Djfg#!q8#M{=}sJovW|>jD&8tdg>l=2MNf|5 zn~##^{(lgq3an4ZGX=6uN!y%?Gjn#~L9#kQq34LKwZv~4(X=Tz3O=o;FWtFcak4m* zDbHlZ_=AN%7G%FZ2*gfg(Z%m-A7a#(%W}_z+K*p9m=<6;Iq~eOw1wDT#%CQrJ&Ct zn3}1R1eNHR@)^!2&FEoA@^>^ny&;vfg#Hj58CS;uUP4PS6}~~})TRWR7Ovg#Z7m&M z@s-?bmS9GJ0y&2YEg4pD1lSkA#l_lbpLe>A_MvQq`P4Jq+UzRv$noLT;Uk?m6sKx; z_su7-dU5(#RcM%3cd-qIo>(Ek9pH8?MFTK|iZ*4e0G$}I$s4{6=qbG^rx15MJ@28c zp(Focl6ioiSwU)FT`tn|>Tut9mCU9aOrKf$(pCrHag56w(SPHf4UCPibot;>*<1d1 zm#O9ktV{4;rQxa%9)P4nJe%!*3LW- z*0d@-@JRzq$U`NCPRur7TifnV5KXugSNwUhd9kejB=tgwqS&5{aB%<$Zfb9%TOzn7 zw_RZA}D;^3=LiH`}of?(6QsW_ut zxN=0<+HF&cI9Yy9)!6fGz)E(N9w~kWer*P)0@`QLUIoS{uPLz;odo$eKz4FjpM&Vc zokJre+3_UvQVx;N4BIGqWwAR(F<9u86HL|dbGXpTJw7Nt6yMDqLgXd#`@oz#2U!0K z1w`x2AMVS*r_Yemk}GVP>B5Nqb0kVXa--bZ0%b4xftDxe5?=yKIdplivsrgx#s>1L z`hGI%4tfVg;{t(X6&tYRmu>2*zz&bOUrKpW?@lMO_A9DiCH4nys{2R;w%raSZa7P2 zVv-ERSmy>3rw8AKl{{$#Zr0f^aa)`>6JKR;@;6e_=3SYR3DwWR)TzV>{AN=Za*^TX z+u|LH=@#4tx06*memuM_x2_PK2O<%bYWfvJW3)i)8N(a#itHrnHsHedhV0C%w~q3$ zcGPp4_aL&bu)m|+;q>xR&9__r*n`BLD=MpHoIA7a<&d-%m3i2BTzESj#U)H|3?Nn+ z>bnk=UTq-+!jwdYBey=o_5J>kmM}zRCK`^^cRNH=_UY%a%O=ThV*h*Y=MY zYc4`(Sq1)!cJ+UOUh?+?&Nlgl7c%r0-!mL_^;?e6PsPnmjtk~K{4x@$8Y!JXzc~@; zStU|&t7d0xy60vk04lq0H1tycp2*X?@v)<_fZ4vlxet5%T+5T1ca9U8vbT`eT=)}b z;5@~?c3@bxI*b6_-Ky5zW9(}};2y|BV~^ffsNU`5_0K|jnf_o%EQP){yFo$On=yLfe~*VMHm7maz0 zn)}IT@vf~rN_T5QA6dq66Z^9VW{a80VDC0(Q9{`P8+X_$8?=?G{9VtqP5X6U2ae9& zVLzJ|Vu9o6B&=fkNLbzar=rcV$*#(WuB^5`w@M0iwf1U7u1v0%Ej2V2h1{S9RppFF@2JT>V|IKv?XBw}63wu?C5 zmAn6qc)pe28YW1J8OA0_G%!)Tq=29dfz8PU`a1QPb=v=N{oIFs1GM*cr z=_1iG!LD(K`{gblH;Du<6C*)NzYoi3Op)&l$=L5kFOoj}*hS(Z6J%z%_ukt8SHv1g z{AaZNc*K#rJE|=DnLU+dtL1eGYiUi(ML;x`f(dhh5yO-Afs_rs-^a^1ZNk=Ru(gI^ z-E6iz`A0kXx6$(6!yFt9)#rwfO72HBOd;tgN>_|L9q*md3RKrRiZE@hvyP2%N@E=q zYxhb2{aPIyXIpNgb(I_^a!cw7dGmdr6rsSGEKe!yMcPP8FXU{#Ge-R_vll7iSxE{o z{YYb6n=@^9=qdgE_z`2x^UKR^;zIgeXq#sRFrjS-?G%3x%>S0pp}v6A@5% z&W!vGCmvw%FBQF?Y&-bLkXo3@V3`~H!RMMAinhAo z5Kp{`do~v;2})u5ClAe_d{Y z>a$LC6Vf)ClcGQ_4zOw3q?UHcX!(03pyq+W+&39JmU{!8_78E77f54+)~oki{-GHn z!Z5K5Q$FiV57QD2tx=~*kNCacdRd)1J$oO46P2Dh^NWhEhG7ze41y}XisN&p*>grJ z|0%ALOi<{1>btSXw4P!PdPbKZwZ(f~P8c~=_#3rsmWuyS`90U*@O&qnz_jdex;eko zQkh>6Ja?+ELqA#Kn&*>}N!oWn@+K7~>^|d6HkYi8^~YS1cmkn@TbG+v|8xXw@tK)Y z8v+vOezH@89o;Q+Uh?MG6pVj8RKkp(NdeofRP6TR3`7xL&6$(KK)IVD>KS%PaaQ-K+2$-L-oVvq z72Jd+O(EZ>f299buwyYzYu{7Uq{6ejT_vd*XjWZT%`T#~@Z2(c=i*r&fyT~MolwtuS3g~Df=|~DRF3Li0$SH=9jvM*%y&cr78bv^<+g=O z@bI0OGql>4JOfXQOu*pXyvm32D3?N|;FPkrg09ep>s{*iukeVYB?UQ$`tv8}z5xeW z@|3zR7hg{=+CTHjl4yZ5Yy~@wc#a0_{+b6|48D5LEnvX+ewCGehJ^cF@aE?kh}`?v>v0hD@Q zr2kj(aw39PV|vl2l(CYX%<{0znQGiNZ#q75DWBnuj7aOWM2x(2eoqbKiVS$q5)-SB zOd#n}kg$|Lkj~1OS8|^V$Uy50(t%9#n-d|1*31e2Z3iCak%TdP3uWe%j$w1E%9h*p zO;2A-=*6&MxbgwT=oQO|YjEu&gKFcb2d!JmJY9ulg#I6%T%Z@DW!(fad?rk?LmqK8 zBD3bH>qa!lzR~*>WYtT6IWcYSFnbF2{(}M4g26t)NkN3TQ}>ZuA}fI6-;lEQ0L}D* zTmPPtuFD2hsxFv5We8)yHMsmQa$%OoV_w1DLBA9Xx;nzmxPDVc&Qx>ODSaC}pIbJq zD=O|DP`GeDq3y&Cn6NI~qZgFPd`^(NIg?p#83lP`YlhfG*~d=g9?;7C#+-cgwJx!%W`budbNzR7H9qDXEbb$Dw6Jl zi}>eg|I8C#_*qC?C~_)w5Z-y zhvrNVZ2FE++5xRoxpiSo)iqvh!6 zNS{NYuC8fa1rZ0cJ-QC)+kb}!J~v8fD0b+soQqfq$8V@Ao_ppu5w!j`Fg5RV_T$u& zrzf1G9@AfJpcc@~9h%L);WKf9q5rsIAn6(Ec6jD(a$pDm zj28Iw!tD1AmOOu$aD-FnE=$Z7zk0#;*cNEVGArcxiz`Df^sz<42ah-dYZ*zxO2mcs zc2WFs%OsXZ8c{&W%`gfbrb#fW#PN;lS}VXhI$#qb&G8ju4JWJ?WMIQlOWWf-?nIUx z6=3$o2`kOrXHS|Xwe%j&Df%TT%(U+(c<78DNS^{MEadub9C_pOcZbR5*5KX!xo#fo zzKdh`+E$Uhz6v9a!V$pz=2fhUa`wDE;$-3L@>N(CE ztglt{BIBp@ByjU|8oACVq>6aT3(lKC8jIIx_9|DwRx$6O`*;lB!oT6d4}?u$pCz>S zyVxZA@)+d&9*}qxY~|GfZ!uDkDC4@d4~V^ri(V?ASjjXqY?-BB{ZbdDRIHPb^W=l^ z8WKubvMvE&`^#We!mwhL>i5!}7kcKj$BO#dNvUF#?B{0R%o=1{ z6US1iBxe7dwh-l&!>8wF_{*sU63$HRl$x>EqaHz*=xvlte=|8yCo0@Aaj)z`-$Y+z zUxa#b`K=@QrA~Tyz*4Y)3iVqGe^kU$Qq{TXLAXoMB8->*!YQ5o@dXkW!9(@0{a`CF z`cn1lo*}n!U9`H3>40wE3f2((J!Pb89Cdr@gLA;YdR`)$xV{fi6$WG}8X@N&Rg-xB z0{j9Is?V~VK{8+nG6s}GCW1ewjX|BK5t^}kh0m>|Y3}8-{}m5Y;t2yKu?RElcm+R9}JE!THaE4WB5L=leid*3yL!rgoE5 z&R>3iD!K4~@@FU_cw8RxkyhYc#y?5*zvYI{NCo)oPg4DRqyp)O{v_4EM=GGP{v_4E zM=J2L&7Y+D_ece>!2cxGzeg$nz4j-m{ykEGcheTYKJlwWJC;G#fBWUW-pa479xO!I zzur6gl~e4Mqq|;#C;w-D-p3Vw^DIV627cB1YpVOWfVH|4uOi-k^tM2+E0wflTJDF-SU8Cl`tB3fNBt5p7VzBEjNCe2N*yR;)09NB`GWTI2} z)5v()ld2EXtKS>w&57me3TyHo#)rz4ey8NblTxnGn_Xl@+VU-AZAfw#d8Nk*p~ z^wm{RCm7Mj^AEb^#>+>irfdxBHlF3D2qRt0RYaxPYfS-)_B4{n-gjWzcjj3brJ?R_ z+z4KqwK>>GQ*_MjLA-Xxx&vY)(I)2JcmrIPnd>3fVbG`5>xEvHpT6W=2UGc65!rp) z)gu8t;^|)QiBUO~72Q@rM{xBKc3J0Nu@kK}_>H*CcTnBl37sQ{oEvV3#uAh!ApdcF z7r!`1xWjyW%d5pX#rJQk?)rK%ZA?zgkInCjwez8*i?(D$W9bdIp6gJG_YrJ=@UBg! zE-`Jg>nvNks60)0SFgluk$qWS<-yn;I{jGDR9dlT!9A>hxC_RGM@i6Bnizf zE352h-PLf4E5FO|OOQ@f&0Juy{CYoFa6+CL1smPJ_VIo&l`H#6qfOfeE={agn7pC1iL&tc82D5lzp;EdfhXKpGI=>gx+J zGrdX|TvF6E2DK_K+MXa9a5ZgQTm}<{N^aicHo#r@Crz_dol1ndzk8hxdyy{4EoDIQkyl0c{*x++(UFw0`@I3e>)iYPg369vcW1KCm+!}A!2gR_}O)@L_0 z7hmm~k<>G?`DbNTZq;?x%1lzBj+3eQL{{>=m=%L_ecP~T!dPtnhx-p5m_L$R%4|5U zf?-@>=XlbN2FcA$^CAJ>Xb6~n4Blq3d=xfUiIUwy>-zkR7cdTwy*{TA*kTY^EARat zMD>0^SEpkX3<4kf5=y}r8EbTaccL+O>&!8m;^c8wPxI}~cW2A5t9fZl-qg+Ao>Z}+=w^v-^V_^1FuPKhr+Me*#=Z1?SLh`n{j^wiaXg9|L| ztI7`Vy7(LYn;Qo3+m6l5Q0wJx&9Mg)>>!?RIGqbQ&P)gEzDb4|2aKvekUe7Gj(~-Uq=uR>P%0 zjwh18G6G0;5Xh-q^a6)}e#})@A`^>u6VZZ5RMwVYLBk9W)l>(gKk|v9q-&6)_aa(# z4abh4`od>oGZWyuaBvr^WLJ!)KhK`#SUBg3$G+JbN~QG=)RAE^_H8cnhuAY37)U-BJy-TOr}^ zT~?K77|V>rzpuBLj%}) z>bV4T2#gsdp=_{60HXYKOVaoV)WKcQ(~(h$@i=I`}Y9T*=g|i>ax)bHfU}GMDl1Y4RZiE@n>Ia zrr|$k#TfEev6^0eQe9&kL)t@3pP?>;?$>Z`QYKlh9B1Ajeq<1Puw zpLqT=(+H5m z6|(l=V))#unG0v_&^Ia-O{rw0xF)n%iVev!-{&|T=;uA9XR_VsO>L736wm((N7)=4=!&iU z>-;1VES+OAW!httvkNM`OPW9GJfMocM11P>&Fj1q@wd)coVr@0(Rsx;cOOivddA4L zw;sC@>=?c9;a@hK42}xfS2;5~K2_aB1Tilkl%YV$M7LIU?Q`#TB|>M4mepxg!*N^m z7pC*PI)L1JRil&uTz}0xBLlwEnO8+2M(Z`Ka{ngzD{l=4oC2)4RMYpZ7OQT3tc?3# zt?c{=(yQmwe&yz&Ngnj0Ax4)_^F1I~3VC$pt#jNmk8L&`s+k7aaDyD^EfhLzssFsn zDE^UqGlbGYa0nsUcU>dfel_1cN*FbBMqA zy*eXtQ?oK5+gblPbiPG^=AE#-VVv2;jM7TL3Wm49$4jlBCyAd*4zK0B`^0o>!R?rzg+u^EPF*xUur^@^PRx!n%jTtnTsLll8r9k5^J6dshy#T_bpV6T8SQ*Y<|+u z9r=H8(*MChG+hZc;?sUj08DEM>kox=|8O9eFeTRm3MrY_ca2zOGo3-gb|w(Zbcv6M zBd*;;${#Z|%nQio{IHMuW`8BUpwxa4nVvEKGs4nYaPRPj_IA_?_j(=SLES(2z#X$f z78h67)Z}AV3PKkBICeZ&uGY8}L6{&oFPnAerZl zg^uFa3ir&{9YPH!-gYZm*U8l8RCiUD)J3%DQu->hB|=8^Ji}$9bpfwTBqk8k?D&Zz zNE!{R!1ZtbgCAVsJq_jtDx!g+>|mgM;jrJF6Sr)}=Jj+qE(_2>AThCtsyp*hxd4x6 zVbQ0`<(Ihj?ceS_k$CIu$-6NJ4=p%pf2{qc<;Ay<1xqo;3DDpJMcu#Yp5--PZ!@~T zLN*fCegU#Qf!7zT8kOJ~s!@HBWTai0Wh><-rK8(R<{}gzI#qz>5M<}#PMV9`R1qWM z!^-z9ZA4tWg`)%>;7L(LHuTTVsfN4Jz=T#@6Os`*3h4HmS6kG*h3rjABDcI7#sqY= zSB2%G>?%NG64^BfYbQ9>ZsOZ2=IG_qLrtwssm0%p@d!`vX5$X<<)ws)28lIt2_ z1KF?^%-c_3HP>t0w)Mb59{8_ScCwuz<(BSIxvpEIQI6{!9Jtd@Q2_DqeW=C?c&9u- z2ed0h4OpgOO8863T8@{Y^wmwXc+d^7O0nhE2COqgiI%E%wOcXkBQ%J-(MA@|Hq+dv zB%(OncYee^xn%hV{JAXF)!S%4H@gw`Vc$rr{?YCRNo`wJrdd^)h=`R}cr~b6EpUT+ zMH)KhpZmJe8;&3^(EV#0Ccc zO%_U}#a<06D^sLmuS@${>&?^VCjwz1?7?P{lKWaz@XEkb)14^|fHkKbgns8&b9}Ac zC>ZY04na+d#us{1dXj4~?LlAunzDaFii8(!z>cJb0>7!gQi2SfZ?*0q~-ku|Ph4D{P{d=SWA>V(J>fa+32s?ssKQWu1LTmYJ=iuw=WxheOu@M^^e~i zeevs$-+rlu<*cIbuUIhp#gpP1e&qe$lT_-JpxsY--%D>Tqrz}+@-C%j^c%0J%7}k- zJ{#2h=_gt*Ww@H}F{G>h@wE@KT5>|WzF?n~0|y*CK_JesCPwY0R05D(kkY+TisWA2 zbNKgLI2&iJYXwU6t!H3)26??XMkesE8v;he10=+P4BRQZ>BVEdN_|8OvXozdKxS>! zzpey-qPJ{wfS-bUm5xm6b8qwT-U2U=F!;4;c2xoo-@|a?ZoBr*{HHHI2-I zzF;-GFNhuyMiyQ4s4kCrsII`bp8s>!To^SgR4cH*ie%U$9ZsJtkVo~4nk@mu4%oUr zU4B$~b}m~r##skOu~0pVGdl6Um|q7Am4};ct&VY4Ku#Y6BRGBLPP{qxtIKRo?*OHqW;cfZ(cf4Akrms$?mw(oD;Kc25`a3PkTaf5dA-4cf3FL6tL z;e0*1eAB3R`uAqGxc*Ju?=EjwdQ5umNoRiu7Gz9KP2JPz)c-rV6^X&MpT&09g&gVQ z15tuNoU)qVWs5b6<7;+fs; zuI{jyOTM&GgcjX6j?QtZPU;YW=*B#C!40lLbmHi+AG+MOA~OV4C03U^2Fmp|V_%Zl z1{a3D3&J3(Ju^%%%s$ax-OIPdEt^0J=sSz76~3m@OVSR=vo_H0XM{A)o@2DyOVq9J zu7%i$Ol?CfZHHfFB=+kJFqSW0=Oh5&CEVsHWiVzD#7;e6VUvfB$k``i_ZxSFZG@-F z_h44&dc1F{PwPy87JaE6UEHd27%z%_&K~~)lG6leA<1pO>B%djn4*SdhDW${o@?@2 zl;0~sX{#Yi^7_QCZbkQRnR*UlMBeq?!I-Zg)n>2Jx`kEkfnE;MI>=tL7UjAu;Y?ncH9j)+jB7li+C3&qG%g+Q9ZwDxe+jAH{eCt&p_jiDveS_sYkzw# z1HQ8s#;x6B!(JS2t~7tW^f`fAcwPUF_%XSc|1~6i4VaI|dWEKyZkJX`VuJXR#Gt3v zfsfo@z}fVleAf&!hS=l0w=@1#8|pJwLiX%1YuaH>?g(EH?OWg$bhOy!qL-mus>|%Kj#SGP>)IdBESe$FX3(7mU5Co3tJOn| zex&9A#{*zKa)xX!v)<^|p|r%k{O8pQx*qnlqaUI=&_RGr46>J20G|53r!t3MJ{0|E za8=Oh^CM-($K1|)AgUcHQ~pGc+bXwv5j+AltitkAg-f+`LKUJI+GB|K1zh(HeAVLy zgsm0hX&6mtOJhk9J|1^JK5w9>zw1%v9l=JNq`f0$0p$Lc+r*I-1j}sm!VdNVJA`%+ zzR}jRwD#%c{ULH>Ec&$9Z+8si+&?UJSq+9NWKz8nHLjys1A2m>N)}>eohYQ(0 zR{7ks(DU&KLCTC_9OdS@Jb^0o=9@c~mVhu8pgTIJY$KSDyGS;|aN4E4@h|r@>QPD$ z$G5n!=2E;!+&uJFd?biv@Fp0YHp{QQw6pcOyg6SicMGEH#RSDRq2(>(Ll+x;X6{h~)f>xn}y%yGQH`8@8Ll0|xsEjo( z=$KjnIen5Qw;X>S(MZl<;})i0=ZB=X8^5c`mv|yx&=ERHF(0%Ot+(V&dZEDu*{Yy( zFIh#`(X4Bj!0UH#VBR5b0|zUAMd_5=Cs>+2i^?sB^Ya7fZ9!<(`u6%p7oElLSD?T9`+^fc9{e(HJApE^d=uja{p-tG+J8B) z`Q~lgFVQ>wI+j}R%D$CR9i5%Me!=B0S1({*+-}lvsJpC`Xs~kWfm_tC>VI9l@4)K6 zj1;7lC6~bm2UUl&2BqEaxEWH5uex0j@QEqh(1cLv?7skVtN!s#8m@LvV!1|Uz?eH@%Xx>J)+}DYYaA6#7b6@E_!+dy^*Si2K{n{t;a6vS*-u57xiqcTP`mA zXkJyalgsFjp4I5*rj>WgyIgAXVeHpgZ;&&~Ik<-aTG2ra6;AG?Bov3oArI?F-S zTR9Q#DNO}-B|2suV)RPDxXM0Q^yDzJ7wOb$r;`^fs_-kwvpgAS62QBdshbpJG1Xpz zy%;4WxSRn{3}5&}Y{qwj-aO+Ena;kh`)%>jM-6=OibkSuC)7}WNi~4{F7Av8K|I?T zzs?R3QQRIyiXMwCyGaizPGyE_Wwl!S9)B?!GVGEOD=BA7P|mx#hi5wAm0&A=D|wfM z4iY`+`}2w`6UxItD{p@kkEI8J?E zR263q+our18Js-%fgI@*F?<#+F%S-oGNT{_VDh6cpSu|8 zb>DZUAu5&LBwo?Z{t$%&HIMfq>&r4m-^dNRQpy!RxvHtRPqTcNH5T>6ASKkJggy8f z-o4FSzu4)~1pYM5tG5UwyN2A`WmP2zH4{YLpCaVw?+)vtm2be43sE#`E$xe7FCLTGl3&+ z7SlG|GuUBX^iUA4w$tY-$v(RW{X}i8{^mEl#nCsm)tAP z`#-`Npv*;=00nO+_77K`7iE6PQO)cW&k^tfYDefcN*WsO`r<}CI;bx!R7-Y9^xNnm z>4_KDa3W4fHzI;q92jL&+aVuj*#=W5s1f(aQGH@{?UD}>);oG8U(H>(jQYC9KhS3{mct~q&DkB`U{Q6zRxj_HLgs;KZCg)Q-{K1D{nc-1U8 z8Yk~(>dPFuiGgK$`nn}i$|JBTVrt zp6yh}sX(nIhzcxUekkgd=eTKqo0y|t8de#M^B- z)tLqu{FKb+17)Od7RC?v?U>6dymVBmw~F=JT88*g0vF5JlEvH9uQ^3O_c{I&V~JBa z%63(5>xu6f#faXGb;wQ5{v=0MrFrC_pszgVPI8h*pFK@Bv!#ygifku_b_+b`O#AB@ zkGi(d-VxPxHP+LTISQK{!6wDEYMcjuk*S=+ihXxi!^ z9L88kkhUea47+!ANJ{d|(l}3j^BC(86@QBhm(D>p8-l1~&0-1sU-;!G7O9A@hERU~`Ofs}{I|Vt@4qv6`jq{b&KIq@m%lk19I!fQ zY{d`X{5+8T^V_o#SHAafXB~>OUSae6+V^IvU)>=CNJuyJ%e!=S%Ok~jP2r7sj{C8UsZU6N=XkzwuS znR$bAd7Q~G)UCS5uhO09y6M1{%z9#jsm>h*Mfh^s}!yKsUs78QnX>AoSs}>QZ@3*d)O!sUDkOWO_^g1 z*HwEm8Qmuh0cAffYy{{Hg$H@KRAn)d@N=I#FR#hQ3E$k4o7uvgdU$jbxW`M6*a z*ysO0v@ zl-;;h5YtnB3>(nJ6u?x&%UGh`Y0nR*>3ACx>dQ#v@gDPr9DcIL#r@O1@_jR{HYnnB`1+sFm)ziO>%DL zWZ0N!P<5hburO9|!DH>}P*M@7Fa%QyrL29ixj)5Sd-N%k(p@4ys#DcgiXy+f+q|T7 zq=t5L(qT-}`?6p(ukZ|1GMx_mqyf83G-64wR{ivi!MRNEK6k56XPu{+1OTTD)kO^H z1<#@Fdul5lSsznAq+>$qvDbo*io}37pN;jwgio)pZWH9uuP?#WJIonYt>>OC#XQ?p zi)>}0$hJ8sm&EDcJnm%Jup__kvZh3ORM!{Gb|0OyYLica?W4yLPB7u+I|82$3oMG` zb<|0TgE>d}sL=2Pnxy@Wx{CHCJ|9AYWqYhFpZm2Cy?scE+#Mjn?WT;-06L|2rKs{We1r6TQxU$ zdGRJyfo{zHm^$5MJsEe{mnV;lM8NfbHg=>Bxp{~&F%?)p`n*Yw_3>yI2Da2P2*y#H z%-30_$zLc-TGXQ$O32zd6Lg`0Ew`vLvf<=Nuz&=o!%N^U$QNQzLH8JC{h6bU**HN_^)JJj^28!KP-)S9DQ)7J zqA)AoBkLql9>Yf1gIP36rlDcZbRSu1g^9jkys+?k^5&k)Po2oNGpOj2702uh!MLh|vP!_qkR+@#8KFIT&@2+9(C!z6 zAD!tU0$!|Vc84WSZGMcH9h*w_cv==KW$B}h~OBr7(p4|&90zq;H>_Q9;Y>civ8cz+=3E!{RHe+@js z8PD9QxG2QV)no+#=iuZN~PU^W3j`3;%7wQRS(_~?3R zhG*Pm&#aYzO8>2&XHh)L>+GGRkJd!}2F{;vHh;GF{K>^<+t9$|{Yk1%i1Yc^&qxKL z^8X~&=k)pH>N8RSgZL+@J|WKMUq2%i2u=KxRG-u5ldI22^=CZTCzSb@ub+_$_%DBQ f)xVJF_a8nZ74S9xB-QVf`IrBnk?Q}Xc(DHq)kDV) diff --git a/src/debugger/TimerMap.hxx b/src/debugger/TimerMap.hxx index bd466dd95..8b6b2e305 100644 --- a/src/debugger/TimerMap.hxx +++ b/src/debugger/TimerMap.hxx @@ -48,20 +48,6 @@ class TimerMap TimerPoint() : addr{0}, bank(ANY_BANK) {} -#if 0 // unused - bool operator==(const TimerPoint& other) const - { - if(addr == other.addr) - { - if(bank == ANY_BANK || other.bank == ANY_BANK) - return true; - else - return bank == other.bank; - } - return false; - } -#endif - bool operator<(const TimerPoint& other) const { if(bank == ANY_BANK || other.bank == ANY_BANK) @@ -111,33 +97,6 @@ class TimerMap Timer(TimerPoint(addr, bank), c_mirrors, c_anyBank); } -#if 0 // unused - bool operator==(const Timer& other) const - { - cerr << from.addr << ", " << to.addr << endl; - if(from.addr == other.from.addr && to.addr == other.to.addr) - { - if((from.bank == ANY_BANK || other.from.bank == ANY_BANK) && - (to.bank == ANY_BANK || other.to.bank == ANY_BANK)) - return true; - else - return from.bank == other.from.bank && to.bank == other.to.bank; - } - return false; - } - - bool operator<(const Timer& other) const - { - if(from.bank < other.from.bank || (from.bank == other.from.bank && from.addr < other.from.addr)) - return true; - - if(from.bank == other.from.bank && from.addr == other.from.addr) - return to.bank < other.to.bank || (to.bank == other.to.bank && to.addr < other.to.addr); - - return false; - } -#endif - void setTo(const TimerPoint& tp, bool c_mirrors = false, bool c_anyBank = false) { to = tp;

    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 diff --git a/docs/graphics/debugger_romcmenu.png b/docs/graphics/debugger_romcmenu.png index f6cd561a337f329249a6a6af8e89375319bc8e38..92fe7003a4e9baf4c8ff1670dfae61df0f2fbbd0 100644 GIT binary patch literal 15084 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 literal 8710 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 ZO2!9n;1Kt&{P|agsS)-}K&^^( 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%0DS^rQw~59+4OA-gZ7tIK{uYZu(rP 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℘-|KGj{uUt8X-9pGRM!9|em}=*uyFzta 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