From dfb5435442927858b846787d50320fafac5b12af Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Wed, 17 Jun 2026 17:20:35 +0300 Subject: [PATCH 1/7] Add BLB_write function to allow modification of data in a BLOB --- src/include/firebird/impl/msg/jrd.h | 1 + src/include/gen/Firebird.pas | 1 + src/jrd/blb.cpp | 172 +++++++++++++++ src/jrd/blb.h | 5 + src/jrd/tests/BlobRandomWriteTest.cpp | 287 ++++++++++++++++++++++++++ 5 files changed, 466 insertions(+) create mode 100644 src/jrd/tests/BlobRandomWriteTest.cpp diff --git a/src/include/firebird/impl/msg/jrd.h b/src/include/firebird/impl/msg/jrd.h index 0595ee9da2e..bccd2a899d2 100644 --- a/src/include/firebird/impl/msg/jrd.h +++ b/src/include/firebird/impl/msg/jrd.h @@ -1020,3 +1020,4 @@ FB_IMPL_MSG(JRD, 1017, dsql_agg_non_agg_context, -104, "42", "000", "Aggregate f FB_IMPL_MSG(JRD, 1018, dsql_agg_param_not_accum, -204, "42", "000", "Aggregate function input parameters may be referenced only in ON ACCUMULATE DO") FB_IMPL_MSG(JRD, 1019, dsql_agg_exit_group, -204, "42", "000", "EXIT is not allowed in ON GROUP DO section of aggregate function") FB_IMPL_MSG(JRD, 1020, dsql_agg_return, -204, "42", "000", "RETURN is not allowed in ON START DO, ON ACCUMULATE DO or ON FINISH DO sections of aggregate function; use EXIT instead") +FB_IMPL_MSG(JRD, 1021, blob_out_of_length_write, -204, "42", "000", "Cannot write to blob. Position @1 is out of length @2") diff --git a/src/include/gen/Firebird.pas b/src/include/gen/Firebird.pas index 93e2512ee4e..b4e03a69234 100644 --- a/src/include/gen/Firebird.pas +++ b/src/include/gen/Firebird.pas @@ -6062,6 +6062,7 @@ IPerformanceStatsImpl = class(IPerformanceStats) isc_dsql_agg_param_not_accum = 335545338; isc_dsql_agg_exit_group = 335545339; isc_dsql_agg_return = 335545340; + isc_blob_out_of_length_write = 335545341; isc_gfix_db_name = 335740929; isc_gfix_invalid_sw = 335740930; isc_gfix_incmp_sw = 335740932; diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index c4fdb295d13..6a0c3e08b91 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -90,6 +90,78 @@ static void move_to_string(Jrd::thread_db*, dsc*, dsc*); static void slice_callback(array_slice*, ULONG, dsc*); static blb* store_array(thread_db*, jrd_tra*, bid*); +namespace { + +class ReplaceDataHelper +{ +public: + ReplaceDataHelper(thread_db* tdbb, const vcl* blb_pages, const offset_t position, const void* buffer, const ULONG length) : + m_newData(buffer), m_newLength(length), + m_level1Pages(*blb_pages), + m_pageDataLength(tdbb->getDatabase()->dbb_page_size - BLP_SIZE) + { + m_level1PageId = position / m_pageDataLength; // Number of used pages + m_offset = position % m_pageDataLength; // Position in the page + } + + inline void replaceInPage(blob_page* page) noexcept + { + UCHAR* data = reinterpret_cast(page->blp_page); + const ULONG dataLength = std::min(m_pageDataLength - m_offset, m_newLength - m_written); + fb_assert(dataLength <= m_pageDataLength); + + memcpy(data + m_offset, reinterpret_cast(m_newData) + m_written, dataLength); + m_written += dataLength; + m_offset = 0; // Offset only in the first page + }; + + // Move child page Id from level 1 to level 2 + inline ULONG setLevel2(const USHORT pagesOnRootPage) + { + const auto pageId = m_level1PageId; + m_level1PageId = pageId / pagesOnRootPage; // 100000 / 8000 = 12 // level1 page number + return pageId % pagesOnRootPage; // 100000 % 8000 = 4000 // level2 page number + } + + // Get level 1 or level 2 page + inline ULONG getNextLevel1PageId() noexcept + { + return m_level1Pages[m_level1PageId++]; + } + + // Pages are over, write to buffer + inline bool hasPages() const noexcept + { + return m_level1PageId < m_level1Pages.count(); + } + + inline bool needWrite() const noexcept + { + return m_written < m_newLength; + } + + [[maybe_unused]] + inline ULONG getWrittenLength() const noexcept + { + return m_written; + } + +private: + // Where to replace + offset_t m_offset = 0; + + // New Data + const void* m_newData; + const ULONG m_newLength; + + ULONG m_level1PageId = 0; + const vcl& m_level1Pages; + const USHORT m_pageDataLength; + + ULONG m_written = 0; +}; + +} void blb::BLB_cancel(thread_db* tdbb) { @@ -3033,3 +3105,103 @@ void blb::BLB_cancel() { BLB_cancel(JRD_get_thread_data()); } + +void blb::BLB_write(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) +{ + if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) + ERR_post(Arg::Gds(isc_cannot_update_old_blob)); + + if (position > blb_length) + ERR_post(Arg::Gds(isc_blob_out_of_length_write) << Arg::Int64(position) << Arg::Int64(blb_length)); + + const offset_t end = position + length; + if (end > blb_length) + { + const offset_t middle = blb_length - position; + BLB_write(tdbb, position, buffer, middle); // Replace + BLB_put_segment(tdbb, (const UCHAR*)buffer + middle, length - middle); // Append + return; + } + + if (blb_level == 0) + { + blob_page* page = (blob_page*) getBuffer(); + memcpy(reinterpret_cast(page->blp_page) + position, buffer, length); + return; + } + + ReplaceDataHelper helper(tdbb, blb_pages, position, buffer, length); + blob_page* page = nullptr; + + WIN window(blb_pg_space_id, -1); + if (blb_flags & BLB_large_scan) + { + window.win_flags = WIN_large_scan; + window.win_scans = 1; + } + + auto releasePage = [&tdbb, &window](const bool mark) + { + if (mark) + CCH_MARK(tdbb, &window); + + if (window.win_flags & WIN_large_scan) + CCH_RELEASE_TAIL(tdbb, &window); + else + CCH_RELEASE(tdbb, &window); + }; + + // Level 1 blobs are much easier -- page number is in vector. + if (blb_level == 1) + { + while (helper.needWrite()) + { + if (!helper.hasPages()) // The last data is in the blb_buffer + { + page = reinterpret_cast(getBuffer()); + helper.replaceInPage(page); + fb_assert(helper.getWrittenLength() == length); + return; + } + + // Level 1 page constains data + window.win_page = helper.getNextLevel1PageId(); + page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + helper.replaceInPage(page); + releasePage(true); + } + } + else + { + auto level2page = helper.setLevel2(blb_pointers); + while (helper.needWrite()) + { + if (!helper.hasPages()) // The last data is in the blb_buffer + { + helper.replaceInPage(page); + fb_assert(helper.getWrittenLength() == length); + return; + } + + // Level 1 page contains pointers + window.win_page = helper.getNextLevel1PageId(); + page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + + // Level 2 pages contain data + const auto numberOfPagess = page->blp_length / sizeof(page->blp_page); + for (FB_SIZE_T i = level2page; i < numberOfPagess && helper.needWrite(); ++i) + { + auto level2Page = reinterpret_cast(CCH_HANDOFF(tdbb, &window, + page->blp_page[i], + LCK_write, pag_blob)); + + helper.replaceInPage(level2Page); + CCH_MARK(tdbb, &window); + } + releasePage(false); + + level2page = 0; // Offset only for the first pages + } + } + fb_assert(helper.getWrittenLength() == length); +} diff --git a/src/jrd/blb.h b/src/jrd/blb.h index 1a3ded79023..8aa0773df5f 100644 --- a/src/jrd/blb.h +++ b/src/jrd/blb.h @@ -133,6 +133,11 @@ class blb : public pool_alloc return destination; } + // Write data at any position in a temporally (new) blob + // The position of the new buffer must start inside the blob range, but its length may extend beyond it + // Existing data will be overwritten + void BLB_write(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length); + private: static blb* allocate_blob(thread_db*, jrd_tra*); static blb* copy_blob(thread_db* tdbb, const bid* source, bid* destination, diff --git a/src/jrd/tests/BlobRandomWriteTest.cpp b/src/jrd/tests/BlobRandomWriteTest.cpp new file mode 100644 index 00000000000..15c9dd5c9c6 --- /dev/null +++ b/src/jrd/tests/BlobRandomWriteTest.cpp @@ -0,0 +1,287 @@ +#include "boost/test/unit_test.hpp" +#include "../../jrd/blb.h" + +#include "TestContext.h" + +#include + + +BOOST_AUTO_TEST_SUITE(EngineSuite) +BOOST_AUTO_TEST_SUITE(JrdClassesSuite) + + +BOOST_AUTO_TEST_SUITE(BlobTests) + +BOOST_AUTO_TEST_SUITE(BlobRandomWriteTests) + +namespace { + +static constexpr UCHAR STREAM_BLOB_BPB[] = { + isc_bpb_version1, + isc_bpb_type, 1, isc_bpb_type_stream, +}; + + +std::string getDefaultString(std::string_view header = "", int pageNumber = 0, std::optional dum = std::nullopt) +{ + std::string output; + output += header; + + // Bigger page size - level 1 + // Bigger 2 pages - level 2 + auto tdbb = JRD_get_thread_data(); + auto size = tdbb->getDatabase()->dbb_page_size; + + for (int i = 0 ; i < pageNumber; i++) + { + std::string dummy; + dummy.resize(size, dum.value_or('0' + i)); + output += dummy; + } + + return output; +} + +Jrd::blb* makeBlob(Jrd::bid& id, std::string_view testData = "") +{ + auto tdbb = JRD_get_thread_data(); + + Jrd::blb* blob = Jrd::blb::create2(tdbb, tdbb->getTransaction(), &id, sizeof(STREAM_BLOB_BPB), STREAM_BLOB_BPB); + BOOST_REQUIRE(blob != nullptr); + + blob->BLB_put_data(tdbb, (const UCHAR*)testData.data(), testData.length()); + + return blob; +} + + +std::string readBlob(Jrd::bid id) +{ + auto tdbb = JRD_get_thread_data(); + + auto blob = Jrd::blb::open(tdbb, tdbb->getTransaction(), &id); + + std::string buffer; + buffer.resize(blob->blb_length, '\0'); + const ULONG readLength = blob->BLB_get_data(JRD_get_thread_data(), (UCHAR*)buffer.data(), blob->blb_length, true); + return buffer; +} + +void replaceInBlob(Jrd::thread_db* tdbb, Jrd::blb*& blob, const ULONG pos, const std::string_view replacement) +{ + blob->BLB_write(tdbb, pos, replacement.data(), replacement.length()); + blob->BLB_close(tdbb); + blob = nullptr; +} + +std::string replaceInContent(std::string defaultData, ULONG posToInplace, std::string_view contentToInplace) +{ + auto sourceLength = defaultData.length(); + + const auto replacementEnd = posToInplace + contentToInplace.length(); + if (replacementEnd < sourceLength) + { + for (ULONG i = 0; i < contentToInplace.length(); ++i) + { + defaultData[posToInplace + i] = contentToInplace[i]; + } + } + else + { + defaultData.resize(posToInplace); + defaultData += contentToInplace; + } + return defaultData; +} + +} // anonymous namespace + +BOOST_FIXTURE_TEST_CASE(Level0Test, EngineHolder) +{ + Jrd::bid id; + + { // level 0 + const std::string_view testData = "Hello World, BLB_get_data, level=0"; + + // Full rewrite + auto blob = makeBlob(id, testData); + std::string buffer; + buffer.resize(blob->blb_length, '*'); + replaceInBlob(tdbb, blob, 0, buffer); + BOOST_TEST(readBlob(id) == buffer); + + // Middle write + blob = makeBlob(id, testData); + replaceInBlob(tdbb, blob, 12, " __BLB_write_,"); + BOOST_TEST(readBlob(id) == "Hello World, __BLB_write_, level=0"); + + // Ending is out of range - add to end + blob = makeBlob(id, testData); + replaceInBlob(tdbb, blob, 27, testData); + BOOST_TEST(readBlob(id) == "Hello World, BLB_get_data, Hello World, BLB_get_data, level=0"); + + // Beginning is out of range + blob = makeBlob(id, testData); + BOOST_CHECK_THROW(blob->BLB_write(tdbb, 40, (const void*)testData.data(), testData.length()), Firebird::Exception); + } +} + +BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) +{ + Jrd::bid id; + Jrd::blb* blob = nullptr; + + std::string result; + std::string expected; + + const std::string_view testData = "Hello World, BLB_get_data, level=1 | "; + std::string defaultData = getDefaultString(testData, 1); + { + // Full rewrite + auto blob = makeBlob(id, defaultData); + + replaceInBlob(tdbb, blob, 0, "new data"); + + result = readBlob(id); + expected = replaceInContent(defaultData, 0, "new data"); + BOOST_TEST(result == expected); + } + + std::string replacement; + + { + // Middle to end write + replacement.resize(200, '*'); + blob = makeBlob(id, defaultData); + replaceInBlob(tdbb, blob, blob->blb_length - 200, replacement); + + result = readBlob(id); + expected = replaceInContent(defaultData, defaultData.length() - 200, replacement); + BOOST_TEST(result.length() == expected.length()); + BOOST_REQUIRE(result.substr(0, 400) == expected.substr(0, 400)); + BOOST_REQUIRE(result.substr(result.length() - 300) == expected.substr(expected.length() - 300)); + BOOST_TEST(result == expected); + } + + { + // Middle + replacement.resize(200, '*'); + blob = makeBlob(id, defaultData); + replaceInBlob(tdbb, blob, blob->blb_length - 4000, replacement); + + result = readBlob(id); + expected = replaceInContent(defaultData, defaultData.length() - 4000, replacement); + BOOST_TEST(result.length() == expected.length()); + BOOST_REQUIRE(result.substr(result.length() - 4000, 300) == expected.substr(expected.length() - 4000, 300)); + BOOST_TEST(result == expected); + } + + { + // Ending is out of range - add to end + blob = makeBlob(id, defaultData); + replacement.clear(); + replacement.resize(blob->blb_length, '@'); + const auto insertPos = blob->blb_length - 1000; + replaceInBlob(tdbb, blob, insertPos, replacement); + + result = readBlob(id); + expected = replaceInContent(defaultData, insertPos, replacement); + BOOST_TEST(result.length() == expected.length()); + BOOST_REQUIRE(result.substr(0, 400) == expected.substr(0, 400)); + BOOST_REQUIRE(result.substr(result.length() - 300) == expected.substr(expected.length() - 300)); + BOOST_TEST(result == expected); + } + + { + defaultData = getDefaultString(testData, 8); + replacement = getDefaultString(testData, 3, '*'); + + // Big + blob = makeBlob(id, defaultData); + + const auto insertPos = blob->blb_length / 2; + blob->BLB_write(tdbb, insertPos, replacement.data(), replacement.length()); + blob->BLB_close(tdbb); + blob = nullptr; + + result = readBlob(id); + expected = replaceInContent(defaultData, insertPos, replacement); + BOOST_REQUIRE(result.length() == expected.length()); + + std::string_view resultView(result); + std::string_view expectedView(expected); + for (FB_SIZE_T i = 0; i < expected.length(); i += 1000) + { + auto left = std::min(1000, expected.length() - i); + BOOST_TEST(resultView.substr(i, left) == expected.substr(i, left)); + } + } +} + + +BOOST_FIXTURE_TEST_CASE(Level2Test, EngineHolder) +{ + // Takes some time + + Jrd::bid id; + Jrd::blb* blob = nullptr; + + std::string result; + std::string expected; + + const std::string_view testData = "Hello World, BLB_get_data, level=2 | "; + std::string defaultData; + std::string replacement; + + { + blob = makeBlob(id, defaultData); + + const auto insertPos = blob->blb_length / 2; + replaceInBlob(tdbb, blob, insertPos, replacement); + + result = readBlob(id); + expected = replaceInContent(defaultData, insertPos, replacement); + BOOST_REQUIRE(result.length() == expected.length()); + + std::string_view resultView(result); + std::string_view expectedView(expected); + for (FB_SIZE_T i = 0; i < expected.length(); i += 1000) + { + auto left = std::min(1000, expected.length() - i); + BOOST_TEST_INFO("Chunk position is " + std::to_string(i)); + BOOST_TEST(resultView.substr(i, left) == expected.substr(i, left)); + // if (resultView.substr(i, left) != expected.substr(i, left)) + // break; + } + } + + { + defaultData = getDefaultString(testData, 5050); + replacement = getDefaultString(testData, 150, '*'); + + blob = makeBlob(id, defaultData); + + const auto insertPos = 1998; + replaceInBlob(tdbb, blob, insertPos, replacement); + + result = readBlob(id); + expected = replaceInContent(defaultData, insertPos, replacement); + BOOST_REQUIRE(result.length() == expected.length()); + + std::string_view resultView(result); + std::string_view expectedView(expected); + for (FB_SIZE_T i = 0; i < expected.length(); i += 1000) + { + auto left = std::min(1000, expected.length() - i); + BOOST_TEST_INFO("Chunk position is " + std::to_string(i)); + BOOST_TEST(resultView.substr(i, left) == expected.substr(i, left)); + } + } +} + +BOOST_AUTO_TEST_SUITE_END() // BlobRandomWriteTest + +BOOST_AUTO_TEST_SUITE_END() // BlobTests + +BOOST_AUTO_TEST_SUITE_END() // JrdClassesSuite +BOOST_AUTO_TEST_SUITE_END() // EngineSuite From c9426de3685577d73a42e1e49089c90dfc614920 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Thu, 18 Jun 2026 11:26:56 +0300 Subject: [PATCH 2/7] Add ability to use BLB_LSEEK with BLB_put_segment and BLB_put_data --- src/include/firebird/impl/msg/jrd.h | 2 +- src/jrd/blb.cpp | 219 +-- src/jrd/blb.h | 38 +- ...WriteTest.cpp => BlobModificationTest.cpp} | 106 +- src/jrd/tests/TestContext.cpp | 81 + src/jrd/tests/TestContext.h | 23 + src/jrd/tests/json/JsonTempParsingTests.cpp | 1488 +++++++++++++++++ 7 files changed, 1836 insertions(+), 121 deletions(-) rename src/jrd/tests/{BlobRandomWriteTest.cpp => BlobModificationTest.cpp} (74%) create mode 100644 src/jrd/tests/TestContext.cpp create mode 100644 src/jrd/tests/TestContext.h create mode 100644 src/jrd/tests/json/JsonTempParsingTests.cpp diff --git a/src/include/firebird/impl/msg/jrd.h b/src/include/firebird/impl/msg/jrd.h index bccd2a899d2..ac9944f9795 100644 --- a/src/include/firebird/impl/msg/jrd.h +++ b/src/include/firebird/impl/msg/jrd.h @@ -1020,4 +1020,4 @@ FB_IMPL_MSG(JRD, 1017, dsql_agg_non_agg_context, -104, "42", "000", "Aggregate f FB_IMPL_MSG(JRD, 1018, dsql_agg_param_not_accum, -204, "42", "000", "Aggregate function input parameters may be referenced only in ON ACCUMULATE DO") FB_IMPL_MSG(JRD, 1019, dsql_agg_exit_group, -204, "42", "000", "EXIT is not allowed in ON GROUP DO section of aggregate function") FB_IMPL_MSG(JRD, 1020, dsql_agg_return, -204, "42", "000", "RETURN is not allowed in ON START DO, ON ACCUMULATE DO or ON FINISH DO sections of aggregate function; use EXIT instead") -FB_IMPL_MSG(JRD, 1021, blob_out_of_length_write, -204, "42", "000", "Cannot write to blob. Position @1 is out of length @2") +FB_IMPL_MSG(JRD, 1021, blob_out_of_length_write, -204, "42", "000", "Cannot write to blob. Position @1 is out of blob length @2") diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index 6a0c3e08b91..8859e947261 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -92,10 +92,10 @@ static blb* store_array(thread_db*, jrd_tra*, bid*); namespace { -class ReplaceDataHelper +class DataModifyHelper { public: - ReplaceDataHelper(thread_db* tdbb, const vcl* blb_pages, const offset_t position, const void* buffer, const ULONG length) : + DataModifyHelper(thread_db* tdbb, const vcl* blb_pages, const offset_t position, const void* buffer, const ULONG length) : m_newData(buffer), m_newLength(length), m_level1Pages(*blb_pages), m_pageDataLength(tdbb->getDatabase()->dbb_page_size - BLP_SIZE) @@ -1645,6 +1645,21 @@ void blb::BLB_put_data(thread_db* tdbb, const UCHAR* buffer, SLONG length) SET_TDBB(tdbb); const BLOB_PTR* p = buffer; + // BLB_put_segment will remove the flag after teh first call so replace the data here + if (blb_flags & BLB_seek) + { + if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) + ERR_post(Arg::Gds(isc_cannot_update_old_blob)); + + blb_flags &= ~BLB_seek; + + // Modify part inside existing data + if (modifyDataMoveBuffer(tdbb, blb_seek, p, length)) + return; + + // Continue and append the rest + } + while (length > 0) { // ASF: the comment below was copied from BLB_get_data @@ -1679,6 +1694,17 @@ void blb::BLB_put_segment(thread_db* tdbb, const void* seg, USHORT segment_lengt if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) ERR_post(Arg::Gds(isc_cannot_update_old_blob)); + if (blb_flags & BLB_seek) + { + blb_flags &= ~BLB_seek; + + // Modify part inside existing data + if (modifyDataMoveBuffer(tdbb, blb_seek, segment, segment_length)) + return; + + // Continue and append the rest + } + if (blb_filter) { BLF_put_segment(tdbb, &blb_filter, segment_length, segment); @@ -2016,6 +2042,95 @@ void blb::scalar(thread_db* tdbb, blob->BLB_close(tdbb); } +void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) +{ + fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); + + const offset_t end = position + length; + fb_assert(end <= blb_length); + + if (blb_level == 0) + { + blob_page* page = (blob_page*) getBuffer(); + memcpy(reinterpret_cast(page->blp_page) + position, buffer, length); + return; + } + + DataModifyHelper helper(tdbb, blb_pages, position, buffer, length); + blob_page* page = nullptr; + + WIN window(blb_pg_space_id, -1); + if (blb_flags & BLB_large_scan) + { + window.win_flags = WIN_large_scan; + window.win_scans = 1; + } + + auto releasePage = [&tdbb, &window](const bool mark) + { + if (mark) + CCH_MARK(tdbb, &window); + + if (window.win_flags & WIN_large_scan) + CCH_RELEASE_TAIL(tdbb, &window); + else + CCH_RELEASE(tdbb, &window); + }; + + // Level 1 blobs are much easier -- page number is in vector. + if (blb_level == 1) + { + while (helper.needWrite()) + { + if (!helper.hasPages()) // The last data is in the blb_buffer + { + page = reinterpret_cast(getBuffer()); + helper.replaceInPage(page); + fb_assert(helper.getWrittenLength() == length); + return; + } + + // Level 1 page constains data + window.win_page = helper.getNextLevel1PageId(); + page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + helper.replaceInPage(page); + releasePage(true); + } + } + else + { + auto level2page = helper.setLevel2(blb_pointers); + while (helper.needWrite()) + { + if (!helper.hasPages()) // The last data is in the blb_buffer + { + helper.replaceInPage(page); + fb_assert(helper.getWrittenLength() == length); + return; + } + + // Level 1 page contains pointers + window.win_page = helper.getNextLevel1PageId(); + page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + + // Level 2 pages contain data + const auto numberOfPagess = page->blp_length / sizeof(page->blp_page); + for (FB_SIZE_T i = level2page; i < numberOfPagess && helper.needWrite(); ++i) + { + auto level2Page = reinterpret_cast(CCH_HANDOFF(tdbb, &window, + page->blp_page[i], + LCK_write, pag_blob)); + + helper.replaceInPage(level2Page); + CCH_MARK(tdbb, &window); + } + releasePage(false); + + level2page = 0; // Offset only for the first pages + } + } + fb_assert(helper.getWrittenLength() == length); +} static ArrayField* alloc_array(jrd_tra* transaction, Ods::InternalArrayDesc* proto_desc) { @@ -3106,102 +3221,14 @@ void blb::BLB_cancel() BLB_cancel(JRD_get_thread_data()); } -void blb::BLB_write(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) +void blb::BLB_write(thread_db* tdbb, offset_t position, const void* buffer, ULONG length) { if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) - ERR_post(Arg::Gds(isc_cannot_update_old_blob)); - - if (position > blb_length) - ERR_post(Arg::Gds(isc_blob_out_of_length_write) << Arg::Int64(position) << Arg::Int64(blb_length)); - - const offset_t end = position + length; - if (end > blb_length) - { - const offset_t middle = blb_length - position; - BLB_write(tdbb, position, buffer, middle); // Replace - BLB_put_segment(tdbb, (const UCHAR*)buffer + middle, length - middle); // Append - return; - } - - if (blb_level == 0) - { - blob_page* page = (blob_page*) getBuffer(); - memcpy(reinterpret_cast(page->blp_page) + position, buffer, length); - return; - } - - ReplaceDataHelper helper(tdbb, blb_pages, position, buffer, length); - blob_page* page = nullptr; - - WIN window(blb_pg_space_id, -1); - if (blb_flags & BLB_large_scan) - { - window.win_flags = WIN_large_scan; - window.win_scans = 1; - } - - auto releasePage = [&tdbb, &window](const bool mark) - { - if (mark) - CCH_MARK(tdbb, &window); - - if (window.win_flags & WIN_large_scan) - CCH_RELEASE_TAIL(tdbb, &window); - else - CCH_RELEASE(tdbb, &window); - }; - - // Level 1 blobs are much easier -- page number is in vector. - if (blb_level == 1) - { - while (helper.needWrite()) - { - if (!helper.hasPages()) // The last data is in the blb_buffer - { - page = reinterpret_cast(getBuffer()); - helper.replaceInPage(page); - fb_assert(helper.getWrittenLength() == length); - return; - } + ERR_post(Arg::Gds(isc_cannot_update_old_blob)); // Cannot update existing blob - // Level 1 page constains data - window.win_page = helper.getNextLevel1PageId(); - page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); - helper.replaceInPage(page); - releasePage(true); - } - } - else - { - auto level2page = helper.setLevel2(blb_pointers); - while (helper.needWrite()) - { - if (!helper.hasPages()) // The last data is in the blb_buffer - { - helper.replaceInPage(page); - fb_assert(helper.getWrittenLength() == length); - return; - } - - // Level 1 page contains pointers - window.win_page = helper.getNextLevel1PageId(); - page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + // Modify part inside existing data + if (modifyDataMoveBuffer(tdbb, position, buffer, length)) + return; // Only modify, exit - // Level 2 pages contain data - const auto numberOfPagess = page->blp_length / sizeof(page->blp_page); - for (FB_SIZE_T i = level2page; i < numberOfPagess && helper.needWrite(); ++i) - { - auto level2Page = reinterpret_cast(CCH_HANDOFF(tdbb, &window, - page->blp_page[i], - LCK_write, pag_blob)); - - helper.replaceInPage(level2Page); - CCH_MARK(tdbb, &window); - } - releasePage(false); - - level2page = 0; // Offset only for the first pages - } - } - fb_assert(helper.getWrittenLength() == length); + BLB_put_segment(tdbb, buffer, length); // Append } diff --git a/src/jrd/blb.h b/src/jrd/blb.h index 8aa0773df5f..1bb88b43b96 100644 --- a/src/jrd/blb.h +++ b/src/jrd/blb.h @@ -40,6 +40,7 @@ #include "../common/classes/ImplementHelper.h" #include "../common/dsc.h" #include "../jrd/Resources.h" +#include "err_proto.h" namespace Ods { @@ -136,7 +137,7 @@ class blb : public pool_alloc // Write data at any position in a temporally (new) blob // The position of the new buffer must start inside the blob range, but its length may extend beyond it // Existing data will be overwritten - void BLB_write(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length); + void BLB_write(thread_db* tdbb, offset_t position, const void* buffer, ULONG length); private: static blb* allocate_blob(thread_db*, jrd_tra*); @@ -147,6 +148,41 @@ class blb : public pool_alloc void insert_page(thread_db*); void destroy(const bool purge_flag); + // Modify only existing data. Throw error on side violation + void modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length); + + // Modify existing data + // Output: + // true: the input range is only inside the blob data + // false: the input range is extends beyond existing data. Modify `buffer` and `length` to return only non-written data + template + requires((std::is_same_v || std::is_same_v) && std::is_integral_v) + bool modifyDataMoveBuffer(thread_db* tdbb, const offset_t position, const BufferType*& buffer, SizeType& length) + { + if (position > blb_length) + { + ERR_post(Firebird::Arg::Gds(isc_blob_out_of_length_write) << + Firebird::Arg::Int64(position) << Firebird::Arg::Int64(blb_length)); + } + + const offset_t end = position + length; + if (end <= blb_length) + { + // Range is inside the current data, replace and report that no extra actions are requeued + modifyExistingData(tdbb, position, buffer, length); + return true; + } + + // Part inside existing data + const offset_t middle = blb_length - position; + modifyExistingData(tdbb, position, buffer, middle); + + // Return only part to append + buffer = reinterpret_cast(reinterpret_cast(buffer) + middle); // Move pointer + length -= middle; + return false; + } + FB_SIZE_T blb_temp_size = 0; // size stored in transaction temp space offset_t blb_temp_offset = 0; // offset in transaction temp space Attachment* blb_attachment = nullptr; // database attachment diff --git a/src/jrd/tests/BlobRandomWriteTest.cpp b/src/jrd/tests/BlobModificationTest.cpp similarity index 74% rename from src/jrd/tests/BlobRandomWriteTest.cpp rename to src/jrd/tests/BlobModificationTest.cpp index 15c9dd5c9c6..ef41b3382aa 100644 --- a/src/jrd/tests/BlobRandomWriteTest.cpp +++ b/src/jrd/tests/BlobModificationTest.cpp @@ -67,9 +67,35 @@ std::string readBlob(Jrd::bid id) return buffer; } -void replaceInBlob(Jrd::thread_db* tdbb, Jrd::blb*& blob, const ULONG pos, const std::string_view replacement) +enum class ModifyFunction { - blob->BLB_write(tdbb, pos, replacement.data(), replacement.length()); + WRITE, + PUT_DATA, + PUT_SEGMENT, +}; + +void replaceInBlob(Jrd::thread_db* tdbb, Jrd::blb*& blob, const ULONG pos, const std::string_view replacement, + const ModifyFunction modifyFunction) +{ + switch (modifyFunction) + { + case ModifyFunction::WRITE: + blob->BLB_write(tdbb, pos, replacement.data(), replacement.length()); + break; + case ModifyFunction::PUT_SEGMENT: + if (replacement.length() < MAX_USHORT) + { + blob->BLB_lseek(0, pos); + blob->BLB_put_segment(tdbb, (const UCHAR*)replacement.data(), replacement.length()); + break; + } + [[fallthrough]]; + case ModifyFunction::PUT_DATA: + blob->BLB_lseek(0, pos); + blob->BLB_put_data(tdbb, (const UCHAR*)replacement.data(), replacement.length()); + break; + } + blob->BLB_close(tdbb); blob = nullptr; } @@ -96,28 +122,46 @@ std::string replaceInContent(std::string defaultData, ULONG posToInplace, std::s } // anonymous namespace +static constexpr std::array functions = {ModifyFunction::PUT_DATA, ModifyFunction::PUT_SEGMENT, ModifyFunction::WRITE}; +static void putFunctionInfo(const ModifyFunction func) +{ + switch (func) + { + case ModifyFunction::WRITE: + BOOST_TEST_INFO("Modify function WRITE"); + break; + case ModifyFunction::PUT_SEGMENT: + BOOST_TEST_INFO("Modify function PUT_SEGMENT"); + break; + case ModifyFunction::PUT_DATA: + BOOST_TEST_INFO("Modify function PUT_DATA"); + break; + } +} + BOOST_FIXTURE_TEST_CASE(Level0Test, EngineHolder) { Jrd::bid id; - { // level 0 + for (auto type : functions) + { const std::string_view testData = "Hello World, BLB_get_data, level=0"; // Full rewrite auto blob = makeBlob(id, testData); std::string buffer; buffer.resize(blob->blb_length, '*'); - replaceInBlob(tdbb, blob, 0, buffer); + replaceInBlob(tdbb, blob, 0, buffer, type); BOOST_TEST(readBlob(id) == buffer); // Middle write blob = makeBlob(id, testData); - replaceInBlob(tdbb, blob, 12, " __BLB_write_,"); + replaceInBlob(tdbb, blob, 12, " __BLB_write_,", type); BOOST_TEST(readBlob(id) == "Hello World, __BLB_write_, level=0"); // Ending is out of range - add to end blob = makeBlob(id, testData); - replaceInBlob(tdbb, blob, 27, testData); + replaceInBlob(tdbb, blob, 27, testData, type); BOOST_TEST(readBlob(id) == "Hello World, BLB_get_data, Hello World, BLB_get_data, level=0"); // Beginning is out of range @@ -136,11 +180,14 @@ BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) const std::string_view testData = "Hello World, BLB_get_data, level=1 | "; std::string defaultData = getDefaultString(testData, 1); + for (auto type : functions) { + putFunctionInfo(type); + // Full rewrite auto blob = makeBlob(id, defaultData); - replaceInBlob(tdbb, blob, 0, "new data"); + replaceInBlob(tdbb, blob, 0, "new data", type); result = readBlob(id); expected = replaceInContent(defaultData, 0, "new data"); @@ -148,12 +195,13 @@ BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) } std::string replacement; + replacement.resize(200, '*'); + for (auto type : functions) { // Middle to end write - replacement.resize(200, '*'); blob = makeBlob(id, defaultData); - replaceInBlob(tdbb, blob, blob->blb_length - 200, replacement); + replaceInBlob(tdbb, blob, blob->blb_length - 200, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, defaultData.length() - 200, replacement); @@ -163,46 +211,53 @@ BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) BOOST_TEST(result == expected); } + for (auto type : functions) { + putFunctionInfo(type); + // Middle replacement.resize(200, '*'); blob = makeBlob(id, defaultData); - replaceInBlob(tdbb, blob, blob->blb_length - 4000, replacement); + replaceInBlob(tdbb, blob, blob->blb_length - 4000, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, defaultData.length() - 4000, replacement); - BOOST_TEST(result.length() == expected.length()); + BOOST_REQUIRE(result.length() == expected.length()); BOOST_REQUIRE(result.substr(result.length() - 4000, 300) == expected.substr(expected.length() - 4000, 300)); BOOST_TEST(result == expected); } + replacement.clear(); + for (auto type : functions) { + putFunctionInfo(type); + // Ending is out of range - add to end blob = makeBlob(id, defaultData); - replacement.clear(); replacement.resize(blob->blb_length, '@'); + const auto insertPos = blob->blb_length - 1000; - replaceInBlob(tdbb, blob, insertPos, replacement); + replaceInBlob(tdbb, blob, insertPos, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, insertPos, replacement); - BOOST_TEST(result.length() == expected.length()); + BOOST_REQUIRE(result.length() == expected.length()); BOOST_REQUIRE(result.substr(0, 400) == expected.substr(0, 400)); BOOST_REQUIRE(result.substr(result.length() - 300) == expected.substr(expected.length() - 300)); BOOST_TEST(result == expected); } + defaultData = getDefaultString(testData, 8); + replacement = getDefaultString(testData, 3, '*'); + for (auto type : functions) { - defaultData = getDefaultString(testData, 8); - replacement = getDefaultString(testData, 3, '*'); + putFunctionInfo(type); // Big blob = makeBlob(id, defaultData); const auto insertPos = blob->blb_length / 2; - blob->BLB_write(tdbb, insertPos, replacement.data(), replacement.length()); - blob->BLB_close(tdbb); - blob = nullptr; + replaceInBlob(tdbb, blob, insertPos, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, insertPos, replacement); @@ -233,11 +288,14 @@ BOOST_FIXTURE_TEST_CASE(Level2Test, EngineHolder) std::string defaultData; std::string replacement; + for (auto type : functions) { + putFunctionInfo(type); + blob = makeBlob(id, defaultData); const auto insertPos = blob->blb_length / 2; - replaceInBlob(tdbb, blob, insertPos, replacement); + replaceInBlob(tdbb, blob, insertPos, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, insertPos, replacement); @@ -255,14 +313,16 @@ BOOST_FIXTURE_TEST_CASE(Level2Test, EngineHolder) } } + defaultData = getDefaultString(testData, 5050); + replacement = getDefaultString(testData, 150, '*'); + for (auto type : functions) { - defaultData = getDefaultString(testData, 5050); - replacement = getDefaultString(testData, 150, '*'); + putFunctionInfo(type); blob = makeBlob(id, defaultData); const auto insertPos = 1998; - replaceInBlob(tdbb, blob, insertPos, replacement); + replaceInBlob(tdbb, blob, insertPos, replacement, type); result = readBlob(id); expected = replaceInContent(defaultData, insertPos, replacement); diff --git a/src/jrd/tests/TestContext.cpp b/src/jrd/tests/TestContext.cpp new file mode 100644 index 00000000000..1d3525d12c6 --- /dev/null +++ b/src/jrd/tests/TestContext.cpp @@ -0,0 +1,81 @@ +#include "TestContext.h" +#include "../jrd/req.h" + +#include "../jrd/trace/TraceManager.h" + +#include "boost/test/unit_test.hpp" + +#include + +// It is to slow to create a new DB for each test, so create it once and keep in cache +class CachedAttach +{ +public: + CachedAttach(Firebird::MemoryPool& pool) : + status(pool) + { + dbPath = std::filesystem::temp_directory_path() / "engine_utests.fdb"; + removeDb(); + } + + Jrd::JAttachment* getAttachment() + { + // Delay init + if (att != nullptr) + return att; + + att = prov.createDatabase(&status, dbPath.string().data(), 0, nullptr); + BOOST_REQUIRE(att); + + tra = att->startTransaction(&status, 0, nullptr); + BOOST_REQUIRE(tra); + + statement = att->prepare(&status, tra, 0, "select 1 from rdb$database", 3, 0); + + return att; + } + + ~CachedAttach() + { + att->release(); + Jrd::TraceManager::getStorage()->shutdown(); + removeDb(); + } + + void removeDb() + { + if (std::filesystem::exists(dbPath)) + std::filesystem::remove(dbPath); + } + + Jrd::JProvider prov{nullptr}; + Firebird::FbLocalStatus status; + + + std::filesystem::path dbPath; + Jrd::JAttachment* att = nullptr; + + Jrd::JTransaction* tra = nullptr; + Jrd::JStatement* statement = nullptr; +}; +static Firebird::GlobalPtr storage; + + +TestContextHolder::TestContextHolder() : + m_tdbb(&storage->status, storage->getAttachment(), FB_FUNCTION), + pool(*getDefaultMemoryPool()) +{ + m_tdbb->setRequest(storage->statement->getHandle()->getRequest()); + m_tdbb->setTransaction(storage->tra->getHandle()); + + ISC_TIMESTAMP ts = {}; + m_tdbb->getRequest()->setGmtTimeStamp(ts); + + tdbb = JRD_get_thread_data(); +} + +TestContextHolder::~TestContextHolder() +{ + m_tdbb->setRequest(nullptr); + m_tdbb->setTransaction(nullptr); +} diff --git a/src/jrd/tests/TestContext.h b/src/jrd/tests/TestContext.h new file mode 100644 index 00000000000..b2c5050208a --- /dev/null +++ b/src/jrd/tests/TestContext.h @@ -0,0 +1,23 @@ +#ifndef TEST_CONTEXT_H +#define TEST_CONTEXT_H + +#include "firebird.h" +#include "../jrd/jrd.h" + +class TestContextHolder +{ +public: + TestContextHolder(); + ~TestContextHolder(); + +private: + Jrd::EngineContextHolder m_tdbb; // must be at stack + +public: // Available in tests + Firebird::MemoryPool& pool; + Jrd::thread_db* tdbb{}; +}; + +using EngineHolder = TestContextHolder; + +#endif // TEST_CONTEXT_H diff --git a/src/jrd/tests/json/JsonTempParsingTests.cpp b/src/jrd/tests/json/JsonTempParsingTests.cpp new file mode 100644 index 00000000000..25c2835cb9b --- /dev/null +++ b/src/jrd/tests/json/JsonTempParsingTests.cpp @@ -0,0 +1,1488 @@ +// #include "boost/test/unit_test.hpp" +// #include "JsonTestUtils.h" +// #include "../TestContext.h" + +// #include "firebird.h" +// #include "../common/status.h" + +// BOOST_AUTO_TEST_SUITE(JsonSuite) +// BOOST_AUTO_TEST_SUITE(JsonPathTests) + +// using namespace FBJSON; +// using namespace Firebird; +// using namespace TestUtils; + + +// BOOST_FIXTURE_TEST_CASE(BasicTest, EngineHolder) +// { +// PathWrapper parser; +// parser.keys.put("TEST"); +// parser.keys.put("test"); +// parser.keys.put("DAT"); +// parser.keys.put("dat"); +// parser.keys.put("TIMESTAM"); +// parser.keys.put("STR"); +// parser.keys.put("EX"); +// parser.keys.put("SRC"); +// parser.keys.put("NUM"); +// parser.keys.put("STR"); +// parser.keys.put("NUM1"); +// parser.keys.put("NUM2"); +// parser.keys.put("TIM"); +// parser.keys.put("tim"); +// parser.keys.put("passed_date"); +// parser.keys.put("passed_time"); +// parser.keys.put("passed_timestamp"); +// parser.keys.put("new"); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t ==3).a ? (@.t ==4).b ? (@.t ==5).c")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@[0] == 3)[1] ? (@.t ==4).b ? (@[0].t ==5)[1].c")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@.type() == \"array\")")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 100).digits")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 100).digits")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t == 4).b ? (exists(@.c))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t == 4).b ? (exists(@.c)).c")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.type() == \"array\")[1]")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1][*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0].arr[0,1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0].arr[0,1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[-1,0, -1][*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,02,0,0,0,2].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,0][0].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,0,0,2,0].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("- ( -(-(+$.test).abs()))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-(-(+$.test).abs())")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $ ? (@.type() == \"array\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $ ? (@.type() == \"array\")")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.* ? (@.type() == \"number\")")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.*")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.* ? (@.type() == \"array\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.*")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime()).type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck(R"!!!( ($.datetime("YYYY-MM-DD")).type() )!!!")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2018-02-01\".datetime() > \"2018-01-01\".datetime())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2018-02-01\".datetime() < \"2018-01-01\".datetime())")); + +// // Lex mode - check sequence values in the filter before the first True +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.words[2])")); +// // Strict mode - check all sequence values in the filter. number vs string = Unknown -> filter failed -> empty result +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words == @.words[2])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words[*] == @.words[2])")); +// // Strict mode - does not unwrap +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words == @.words[2])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words[*] == @.words[2])")); + + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck(R"--($.data ? (@ like_regex "^Second line $" flags "m"))--")); + +// // WITH TEXT + +// { +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $[0]")); + + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*]")); +// } + + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().name")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().name")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value")); + +// // SELECT JSON_QUERY('{ "a": 1, "b":2, "c":3,"d":4,"e":5}', '$.keyvalue().value' RETURNING VARCHAR(100) with array wrapper ERROR ON ERROR) from RDB$DATABASE; +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue() ? (@.value > 2)")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value ? (@ > 2)")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.keyvalue().value + 1) ? (@ > 5)")); // Compare array with value + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value ? (@ > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.keyvalue().value[*] + 1) ? (@ > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().keyvalue()")); + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().value -6")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().value.size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.keyvalue().value.keyvalue().value.size() == 3)")); + + + +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data ? (@ < 10)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data ? (@ < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.friends.name")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[3][0 to 3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[0][0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][2,2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data[0,2,3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].balance")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].balance1")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].tags")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[].tags"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5].tags")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].catalog")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[1].]balance"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].tags")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].balance1")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].balance")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[2].]"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 2 to 3, 5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].tags[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].tags[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].tags[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*]")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[].tags[]"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[].index"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[]"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[].index"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 4 to 5, 3 to 5, 5,1,2,1,0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 4 to 5, 3 to 5, 5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0to 0, 0, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 0, 0, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 1, 0, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 0, 0, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5 to 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5 to 0, 1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 1 to 2, 5 to 0, 1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 1 to 2, 5 to 0, 1, 4, 8, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 100 to 101, 1 to 2, 5 to 0, 1, 4, 8, 10, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 100 to 111, 1 to 2, 5 to 0, 1, 4, 8, 10, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors.*")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors.*[0, last, 2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, last-1 to last, last-2 to last, 5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, last-1 to last, -3 to last, 5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[-3 to -1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*, 0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, *]")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[0 to *]"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[* to 1]"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens.\"ors\""), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens.\\ors\""), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens.\\\\ors\"")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens\"\".\"o.rs\""), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens\".\"ors\"")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sens.ors")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sensors\"")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens\".ors")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sens.\"o.rs\"")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens.ors\"")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.sens.ors\""), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size > 5 && @.size < 15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < 15 - 6)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < 15 - 6 / 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < (15 - 6) / 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < (15 - 6) * 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) / 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) * 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) || 3 > 5))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && (($.size < (15 - 6)) || 3 < 5))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.other")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0 to 4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0 to 6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[7 to 10]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[1, 3, 4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[2, 4, 6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[8, 10, 11]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.people.*")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.people.*[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[*].*")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2][2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2][5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].id")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].index")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].element[3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].element[5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].mass.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].mass.test")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.element[3][2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.element[3][7]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.mass[3].data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.mass[3].value")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.test[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.test[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.city.district")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.city.location")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.$"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $.second")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test")); +// BOOST_CHECK_THROW(parser.parseNoCheck("Special $ymbols"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" < $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" == $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" <= $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.datetime() < $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.datetime() > $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data > $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $NUM) && (@.desc == $STR))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data < $NUM) && (@.desc == $STR))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $STR))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $EX))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data != $STR))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $SRC.element[2].data))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $SRC.tags[0]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $SRC.tags[2][2]/2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $SRC.tags[2][2]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data < $NUM1) && (@.data > $NUM2) && (@.desc == $STR))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST.floor())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST.ceiling())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ($TEST.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.$TEST")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[$TEST]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > $test)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST.ceiling()]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST, 2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.test")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits[*].floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.digits[*].floor())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.digits[*]).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.test")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits[*].floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]-5.1")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test-5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits-5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()-0.5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()-0.5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]-0.5).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]+5.1")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test+5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits+5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()+0.5")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()+0.5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]+0.5).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]*2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test*2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits*2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()*2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()*2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]*2).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]/2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test/2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits/2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()/2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()/2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]/2).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()%4")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()%4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]%4).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.value+2*3-15/5%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.value)+2*3-15/5%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-($.value+2*3-15/5%2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-($.value+2)*(3-15)/5%2")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first+$.second")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first[*]*$.second[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first+$.third")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.str")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.arr")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.arr[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $TEST")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $TEST.ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first+$.second).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first.floor()+$.second).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.a[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ?(@.first[1][1] > 0).second")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first[*][1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.second ?(@.test_key[0].inner == 5).test_key[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.second ?(@.test_key[0].inner == 999).test_key[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[a]"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5]")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$[\"a\"]"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ - 23 == 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ - 23) != 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ + 23 == 146)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ + 23 != 146)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/2 == 61.5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/2 == 61)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/5 == 27.0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3 == 36)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3 == 40)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3.5 == 1.75)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3.5 == 1.755)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*-3 == -36)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*-3 == 36)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 3)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 0.45)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (-@*-3 == -36)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (-@*-3 == 36)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2) > 2 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2).floor() > 1.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2).floor() > 2 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( 0 < (@.value / 2) - @.score.floor() )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( 0 < (@.value / 2) - @.score )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@ <= 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[-1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[-10]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last-1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last-5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.words[2])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.digits)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == @.data)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ == @.test)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == @.test)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] > -10)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] < -10)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] < 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] > 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == \"words\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == \"true\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] == false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] == true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] != true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] != false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] <> @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] > @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] < @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] >= @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] <= @[0])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[5] == @[1])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null >= @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <= @.words[3])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null >= @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <= @.words[4])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? (null == null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] == null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] != null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] <> null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] > null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] < null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] >= null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] <= null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[-5])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[-6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[-5])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[-6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[-5])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[-6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[-5])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[-6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-7])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-5])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ != null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <> null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ < null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ >= null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 200)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 20)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 23)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 2323)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 10)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 10)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 45)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 45)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < -12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > -12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.13)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.99)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 123.99)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ != 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <> 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ < 1234)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ >= 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <= 1234)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"risc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"TEXT\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"text \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \" text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"tex\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element != \"sample\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element != \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <> \"sample\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <> \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"text for testing\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"text for testing\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"text for testing\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"text for testing\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.test))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[5]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[5 to 10]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[*]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.test.*))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[*]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1 to 3] ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2 to 5] ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[1 to 3]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[3 to 7]))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@.new))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3] ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0] ? (exists (@))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (exists (@.test[*].*))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (exists (@.test))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@.*))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.data))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"new data\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"$new\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"$.new\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) && (exists (@.text)))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) || (exists (@.other)))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) && (exists (@.other)))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (!(exists (@.new)))")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? (exists (@[text]))"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? ((exists (@[text])) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? ((exists (@[0.1])) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@..data)) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@.data.)) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@.new data)) is unknown)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((exists (@.$new)) is unknown)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (exist (@.new))"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.new))")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (EXISTS (@.new))"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (exists @.new)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words == @.words[2]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words == @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? ((@.words == @.digits) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test == @.test.data) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@ == @.test) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == @.test) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > -10) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < 2) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == \"words\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == 555) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == 500) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ == false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ != false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <> false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ >= false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <= false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ == true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ != true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <> true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ >= true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <= true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[3] == true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[3] != false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[4] == false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[4] != true) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null >= @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null <= @.words[3]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[4]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[4]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[4]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null >= @.words[4]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null <= @.words[4]) is unknown)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ == 123 is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ + \"text\") is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ + 123) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ == 123) unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ == 123) is)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] != null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] <> null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] > null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] < null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[-5]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[-6]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[-5]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[-6]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-7]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-5]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-6]) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ == null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ > null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ < null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ >= null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits > 100) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits > 1000) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits < 20) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == 23) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits >= 10) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits >= 1000) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <= 10) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <= 1000) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <> 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <> 1234) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits != 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits != 1234) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ == 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ != 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ <> 123) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ > 12) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ < 1234) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ >= 12) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ <= 1234) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element == \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element == \"risc\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element != \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element <> \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element > \"text for testing\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element > \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element < \"abc\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element < \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element >= \"text for testing\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element <= \"abc\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+\" flags \"i\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"has no[a-z ,]+\" flags \"i\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ И ЧТО ДЕЛАТЬ\" flags \"i\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ и что делать\" flags \"i\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ И ЧТО ДЕЛАТЬ\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^Second line $\" flags \"m\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^First line $\" flags \"m\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^Third line$\" flags \"m\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line Second line Third\" flags \"m\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line .Second.*$\" flags \"s\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line .Second.*$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"(ha)+ Classic\" flags \"U\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+\" flags \"U\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+$\" flags \"U\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[a-zA-Z]+\" flags \"U\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+$\" flags \"imU\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Goal. only\\\\s+\" flags \"isU\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \". only\\\\s+\" flags \"i sU\")")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flag \"i\")"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags m)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags 's')"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags \"flags is located here\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"test\" flags \"U123\")")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"test\" flags)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"one\" flags \"i\" && @ like_regex \"test\" flags \"i\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[[:digit:]]+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"[[:digit:]]+\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"nul(?i:L)?\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"nul(?i:L)?\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name[0][0] ? (@ like_regex \"[abc^xyz]+|main\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[abc^xyz]+|main\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\[\\\"abc\\\", \\\"main\\\", 3\\\\]\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"[abc^xyz]+|main\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ like_regex \"abc|main\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@ like_regex \"abc|main\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"true{1,}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"true{1,}\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"false+?\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"false+?\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex 123) is unknown)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex null)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex null) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex true)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex true) is unknown)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex false)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex false) is unknown)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Rog.*\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Rog\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Rog$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Zelazny$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Zelazny\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Rog[a-z]+ Z\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"e[prst]?.*y$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"r[prst]?.*y$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Zelazny){1,2}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Zelazny){3,}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Roger (Zelazny)+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Roger (Joseph)+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Joseph|Zelazny)\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\\\\d+$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\\\\Dahrenheit \\\\d+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^\\\\w+\")")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Fahrenheit \\d+\")"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Fahrenheit \\\\d+\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Борис\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"бор\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"БОР\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"кие$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Boris\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Эл\\\\.почта [a-z]+@.*\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"почта [a-z]+@.*\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Эл [a-z]+@.*\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"^mail.*на\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"King''s\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Kings\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"King\\\\\\\\s\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\"King\\\"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\{King\\\\}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\w+ \\\\(King\\\\)\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Stephen\\\\W\\\\[King\\\\]\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Stephen\\\\|.*|abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[a-zA-Z ]+\\\\+.*\\\\*\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\. dot\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"m[a-z]?\\\\?\\\\??$\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.name ? (@ like_regex \"^O\''\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac Asimov\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Asimov\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"ac Asi\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" Isaac Asimov\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac Asimov \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac ASIMOV\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" Isaac Asimov \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"451\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"4515432\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.test.data == \"text\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.test.data == \"other\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[1] == 2) && (@.digits[2] == \"wrong_comp\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.digits[2] == \"wrong_comp\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == 45.2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.test.data == \"other\") && (@.digits[1] == \"wrong_comp\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == \"wrong_comp\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 2)) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 123)) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 123))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == \"test\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == \"test\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.test.data == \"text\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.test.data == \"other\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[1] == 2) || (@.digits[2] == \"wrong_comp\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.digits[2] == \"wrong_comp\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == 45.2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.test.data == \"other\") || (@.digits[1] == \"wrong_comp\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == \"wrong_comp\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 2)) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 2))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 123)) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 123))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == \"test\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == \"test\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == 3))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == 123))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((!(@.digits[2] == \"test\")) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == \"test\"))")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && @.test.data)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data && (@.digits[1] == 2))"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 123) || @.test.data)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data || (@.digits[1] == 123))"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (!(@.test.data))"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == \"test\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\".\"new test\" > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.\"new test\" > 100)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.data.new test > 100)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data.new test\" > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.\"dot.key\" > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.dot.key > 100)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.$dollar.test > 100)"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"$dollar\".test > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$?(@.white.spaces > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( @.white.spaces > 100) ")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck(" $ ? (@.white.spaces > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.white.spaces > 100) ")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ($.internal.dollar > 100) ")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists($.internal.dollar)) ")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $.second ? (@>15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $.second ? (@<15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@<10) + $.second ? (@<15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $TEST ? (@>15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $TEST ? (@<15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@<10) + $TEST ? (@>15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.second) ? (@>15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $TEST) ? (@>15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.second) ? (@<15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $TEST) ? (@<15)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.third) ? (@<15)")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts with)"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts \"Stephen\")"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts_with \"Stephen\")"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ startswith \"Stephen\")"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ STARTS WITH \"Stephen\")"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with(\"Stephen\"))")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ( starts with \"Stephen\")"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"123\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"nul\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ starts with \"name\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ starts with \"{\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"abc\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"[\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"tr\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"fal\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with $TEST)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with @.valid_pattern)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with @.pattern_without_dot)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.pattern_without_dot starts with @.text)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[1] starts with @.name)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.name[2])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.name[6])")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.filter)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Борис\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"бор\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"БОР\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \" \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Boris\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Boris and Аркадий\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Эл.почта\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"пишите\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Эл.почта mail\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"mail\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"There is нет\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Здесь нет тестового текста\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple {text}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other {text}\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple \\\"text\\\"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other \\\"text\\\"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple ''text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other ''text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple $.text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other $.text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple \\\\text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other \\\\text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple @text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other @text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple text?\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other text?\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.name ? (@ starts with \"O\''\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with \"Isa\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Zelazny\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"isa\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"ISA\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Isaac Asimov\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with \"Mr and Mrs Dursley\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with \"Some random text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \" Harry\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Harry \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Harry \")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Cthulhu\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() > 4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() > -4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() < -4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() > 4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() > -4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() < -4.9 )")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7].abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == 555.7)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == \"555.7\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == 135.22)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@[4].abs() == 135.22)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].abs() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].abs() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].abs() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].abs() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[1].abs() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() > 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].abs() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.abs() <= 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@.abs() <= 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() == 12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.abs() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs == 123.45)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs ? (@ == 123.45)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs() + 10) > 120)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs()/10) > 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs()/10) < 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((-345/10).abs() > @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((-345/10).abs() < @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second).abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second) ? (@ < 0).abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second) ? (@ > 0).abs()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == \"-12355\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == 345)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == \"345.567\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].bigint() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].bigint() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.bigint() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@ < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].bigint() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@.bigint() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.bigint() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.bigint() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second).bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second) ? (@ < 0).bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second) ? (@ > 0).bigint()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 10].boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == \"true\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == \"false\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@ > false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@ < true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@.type() == \"boolean\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].boolean() ? (@.type() == \"boolean\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() < true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@.type() == \"boolean\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() > false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() < false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.boolean() < true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@ < true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@ > false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].boolean() ? (@ > false)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@.boolean() < true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() == true)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.boolean() == false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.boolean() == false) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"true\").boolean()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7,15].ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].ceiling() == 556)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].ceiling() == \"556\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].ceiling() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].ceiling() == -12355.67)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].ceiling() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].ceiling() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].ceiling() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[2].ceiling() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].ceiling() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling() < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@ < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].ceiling() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.ceiling() <= 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@.ceiling() <= 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.ceiling() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling == 124)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling ? (@ == 124)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling() + 10) > -113.5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling()/10) > -12.4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling()/10) < -12.4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).ceiling() > @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).ceiling() < @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second) ? (@ < 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second) ? (@ > 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD/MM/YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MM/DD/YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYYMMDD\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Mon-DD-YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD-Mon-YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Month DD, YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-DD\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH:MI P.M.\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH:MI:SS P.M.\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24MISS\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD.MM.YYYY HH24:MI:SS\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Mon DD, YYYY HH:MI P.M.\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YEAR\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MM\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MONTH\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MON\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"RM\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SSTZH:TZM\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS TZH:TZM\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS TZH:TZM\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS.FF3\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS.FF4\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS.FF4\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"J\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD-YYYY\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01\".datetime() < \"2023-12-31\".datetime())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"01:00\".datetime(\"HH24:MI\") < \"23:59\".datetime(\"HH24:MI\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01 00:00\".datetime() != \"2023-01-01 01:00\".datetime())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01\".datetime() == \"2023-01-01\".datetime())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].datetime(\"YYYY-MM-DD\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].datetime(\"HH24:MI\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"YYYY-MM-DD\")).type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"HH24:MI:SS\")).type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $dat.datetime())")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI\") < $tim)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $DAT)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime()).type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_date.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI:SS\") == $TIM)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_time.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $TIMESTAM)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_timestamp.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI:SSTZH:TZM\") == $TIM)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"HH24:MI:SSTZH:TZM\")).type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0, 3, 15].double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == \"-12355\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == 345.567)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == \"345.567\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].double() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].double() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.double() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@ < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].double() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@.double() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.double() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.double() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ == \"-123.45\").double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ == \"555\").double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second).double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second) ? (@ < 0).double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second) ? (@ > 0).double()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7,15].floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].floor() == 555)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].floor() == \"555\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].floor() == -12356)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].floor() == -12355.67)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].floor() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].floor() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].floor() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[2].floor() ? (@ < 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].floor() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor() < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@ < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() < 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].floor() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.floor() <= 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@.floor() <= 100)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.floor() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor == 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor ? (@ == 123)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor() + 10) < -113.5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor()/10) < -12.4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor()/10) > -12.4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).floor() < @)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).floor()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second) ? (@ < 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second) ? (@ > 0).ceiling()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == \"-12355\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == 345)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == \"345.567\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].integer() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].integer() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.integer() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@ < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].integer() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@.integer() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.integer() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.integer() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second).integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second) ? (@ < 0).integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second) ? (@ > 0).integer()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0,2].keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.keyvalue().name == \"1\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.keyvalue().name == \"1\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == \"test\").keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == \"other\").keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.outdata.inkey == \"invalue\").keyvalue().value ? (@.inkey == \"invalue\").keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.outdata.inkey == \"invalue\").keyvalue().value ? (@.inkey == \"other\").keyvalue()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == \"-12355\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == 345.567)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == \"345.567\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@ < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].number() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].number() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.number() < 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@ < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].number() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@.number() < 1000)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() == -12355)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.number() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.number() == -12355) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second).number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second) ? (@ < 0).number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second) ? (@ > 0).number()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ == \"words\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ > 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size() ? (@ > 3)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size() ? (@ > 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == \"1\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data[2].size() == \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.size() == 1))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() < 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, -3, last] ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 3)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (@.size() > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.size() == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.size() == 4)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@[0] == 5).size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@[0] == 9).size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1) ? (@[0] > 1).size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1) ? (@[0] > 10).size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1][1].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() == 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() > 2)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() > 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1][1][1][1].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2].size()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 2, 9].string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"123\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"true\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"TEXT\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].string() ? (@ > \"fal\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[2].string() ? (@ < \"1234\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].string() ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[2].string() ? (@ > 12)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[4].string() ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() > \"\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() > \"1\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() < \"xyxz\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.string() < \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@ < \"true\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@ > \"false\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].string() ? (@ > \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@.string() < \"STRING\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() > \"null\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() == \"text\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.string() == \"false\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.string() == \"text\") is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"text\").string()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8].type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type() ? ((@ == \"number\") || (@ == \"string\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type() ? (@ == \"words\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type() ? ((@ == \"number\") || (@ == \"string\"))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type() ? (@ == 555)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4] ? (@.type() == \"boolean\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2] ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2] ? (@.type() == \"boolean\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[6].type() == null)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.data[6].type() == null) is unknown)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!((@.data[6].type() == null) is unknown))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.type() == null))")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last, -3] ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@ != \"null\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@.type() == \"string\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@ == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@.type() == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"other\").type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type() ? (@ == \"object\").type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type() ? (@ == \"string\").type()")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bios.rom_size")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.system.manufacturer")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.ssd.size")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.b")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.Name")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[0].handed")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[1].handed")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $[*]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.rating")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.Name")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.card")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[0].handed")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[1].handed")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_t")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3,4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3,5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1,2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2 to 3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_t")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first.second")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first.wrong")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1 to 3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4 to 7]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,3,9]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.science")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art[1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.. sience"), Firebird::Exception); +// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.$sience"), Firebird::Exception); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.science")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2][0] + $.data[2][1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.key")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (@ > 3)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (@ < 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? (@.abs() == 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ($.value.abs() == 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5 && @ != \"inactive\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5 && @ != \"active\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@ == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ == 1)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.a.size() == 0).b")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.a.size() == 0)")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.prefixItems[*].type ? (@ == \"number\")")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3][0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3][1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 6]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.new")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.empty")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.empty")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong.test")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-3]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-1][0]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last].sample")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last].sample")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last+1]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 2]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6 to 7]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,5]")); +// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,7]")); + +// } + +// BOOST_AUTO_TEST_SUITE_END() // JsonPathTests +// BOOST_AUTO_TEST_SUITE_END() // JsonSuite From 9d2bb639edf75c1b1adec27a167d92850ffa4cd9 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Thu, 18 Jun 2026 11:37:05 +0300 Subject: [PATCH 3/7] Add more comments to blob modification functions --- src/jrd/blb.cpp | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index 8859e947261..3839a0de2a6 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -92,6 +92,7 @@ static blb* store_array(thread_db*, jrd_tra*, bid*); namespace { +// A helper class to track positions of buffer, pages and modifications class DataModifyHelper { public: @@ -104,8 +105,11 @@ class DataModifyHelper m_offset = position % m_pageDataLength; // Position in the page } + // Get data from blob data page and replace data on it inline void replaceInPage(blob_page* page) noexcept { + fb_assert(needWrite()); + UCHAR* data = reinterpret_cast(page->blp_page); const ULONG dataLength = std::min(m_pageDataLength - m_offset, m_newLength - m_written); fb_assert(dataLength <= m_pageDataLength); @@ -2044,18 +2048,19 @@ void blb::scalar(thread_db* tdbb, void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) { - fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); + fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); // Can update only new blob - const offset_t end = position + length; - fb_assert(end <= blb_length); + // Only update + fb_assert(position + length <= blb_length); - if (blb_level == 0) + if (blb_level == 0) // No pages, just a buffer { blob_page* page = (blob_page*) getBuffer(); memcpy(reinterpret_cast(page->blp_page) + position, buffer, length); return; } + // Use helper to simplify pages modification DataModifyHelper helper(tdbb, blb_pages, position, buffer, length); blob_page* page = nullptr; @@ -2069,7 +2074,7 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf auto releasePage = [&tdbb, &window](const bool mark) { if (mark) - CCH_MARK(tdbb, &window); + CCH_MARK(tdbb, &window); // Mark as dirty if (window.win_flags & WIN_large_scan) CCH_RELEASE_TAIL(tdbb, &window); @@ -2080,9 +2085,12 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf // Level 1 blobs are much easier -- page number is in vector. if (blb_level == 1) { + // Level1 pages are pointing to data + + // Update data on pages one by one while (helper.needWrite()) { - if (!helper.hasPages()) // The last data is in the blb_buffer + if (!helper.hasPages()) // The last data chunk is in the blb_buffer { page = reinterpret_cast(getBuffer()); helper.replaceInPage(page); @@ -2099,7 +2107,10 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf } else { - auto level2page = helper.setLevel2(blb_pointers); + // Level1 pages are pointing to Level2 pages + // Level2 pages are pointing to date + + auto level2pageOffset = helper.setLevel2(blb_pointers); while (helper.needWrite()) { if (!helper.hasPages()) // The last data is in the blb_buffer @@ -2113,9 +2124,9 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf window.win_page = helper.getNextLevel1PageId(); page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); - // Level 2 pages contain data + // Level 2 pages contain data. Update them one by one const auto numberOfPagess = page->blp_length / sizeof(page->blp_page); - for (FB_SIZE_T i = level2page; i < numberOfPagess && helper.needWrite(); ++i) + for (FB_SIZE_T i = level2pageOffset; i < numberOfPagess && helper.needWrite(); ++i) { auto level2Page = reinterpret_cast(CCH_HANDOFF(tdbb, &window, page->blp_page[i], @@ -2126,7 +2137,7 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf } releasePage(false); - level2page = 0; // Offset only for the first pages + level2pageOffset = 0; // Offset only for the first pages } } fb_assert(helper.getWrittenLength() == length); @@ -3230,5 +3241,5 @@ void blb::BLB_write(thread_db* tdbb, offset_t position, const void* buffer, ULON if (modifyDataMoveBuffer(tdbb, position, buffer, length)) return; // Only modify, exit - BLB_put_segment(tdbb, buffer, length); // Append + BLB_put_data(tdbb, reinterpret_cast(buffer), length); // Append } From d06480bb514c37d502530868deab956ae829eee7 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Thu, 18 Jun 2026 11:38:23 +0300 Subject: [PATCH 4/7] Remove accidentally committed json file --- src/jrd/tests/json/JsonTempParsingTests.cpp | 1488 ------------------- 1 file changed, 1488 deletions(-) delete mode 100644 src/jrd/tests/json/JsonTempParsingTests.cpp diff --git a/src/jrd/tests/json/JsonTempParsingTests.cpp b/src/jrd/tests/json/JsonTempParsingTests.cpp deleted file mode 100644 index 25c2835cb9b..00000000000 --- a/src/jrd/tests/json/JsonTempParsingTests.cpp +++ /dev/null @@ -1,1488 +0,0 @@ -// #include "boost/test/unit_test.hpp" -// #include "JsonTestUtils.h" -// #include "../TestContext.h" - -// #include "firebird.h" -// #include "../common/status.h" - -// BOOST_AUTO_TEST_SUITE(JsonSuite) -// BOOST_AUTO_TEST_SUITE(JsonPathTests) - -// using namespace FBJSON; -// using namespace Firebird; -// using namespace TestUtils; - - -// BOOST_FIXTURE_TEST_CASE(BasicTest, EngineHolder) -// { -// PathWrapper parser; -// parser.keys.put("TEST"); -// parser.keys.put("test"); -// parser.keys.put("DAT"); -// parser.keys.put("dat"); -// parser.keys.put("TIMESTAM"); -// parser.keys.put("STR"); -// parser.keys.put("EX"); -// parser.keys.put("SRC"); -// parser.keys.put("NUM"); -// parser.keys.put("STR"); -// parser.keys.put("NUM1"); -// parser.keys.put("NUM2"); -// parser.keys.put("TIM"); -// parser.keys.put("tim"); -// parser.keys.put("passed_date"); -// parser.keys.put("passed_time"); -// parser.keys.put("passed_timestamp"); -// parser.keys.put("new"); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t ==3).a ? (@.t ==4).b ? (@.t ==5).c")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@[0] == 3)[1] ? (@.t ==4).b ? (@[0].t ==5)[1].c")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@.type() == \"array\")")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.root ?(@.name==\"first\").content")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 100).digits")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 100).digits")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t == 4).b ? (exists(@.c))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.t == 4).b ? (exists(@.c)).c")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.type() == \"array\")[1]")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1][*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0].arr[0,1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0].arr[0,1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[-1,0, -1][*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,02,0,0,0,2].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,0][0].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[2,0,0,2,0].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("- ( -(-(+$.test).abs()))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-(-(+$.test).abs())")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $ ? (@.type() == \"array\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $ ? (@.type() == \"array\")")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.* ? (@.type() == \"number\")")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.*")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.* ? (@.type() == \"array\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.*")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime()).type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck(R"!!!( ($.datetime("YYYY-MM-DD")).type() )!!!")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2018-02-01\".datetime() > \"2018-01-01\".datetime())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2018-02-01\".datetime() < \"2018-01-01\".datetime())")); - -// // Lex mode - check sequence values in the filter before the first True -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.words[2])")); -// // Strict mode - check all sequence values in the filter. number vs string = Unknown -> filter failed -> empty result -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words == @.words[2])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words[*] == @.words[2])")); -// // Strict mode - does not unwrap -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words == @.words[2])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.words[*] == @.words[2])")); - - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck(R"--($.data ? (@ like_regex "^Second line $" flags "m"))--")); - -// // WITH TEXT - -// { -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $[0]")); - - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*]")); -// } - - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().name")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().name")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value")); - -// // SELECT JSON_QUERY('{ "a": 1, "b":2, "c":3,"d":4,"e":5}', '$.keyvalue().value' RETURNING VARCHAR(100) with array wrapper ERROR ON ERROR) from RDB$DATABASE; -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue() ? (@.value > 2)")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value ? (@ > 2)")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.keyvalue().value + 1) ? (@ > 5)")); // Compare array with value - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value ? (@ > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.keyvalue().value[*] + 1) ? (@ > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().keyvalue()")); - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().value -6")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue().value.keyvalue().value.size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.keyvalue().value.keyvalue().value.size() == 3)")); - - - -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data ? (@ < 10)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data ? (@ < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.friends.name")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.data.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3.data[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr.arr2.arr3[0].data[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.arr[0].arr2[0].arr3.data[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[3][0 to 3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[0][0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,0,0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0,2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][2,2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words[*][0].data[0,2,3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].balance")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].balance1")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].tags")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[].tags"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5].tags")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].catalog")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[1].]balance"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].tags")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].balance1")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[3].balance")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[2].]"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 2 to 3, 5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].tags[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].tags[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].tags[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*]")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[].tags[]"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[].index"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[]"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[].index"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 4 to 5, 3 to 5, 5,1,2,1,0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 4 to 5, 3 to 5, 5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, 0, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0to 0, 0, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 0, 0, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 1, 0, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 0, 0, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0 to 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1 to 1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5 to 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5 to 0, 1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 1 to 2, 5 to 0, 1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 1 to 2, 5 to 0, 1, 4, 8, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 100 to 101, 1 to 2, 5 to 0, 1, 4, 8, 10, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1, 100 to 111, 1 to 2, 5 to 0, 1, 4, 8, 10, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors.*")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sensors.*[0, last, 2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, last-1 to last, last-2 to last, 5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, last-1 to last, -3 to last, 5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[-3 to -1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*, 0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0, *]")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[0 to *]"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[* to 1]"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens.\"ors\""), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens.\\ors\""), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens.\\\\ors\"")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.\"sens\"\".\"o.rs\""), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens\".\"ors\"")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sens.ors")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sensors\"")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens\".ors")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.sens.\"o.rs\"")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.\"sens.ors\"")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.sens.ors\""), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size > 5 && @.size < 15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < 15 - 6)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < 15 - 6 / 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < (15 - 6) / 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ($.size > 5 && $.size < (15 - 6) * 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) / 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) * 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && ($.size < (15 - 6) || 3 > 5))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (($.size > 5) && (($.size < (15 - 6)) || 3 < 5))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.other")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0 to 4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[0 to 6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[7 to 10]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[1, 3, 4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[2, 4, 6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[8, 10, 11]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.people.*")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.people.*[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags[*].*")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2][2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2][5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].id")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].index")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].element[3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].element[5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].mass.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].mass.test")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.element[3][2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.element[3][7]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.mass[3].data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.mass[3].value")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.test[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.test[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.city.district")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.tags.city.location")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.$"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $.second")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test")); -// BOOST_CHECK_THROW(parser.parseNoCheck("Special $ymbols"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" < $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" == $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" <= $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.datetime() < $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.datetime() > $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data > $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $NUM) && (@.desc == $STR))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data < $NUM) && (@.desc == $STR))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $STR))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $EX))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data != $STR))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $SRC.element[2].data))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data == $SRC.tags[0]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $SRC.tags[2][2]/2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data > $SRC.tags[2][2]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data < $NUM1) && (@.data > $NUM2) && (@.desc == $STR))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST.floor())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == $TEST.ceiling())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ($TEST.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.$TEST")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[$TEST]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > $test)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST.ceiling()]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[$TEST, 2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.test")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.digits[*].floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.digits[*].floor())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.digits[*]).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.test")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("+$.digits[*].floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]-5.1")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test-5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits-5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()-0.5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()-0.5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]-0.5).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]+5.1")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test+5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits+5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()+0.5")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()+0.5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]+0.5).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]*2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test*2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits*2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()*2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()*2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]*2).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]/2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test/2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits/2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()/2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()/2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]/2).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*]%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits[*].floor()%4")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*].floor()%4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.digits[*]%4).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-$.value+2*3-15/5%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("(-$.value)+2*3-15/5%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-($.value+2*3-15/5%2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("-($.value+2)*(3-15)/5%2")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first+$.second")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first[*]*$.second[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first+$.third")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.str")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.arr")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.num+$.arr[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $TEST")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first + $TEST.ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first+$.second).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first.floor()+$.second).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.a[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ?(@.first[1][1] > 0).second")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first[*][1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.second ?(@.test_key[0].inner == 5).test_key[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.second ?(@.test_key[0].inner == 999).test_key[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[a]"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[5]")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$[\"a\"]"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ - 23 == 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ - 23) != 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ + 23 == 146)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ + 23 != 146)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/2 == 61.5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/2 == 61)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@/5 == 27.0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3 == 36)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3 == 40)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3.5 == 1.75)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*3.5 == 1.755)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*-3 == -36)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@*-3 == 36)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 3)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (@ % 6 == 0.45)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (-@*-3 == -36)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? (-@*-3 == 36)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2) > 2 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2).floor() > 1.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size() ? ( ($.value / 2).floor() > 2 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( 0 < (@.value / 2) - @.score.floor() )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( 0 < (@.value / 2) - @.score )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@ <= 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[-1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[-10]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last-1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.type() == \"array\")[last-5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.words[2])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words == @.digits)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == @.data)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ == @.test)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == @.test)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] > -10)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] < -10)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] < 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits[*] > 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == \"words\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[*] == \"true\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] == false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] == true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] != true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[3] != false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] == @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] != @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] <> @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] > @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] < @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] >= @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[4] <= @[0])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[5] == @[1])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null >= @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <= @.words[3])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null >= @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <= @.words[4])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? (null == null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] == null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] != null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] <> null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] > null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] < null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] >= null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.words[last] <= null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[-5])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null == @.words[-6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[-5])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null != @.words[-6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[-5])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null <> @.words[-6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[-5])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null > @.words[-6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-7])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-5])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (null < @.words[-6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ != null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <> null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ < null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ >= null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 200)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 20)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 23)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits == 2323)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 10)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits >= 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 10)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <= 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits <> 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits != 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 45)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 45)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < -12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > -12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.13)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.99)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits < 123.99)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.digits > 123.0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ == 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ != 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <> 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ > 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ < 1234)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ >= 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ <= 1234)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"risc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"TEXT\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"text \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \" text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element == \"tex\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element != \"sample\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element != \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <> \"sample\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <> \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"text for testing\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element > \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"text for testing\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element < \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"text for testing\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element >= \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"text for testing\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.element <= \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.test))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[5]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[5 to 10]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.data[*]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.test.*))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[*]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1 to 3] ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2 to 5] ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[1 to 3]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@[3 to 7]))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@.new))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3] ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0] ? (exists (@))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (exists (@.test[*].*))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (exists (@.test))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (exists (@.*))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.data))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"new data\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"$new\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists(@.\"$.new\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) && (exists (@.text)))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) || (exists (@.other)))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((exists (@.new)) && (exists (@.other)))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (!(exists (@.new)))")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? (exists (@[text]))"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? ((exists (@[text])) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data[0] ? ((exists (@[0.1])) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@..data)) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@.data.)) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((exists (@.new data)) is unknown)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((exists (@.$new)) is unknown)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (exist (@.new))"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists (@.new))")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (EXISTS (@.new))"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (exists @.new)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words == @.words[2]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words == @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? ((@.words == @.digits) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test == @.test.data) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@ == @.test) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == @.test) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > -10) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < 2) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == \"words\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == 555) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.words ? ((@ == 500) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ == false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ != false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <> false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ >= false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <= false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ == true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ != true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <> true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ > true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ < true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ >= true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.digits ? ((@ <= true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[3] == true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[3] != false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[4] == false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[4] != true) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null >= @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null <= @.words[3]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[4]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[4]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[4]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null >= @.words[4]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null <= @.words[4]) is unknown)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ == 123 is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ + \"text\") is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ + 123) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ == 123) unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? ((@ == 123) is)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] != null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] <> null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] > null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.words[last] < null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[-5]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null == @.words[-6]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[-5]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null > @.words[-6]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-7]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-5]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((null < @.words[-6]) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ == null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ > null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ < null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ >= null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits > 100) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits > 1000) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits < 20) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits == 23) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits >= 10) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits >= 1000) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <= 10) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <= 1000) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <> 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits <> 1234) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits != 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits != 1234) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ == 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ != 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ <> 123) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ > 12) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ < 1234) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ >= 12) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? ((@ <= 1234) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element == \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element == \"risc\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element != \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element <> \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element > \"text for testing\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element > \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element < \"abc\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element < \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element >= \"text for testing\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.element <= \"abc\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+\" flags \"i\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"has no[a-z ,]+\" flags \"i\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ И ЧТО ДЕЛАТЬ\" flags \"i\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ и что делать\" flags \"i\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[а-я ]+ И ЧТО ДЕЛАТЬ\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^Second line $\" flags \"m\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^First line $\" flags \"m\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"^Third line$\" flags \"m\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line Second line Third\" flags \"m\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line .Second.*$\" flags \"s\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"line .Second.*$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"(ha)+ Classic\" flags \"U\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+\" flags \"U\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+$\" flags \"U\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Classic (ha)+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"[a-zA-Z]+\" flags \"U\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"HAS NO[a-z ,]+$\" flags \"imU\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Goal. only\\\\s+\" flags \"isU\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \". only\\\\s+\" flags \"i sU\")")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flag \"i\")"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags m)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags 's')"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"Test\" flags \"flags is located here\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"test\" flags \"U123\")")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"test\" flags)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@ like_regex \"one\" flags \"i\" && @ like_regex \"test\" flags \"i\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[[:digit:]]+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"[[:digit:]]+\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"nul(?i:L)?\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"nul(?i:L)?\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name[0][0] ? (@ like_regex \"[abc^xyz]+|main\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[abc^xyz]+|main\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\[\\\"abc\\\", \\\"main\\\", 3\\\\]\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"[abc^xyz]+|main\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ like_regex \"abc|main\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@ like_regex \"abc|main\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"true{1,}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"true{1,}\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"false+?\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex \"false+?\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? ((@ like_regex 123) is unknown)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex null)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex null) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex true)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex true) is unknown)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ like_regex false)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ((@ like_regex false) is unknown)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Rog.*\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Rog\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Rog$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Zelazny$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^Zelazny\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Rog[a-z]+ Z\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"e[prst]?.*y$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"r[prst]?.*y$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Zelazny){1,2}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Zelazny){3,}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Roger (Zelazny)+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Roger (Joseph)+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"(Joseph|Zelazny)\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\\\\d+$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\\\\Dahrenheit \\\\d+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^\\\\w+\")")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Fahrenheit \\d+\")"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Fahrenheit \\\\d+\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Борис\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"бор\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"БОР\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"кие$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Boris\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Эл\\\\.почта [a-z]+@.*\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"почта [a-z]+@.*\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Эл [a-z]+@.*\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"^mail.*на\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"King''s\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Kings\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"King\\\\\\\\s\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\"King\\\"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\{King\\\\}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\w+ \\\\(King\\\\)\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Stephen\\\\W\\\\[King\\\\]\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"Stephen\\\\|.*|abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"[a-zA-Z ]+\\\\+.*\\\\*\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"\\\\. dot\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ like_regex \"m[a-z]?\\\\?\\\\??$\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.name ? (@ like_regex \"^O\''\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac Asimov\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Asimov\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"ac Asi\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" Isaac Asimov\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac Asimov \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"Isaac ASIMOV\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" Isaac Asimov \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"451\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"4515432\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \"^\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name like_regex \" \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.test.data == \"text\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.test.data == \"other\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[1] == 2) && (@.digits[2] == \"wrong_comp\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && (@.digits[2] == \"wrong_comp\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == 45.2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.test.data == \"other\") && (@.digits[1] == \"wrong_comp\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") && (@.digits[1] == \"wrong_comp\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 2)) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 123)) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == 123))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") && (@.digits[1] == \"test\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") && (@.digits[1] == \"test\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.test.data == \"text\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.test.data == \"other\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[1] == 2) || (@.digits[2] == \"wrong_comp\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) || (@.digits[2] == \"wrong_comp\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == 45.2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.test.data == \"other\") || (@.digits[1] == \"wrong_comp\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.data == \"other\") || (@.digits[1] == \"wrong_comp\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 2)) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 2))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 123)) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == 123))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (((@.digits[2] == \"wrong_comp\") || (@.digits[1] == \"test\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.digits[2] == \"wrong_comp\") || (@.digits[1] == \"test\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == 3))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == 123))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((!(@.digits[2] == \"test\")) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == \"test\"))")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 2) && @.test.data)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data && (@.digits[1] == 2))"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? ((@.digits[1] == 123) || @.test.data)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data || (@.digits[1] == 123))"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.test.data)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (!(@.test.data))"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.digits[2] == \"test\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\" > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data\".\"new test\" > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.\"new test\" > 100)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.data.new test > 100)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"data.new test\" > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.\"dot.key\" > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data.dot.key > 100)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$ ? (@.$dollar.test > 100)"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.\"$dollar\".test > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$?(@.white.spaces > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ( @.white.spaces > 100) ")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck(" $ ? (@.white.spaces > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.white.spaces > 100) ")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ($.internal.dollar > 100) ")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (exists($.internal.dollar)) ")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $.second ? (@>15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $.second ? (@<15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@<10) + $.second ? (@<15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $TEST ? (@>15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@>10) + $TEST ? (@<15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first ? (@<10) + $TEST ? (@>15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.second) ? (@>15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $TEST) ? (@>15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.second) ? (@<15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $TEST) ? (@<15)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first + $.third) ? (@<15)")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts with)"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts \"Stephen\")"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ starts_with \"Stephen\")"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ startswith \"Stephen\")"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? (@ STARTS WITH \"Stephen\")"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with(\"Stephen\"))")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.name ? ( starts with \"Stephen\")"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"123\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"nul\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ starts with \"name\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ starts with \"{\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"abc\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"[\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"tr\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"fal\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with $TEST)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with @.valid_pattern)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with @.pattern_without_dot)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.pattern_without_dot starts with @.text)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[1] starts with @.name)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.name[2])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.name[6])")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name[0] starts with @.filter)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Борис\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"бор\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"БОР\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \" \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Boris\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Boris and Аркадий\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Эл.почта\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"пишите\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Эл.почта mail\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"mail\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"There is нет\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Здесь нет тестового текста\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple {text}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other {text}\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple \\\"text\\\"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other \\\"text\\\"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple ''text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other ''text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple $.text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other $.text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple \\\\text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other \\\\text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple @text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other @text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Simple text?\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Other text?\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $.name ? (@ starts with \"O\''\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.name starts with \"Isa\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Zelazny\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"isa\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"ISA\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Isaac Asimov\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with \"Mr and Mrs Dursley\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.text starts with \"Some random text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \" Harry\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Harry \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Harry \")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.name ? (@ starts with \"Cthulhu\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() > 4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() > -4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( $.score.floor() < -4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() > 4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() > -4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? ( -$.score.floor() < -4.9 )")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7].abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == 555.7)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == \"555.7\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == 135.22)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@[4].abs() == 135.22)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].abs() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].abs() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].abs() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].abs() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[1].abs() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() > 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].abs() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.abs() <= 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs() ? (@.abs() <= 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.abs() == 12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.abs() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.abs == 123.45)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.abs ? (@ == 123.45)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs() + 10) > 120)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs()/10) > 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.abs()/10) < 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((-345/10).abs() > @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((-345/10).abs() < @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second).abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second) ? (@ < 0).abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).abs() - $.second) ? (@ > 0).abs()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == \"-12355\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == 345)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() == \"345.567\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].bigint() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].bigint() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].bigint() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.bigint() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.bigint() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@ < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].bigint() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.bigint() ? (@.bigint() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.bigint() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.bigint() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.bigint() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second).bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second) ? (@ < 0).bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").bigint() + $.second) ? (@ > 0).bigint()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 10].boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == \"true\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() == \"false\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@ > false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@ < true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].boolean() ? (@.type() == \"boolean\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].boolean() ? (@.type() == \"boolean\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.boolean() < true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@.type() == \"boolean\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() > false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() < false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.boolean() < true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@ < true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@ > false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].boolean() ? (@ > false)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.boolean() ? (@.boolean() < true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.boolean() == true)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.boolean() == false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.boolean() == false) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"true\").boolean()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7,15].ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].ceiling() == 556)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].ceiling() == \"556\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].ceiling() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].ceiling() == -12355.67)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].ceiling() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].ceiling() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].ceiling() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[2].ceiling() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].ceiling() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling() < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@ < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].ceiling() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.ceiling() <= 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling() ? (@.ceiling() <= 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.ceiling() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.ceiling() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.ceiling == 124)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.ceiling ? (@ == 124)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling() + 10) > -113.5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling()/10) > -12.4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.ceiling()/10) < -12.4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).ceiling() > @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).ceiling() < @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second) ? (@ < 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).ceiling() - $.second) ? (@ > 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD/MM/YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MM/DD/YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYYMMDD\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Mon-DD-YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD-Mon-YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Month DD, YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-DD\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH:MI P.M.\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH:MI:SS P.M.\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24MISS\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD.MM.YYYY HH24:MI:SS\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"Mon DD, YYYY HH:MI P.M.\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YEAR\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MM\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MONTH\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"MON\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"RM\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SSTZH:TZM\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS TZH:TZM\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS TZH:TZM\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS.FF3\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"HH24:MI:SS.FF4\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"YYYY-MM-DD HH24:MI:SS.FF4\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"J\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime(\"DD-YYYY\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01\".datetime() < \"2023-12-31\".datetime())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"01:00\".datetime(\"HH24:MI\") < \"23:59\".datetime(\"HH24:MI\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01 00:00\".datetime() != \"2023-01-01 01:00\".datetime())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (\"2023-01-01\".datetime() == \"2023-01-01\".datetime())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.datetime()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].datetime(\"YYYY-MM-DD\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].datetime(\"HH24:MI\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"YYYY-MM-DD\")).type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"HH24:MI:SS\")).type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $dat.datetime())")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI\") < $tim)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $DAT)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime()).type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_date.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI:SS\") == $TIM)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_time.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime() == $TIMESTAM)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$passed_timestamp.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.datetime(\"HH24:MI:SSTZH:TZM\") == $TIM)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.datetime(\"HH24:MI:SSTZH:TZM\")).type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0, 3, 15].double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == \"-12355\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == 345.567)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() == \"345.567\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].double() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].double() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].double() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.double() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.double() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@ < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].double() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.double() ? (@.double() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.double() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.double() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.double() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ == \"-123.45\").double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ == \"555\").double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second).double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second) ? (@ < 0).double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").double() + $.second) ? (@ > 0).double()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last].floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0,3,7,15].floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].floor() == 555)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[1].floor() == \"555\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].floor() == -12356)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.numbers[4].floor() == -12355.67)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].floor() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[3].floor() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[4].floor() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[2].floor() ? (@ < 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0].floor() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor() < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@ < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() < 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*].floor() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[0 to last] ? (@.floor() <= 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor() ? (@.floor() <= 100)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? (@.floor() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers[*] ? ((@.floor() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@.floor == 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers.floor ? (@ == 123)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor() + 10) < -113.5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor()/10) < -12.4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((@.floor()/10) > -12.4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? ((345/10).floor() < @)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ < 0).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numbers ? (@ > 0).floor()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second) ? (@ < 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ < 0).floor() - $.second) ? (@ > 0).ceiling()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == \"-12355\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == 345)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() == \"345.567\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].integer() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].integer() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].integer() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.integer() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.integer() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@ < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].integer() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.integer() ? (@.integer() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.integer() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.integer() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.integer() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second).integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second) ? (@ < 0).integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").integer() + $.second) ? (@ > 0).integer()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0,2].keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $.keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.keyvalue().name == \"1\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("strict $ ? (@.keyvalue().name == \"1\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == \"test\").keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data == \"other\").keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.outdata.inkey == \"invalue\").keyvalue().value ? (@.inkey == \"invalue\").keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.outdata.inkey == \"invalue\").keyvalue().value ? (@.inkey == \"other\").keyvalue()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 3, 15].number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == \"-12355\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == 345.567)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() == \"345.567\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@ < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].number() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].number() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].number() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.number() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.number() < 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@ < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].number() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.number() ? (@.number() < 1000)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.number() == -12355)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.number() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.number() == -12355) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"-123.45\").number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"123\").number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second).number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second) ? (@ < 0).number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("($.first ? (@ == \"-123.45\").number() + $.second) ? (@ > 0).number()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ == \"words\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ > 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@ > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size() ? (@ > 3)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].size() ? (@ > 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == \"1\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].size() == \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.data[2].size() == \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.size() == 1))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() < 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.* ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, -3, last] ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last-1, -1] ? (@.size() == 3)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (@.size() > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.size() == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].size() ? (@.size() == 4)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@[0] == 5).size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@[0] == 9).size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1) ? (@[0] > 1).size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.size() > 1) ? (@[0] > 10).size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[2].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1][1].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[0].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() == 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() > 2)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.size() > 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1][1][1][1].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][1].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[1][2].size()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last].string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0, 2, 9].string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"123\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"true\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"TEXT\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() == \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[3].string() ? (@ > \"fal\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[2].string() ? (@ < \"1234\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0].string() ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[2].string() ? (@ > 12)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[4].string() ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@.string() > \"\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() > \"1\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() < \"xyxz\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[0 to last] ? (@.string() < \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@ < \"true\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@ > \"false\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*].string() ? (@ > \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test.string() ? (@.string() < \"STRING\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() > \"null\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? (@.string() == \"text\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test[*] ? ((@.string() == \"false\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ((@.string() == \"text\") is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? (@ == \"text\").string()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8].type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type() ? ((@ == \"number\") || (@ == \"string\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2].type() ? (@ == \"words\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type() ? ((@ == \"number\") || (@ == \"string\"))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0].type() ? (@ == 555)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2].type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4] ? (@.type() == \"boolean\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2] ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2] ? (@.type() == \"boolean\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[6].type() == null)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!(@.data[6].type() == null) is unknown)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (!((@.data[6].type() == null) is unknown))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? ((@.test.type() == null))")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*] ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0, last, -3] ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@ != \"null\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@.type() == \"string\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@ == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[*].type() ? (@.type() == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"other\").type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type() ? (@ == \"object\").type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.data[2] == \"words\").type() ? (@ == \"string\").type()")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bios.rom_size")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.system.manufacturer")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.ssd.size")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.b")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.Name")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[0].handed")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[1].handed")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("lax $[*]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.rating")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.Name")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.card")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address.postalCode")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[0].handed")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books[1].handed")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.books")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.address")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.phoneNumber.number")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_t")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3,4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3,5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1,2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2 to 3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_t")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first.second")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.first.wrong")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[1 to 3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4 to 7]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,3,9]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.science")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art[1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.art")); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.. sience"), Firebird::Exception); -// BOOST_CHECK_THROW(parser.parseNoCheck("$.data.$sience"), Firebird::Exception); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data.science")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2][0] + $.data[2][1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.key")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (@ > 3)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.value ? (@ < 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? (@.abs() == 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.test ? ($.value.abs() == 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5 && @ != \"inactive\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.status ? ($.value.abs() == 5 && @ != \"active\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$[*] ? (@ == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@ == 1)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.a.size() == 0).b")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$ ? (@.a.size() == 0)")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.prefixItems[*].type ? (@ == \"number\")")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[8]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3][0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3][1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[3 to 6]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.new")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.empty")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[4]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.empty")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.string")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.numeric")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.bool_f")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.null_val")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.wrong.test")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-3]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last-1][0]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last].sample")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last].sample")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[7]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[last+1]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0 to 2]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[6 to 7]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,5]")); -// BOOST_CHECK_NO_THROW(parser.parseNoCheck("$.data[0,2,7]")); - -// } - -// BOOST_AUTO_TEST_SUITE_END() // JsonPathTests -// BOOST_AUTO_TEST_SUITE_END() // JsonSuite From d632219729098689e421f95144403828ca37f8a2 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Thu, 18 Jun 2026 16:03:28 +0300 Subject: [PATCH 5/7] Add description for blob modification algorithm --- src/jrd/blb.cpp | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index 3839a0de2a6..38a60256002 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -2048,10 +2048,39 @@ void blb::scalar(thread_db* tdbb, void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) { - fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); // Can update only new blob + // All BLOB data is stored in the following format: + // + // contains unflushed data and is easy to modify. + // must be fetched, modified, marked, and released. + // + // Depending on the level, the algorithm works as follows: + // + // Level 0: All data is inside blb_buffer. + // This is the simplest case: just perform a memset, and we're done. + // + // Level 1: Flushed data is located on pages (blb_pages), unflushed data is in blb_buffer. + // To modify the data: + // 1. Find the first page that needs modification, read, mark and release it. + // 2. If the remaining data to modify exceeds the current page size, proceed to the next page. + // 3. If there are no more pages but there is still data to modify, update the . + // + // Level 2: Flushed data is organized in a pages tree. + // - The blb_pages array contains level 1 pages. + // - Each level 1 page holds a list of level 2 page IDs. + // + // To locate and modify the required page: + // 1. Calculate the page offset: OFFSET = position / . + // 2. Determine the target level 2 page: FIRST = OFFSET / . + // 3. Compute the byte offset within the level 2 page: + // BytesOffset = position % . + // 4. Modify the first relevant level 2 page, then move to the next one. + // 5. If no more level 2 pages are available, advance to the next level 1 page, + // read its first level 2 page, and continue modifying subsequent level 2 pages. + // 6. If all pages have been processed but there is still unmodified data, update the . + - // Only update - fb_assert(position + length <= blb_length); + fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); // Can update only new blob + fb_assert(position + length <= blb_length); // Update only existing data if (blb_level == 0) // No pages, just a buffer { From 52b18442522d17b51e182b517ff0c067b6646234 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Thu, 18 Jun 2026 16:39:47 +0300 Subject: [PATCH 6/7] Add BLB_read function --- src/jrd/blb.cpp | 9 ++- src/jrd/blb.h | 5 +- ...{BlobModificationTest.cpp => BlobTest.cpp} | 71 ++++++++++++++++--- 3 files changed, 72 insertions(+), 13 deletions(-) rename src/jrd/tests/{BlobModificationTest.cpp => BlobTest.cpp} (83%) diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index 38a60256002..eee280a4487 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -3261,7 +3261,14 @@ void blb::BLB_cancel() BLB_cancel(JRD_get_thread_data()); } -void blb::BLB_write(thread_db* tdbb, offset_t position, const void* buffer, ULONG length) +FB_SIZE_T blb::BLB_read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length) +{ + // Mode 0 - from start + BLB_lseek(0, position); + return BLB_get_data(tdbb, reinterpret_cast(buffer), length, false); +} + +void blb::BLB_write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length) { if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) ERR_post(Arg::Gds(isc_cannot_update_old_blob)); // Cannot update existing blob diff --git a/src/jrd/blb.h b/src/jrd/blb.h index 1bb88b43b96..22c9da4614b 100644 --- a/src/jrd/blb.h +++ b/src/jrd/blb.h @@ -134,10 +134,13 @@ class blb : public pool_alloc return destination; } + // Read form specified position + FB_SIZE_T BLB_read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length); + // Write data at any position in a temporally (new) blob // The position of the new buffer must start inside the blob range, but its length may extend beyond it // Existing data will be overwritten - void BLB_write(thread_db* tdbb, offset_t position, const void* buffer, ULONG length); + void BLB_write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length); private: static blb* allocate_blob(thread_db*, jrd_tra*); diff --git a/src/jrd/tests/BlobModificationTest.cpp b/src/jrd/tests/BlobTest.cpp similarity index 83% rename from src/jrd/tests/BlobModificationTest.cpp rename to src/jrd/tests/BlobTest.cpp index ef41b3382aa..effb58c5c7d 100644 --- a/src/jrd/tests/BlobModificationTest.cpp +++ b/src/jrd/tests/BlobTest.cpp @@ -12,16 +12,12 @@ BOOST_AUTO_TEST_SUITE(JrdClassesSuite) BOOST_AUTO_TEST_SUITE(BlobTests) -BOOST_AUTO_TEST_SUITE(BlobRandomWriteTests) - -namespace { static constexpr UCHAR STREAM_BLOB_BPB[] = { isc_bpb_version1, isc_bpb_type, 1, isc_bpb_type_stream, }; - std::string getDefaultString(std::string_view header = "", int pageNumber = 0, std::optional dum = std::nullopt) { std::string output; @@ -64,9 +60,12 @@ std::string readBlob(Jrd::bid id) std::string buffer; buffer.resize(blob->blb_length, '\0'); const ULONG readLength = blob->BLB_get_data(JRD_get_thread_data(), (UCHAR*)buffer.data(), blob->blb_length, true); + return buffer; } +BOOST_AUTO_TEST_SUITE(BlobModificationTests) + enum class ModifyFunction { WRITE, @@ -120,8 +119,6 @@ std::string replaceInContent(std::string defaultData, ULONG posToInplace, std::s return defaultData; } -} // anonymous namespace - static constexpr std::array functions = {ModifyFunction::PUT_DATA, ModifyFunction::PUT_SEGMENT, ModifyFunction::WRITE}; static void putFunctionInfo(const ModifyFunction func) { @@ -139,7 +136,7 @@ static void putFunctionInfo(const ModifyFunction func) } } -BOOST_FIXTURE_TEST_CASE(Level0Test, EngineHolder) +BOOST_FIXTURE_TEST_CASE(Level0WriteTest, EngineHolder) { Jrd::bid id; @@ -170,7 +167,7 @@ BOOST_FIXTURE_TEST_CASE(Level0Test, EngineHolder) } } -BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) +BOOST_FIXTURE_TEST_CASE(Level1WriteTest, EngineHolder) { Jrd::bid id; Jrd::blb* blob = nullptr; @@ -273,8 +270,7 @@ BOOST_FIXTURE_TEST_CASE(Level1Test, EngineHolder) } } - -BOOST_FIXTURE_TEST_CASE(Level2Test, EngineHolder) +BOOST_FIXTURE_TEST_CASE(Level2WriteTest, EngineHolder) { // Takes some time @@ -339,7 +335,60 @@ BOOST_FIXTURE_TEST_CASE(Level2Test, EngineHolder) } } -BOOST_AUTO_TEST_SUITE_END() // BlobRandomWriteTest +BOOST_AUTO_TEST_SUITE_END() // BlobModificationTest + +BOOST_AUTO_TEST_SUITE(BlobModificationTests) + + +BOOST_FIXTURE_TEST_CASE(Level0ReadTest, EngineHolder) +{ + Jrd::bid id; + + const std::string_view testData = "Hello World, BLB_read, level=0"; + auto blob = makeBlob(id, testData); + blob->BLB_close(tdbb); + blob = Jrd::blb::open(tdbb, tdbb->getTransaction(), &id); + + std::string buffer; + buffer.resize(blob->blb_length, '\0'); + blob->BLB_read(tdbb, 0, buffer.data(), buffer.length()); + BOOST_TEST(buffer == testData); + + auto read = blob->BLB_read(tdbb, 5, buffer.data(), buffer.length()); + BOOST_TEST(read == buffer.length() - 5); + + BOOST_TEST(buffer.substr(0, read) == testData.substr(5)); + + blob->BLB_close(tdbb); +} + +BOOST_FIXTURE_TEST_CASE(Level1ReadTest, EngineHolder) +{ + Jrd::bid id; + + std::string result; + std::string expected; + + const std::string_view testData = "Hello World, BLB_read, level=1 | "; + std::string defaultData = getDefaultString(testData, 8); + + auto blob = makeBlob(id, defaultData); + blob->BLB_close(tdbb); + blob = Jrd::blb::open(tdbb, tdbb->getTransaction(), &id); + + std::string buffer; + buffer.resize(blob->blb_length, '\0'); + auto read = blob->BLB_read(tdbb, blob->blb_length / 2, buffer.data(), buffer.length()); + BOOST_TEST(buffer.substr(0, read) == defaultData.substr(blob->blb_length / 2, read)); + + read = blob->BLB_read(tdbb, 0, buffer.data(), buffer.length()); + BOOST_TEST(read == buffer.length()); + BOOST_TEST(buffer == defaultData); + + blob->BLB_close(tdbb); +} + +BOOST_AUTO_TEST_SUITE_END() // BlobModificationTests BOOST_AUTO_TEST_SUITE_END() // BlobTests From b4a2ed6f3bb025bc598bf20a4c3356104b67f259 Mon Sep 17 00:00:00 2001 From: Artyom Abakumov Date: Fri, 19 Jun 2026 11:16:40 +0300 Subject: [PATCH 7/7] Improve code clearance for blob modify routines, use correct terms for pages and correct style for new functions --- src/include/firebird/impl/msg/jrd.h | 2 +- src/include/gen/Firebird.pas | 2 +- src/jrd/blb.cpp | 222 ++++++++++++++++------------ src/jrd/blb.h | 16 +- src/jrd/tests/BlobTest.cpp | 36 ++--- 5 files changed, 153 insertions(+), 125 deletions(-) diff --git a/src/include/firebird/impl/msg/jrd.h b/src/include/firebird/impl/msg/jrd.h index ac9944f9795..edbd046213c 100644 --- a/src/include/firebird/impl/msg/jrd.h +++ b/src/include/firebird/impl/msg/jrd.h @@ -1020,4 +1020,4 @@ FB_IMPL_MSG(JRD, 1017, dsql_agg_non_agg_context, -104, "42", "000", "Aggregate f FB_IMPL_MSG(JRD, 1018, dsql_agg_param_not_accum, -204, "42", "000", "Aggregate function input parameters may be referenced only in ON ACCUMULATE DO") FB_IMPL_MSG(JRD, 1019, dsql_agg_exit_group, -204, "42", "000", "EXIT is not allowed in ON GROUP DO section of aggregate function") FB_IMPL_MSG(JRD, 1020, dsql_agg_return, -204, "42", "000", "RETURN is not allowed in ON START DO, ON ACCUMULATE DO or ON FINISH DO sections of aggregate function; use EXIT instead") -FB_IMPL_MSG(JRD, 1021, blob_out_of_length_write, -204, "42", "000", "Cannot write to blob. Position @1 is out of blob length @2") +FB_IMPL_MSG(JRD, 1021, blob_write_after_the_end, -204, "42", "000", "Cannot write to blob. Position @1 is out of blob length @2") diff --git a/src/include/gen/Firebird.pas b/src/include/gen/Firebird.pas index b4e03a69234..94e9c72bdb4 100644 --- a/src/include/gen/Firebird.pas +++ b/src/include/gen/Firebird.pas @@ -6062,7 +6062,7 @@ IPerformanceStatsImpl = class(IPerformanceStats) isc_dsql_agg_param_not_accum = 335545338; isc_dsql_agg_exit_group = 335545339; isc_dsql_agg_return = 335545340; - isc_blob_out_of_length_write = 335545341; + isc_blob_write_after_the_end = 335545341; isc_gfix_db_name = 335740929; isc_gfix_invalid_sw = 335740930; isc_gfix_incmp_sw = 335740932; diff --git a/src/jrd/blb.cpp b/src/jrd/blb.cpp index eee280a4487..1138b11897a 100644 --- a/src/jrd/blb.cpp +++ b/src/jrd/blb.cpp @@ -92,53 +92,32 @@ static blb* store_array(thread_db*, jrd_tra*, bid*); namespace { -// A helper class to track positions of buffer, pages and modifications +// A helper class to track positions input buffer writing process class DataModifyHelper { public: - DataModifyHelper(thread_db* tdbb, const vcl* blb_pages, const offset_t position, const void* buffer, const ULONG length) : - m_newData(buffer), m_newLength(length), - m_level1Pages(*blb_pages), - m_pageDataLength(tdbb->getDatabase()->dbb_page_size - BLP_SIZE) + DataModifyHelper(const offset_t position, const void* buffer, const ULONG length, + const USHORT dataPageSize, const USHORT maxDataPagesNumber) + : m_newData(buffer), m_newLength(length), + m_dataPageSize(dataPageSize) { - m_level1PageId = position / m_pageDataLength; // Number of used pages - m_offset = position % m_pageDataLength; // Position in the page + m_byteOffsetInPage = position % m_dataPageSize; } - // Get data from blob data page and replace data on it + // Replace content on blob data page inline void replaceInPage(blob_page* page) noexcept { fb_assert(needWrite()); UCHAR* data = reinterpret_cast(page->blp_page); - const ULONG dataLength = std::min(m_pageDataLength - m_offset, m_newLength - m_written); - fb_assert(dataLength <= m_pageDataLength); + const ULONG dataLength = std::min(m_dataPageSize - m_byteOffsetInPage, m_newLength - m_written); + fb_assert(dataLength <= m_dataPageSize); - memcpy(data + m_offset, reinterpret_cast(m_newData) + m_written, dataLength); + memcpy(data + m_byteOffsetInPage, reinterpret_cast(m_newData) + m_written, dataLength); m_written += dataLength; - m_offset = 0; // Offset only in the first page + m_byteOffsetInPage = 0; // Offset only in the first page }; - // Move child page Id from level 1 to level 2 - inline ULONG setLevel2(const USHORT pagesOnRootPage) - { - const auto pageId = m_level1PageId; - m_level1PageId = pageId / pagesOnRootPage; // 100000 / 8000 = 12 // level1 page number - return pageId % pagesOnRootPage; // 100000 % 8000 = 4000 // level2 page number - } - - // Get level 1 or level 2 page - inline ULONG getNextLevel1PageId() noexcept - { - return m_level1Pages[m_level1PageId++]; - } - - // Pages are over, write to buffer - inline bool hasPages() const noexcept - { - return m_level1PageId < m_level1Pages.count(); - } - inline bool needWrite() const noexcept { return m_written < m_newLength; @@ -151,22 +130,58 @@ class DataModifyHelper } private: - // Where to replace - offset_t m_offset = 0; - - // New Data const void* m_newData; const ULONG m_newLength; - ULONG m_level1PageId = 0; - const vcl& m_level1Pages; - const USHORT m_pageDataLength; + // Where to replace + offset_t m_byteOffsetInPage = 0; + const USHORT m_dataPageSize; ULONG m_written = 0; }; +// A helper class to track positions pages +class PageIterator +{ +public: + PageIterator(const ULONG pageId, const ULONG* blbPages, const FB_SIZE_T pagesCount) + : m_pageId(pageId), + m_pagesId(blbPages), + m_numberOfPages(pagesCount) + { } + + PageIterator(const ULONG pageId, const vcl& blbPages) + : m_pageId(pageId), + m_pagesId(blbPages.begin()), + m_numberOfPages(blbPages.count()) + { } + + // Get blob pointer page ID (for blob level 2) or a blob data page (for blob level 1) + inline ULONG getNextPageId() noexcept + { + return m_pagesId[m_pageId++]; + } + + inline bool hasPages() const noexcept + { + return m_pageId < m_numberOfPages; + } + +private: + ULONG m_pageId = 0; + const ULONG* m_pagesId = nullptr; // Data pages (for BLOB level 1) or pointer pages (for BLOB level 2) + const ULONG m_numberOfPages = 0; +}; + +// Make sure blob is a temporary blob. If not, complain bitterly. +inline void verifyBlobModifiable(const USHORT blbFlags) +{ + if (!(blbFlags & BLB_temporary) || (blbFlags & BLB_closed)) + ERR_post(Arg::Gds(isc_cannot_update_old_blob)); // Cannot update existing blob } +} // namespace + void blb::BLB_cancel(thread_db* tdbb) { /************************************** @@ -1649,16 +1664,15 @@ void blb::BLB_put_data(thread_db* tdbb, const UCHAR* buffer, SLONG length) SET_TDBB(tdbb); const BLOB_PTR* p = buffer; - // BLB_put_segment will remove the flag after teh first call so replace the data here + // BLB_put_segment will remove the flag after the first call so replace the data here if (blb_flags & BLB_seek) { - if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) - ERR_post(Arg::Gds(isc_cannot_update_old_blob)); + verifyBlobModifiable(blb_flags); blb_flags &= ~BLB_seek; // Modify part inside existing data - if (modifyDataMoveBuffer(tdbb, blb_seek, p, length)) + if (modifyBlobChunk(tdbb, blb_seek, p, length)) return; // Continue and append the rest @@ -1693,17 +1707,14 @@ void blb::BLB_put_segment(thread_db* tdbb, const void* seg, USHORT segment_lengt Database* dbb = tdbb->getDatabase(); const UCHAR* segment = static_cast(seg); - // Make sure blob is a temporary blob. If not, complain bitterly. - - if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) - ERR_post(Arg::Gds(isc_cannot_update_old_blob)); + verifyBlobModifiable(blb_flags); if (blb_flags & BLB_seek) { blb_flags &= ~BLB_seek; // Modify part inside existing data - if (modifyDataMoveBuffer(tdbb, blb_seek, segment, segment_length)) + if (modifyBlobChunk(tdbb, blb_seek, segment, segment_length)) return; // Continue and append the rest @@ -2046,43 +2057,46 @@ void blb::scalar(thread_db* tdbb, blob->BLB_close(tdbb); } -void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) +void blb::modifyData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length) { - // All BLOB data is stored in the following format: + // All BLOB data is stored in the following format: // - // contains unflushed data and is easy to modify. - // must be fetched, modified, marked, and released. + // contains unflushed data and is easy to modify. + // must be fetched, marked, modified, and released. // - // Depending on the level, the algorithm works as follows: + // Depending on the BLOB level, the algorithm works as follows: // // Level 0: All data is inside blb_buffer. // This is the simplest case: just perform a memset, and we're done. // // Level 1: Flushed data is located on pages (blb_pages), unflushed data is in blb_buffer. // To modify the data: - // 1. Find the first page that needs modification, read, mark and release it. - // 2. If the remaining data to modify exceeds the current page size, proceed to the next page. - // 3. If there are no more pages but there is still data to modify, update the . + // 1. Find the first blob data page that needs modification, read, mark and release it. + // 2. If the remaining data to modify exceeds the current page size, proceed to the next data page. + // 3. If there are no more data pages but there is still data to modify, update the . // // Level 2: Flushed data is organized in a pages tree. - // - The blb_pages array contains level 1 pages. - // - Each level 1 page holds a list of level 2 page IDs. + // - The blb_pages array contains BLOB pointer pages. + // - Each pointer page holds a list of BLOB data page IDs. // // To locate and modify the required page: - // 1. Calculate the page offset: OFFSET = position / . - // 2. Determine the target level 2 page: FIRST = OFFSET / . - // 3. Compute the byte offset within the level 2 page: - // BytesOffset = position % . - // 4. Modify the first relevant level 2 page, then move to the next one. - // 5. If no more level 2 pages are available, advance to the next level 1 page, - // read its first level 2 page, and continue modifying subsequent level 2 pages. - // 6. If all pages have been processed but there is still unmodified data, update the . + // 1. Calculate the pointer page offset: + // NUMBER_OF_USED_PAGES = position / + // PINTER_PAGE_ID = NUMBER_OF_USED_PAGES / . + // 2. Determine the target data page: + // DATA_PAGE_ID = NUMBER_OF_USED_PAGES % . + // 3. Compute the byte offset within the data page: + // BYTE_OFFSET = position % . + // 4. Modify the first relevant data page, then move to the next one. + // 5. If no more data pages are available, advance to the next pointer page, + // read its first data page, and continue modifying next data pages. + // 6. If all pages have been processed but there is still input data left, update the . fb_assert ((blb_flags & BLB_temporary) && !(blb_flags & BLB_closed)); // Can update only new blob fb_assert(position + length <= blb_length); // Update only existing data - if (blb_level == 0) // No pages, just a buffer + if (blb_level == 0) // No pages, just a buffer () { blob_page* page = (blob_page*) getBuffer(); memcpy(reinterpret_cast(page->blp_page) + position, buffer, length); @@ -2090,7 +2104,12 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf } // Use helper to simplify pages modification - DataModifyHelper helper(tdbb, blb_pages, position, buffer, length); + const auto maxDataPagesNumber = blb_pointers; + const auto dataPageSize = tdbb->getDatabase()->dbb_page_size - BLP_SIZE; + + const auto numberOfUsedDataPages = position / dataPageSize; + + DataModifyHelper helper(position, buffer, length, dataPageSize, maxDataPagesNumber); blob_page* page = nullptr; WIN window(blb_pg_space_id, -1); @@ -2100,11 +2119,8 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf window.win_scans = 1; } - auto releasePage = [&tdbb, &window](const bool mark) + auto releasePage = [&tdbb, &window]() { - if (mark) - CCH_MARK(tdbb, &window); // Mark as dirty - if (window.win_flags & WIN_large_scan) CCH_RELEASE_TAIL(tdbb, &window); else @@ -2114,12 +2130,17 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf // Level 1 blobs are much easier -- page number is in vector. if (blb_level == 1) { - // Level1 pages are pointing to data + // Work with data pages + fb_assert(blb_pages); + + const auto dataPageId = numberOfUsedDataPages; + fb_assert(dataPageId < maxDataPagesNumber); // Update data on pages one by one + PageIterator dataPagesIt(dataPageId, *blb_pages); while (helper.needWrite()) { - if (!helper.hasPages()) // The last data chunk is in the blb_buffer + if (!dataPagesIt.hasPages()) // The last data chunk is in the blb_buffer { page = reinterpret_cast(getBuffer()); helper.replaceInPage(page); @@ -2127,46 +2148,54 @@ void blb::modifyExistingData(thread_db* tdbb, offset_t position, const void* buf return; } - // Level 1 page constains data - window.win_page = helper.getNextLevel1PageId(); + // Work with data page + window.win_page = dataPagesIt.getNextPageId(); page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); + + CCH_MARK(tdbb, &window); // Mark as dirty helper.replaceInPage(page); - releasePage(true); + releasePage(); } } else { - // Level1 pages are pointing to Level2 pages - // Level2 pages are pointing to date + fb_assert(blb_level == 2); + + // blb_pages constains pointer pages ID + // A pointer page constains a list of data page IDs - auto level2pageOffset = helper.setLevel2(blb_pointers); + const ULONG pointerPageId = numberOfUsedDataPages / maxDataPagesNumber; // Example: 100000 / 8000 = 12 + ULONG dataPageId = numberOfUsedDataPages % maxDataPagesNumber; // Example: 100000 % 8000 = 4000 + + PageIterator pointerPagesIt(pointerPageId, *blb_pages); while (helper.needWrite()) { - if (!helper.hasPages()) // The last data is in the blb_buffer + if (!pointerPagesIt.hasPages()) // The last data is in the blb_buffer { helper.replaceInPage(page); fb_assert(helper.getWrittenLength() == length); return; } - // Level 1 page contains pointers - window.win_page = helper.getNextLevel1PageId(); + // Get pointer page + window.win_page = pointerPagesIt.getNextPageId(); page = reinterpret_cast(CCH_FETCH(tdbb, &window, LCK_write, pag_blob)); - // Level 2 pages contain data. Update them one by one - const auto numberOfPagess = page->blp_length / sizeof(page->blp_page); - for (FB_SIZE_T i = level2pageOffset; i < numberOfPagess && helper.needWrite(); ++i) + // Get data pages one by one and update + const ULONG numberOfDataPages = page->blp_length / sizeof(page->blp_page); + PageIterator dataPagesIt(dataPageId, page->blp_page, numberOfDataPages); + while (dataPagesIt.hasPages() && helper.needWrite()) { - auto level2Page = reinterpret_cast(CCH_HANDOFF(tdbb, &window, - page->blp_page[i], + auto dataPage = reinterpret_cast(CCH_HANDOFF(tdbb, &window, + dataPagesIt.getNextPageId(), LCK_write, pag_blob)); - helper.replaceInPage(level2Page); - CCH_MARK(tdbb, &window); + CCH_MARK(tdbb, &window); // Mark as dirty + helper.replaceInPage(dataPage); } - releasePage(false); + releasePage(); - level2pageOffset = 0; // Offset only for the first pages + dataPageId = 0; // Offset only for the first pointer pages } } fb_assert(helper.getWrittenLength() == length); @@ -3261,20 +3290,19 @@ void blb::BLB_cancel() BLB_cancel(JRD_get_thread_data()); } -FB_SIZE_T blb::BLB_read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length) +FB_SIZE_T blb::read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length) { // Mode 0 - from start BLB_lseek(0, position); return BLB_get_data(tdbb, reinterpret_cast(buffer), length, false); } -void blb::BLB_write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length) +void blb::write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length) { - if (!(blb_flags & BLB_temporary) || (blb_flags & BLB_closed)) - ERR_post(Arg::Gds(isc_cannot_update_old_blob)); // Cannot update existing blob + verifyBlobModifiable(blb_flags); // Modify part inside existing data - if (modifyDataMoveBuffer(tdbb, position, buffer, length)) + if (modifyBlobChunk(tdbb, position, buffer, length)) return; // Only modify, exit BLB_put_data(tdbb, reinterpret_cast(buffer), length); // Append diff --git a/src/jrd/blb.h b/src/jrd/blb.h index 22c9da4614b..382755fc8ac 100644 --- a/src/jrd/blb.h +++ b/src/jrd/blb.h @@ -135,12 +135,12 @@ class blb : public pool_alloc } // Read form specified position - FB_SIZE_T BLB_read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length); + FB_SIZE_T read(thread_db* tdbb, const offset_t position, void* buffer, const ULONG length); // Write data at any position in a temporally (new) blob // The position of the new buffer must start inside the blob range, but its length may extend beyond it // Existing data will be overwritten - void BLB_write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length); + void write(thread_db* tdbb, const offset_t position, const void* buffer, ULONG length); private: static blb* allocate_blob(thread_db*, jrd_tra*); @@ -151,8 +151,8 @@ class blb : public pool_alloc void insert_page(thread_db*); void destroy(const bool purge_flag); - // Modify only existing data. Throw error on side violation - void modifyExistingData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length); + // Modify data. Throw error on valid length violation + void modifyData(thread_db* tdbb, offset_t position, const void* buffer, const ULONG length); // Modify existing data // Output: @@ -160,11 +160,11 @@ class blb : public pool_alloc // false: the input range is extends beyond existing data. Modify `buffer` and `length` to return only non-written data template requires((std::is_same_v || std::is_same_v) && std::is_integral_v) - bool modifyDataMoveBuffer(thread_db* tdbb, const offset_t position, const BufferType*& buffer, SizeType& length) + bool modifyBlobChunk(thread_db* tdbb, const offset_t position, const BufferType*& buffer, SizeType& length) { if (position > blb_length) { - ERR_post(Firebird::Arg::Gds(isc_blob_out_of_length_write) << + ERR_post(Firebird::Arg::Gds(isc_blob_write_after_the_end) << Firebird::Arg::Int64(position) << Firebird::Arg::Int64(blb_length)); } @@ -172,13 +172,13 @@ class blb : public pool_alloc if (end <= blb_length) { // Range is inside the current data, replace and report that no extra actions are requeued - modifyExistingData(tdbb, position, buffer, length); + modifyData(tdbb, position, buffer, length); return true; } // Part inside existing data const offset_t middle = blb_length - position; - modifyExistingData(tdbb, position, buffer, middle); + modifyData(tdbb, position, buffer, middle); // Return only part to append buffer = reinterpret_cast(reinterpret_cast(buffer) + middle); // Move pointer diff --git a/src/jrd/tests/BlobTest.cpp b/src/jrd/tests/BlobTest.cpp index effb58c5c7d..8b30e4f3440 100644 --- a/src/jrd/tests/BlobTest.cpp +++ b/src/jrd/tests/BlobTest.cpp @@ -79,7 +79,7 @@ void replaceInBlob(Jrd::thread_db* tdbb, Jrd::blb*& blob, const ULONG pos, const switch (modifyFunction) { case ModifyFunction::WRITE: - blob->BLB_write(tdbb, pos, replacement.data(), replacement.length()); + blob->write(tdbb, pos, replacement.data(), replacement.length()); break; case ModifyFunction::PUT_SEGMENT: if (replacement.length() < MAX_USHORT) @@ -99,24 +99,24 @@ void replaceInBlob(Jrd::thread_db* tdbb, Jrd::blb*& blob, const ULONG pos, const blob = nullptr; } -std::string replaceInContent(std::string defaultData, ULONG posToInplace, std::string_view contentToInplace) +std::string replaceInContent(std::string sourceData, const ULONG posToInplace, const std::string_view contentToInplace) { - auto sourceLength = defaultData.length(); + auto sourceLength = sourceData.length(); const auto replacementEnd = posToInplace + contentToInplace.length(); if (replacementEnd < sourceLength) { for (ULONG i = 0; i < contentToInplace.length(); ++i) { - defaultData[posToInplace + i] = contentToInplace[i]; + sourceData[posToInplace + i] = contentToInplace[i]; } } else { - defaultData.resize(posToInplace); - defaultData += contentToInplace; + sourceData.resize(posToInplace); + sourceData += contentToInplace; } - return defaultData; + return sourceData; } static constexpr std::array functions = {ModifyFunction::PUT_DATA, ModifyFunction::PUT_SEGMENT, ModifyFunction::WRITE}; @@ -142,7 +142,7 @@ BOOST_FIXTURE_TEST_CASE(Level0WriteTest, EngineHolder) for (auto type : functions) { - const std::string_view testData = "Hello World, BLB_get_data, level=0"; + const std::string testData = "Hello World, BLB_get_data, level=0"; // Full rewrite auto blob = makeBlob(id, testData); @@ -153,17 +153,17 @@ BOOST_FIXTURE_TEST_CASE(Level0WriteTest, EngineHolder) // Middle write blob = makeBlob(id, testData); - replaceInBlob(tdbb, blob, 12, " __BLB_write_,", type); - BOOST_TEST(readBlob(id) == "Hello World, __BLB_write_, level=0"); + replaceInBlob(tdbb, blob, 12, " __write_,", type); + BOOST_TEST(readBlob(id) == replaceInContent(testData, 12, " __write_,")); // Ending is out of range - add to end blob = makeBlob(id, testData); replaceInBlob(tdbb, blob, 27, testData, type); - BOOST_TEST(readBlob(id) == "Hello World, BLB_get_data, Hello World, BLB_get_data, level=0"); + BOOST_TEST(readBlob(id) == replaceInContent(testData, 27, testData)); // Beginning is out of range blob = makeBlob(id, testData); - BOOST_CHECK_THROW(blob->BLB_write(tdbb, 40, (const void*)testData.data(), testData.length()), Firebird::Exception); + BOOST_CHECK_THROW(blob->write(tdbb, 40, (const void*)testData.data(), testData.length()), Firebird::Exception); } } @@ -344,17 +344,17 @@ BOOST_FIXTURE_TEST_CASE(Level0ReadTest, EngineHolder) { Jrd::bid id; - const std::string_view testData = "Hello World, BLB_read, level=0"; + const std::string_view testData = "Hello World, read, level=0"; auto blob = makeBlob(id, testData); blob->BLB_close(tdbb); blob = Jrd::blb::open(tdbb, tdbb->getTransaction(), &id); std::string buffer; buffer.resize(blob->blb_length, '\0'); - blob->BLB_read(tdbb, 0, buffer.data(), buffer.length()); + blob->read(tdbb, 0, buffer.data(), buffer.length()); BOOST_TEST(buffer == testData); - auto read = blob->BLB_read(tdbb, 5, buffer.data(), buffer.length()); + auto read = blob->read(tdbb, 5, buffer.data(), buffer.length()); BOOST_TEST(read == buffer.length() - 5); BOOST_TEST(buffer.substr(0, read) == testData.substr(5)); @@ -369,7 +369,7 @@ BOOST_FIXTURE_TEST_CASE(Level1ReadTest, EngineHolder) std::string result; std::string expected; - const std::string_view testData = "Hello World, BLB_read, level=1 | "; + const std::string_view testData = "Hello World, read, level=1 | "; std::string defaultData = getDefaultString(testData, 8); auto blob = makeBlob(id, defaultData); @@ -378,10 +378,10 @@ BOOST_FIXTURE_TEST_CASE(Level1ReadTest, EngineHolder) std::string buffer; buffer.resize(blob->blb_length, '\0'); - auto read = blob->BLB_read(tdbb, blob->blb_length / 2, buffer.data(), buffer.length()); + auto read = blob->read(tdbb, blob->blb_length / 2, buffer.data(), buffer.length()); BOOST_TEST(buffer.substr(0, read) == defaultData.substr(blob->blb_length / 2, read)); - read = blob->BLB_read(tdbb, 0, buffer.data(), buffer.length()); + read = blob->read(tdbb, 0, buffer.data(), buffer.length()); BOOST_TEST(read == buffer.length()); BOOST_TEST(buffer == defaultData);