From 475af33319ade31eb52aef21ff21bbcc79db2a3d Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 8 Jun 2020 20:35:45 +0300 Subject: [PATCH 01/19] Avoid too large stack frames --- cmake/warnings.cmake | 3 ++ src/Common/Exception.cpp | 2 +- src/Common/Volnitsky.h | 9 ++--- src/Common/filesystemHelpers.cpp | 4 +-- src/Databases/DatabaseOrdinary.cpp | 3 +- src/Functions/FunctionsStringSimilarity.cpp | 39 ++++++++++----------- src/IO/AIOContextPool.cpp | 6 ++-- 7 files changed, 34 insertions(+), 32 deletions(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 63cb153a0b4..c0620258b18 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -20,6 +20,9 @@ endif () option (WEVERYTHING "Enables -Weverything option with some exceptions. This is intended for exploration of new compiler warnings that may be found to be useful. Only makes sense for clang." ON) +# Control maximum size of stack frames. It can be important if the code is run in fibers with small stack size. +add_warning(frame-larger-than=32768) + if (COMPILER_CLANG) add_warning(pedantic) no_warning(vla-extension) diff --git a/src/Common/Exception.cpp b/src/Common/Exception.cpp index f2470ea0406..a0eb87bdb21 100644 --- a/src/Common/Exception.cpp +++ b/src/Common/Exception.cpp @@ -149,7 +149,7 @@ static void getNotEnoughMemoryMessage(std::string & msg) #if defined(__linux__) try { - static constexpr size_t buf_size = 4096; + static constexpr size_t buf_size = 1024; char buf[buf_size]; UInt64 max_map_count = 0; diff --git a/src/Common/Volnitsky.h b/src/Common/Volnitsky.h index 0cfabd94b96..6d132016337 100644 --- a/src/Common/Volnitsky.h +++ b/src/Common/Volnitsky.h @@ -318,7 +318,7 @@ protected: /** max needle length is 255, max distinct ngrams for case-sensitive is (255 - 1), case-insensitive is 4 * (255 - 1) * storage of 64K ngrams (n = 2, 128 KB) should be large enough for both cases */ - VolnitskyTraits::Offset hash[VolnitskyTraits::hash_size]; /// Hash table. + std::unique_ptr hash; /// Hash table. const bool fallback; /// Do we need to use the fallback algorithm. @@ -340,7 +340,7 @@ public: if (fallback) return; - memset(hash, 0, sizeof(hash)); + hash = std::unique_ptr(new VolnitskyTraits::Offset[VolnitskyTraits::hash_size]{}); auto callback = [this](const VolnitskyTraits::Ngram ngram, const int offset) { return this->putNGramBase(ngram, offset); }; /// ssize_t is used here because unsigned can't be used with condition like `i >= 0`, unsigned always >= 0 @@ -419,7 +419,7 @@ private: VolnitskyTraits::Offset off; }; - OffsetId hash[VolnitskyTraits::hash_size]; + std::unique_ptr hash; /// step for each bunch of strings size_t step; @@ -434,6 +434,7 @@ public: MultiVolnitskyBase(const std::vector & needles_) : needles{needles_}, step{0}, last{0} { fallback_searchers.reserve(needles.size()); + hash = std::unique_ptr(new OffsetId[VolnitskyTraits::hash_size]); /// No zero initialization, it will be done later. } /** @@ -454,7 +455,7 @@ public: if (last == needles.size()) return false; - memset(hash, 0, sizeof(hash)); + memset(hash.get(), 0, VolnitskyTraits::hash_size * sizeof(OffsetId)); fallback_needles.clear(); step = std::numeric_limits::max(); diff --git a/src/Common/filesystemHelpers.cpp b/src/Common/filesystemHelpers.cpp index 209a798b022..e722fbc9c0f 100644 --- a/src/Common/filesystemHelpers.cpp +++ b/src/Common/filesystemHelpers.cpp @@ -79,8 +79,8 @@ String getFilesystemName([[maybe_unused]] const String & mount_point) throw DB::Exception("Cannot open /etc/mtab to get name of filesystem", ErrorCodes::SYSTEM_ERROR); mntent fs_info; constexpr size_t buf_size = 4096; /// The same as buffer used for getmntent in glibc. It can happen that it's not enough - char buf[buf_size]; - while (getmntent_r(mounted_filesystems, &fs_info, buf, buf_size) && fs_info.mnt_dir != mount_point) + std::vector buf(buf_size); + while (getmntent_r(mounted_filesystems, &fs_info, buf.data(), buf_size) && fs_info.mnt_dir != mount_point) ; endmntent(mounted_filesystems); if (fs_info.mnt_dir != mount_point) diff --git a/src/Databases/DatabaseOrdinary.cpp b/src/Databases/DatabaseOrdinary.cpp index b31752ad1b3..6087e6cc2f5 100644 --- a/src/Databases/DatabaseOrdinary.cpp +++ b/src/Databases/DatabaseOrdinary.cpp @@ -234,8 +234,7 @@ void DatabaseOrdinary::alterTable( String statement; { - char in_buf[METADATA_FILE_BUFFER_SIZE]; - ReadBufferFromFile in(table_metadata_path, METADATA_FILE_BUFFER_SIZE, -1, in_buf); + ReadBufferFromFile in(table_metadata_path, METADATA_FILE_BUFFER_SIZE); readStringUntilEOF(statement, in); } diff --git a/src/Functions/FunctionsStringSimilarity.cpp b/src/Functions/FunctionsStringSimilarity.cpp index cf9d4d6e42a..4e50f0c7666 100644 --- a/src/Functions/FunctionsStringSimilarity.cpp +++ b/src/Functions/FunctionsStringSimilarity.cpp @@ -48,11 +48,11 @@ struct NgramDistanceImpl /// Max codepoints to store at once. 16 is for batching usage and PODArray has this padding. static constexpr size_t simultaneously_codepoints_num = default_padding + N - 1; - /** This fits mostly in L2 cache all the time. + /** map_size of this fits mostly in L2 cache all the time. * Actually use UInt16 as addings and subtractions do not UB overflow. But think of it as a signed * integer array. */ - using NgramStats = UInt16[map_size]; + using NgramCount = UInt16; static ALWAYS_INLINE UInt16 calculateASCIIHash(const CodePoint * code_points) { @@ -169,8 +169,8 @@ struct NgramDistanceImpl static ALWAYS_INLINE inline size_t calculateNeedleStats( const char * data, const size_t size, - NgramStats & ngram_stats, - [[maybe_unused]] UInt16 * ngram_storage, + NgramCount * ngram_stats, + [[maybe_unused]] NgramCount * ngram_storage, size_t (*read_code_points)(CodePoint *, const char *&, const char *), UInt16 (*hash_functor)(const CodePoint *)) { @@ -202,7 +202,7 @@ struct NgramDistanceImpl static ALWAYS_INLINE inline UInt64 calculateHaystackStatsAndMetric( const char * data, const size_t size, - NgramStats & ngram_stats, + NgramCount * ngram_stats, size_t & distance, [[maybe_unused]] UInt16 * ngram_storage, size_t (*read_code_points)(CodePoint *, const char *&, const char *), @@ -256,7 +256,7 @@ struct NgramDistanceImpl static void constantConstant(std::string data, std::string needle, Float32 & res) { - NgramStats common_stats = {}; + std::unique_ptr common_stats{new NgramCount[map_size]{}}; /// We use unsafe versions of getting ngrams, so I decided to use padded strings. const size_t needle_size = needle.size(); @@ -264,11 +264,11 @@ struct NgramDistanceImpl needle.resize(needle_size + default_padding); data.resize(data_size + default_padding); - size_t second_size = dispatchSearcher(calculateNeedleStats, needle.data(), needle_size, common_stats, nullptr); + size_t second_size = dispatchSearcher(calculateNeedleStats, needle.data(), needle_size, common_stats.get(), nullptr); size_t distance = second_size; if (data_size <= max_string_size) { - size_t first_size = dispatchSearcher(calculateHaystackStatsAndMetric, data.data(), data_size, common_stats, distance, nullptr); + size_t first_size = dispatchSearcher(calculateHaystackStatsAndMetric, data.data(), data_size, common_stats.get(), distance, nullptr); /// For !symmetric version we should not use first_size. if constexpr (symmetric) res = distance * 1.f / std::max(first_size + second_size, size_t(1)); @@ -295,7 +295,7 @@ struct NgramDistanceImpl size_t prev_haystack_offset = 0; size_t prev_needle_offset = 0; - NgramStats common_stats = {}; + std::unique_ptr common_stats{new NgramCount[map_size]{}}; /// The main motivation is to not allocate more on stack because we have already allocated a lot (128Kb). /// And we can reuse these storages in one thread because we care only about what was written to first places. @@ -316,7 +316,7 @@ struct NgramDistanceImpl calculateNeedleStats, needle, needle_size, - common_stats, + common_stats.get(), needle_ngram_storage.get()); size_t distance = needle_stats_size; @@ -326,7 +326,7 @@ struct NgramDistanceImpl calculateHaystackStatsAndMetric, haystack, haystack_size, - common_stats, + common_stats.get(), distance, haystack_ngram_storage.get()); @@ -378,7 +378,7 @@ struct NgramDistanceImpl const size_t needle_offsets_size = needle_offsets.size(); size_t prev_offset = 0; - NgramStats common_stats = {}; + std::unique_ptr common_stats{new NgramCount[map_size]{}}; std::unique_ptr needle_ngram_storage(new UInt16[max_string_size]); std::unique_ptr haystack_ngram_storage(new UInt16[max_string_size]); @@ -394,7 +394,7 @@ struct NgramDistanceImpl calculateNeedleStats, needle, needle_size, - common_stats, + common_stats.get(), needle_ngram_storage.get()); size_t distance = needle_stats_size; @@ -403,7 +403,7 @@ struct NgramDistanceImpl calculateHaystackStatsAndMetric, haystack.data(), haystack_size, - common_stats, + common_stats.get(), distance, haystack_ngram_storage.get()); @@ -430,17 +430,16 @@ struct NgramDistanceImpl PaddedPODArray & res) { /// zeroing our map - NgramStats common_stats = {}; + std::unique_ptr common_stats{new NgramCount[map_size]{}}; - /// The main motivation is to not allocate more on stack because we have already allocated a lot (128Kb). - /// And we can reuse these storages in one thread because we care only about what was written to first places. - std::unique_ptr ngram_storage(new UInt16[max_string_size]); + /// We can reuse these storages in one thread because we care only about what was written to first places. + std::unique_ptr ngram_storage(new NgramCount[max_string_size]); /// We use unsafe versions of getting ngrams, so I decided to use padded_data even in needle case. const size_t needle_size = needle.size(); needle.resize(needle_size + default_padding); - const size_t needle_stats_size = dispatchSearcher(calculateNeedleStats, needle.data(), needle_size, common_stats, nullptr); + const size_t needle_stats_size = dispatchSearcher(calculateNeedleStats, needle.data(), needle_size, common_stats.get(), nullptr); size_t distance = needle_stats_size; size_t prev_offset = 0; @@ -453,7 +452,7 @@ struct NgramDistanceImpl size_t haystack_stats_size = dispatchSearcher( calculateHaystackStatsAndMetric, reinterpret_cast(haystack), - haystack_size, common_stats, + haystack_size, common_stats.get(), distance, ngram_storage.get()); /// For !symmetric version we should not use haystack_stats_size. diff --git a/src/IO/AIOContextPool.cpp b/src/IO/AIOContextPool.cpp index a06d76e86a2..f5607e2e61c 100644 --- a/src/IO/AIOContextPool.cpp +++ b/src/IO/AIOContextPool.cpp @@ -42,12 +42,12 @@ void AIOContextPool::doMonitor() void AIOContextPool::waitForCompletion() { /// array to hold completion events - io_event events[max_concurrent_events]; + std::vector events(max_concurrent_events); try { - const auto num_events = getCompletionEvents(events, max_concurrent_events); - fulfillPromises(events, num_events); + const auto num_events = getCompletionEvents(events.data(), max_concurrent_events); + fulfillPromises(events.data(), num_events); notifyProducers(num_events); } catch (...) From af176b819138c66631c8079f47b42abe48e9e445 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 8 Jun 2020 22:39:49 +0300 Subject: [PATCH 02/19] Continuation --- src/Common/RadixSort.h | 3 ++- src/Functions/array/arrayEnumerateExtended.h | 4 ++-- src/Functions/array/arrayEnumerateRanked.h | 4 ++-- src/Functions/array/arrayIntersect.cpp | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Common/RadixSort.h b/src/Common/RadixSort.h index 6612fa89085..4ee760208f8 100644 --- a/src/Common/RadixSort.h +++ b/src/Common/RadixSort.h @@ -252,7 +252,8 @@ private: /// There are loops of NUM_PASSES. It is very important that they are unfolded at compile-time. /// For each of the NUM_PASSES bit ranges of the key, consider how many times each value of this bit range met. - CountType histograms[HISTOGRAM_SIZE * NUM_PASSES] = {0}; + std::unique_ptr histograms_holder = std::unique_ptr(); + CountType * histograms = *histograms_holder; typename Traits::Allocator allocator; diff --git a/src/Functions/array/arrayEnumerateExtended.h b/src/Functions/array/arrayEnumerateExtended.h index e2f83ae8826..f6043c47694 100644 --- a/src/Functions/array/arrayEnumerateExtended.h +++ b/src/Functions/array/arrayEnumerateExtended.h @@ -58,8 +58,8 @@ public: void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) override; private: - /// Initially allocate a piece of memory for 512 elements. NOTE: This is just a guess. - static constexpr size_t INITIAL_SIZE_DEGREE = 9; + /// Initially allocate a piece of memory for 64 elements. NOTE: This is just a guess. + static constexpr size_t INITIAL_SIZE_DEGREE = 6; template struct MethodOneNumber diff --git a/src/Functions/array/arrayEnumerateRanked.h b/src/Functions/array/arrayEnumerateRanked.h index c021b5fbfd1..64ad5367359 100644 --- a/src/Functions/array/arrayEnumerateRanked.h +++ b/src/Functions/array/arrayEnumerateRanked.h @@ -118,8 +118,8 @@ public: void executeImpl(Block & block, const ColumnNumbers & arguments, size_t result, size_t input_rows_count) override; private: - /// Initially allocate a piece of memory for 512 elements. NOTE: This is just a guess. - static constexpr size_t INITIAL_SIZE_DEGREE = 9; + /// Initially allocate a piece of memory for 64 elements. NOTE: This is just a guess. + static constexpr size_t INITIAL_SIZE_DEGREE = 6; void executeMethodImpl( const std::vector & offsets_by_depth, diff --git a/src/Functions/array/arrayIntersect.cpp b/src/Functions/array/arrayIntersect.cpp index 24db3c0cd08..a1bd668f694 100644 --- a/src/Functions/array/arrayIntersect.cpp +++ b/src/Functions/array/arrayIntersect.cpp @@ -55,8 +55,8 @@ public: private: const Context & context; - /// Initially allocate a piece of memory for 512 elements. NOTE: This is just a guess. - static constexpr size_t INITIAL_SIZE_DEGREE = 9; + /// Initially allocate a piece of memory for 64 elements. NOTE: This is just a guess. + static constexpr size_t INITIAL_SIZE_DEGREE = 4; struct UnpackedArrays { From ef6c5a285569d803a832b5a95c7dfdf5bbb1a380 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 8 Jun 2020 22:52:55 +0300 Subject: [PATCH 03/19] Continuation --- src/Functions/array/arrayIntersect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Functions/array/arrayIntersect.cpp b/src/Functions/array/arrayIntersect.cpp index a1bd668f694..07c01d4db09 100644 --- a/src/Functions/array/arrayIntersect.cpp +++ b/src/Functions/array/arrayIntersect.cpp @@ -56,7 +56,7 @@ private: const Context & context; /// Initially allocate a piece of memory for 64 elements. NOTE: This is just a guess. - static constexpr size_t INITIAL_SIZE_DEGREE = 4; + static constexpr size_t INITIAL_SIZE_DEGREE = 6; struct UnpackedArrays { From ff21fefb4dd2ad22b22644b565b134d00f60606d Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 8 Jun 2020 23:00:00 +0300 Subject: [PATCH 04/19] Update SIMDJSON to the latest master --- contrib/simdjson | 2 +- contrib/simdjson-cmake/CMakeLists.txt | 20 ++++++++++++++------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/contrib/simdjson b/contrib/simdjson index 560f0742cc0..89332e16965 160000 --- a/contrib/simdjson +++ b/contrib/simdjson @@ -1 +1 @@ -Subproject commit 560f0742cc0895d00d78359dbdeb82064a24adb8 +Subproject commit 89332e169657c3a3eac49446f7394b2497c2ea46 diff --git a/contrib/simdjson-cmake/CMakeLists.txt b/contrib/simdjson-cmake/CMakeLists.txt index a07dcd487be..26e8e1a1432 100644 --- a/contrib/simdjson-cmake/CMakeLists.txt +++ b/contrib/simdjson-cmake/CMakeLists.txt @@ -1,13 +1,21 @@ set(SIMDJSON_INCLUDE_DIR "${ClickHouse_SOURCE_DIR}/contrib/simdjson/include") -set(SIMDJSON_SRC_DIR "${SIMDJSON_INCLUDE_DIR}/../src") +set(SIMDJSON_SRC_DIR "${ClickHouse_SOURCE_DIR}/contrib/simdjson/src") set(SIMDJSON_SRC - ${SIMDJSON_SRC_DIR}/document.cpp ${SIMDJSON_SRC_DIR}/error.cpp ${SIMDJSON_SRC_DIR}/implementation.cpp - ${SIMDJSON_SRC_DIR}/jsonioutil.cpp - ${SIMDJSON_SRC_DIR}/jsonminifier.cpp - ${SIMDJSON_SRC_DIR}/stage1_find_marks.cpp - ${SIMDJSON_SRC_DIR}/stage2_build_tape.cpp + ${SIMDJSON_SRC_DIR}/simdjson.cpp + + ${SIMDJSON_SRC_DIR}/arm64/implementation.cpp + ${SIMDJSON_SRC_DIR}/arm64/dom_parser_implementation.cpp + + ${SIMDJSON_SRC_DIR}/fallback/implementation.cpp + ${SIMDJSON_SRC_DIR}/fallback/dom_parser_implementation.cpp + + ${SIMDJSON_SRC_DIR}/haswell/implementation.cpp + ${SIMDJSON_SRC_DIR}/haswell/dom_parser_implementation.cpp + + ${SIMDJSON_SRC_DIR}/westmere/implementation.cpp + ${SIMDJSON_SRC_DIR}/westmere/dom_parser_implementation.cpp ) add_library(${SIMDJSON_LIBRARY} ${SIMDJSON_SRC}) From 48e48a1e097161935fdf74cb647e924234407525 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 8 Jun 2020 23:00:17 +0300 Subject: [PATCH 05/19] Decrease maximum stack frame size while we can --- cmake/warnings.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index c0620258b18..1ac2fb020fd 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -21,7 +21,7 @@ endif () option (WEVERYTHING "Enables -Weverything option with some exceptions. This is intended for exploration of new compiler warnings that may be found to be useful. Only makes sense for clang." ON) # Control maximum size of stack frames. It can be important if the code is run in fibers with small stack size. -add_warning(frame-larger-than=32768) +add_warning(frame-larger-than=16384) if (COMPILER_CLANG) add_warning(pedantic) From 869f13b21f2bbf95c09ea9c4ad6d5e18b42ca3d8 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 9 Jun 2020 01:37:35 +0300 Subject: [PATCH 06/19] Fix error --- src/Common/RadixSort.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Common/RadixSort.h b/src/Common/RadixSort.h index 4ee760208f8..734115c5500 100644 --- a/src/Common/RadixSort.h +++ b/src/Common/RadixSort.h @@ -252,8 +252,7 @@ private: /// There are loops of NUM_PASSES. It is very important that they are unfolded at compile-time. /// For each of the NUM_PASSES bit ranges of the key, consider how many times each value of this bit range met. - std::unique_ptr histograms_holder = std::unique_ptr(); - CountType * histograms = *histograms_holder; + std::unique_ptr histograms{new CountType[HISTOGRAM_SIZE * NUM_PASSES]{}}; typename Traits::Allocator allocator; From 9b53cb052ff5fad952418bf4f02232b6830dcdca Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 9 Jun 2020 01:45:38 +0300 Subject: [PATCH 07/19] Limit stack frame size in tests --- base/common/tests/gtest_json_test.cpp | 1216 ++++++++++++------------- src/Common/RadixSort.h | 4 +- 2 files changed, 610 insertions(+), 610 deletions(-) diff --git a/base/common/tests/gtest_json_test.cpp b/base/common/tests/gtest_json_test.cpp index 5bdeb1bca9b..189a1a03d99 100644 --- a/base/common/tests/gtest_json_test.cpp +++ b/base/common/tests/gtest_json_test.cpp @@ -17,620 +17,620 @@ enum class ResultType struct GetStringTestRecord { - std::string input; + const char * input; ResultType result_type; - std::string result; + const char * result; }; TEST(JSONSuite, SimpleTest) { std::vector test_data = { - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Вафельница Vitek WX-1102 FL")"s, ResultType::Return, "Вафельница Vitek WX-1102 FL"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("184509")"s, ResultType::Return, "184509"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("Все для детей/Детская техника/Vitek")"s, ResultType::Return, "Все для детей/Детская техника/Vitek"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("В наличии")"s, ResultType::Return, "В наличии"s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("2390.00")"s, ResultType::Return, "2390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("Карточка")"s, ResultType::Return, "Карточка"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("detail")"s, ResultType::Return, "detail"s }, - { R"("actionField")"s, ResultType::Return, "actionField"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("http://www.techport.ru/q/?t=вафельница&sort=price&sdim=asc")"s, ResultType::Return, "http://www.techport.ru/q/?t=вафельница&sort=price&sdim=asc"s }, - { R"("action")"s, ResultType::Return, "action"s }, - { R"("detail")"s, ResultType::Return, "detail"s }, - { R"("products")"s, ResultType::Return, "products"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Вафельница Vitek WX-1102 FL")"s, ResultType::Return, "Вафельница Vitek WX-1102 FL"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("184509")"s, ResultType::Return, "184509"s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("2390.00")"s, ResultType::Return, "2390.00"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("Vitek")"s, ResultType::Return, "Vitek"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("Все для детей/Детская техника/Vitek")"s, ResultType::Return, "Все для детей/Детская техника/Vitek"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("В наличии")"s, ResultType::Return, "В наличии"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("isAuthorized")"s, ResultType::Return, "isAuthorized"s }, - { R"("isSubscriber")"s, ResultType::Return, "isSubscriber"s }, - { R"("postType")"s, ResultType::Return, "postType"s }, - { R"("Новости")"s, ResultType::Return, "Новости"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("Электроплита GEFEST Брест ЭПНД 5140-01 0001")"s, ResultType::Return, "Электроплита GEFEST Брест ЭПНД 5140-01 0001"s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("currencyCode")"s, ResultType::Return, "currencyCode"s }, - { R"("RUB")"s, ResultType::Return, "RUB"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("trash_login")"s, ResultType::Return, "trash_login"s }, - { R"("novikoff")"s, ResultType::Return, "novikoff"s }, - { R"("trash_cat_link")"s, ResultType::Return, "trash_cat_link"s }, - { R"("progs")"s, ResultType::Return, "progs"s }, - { R"("trash_parent_link")"s, ResultType::Return, "trash_parent_link"s }, - { R"("content")"s, ResultType::Return, "content"s }, - { R"("trash_posted_parent")"s, ResultType::Return, "trash_posted_parent"s }, - { R"("content.01.2016")"s, ResultType::Return, "content.01.2016"s }, - { R"("trash_posted_cat")"s, ResultType::Return, "trash_posted_cat"s }, - { R"("progs.01.2016")"s, ResultType::Return, "progs.01.2016"s }, - { R"("trash_virus_count")"s, ResultType::Return, "trash_virus_count"s }, - { R"("trash_is_android")"s, ResultType::Return, "trash_is_android"s }, - { R"("trash_is_wp8")"s, ResultType::Return, "trash_is_wp8"s }, - { R"("trash_is_ios")"s, ResultType::Return, "trash_is_ios"s }, - { R"("trash_posted")"s, ResultType::Return, "trash_posted"s }, - { R"("01.2016")"s, ResultType::Return, "01.2016"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("merchantId")"s, ResultType::Return, "merchantId"s }, - { R"("13694_49246")"s, ResultType::Return, "13694_49246"s }, - { R"("cps-source")"s, ResultType::Return, "cps-source"s }, - { R"("wargaming")"s, ResultType::Return, "wargaming"s }, - { R"("cps_provider")"s, ResultType::Return, "cps_provider"s }, - { R"("default")"s, ResultType::Return, "default"s }, - { R"("errorReason")"s, ResultType::Return, "errorReason"s }, - { R"("no errors")"s, ResultType::Return, "no errors"s }, - { R"("scid")"s, ResultType::Return, "scid"s }, - { R"("isAuthPayment")"s, ResultType::Return, "isAuthPayment"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("rubric")"s, ResultType::Return, "rubric"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("rubric")"s, ResultType::Return, "rubric"s }, - { R"("Мир")"s, ResultType::Return, "Мир"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("__ym")"s, ResultType::Return, "__ym"s }, - { R"("ecommerce")"s, ResultType::Return, "ecommerce"s }, - { R"("impressions")"s, ResultType::Return, "impressions"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("863813")"s, ResultType::Return, "863813"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Happy, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Happy, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("863839")"s, ResultType::Return, "863839"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Pretty kitten, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Pretty kitten, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("863847")"s, ResultType::Return, "863847"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Little tiger, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Little tiger, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911480")"s, ResultType::Return, "911480"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Puppy, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Puppy, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911484")"s, ResultType::Return, "911484"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Little bears, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Little bears, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911489")"s, ResultType::Return, "911489"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Dolphin, возраст 2-4 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Dolphin, возраст 2-4 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911496")"s, ResultType::Return, "911496"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Pretty, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Pretty, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911504")"s, ResultType::Return, "911504"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Fairytale, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Fairytale, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911508")"s, ResultType::Return, "911508"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Kittens, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Kittens, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911512")"s, ResultType::Return, "911512"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Sunshine, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Sunshine, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911516")"s, ResultType::Return, "911516"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Dog in bag, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Dog in bag, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911520")"s, ResultType::Return, "911520"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Cute puppy, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Cute puppy, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911524")"s, ResultType::Return, "911524"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Rabbit, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Rabbit, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("911528")"s, ResultType::Return, "911528"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Футболка детская 3D Turtle, возраст 1-2 года, трикотаж")"s, ResultType::Return, "Футболка детская 3D Turtle, возраст 1-2 года, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("390.00")"s, ResultType::Return, "390.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("888616")"s, ResultType::Return, "888616"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { "\"3Д Футболка мужская \\\"Collorista\\\" Светлое завтра р-р XL(52-54), 100% хлопок, трикотаж\""s, ResultType::Return, "3Д Футболка мужская \"Collorista\" Светлое завтра р-р XL(52-54), 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Одежда и обувь/Мужская одежда/Футболки/")"s, ResultType::Return, "/Одежда и обувь/Мужская одежда/Футболки/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("406.60")"s, ResultType::Return, "406.60"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("913361")"s, ResultType::Return, "913361"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("3Д Футболка детская World р-р 8-10, 100% хлопок, трикотаж")"s, ResultType::Return, "3Д Футболка детская World р-р 8-10, 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("470.00")"s, ResultType::Return, "470.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("913364")"s, ResultType::Return, "913364"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("3Д Футболка детская Force р-р 8-10, 100% хлопок, трикотаж")"s, ResultType::Return, "3Д Футболка детская Force р-р 8-10, 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("470.00")"s, ResultType::Return, "470.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("913367")"s, ResultType::Return, "913367"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("3Д Футболка детская Winter tale р-р 8-10, 100% хлопок, трикотаж")"s, ResultType::Return, "3Д Футболка детская Winter tale р-р 8-10, 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("470.00")"s, ResultType::Return, "470.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("913385")"s, ResultType::Return, "913385"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("3Д Футболка детская Moonshine р-р 8-10, 100% хлопок, трикотаж")"s, ResultType::Return, "3Д Футболка детская Moonshine р-р 8-10, 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("470.00")"s, ResultType::Return, "470.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("913391")"s, ResultType::Return, "913391"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("3Д Футболка детская Shaman р-р 8-10, 100% хлопок, трикотаж")"s, ResultType::Return, "3Д Футболка детская Shaman р-р 8-10, 100% хлопок, трикотаж"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("/Летние товары/Летний текстиль/")"s, ResultType::Return, "/Летние товары/Летний текстиль/"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("")"s, ResultType::Return, ""s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("470.00")"s, ResultType::Return, "470.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("/retailrocket/")"s, ResultType::Return, "/retailrocket/"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")"s, ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/"s }, - { R"("usertype")"s, ResultType::Return, "usertype"s }, - { R"("visitor")"s, ResultType::Return, "visitor"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("__ym")"s, ResultType::Return, "__ym"s }, - { R"("ecommerce")"s, ResultType::Return, "ecommerce"s }, - { R"("impressions")"s, ResultType::Return, "impressions"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("experiments")"s, ResultType::Return, "experiments"s }, - { R"("lang")"s, ResultType::Return, "lang"s }, - { R"("ru")"s, ResultType::Return, "ru"s }, - { R"("los_portal")"s, ResultType::Return, "los_portal"s }, - { R"("los_level")"s, ResultType::Return, "los_level"s }, - { R"("none")"s, ResultType::Return, "none"s }, - { R"("__ym")"s, ResultType::Return, "__ym"s }, - { R"("ecommerce")"s, ResultType::Return, "ecommerce"s }, - { R"("currencyCode")"s, ResultType::Return, "currencyCode"s }, - { R"("RUR")"s, ResultType::Return, "RUR"s }, - { R"("impressions")"s, ResultType::Return, "impressions"s }, - { R"("name")"s, ResultType::Return, "name"s }, - { R"("Чайник электрический Mystery MEK-1627, белый")"s, ResultType::Return, "Чайник электрический Mystery MEK-1627, белый"s }, - { R"("brand")"s, ResultType::Return, "brand"s }, - { R"("Mystery")"s, ResultType::Return, "Mystery"s }, - { R"("id")"s, ResultType::Return, "id"s }, - { R"("187180")"s, ResultType::Return, "187180"s }, - { R"("category")"s, ResultType::Return, "category"s }, - { R"("Мелкая бытовая техника/Мелкие кухонные приборы/Чайники электрические/Mystery")"s, ResultType::Return, "Мелкая бытовая техника/Мелкие кухонные приборы/Чайники электрические/Mystery"s }, - { R"("variant")"s, ResultType::Return, "variant"s }, - { R"("В наличии")"s, ResultType::Return, "В наличии"s }, - { R"("price")"s, ResultType::Return, "price"s }, - { R"("1630.00")"s, ResultType::Return, "1630.00"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { R"("Карточка")"s, ResultType::Return, "Карточка"s }, - { R"("position")"s, ResultType::Return, "position"s }, - { R"("detail")"s, ResultType::Return, "detail"s }, - { R"("actionField")"s, ResultType::Return, "actionField"s }, - { R"("list")"s, ResultType::Return, "list"s }, - { "\0\""s, ResultType::Throw, "JSON: expected \", got \0"s }, - { "\"/igrushki/konstruktory\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/1290414/komplekt-zhenskiy-dzhemper-plusbryuki-m-254-09-malina-plustemno-siniy-\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Творчество/Рисование/Инструменты и кра\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобильных аккумуляторов/Пуско-зарядные устр\xD0\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройств\xD0\0t"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобиль\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\0t"s, ResultType::Throw, "JSON: expected \", got \0"s }, - { "\"/Хозтовары/Хранение вещей и организа\xD1\0t"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Хозтовары/Товары для стир\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"li\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/734859/samolet-radioupravlyaemyy-istrebitel-rabotaet-o\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/kosmetika-i-parfyum/parfyumeriya/mu\0t"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/ko\0\x04"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { ""s, ResultType::Throw, "JSON: begin >= end."s }, - { "\"/stroitelstvo-i-remont/stroit\0t"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/av\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/s\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Строительство и ремонт/Строительный инструмент/Изм\0e"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/avto/soputstvuy\0l"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/str\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Отвертка 2 в 1 \\\"TUNDRA basic\\\" 5х75 мм (+,-) \0\xFF"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/avtoinstrumen\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Мелкая бытовая техника/Мелки\xD0\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Пряжа \\\"Бамбук стрейч\\0\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Карандаш чёрнографитны\xD0\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0l"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/1071547/karandash-chernografitnyy-volshebstvo-nv-kruglyy-d-7-2mm-dl-176mm-plast-tuba/\0e"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"ca\0e"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"ca\0e"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/1165424/chipbord-vyrubnoy-dlya-skrapbukinga-malyshi-mikki-maus-disney-bebi\0t"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/posuda/kuhonnye-prinadlezhnosti-i-i\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Канцтовары/Ежедневники и блокн\xD0\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/kanctovary/ezhednevniki-i-blok\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Стакан \xD0\0a"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Набор бумаги для скрапбукинга \\\"Мои первый годик\\\": Микки Маус, Дисней бэби, 12 листов 29.5 х 29.5 см, 160\0\x80"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"c\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Органайзер для хранения аксессуаров, \0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"quantity\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Сменный блок для тетрадей на кольцах А5, 160 листов клетка, офсет \xE2\x84\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Сувениры/Ф\xD0\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"\0\""s, ResultType::Return, "\0"s }, - { "\"\0\x04"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"va\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"ca\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"В \0\x04"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/letnie-tovary/z\0\x04"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Посудомоечная машина Ha\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Крупная бытов\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Полочная акустическая система Magnat Needl\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"brand\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"pos\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"c\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"var\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Телевизоры и видеотехника/Всё для домашних кинотеатр\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Флеш-диск Transcend JetFlash 620 8GB (TS8GJF62\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Табурет Мег\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"variant\0\x04"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Катал\xD0\0\""s, ResultType::Return, "Катал\xD0\0"s }, - { "\"К\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Полочная акустическая система Magnat Needl\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"brand\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"pos\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"c\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"17\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/igrushki/razvivayusc\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Ключница \\\"\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Игр\xD1\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Игрушки/Игрушки для девочек/Игровые модули дл\xD1\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Крупная бытовая техника/Стиральные машины/С фронт\xD0\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\0 "s, ResultType::Throw, "JSON: expected \", got \0"s }, - { "\"Светодиодная лента SMD3528, 5 м. IP33, 60LED, зеленый, 4,8W/мет\xD1\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Сантехника/Мебель для ванных комнат/Стол\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\0o"s, ResultType::Throw, "JSON: expected \", got \0"s }, - { "\"/igrushki/konstruktory\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/posuda/kuhonnye-prinadlezhnosti-i-instrumenty/kuhonnye-pr\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/1290414/komplekt-zhenskiy-dzhemper-plusbryuki-m-254-09-malina-plustemno-siniy-\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Творчество/Рисование/Инструменты и кра\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобильных аккумуляторов/Пуско-зарядные устр\xD0\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройств\xD0\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобиль\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\0 "s, ResultType::Throw, "JSON: expected \", got \0"s }, - { "\"/Хозтовары/Хранение вещей и организа\xD1\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Хозтовары/Товары для стир\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"li\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/igrushki/igrus\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/734859/samolet-radioupravlyaemyy-istrebitel-rabotaet-o\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/kosmetika-i-parfyum/parfyumeriya/mu\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/ko\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/avto/avtomobilnyy\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/stroitelstvo-i-remont/stroit\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/av\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/s\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Строительство и ремонт/Строительный инструмент/Изм\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/avto/soputstvuy\0\""s, ResultType::Return, "/avto/soputstvuy\0"s }, - { "\"/str\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Отвертка 2 в 1 \\\"TUNDRA basic\\\" 5х75 мм (+,-) \0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/avtoinstrumen\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Чайник электрический Vitesse\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Мелкая бытовая техника/Мелки\xD0\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Пряжа \\\"Бамбук стрейч\\0о"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Карандаш чёрнографитны\xD0\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0\""s, ResultType::Return, "/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0"s }, - { "\"/1071547/karandash-chernografitnyy-volshebstvo-nv-kruglyy-d-7-2mm-dl-176mm-plast-tuba/\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"ca\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Подаро\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Средство для прочис\xD1\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"i\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/p\0\""s, ResultType::Return, "/p\0"s }, - { "\"/Сувениры/Магниты, н\xD0\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Дерев\xD0\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/prazdniki/svadba/svadebnaya-c\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Канцт\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Праздники/То\xD0\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"v\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Косметика \xD0\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Спорт и отдых/Настольные игры/Покер, руле\xD1\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"categ\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/retailr\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/retailrocket\0k"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Ежедневник недат А5 140л кл,ляссе,обл пв\0="s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/432809/ezhednevnik-organayzer-sredniy-s-remeshkom-na-knopke-v-oblozhke-kalkulyator-kalendar-do-\0\xD0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/1165424/chipbord-vyrubnoy-dlya-skrapbukinga-malyshi-mikki-maus-disney-bebi\0d"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/posuda/kuhonnye-prinadlezhnosti-i-i\0 "s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/Канцтовары/Ежедневники и блокн\xD0\0o"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"/kanctovary/ezhednevniki-i-blok\00"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Стакан \xD0\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"Набор бумаги для скрапбукинга \\\"Мои первый годик\\\": Микки Маус, Дисней бэби, 12 листов 29.5 х 29.5 см, 160\0\0"s, ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)."s }, - { "\"c\0\""s, ResultType::Return, "c\0"s }, + { R"("name")", ResultType::Return, "name" }, + { R"("Вафельница Vitek WX-1102 FL")", ResultType::Return, "Вафельница Vitek WX-1102 FL" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("184509")", ResultType::Return, "184509" }, + { R"("category")", ResultType::Return, "category" }, + { R"("Все для детей/Детская техника/Vitek")", ResultType::Return, "Все для детей/Детская техника/Vitek" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("В наличии")", ResultType::Return, "В наличии" }, + { R"("price")", ResultType::Return, "price" }, + { R"("2390.00")", ResultType::Return, "2390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("Карточка")", ResultType::Return, "Карточка" }, + { R"("position")", ResultType::Return, "position" }, + { R"("detail")", ResultType::Return, "detail" }, + { R"("actionField")", ResultType::Return, "actionField" }, + { R"("list")", ResultType::Return, "list" }, + { R"("http://www.techport.ru/q/?t=вафельница&sort=price&sdim=asc")", ResultType::Return, "http://www.techport.ru/q/?t=вафельница&sort=price&sdim=asc" }, + { R"("action")", ResultType::Return, "action" }, + { R"("detail")", ResultType::Return, "detail" }, + { R"("products")", ResultType::Return, "products" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Вафельница Vitek WX-1102 FL")", ResultType::Return, "Вафельница Vitek WX-1102 FL" }, + { R"("id")", ResultType::Return, "id" }, + { R"("184509")", ResultType::Return, "184509" }, + { R"("price")", ResultType::Return, "price" }, + { R"("2390.00")", ResultType::Return, "2390.00" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("Vitek")", ResultType::Return, "Vitek" }, + { R"("category")", ResultType::Return, "category" }, + { R"("Все для детей/Детская техника/Vitek")", ResultType::Return, "Все для детей/Детская техника/Vitek" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("В наличии")", ResultType::Return, "В наличии" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("isAuthorized")", ResultType::Return, "isAuthorized" }, + { R"("isSubscriber")", ResultType::Return, "isSubscriber" }, + { R"("postType")", ResultType::Return, "postType" }, + { R"("Новости")", ResultType::Return, "Новости" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("Электроплита GEFEST Брест ЭПНД 5140-01 0001")", ResultType::Return, "Электроплита GEFEST Брест ЭПНД 5140-01 0001" }, + { R"("price")", ResultType::Return, "price" }, + { R"("currencyCode")", ResultType::Return, "currencyCode" }, + { R"("RUB")", ResultType::Return, "RUB" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("trash_login")", ResultType::Return, "trash_login" }, + { R"("novikoff")", ResultType::Return, "novikoff" }, + { R"("trash_cat_link")", ResultType::Return, "trash_cat_link" }, + { R"("progs")", ResultType::Return, "progs" }, + { R"("trash_parent_link")", ResultType::Return, "trash_parent_link" }, + { R"("content")", ResultType::Return, "content" }, + { R"("trash_posted_parent")", ResultType::Return, "trash_posted_parent" }, + { R"("content.01.2016")", ResultType::Return, "content.01.2016" }, + { R"("trash_posted_cat")", ResultType::Return, "trash_posted_cat" }, + { R"("progs.01.2016")", ResultType::Return, "progs.01.2016" }, + { R"("trash_virus_count")", ResultType::Return, "trash_virus_count" }, + { R"("trash_is_android")", ResultType::Return, "trash_is_android" }, + { R"("trash_is_wp8")", ResultType::Return, "trash_is_wp8" }, + { R"("trash_is_ios")", ResultType::Return, "trash_is_ios" }, + { R"("trash_posted")", ResultType::Return, "trash_posted" }, + { R"("01.2016")", ResultType::Return, "01.2016" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("merchantId")", ResultType::Return, "merchantId" }, + { R"("13694_49246")", ResultType::Return, "13694_49246" }, + { R"("cps-source")", ResultType::Return, "cps-source" }, + { R"("wargaming")", ResultType::Return, "wargaming" }, + { R"("cps_provider")", ResultType::Return, "cps_provider" }, + { R"("default")", ResultType::Return, "default" }, + { R"("errorReason")", ResultType::Return, "errorReason" }, + { R"("no errors")", ResultType::Return, "no errors" }, + { R"("scid")", ResultType::Return, "scid" }, + { R"("isAuthPayment")", ResultType::Return, "isAuthPayment" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("rubric")", ResultType::Return, "rubric" }, + { R"("")", ResultType::Return, "" }, + { R"("rubric")", ResultType::Return, "rubric" }, + { R"("Мир")", ResultType::Return, "Мир" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("__ym")", ResultType::Return, "__ym" }, + { R"("ecommerce")", ResultType::Return, "ecommerce" }, + { R"("impressions")", ResultType::Return, "impressions" }, + { R"("id")", ResultType::Return, "id" }, + { R"("863813")", ResultType::Return, "863813" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Happy, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Happy, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("863839")", ResultType::Return, "863839" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Pretty kitten, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Pretty kitten, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("863847")", ResultType::Return, "863847" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Little tiger, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Little tiger, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911480")", ResultType::Return, "911480" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Puppy, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Puppy, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911484")", ResultType::Return, "911484" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Little bears, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Little bears, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911489")", ResultType::Return, "911489" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Dolphin, возраст 2-4 года, трикотаж")", ResultType::Return, "Футболка детская 3D Dolphin, возраст 2-4 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911496")", ResultType::Return, "911496" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Pretty, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Pretty, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911504")", ResultType::Return, "911504" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Fairytale, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Fairytale, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911508")", ResultType::Return, "911508" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Kittens, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Kittens, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911512")", ResultType::Return, "911512" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Sunshine, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Sunshine, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911516")", ResultType::Return, "911516" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Dog in bag, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Dog in bag, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911520")", ResultType::Return, "911520" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Cute puppy, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Cute puppy, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911524")", ResultType::Return, "911524" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Rabbit, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Rabbit, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("911528")", ResultType::Return, "911528" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Футболка детская 3D Turtle, возраст 1-2 года, трикотаж")", ResultType::Return, "Футболка детская 3D Turtle, возраст 1-2 года, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("390.00")", ResultType::Return, "390.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("888616")", ResultType::Return, "888616" }, + { R"("name")", ResultType::Return, "name" }, + { "\"3Д Футболка мужская \\\"Collorista\\\" Светлое завтра р-р XL(52-54), 100% хлопок, трикотаж\"", ResultType::Return, "3Д Футболка мужская \"Collorista\" Светлое завтра р-р XL(52-54), 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Одежда и обувь/Мужская одежда/Футболки/")", ResultType::Return, "/Одежда и обувь/Мужская одежда/Футболки/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("406.60")", ResultType::Return, "406.60" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("913361")", ResultType::Return, "913361" }, + { R"("name")", ResultType::Return, "name" }, + { R"("3Д Футболка детская World р-р 8-10, 100% хлопок, трикотаж")", ResultType::Return, "3Д Футболка детская World р-р 8-10, 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("470.00")", ResultType::Return, "470.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("913364")", ResultType::Return, "913364" }, + { R"("name")", ResultType::Return, "name" }, + { R"("3Д Футболка детская Force р-р 8-10, 100% хлопок, трикотаж")", ResultType::Return, "3Д Футболка детская Force р-р 8-10, 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("470.00")", ResultType::Return, "470.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("913367")", ResultType::Return, "913367" }, + { R"("name")", ResultType::Return, "name" }, + { R"("3Д Футболка детская Winter tale р-р 8-10, 100% хлопок, трикотаж")", ResultType::Return, "3Д Футболка детская Winter tale р-р 8-10, 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("470.00")", ResultType::Return, "470.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("913385")", ResultType::Return, "913385" }, + { R"("name")", ResultType::Return, "name" }, + { R"("3Д Футболка детская Moonshine р-р 8-10, 100% хлопок, трикотаж")", ResultType::Return, "3Д Футболка детская Moonshine р-р 8-10, 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("470.00")", ResultType::Return, "470.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("id")", ResultType::Return, "id" }, + { R"("913391")", ResultType::Return, "913391" }, + { R"("name")", ResultType::Return, "name" }, + { R"("3Д Футболка детская Shaman р-р 8-10, 100% хлопок, трикотаж")", ResultType::Return, "3Д Футболка детская Shaman р-р 8-10, 100% хлопок, трикотаж" }, + { R"("category")", ResultType::Return, "category" }, + { R"("/Летние товары/Летний текстиль/")", ResultType::Return, "/Летние товары/Летний текстиль/" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("")", ResultType::Return, "" }, + { R"("price")", ResultType::Return, "price" }, + { R"("470.00")", ResultType::Return, "470.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("/retailrocket/")", ResultType::Return, "/retailrocket/" }, + { R"("position")", ResultType::Return, "position" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/")", ResultType::Return, "/911488/futbolka-detskaya-3d-dolphin-vozrast-1-2-goda-trikotazh/" }, + { R"("usertype")", ResultType::Return, "usertype" }, + { R"("visitor")", ResultType::Return, "visitor" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("__ym")", ResultType::Return, "__ym" }, + { R"("ecommerce")", ResultType::Return, "ecommerce" }, + { R"("impressions")", ResultType::Return, "impressions" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("experiments")", ResultType::Return, "experiments" }, + { R"("lang")", ResultType::Return, "lang" }, + { R"("ru")", ResultType::Return, "ru" }, + { R"("los_portal")", ResultType::Return, "los_portal" }, + { R"("los_level")", ResultType::Return, "los_level" }, + { R"("none")", ResultType::Return, "none" }, + { R"("__ym")", ResultType::Return, "__ym" }, + { R"("ecommerce")", ResultType::Return, "ecommerce" }, + { R"("currencyCode")", ResultType::Return, "currencyCode" }, + { R"("RUR")", ResultType::Return, "RUR" }, + { R"("impressions")", ResultType::Return, "impressions" }, + { R"("name")", ResultType::Return, "name" }, + { R"("Чайник электрический Mystery MEK-1627, белый")", ResultType::Return, "Чайник электрический Mystery MEK-1627, белый" }, + { R"("brand")", ResultType::Return, "brand" }, + { R"("Mystery")", ResultType::Return, "Mystery" }, + { R"("id")", ResultType::Return, "id" }, + { R"("187180")", ResultType::Return, "187180" }, + { R"("category")", ResultType::Return, "category" }, + { R"("Мелкая бытовая техника/Мелкие кухонные приборы/Чайники электрические/Mystery")", ResultType::Return, "Мелкая бытовая техника/Мелкие кухонные приборы/Чайники электрические/Mystery" }, + { R"("variant")", ResultType::Return, "variant" }, + { R"("В наличии")", ResultType::Return, "В наличии" }, + { R"("price")", ResultType::Return, "price" }, + { R"("1630.00")", ResultType::Return, "1630.00" }, + { R"("list")", ResultType::Return, "list" }, + { R"("Карточка")", ResultType::Return, "Карточка" }, + { R"("position")", ResultType::Return, "position" }, + { R"("detail")", ResultType::Return, "detail" }, + { R"("actionField")", ResultType::Return, "actionField" }, + { R"("list")", ResultType::Return, "list" }, + { "\0\"", ResultType::Throw, "JSON: expected \", got \0" }, + { "\"/igrushki/konstruktory\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/1290414/komplekt-zhenskiy-dzhemper-plusbryuki-m-254-09-malina-plustemno-siniy-\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Творчество/Рисование/Инструменты и кра\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобильных аккумуляторов/Пуско-зарядные устр\xD0\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройств\xD0\0t", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобиль\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\0t", ResultType::Throw, "JSON: expected \", got \0" }, + { "\"/Хозтовары/Хранение вещей и организа\xD1\0t", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Хозтовары/Товары для стир\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"li\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/734859/samolet-radioupravlyaemyy-istrebitel-rabotaet-o\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/kosmetika-i-parfyum/parfyumeriya/mu\0t", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/ko\0\x04", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "", ResultType::Throw, "JSON: begin >= end." }, + { "\"/stroitelstvo-i-remont/stroit\0t", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/av\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/s\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Строительство и ремонт/Строительный инструмент/Изм\0e", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/avto/soputstvuy\0l", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/str\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Отвертка 2 в 1 \\\"TUNDRA basic\\\" 5х75 мм (+,-) \0\xFF", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/avtoinstrumen\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Мелкая бытовая техника/Мелки\xD0\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Пряжа \\\"Бамбук стрейч\\0\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Карандаш чёрнографитны\xD0\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0l", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/1071547/karandash-chernografitnyy-volshebstvo-nv-kruglyy-d-7-2mm-dl-176mm-plast-tuba/\0e", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"ca\0e", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"ca\0e", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/1165424/chipbord-vyrubnoy-dlya-skrapbukinga-malyshi-mikki-maus-disney-bebi\0t", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/posuda/kuhonnye-prinadlezhnosti-i-i\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Канцтовары/Ежедневники и блокн\xD0\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/kanctovary/ezhednevniki-i-blok\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Стакан \xD0\0a", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Набор бумаги для скрапбукинга \\\"Мои первый годик\\\": Микки Маус, Дисней бэби, 12 листов 29.5 х 29.5 см, 160\0\x80", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"c\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Органайзер для хранения аксессуаров, \0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"quantity\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Сменный блок для тетрадей на кольцах А5, 160 листов клетка, офсет \xE2\x84\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Сувениры/Ф\xD0\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"\0\"", ResultType::Return, "\0" }, + { "\"\0\x04", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"va\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"ca\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"В \0\x04", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/letnie-tovary/z\0\x04", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Посудомоечная машина Ha\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Крупная бытов\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Полочная акустическая система Magnat Needl\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"brand\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"pos\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"c\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"var\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Телевизоры и видеотехника/Всё для домашних кинотеатр\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Флеш-диск Transcend JetFlash 620 8GB (TS8GJF62\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Табурет Мег\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"variant\0\x04", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Катал\xD0\0\"", ResultType::Return, "Катал\xD0\0" }, + { "\"К\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Полочная акустическая система Magnat Needl\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"brand\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"pos\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"c\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"17\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/igrushki/razvivayusc\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Ключница \\\"\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Игр\xD1\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Игрушки/Игрушки для девочек/Игровые модули дл\xD1\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Крупная бытовая техника/Стиральные машины/С фронт\xD0\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\0 ", ResultType::Throw, "JSON: expected \", got \0" }, + { "\"Светодиодная лента SMD3528, 5 м. IP33, 60LED, зеленый, 4,8W/мет\xD1\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Сантехника/Мебель для ванных комнат/Стол\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\0o", ResultType::Throw, "JSON: expected \", got \0" }, + { "\"/igrushki/konstruktory\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/posuda/kuhonnye-prinadlezhnosti-i-instrumenty/kuhonnye-pr\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/1290414/komplekt-zhenskiy-dzhemper-plusbryuki-m-254-09-malina-plustemno-siniy-\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Творчество/Рисование/Инструменты и кра\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобильных аккумуляторов/Пуско-зарядные устр\xD0\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройств\xD0\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Строительство и ремонт/Силовая техника/Зарядные устройства для автомобиль\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\0 ", ResultType::Throw, "JSON: expected \", got \0" }, + { "\"/Хозтовары/Хранение вещей и организа\xD1\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Хозтовары/Товары для стир\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"li\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/igrushki/igrus\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/734859/samolet-radioupravlyaemyy-istrebitel-rabotaet-o\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/kosmetika-i-parfyum/parfyumeriya/mu\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/ko\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/avto/avtomobilnyy\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/stroitelstvo-i-remont/stroit\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/av\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/s\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Строительство и ремонт/Строительный инструмент/Изм\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/avto/soputstvuy\0\"", ResultType::Return, "/avto/soputstvuy\0" }, + { "\"/str\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Отвертка 2 в 1 \\\"TUNDRA basic\\\" 5х75 мм (+,-) \0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/stroitelstvo-i-remont/stroitelnyy-instrument/avtoinstrumen\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Чайник электрический Vitesse\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Мелкая бытовая техника/Мелки\xD0\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Пряжа \\\"Бамбук стрейч\\0о", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Карандаш чёрнографитны\xD0\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0\"", ResultType::Return, "/Творчество/Рукоделие, аппликации/Пряжа и шерсть для \xD0\0" }, + { "\"/1071547/karandash-chernografitnyy-volshebstvo-nv-kruglyy-d-7-2mm-dl-176mm-plast-tuba/\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"ca\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Подаро\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Средство для прочис\xD1\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"i\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/p\0\"", ResultType::Return, "/p\0" }, + { "\"/Сувениры/Магниты, н\xD0\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Дерев\xD0\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/prazdniki/svadba/svadebnaya-c\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Канцт\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Праздники/То\xD0\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"v\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Косметика \xD0\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Спорт и отдых/Настольные игры/Покер, руле\xD1\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"categ\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/retailr\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/retailrocket\0k", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Ежедневник недат А5 140л кл,ляссе,обл пв\0=", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/432809/ezhednevnik-organayzer-sredniy-s-remeshkom-na-knopke-v-oblozhke-kalkulyator-kalendar-do-\0\xD0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/1165424/chipbord-vyrubnoy-dlya-skrapbukinga-malyshi-mikki-maus-disney-bebi\0d", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/posuda/kuhonnye-prinadlezhnosti-i-i\0 ", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/Канцтовары/Ежедневники и блокн\xD0\0o", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"/kanctovary/ezhednevniki-i-blok\00", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Стакан \xD0\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"Набор бумаги для скрапбукинга \\\"Мои первый годик\\\": Микки Маус, Дисней бэби, 12 листов 29.5 х 29.5 см, 160\0\0", ResultType::Throw, "JSON: incorrect syntax (expected end of string, found end of JSON)." }, + { "\"c\0\"", ResultType::Return, "c\0" }, }; for (auto i : boost::irange(0, 1/*00000*/)) @@ -641,7 +641,7 @@ TEST(JSONSuite, SimpleTest) { try { - JSON j(r.input.c_str(), r.input.c_str() + r.input.size()); + JSON j(r.input, r.input + strlen(r.input)); ASSERT_EQ(j.getString(), r.result); ASSERT_TRUE(r.result_type == ResultType::Return); diff --git a/src/Common/RadixSort.h b/src/Common/RadixSort.h index 734115c5500..7df4813e7e8 100644 --- a/src/Common/RadixSort.h +++ b/src/Common/RadixSort.h @@ -358,7 +358,7 @@ private: /// The beginning of every i-1-th bucket. 0th element will be equal to 1st. /// Last element will point to array end. - Element * prev_buckets[HISTOGRAM_SIZE + 1]; + std::unique_ptr prev_buckets{new Element*[HISTOGRAM_SIZE + 1]}; /// The beginning of every i-th bucket (the same array shifted by one). Element ** buckets = &prev_buckets[1]; @@ -375,7 +375,7 @@ private: /// also it corresponds with the results from https://github.com/powturbo/TurboHist static constexpr size_t UNROLL_COUNT = 8; - CountType count[HISTOGRAM_SIZE * UNROLL_COUNT]{}; + std::unique_ptr count{new CountType[HISTOGRAM_SIZE * UNROLL_COUNT]{}}; size_t unrolled_size = size / UNROLL_COUNT * UNROLL_COUNT; for (Element * elem = arr; elem < arr + unrolled_size; elem += UNROLL_COUNT) From 1a83546baf282e216c73371dfbb4ce003fedc4e1 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Wed, 22 Jul 2020 08:59:38 +0300 Subject: [PATCH 08/19] Fix build --- programs/benchmark/Benchmark.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/benchmark/Benchmark.cpp b/programs/benchmark/Benchmark.cpp index 8da164d01d6..3ae3980c273 100644 --- a/programs/benchmark/Benchmark.cpp +++ b/programs/benchmark/Benchmark.cpp @@ -157,7 +157,7 @@ private: std::string query_id; bool continue_on_errors; bool print_stacktrace; - Settings settings; + const Settings & settings; SharedContextHolder shared_context; Context global_context; QueryProcessingStage::Enum query_processing_stage; From c491b2c153c2d3119cdebbc927d31c9bdbc803bd Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Thu, 30 Jul 2020 23:58:08 +0300 Subject: [PATCH 09/19] Lower stack frame size --- src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp index a0e0f35bc15..43421216cb5 100644 --- a/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp +++ b/src/Storages/MergeTree/MergeTreeDataMergerMutator.cpp @@ -1024,7 +1024,8 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor commands_for_part.emplace_back(command); } - if (source_part->isStoredOnDisk() && !isStorageTouchedByMutations(storage_from_source_part, metadata_snapshot, commands_for_part, context_for_reading)) + if (source_part->isStoredOnDisk() && !isStorageTouchedByMutations( + storage_from_source_part, metadata_snapshot, commands_for_part, context_for_reading)) { LOG_TRACE(log, "Part {} doesn't change up to mutation version {}", source_part->name, future_part.part_info.mutation); return data.cloneAndLoadDataPartOnSameDisk(source_part, "tmp_clone_", future_part.part_info, metadata_snapshot); @@ -1036,7 +1037,7 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor BlockInputStreamPtr in = nullptr; Block updated_header; - std::optional interpreter; + std::unique_ptr interpreter; const auto data_settings = data.getSettings(); MutationCommands for_interpreter; @@ -1051,7 +1052,8 @@ MergeTreeData::MutableDataPartPtr MergeTreeDataMergerMutator::mutatePartToTempor if (!for_interpreter.empty()) { - interpreter.emplace(storage_from_source_part, metadata_snapshot, for_interpreter, context_for_reading, true); + interpreter = std::make_unique( + storage_from_source_part, metadata_snapshot, for_interpreter, context_for_reading, true); in = interpreter->execute(); updated_header = interpreter->getUpdatedHeader(); in->setProgressCallback(MergeProgressCallback(merge_entry, watch_prev_elapsed, stage_progress)); From a0d6593f90e6273437f14da1d594430a49339429 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 31 Jul 2020 00:07:51 +0300 Subject: [PATCH 10/19] Update tests --- .../0_stateless/00930_arrayIntersect.sql | 28 +++++++++---------- .../00932_array_intersect_bug.reference | 2 +- .../0_stateless/00932_array_intersect_bug.sql | 18 ++++++------ .../01323_add_scalars_in_time.reference | 4 +-- .../0_stateless/01323_add_scalars_in_time.sql | 2 +- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/tests/queries/0_stateless/00930_arrayIntersect.sql b/tests/queries/0_stateless/00930_arrayIntersect.sql index 64505fe4180..837e13b2c08 100644 --- a/tests/queries/0_stateless/00930_arrayIntersect.sql +++ b/tests/queries/0_stateless/00930_arrayIntersect.sql @@ -7,24 +7,24 @@ insert into array_intersect values ('2019-01-01', [1,2]); insert into array_intersect values ('2019-01-01', [1]); insert into array_intersect values ('2019-01-01', []); -select arrayIntersect(arr, [1,2]) from array_intersect order by arr; -select arrayIntersect(arr, []) from array_intersect order by arr; -select arrayIntersect([], arr) from array_intersect order by arr; -select arrayIntersect([1,2], arr) from array_intersect order by arr; -select arrayIntersect([1,2], [1,2,3,4]) from array_intersect order by arr; -select arrayIntersect([], []) from array_intersect order by arr; +select arraySort(arrayIntersect(arr, [1,2])) from array_intersect order by arr; +select arraySort(arrayIntersect(arr, [])) from array_intersect order by arr; +select arraySort(arrayIntersect([], arr)) from array_intersect order by arr; +select arraySort(arrayIntersect([1,2], arr)) from array_intersect order by arr; +select arraySort(arrayIntersect([1,2], [1,2,3,4])) from array_intersect order by arr; +select arraySort(arrayIntersect([], [])) from array_intersect order by arr; optimize table array_intersect; -select arrayIntersect(arr, [1,2]) from array_intersect order by arr; -select arrayIntersect(arr, []) from array_intersect order by arr; -select arrayIntersect([], arr) from array_intersect order by arr; -select arrayIntersect([1,2], arr) from array_intersect order by arr; -select arrayIntersect([1,2], [1,2,3,4]) from array_intersect order by arr; -select arrayIntersect([], []) from array_intersect order by arr; +select arraySort(arrayIntersect(arr, [1,2])) from array_intersect order by arr; +select arraySort(arrayIntersect(arr, [])) from array_intersect order by arr; +select arraySort(arrayIntersect([], arr)) from array_intersect order by arr; +select arraySort(arrayIntersect([1,2], arr)) from array_intersect order by arr; +select arraySort(arrayIntersect([1,2], [1,2,3,4])) from array_intersect order by arr; +select arraySort(arrayIntersect([], [])) from array_intersect order by arr; drop table if exists array_intersect; select '-'; -select arrayIntersect([-100], [156]); -select arrayIntersect([1], [257]); \ No newline at end of file +select arraySort(arrayIntersect([-100], [156])); +select arraySort(arrayIntersect([1], [257])); diff --git a/tests/queries/0_stateless/00932_array_intersect_bug.reference b/tests/queries/0_stateless/00932_array_intersect_bug.reference index 7ac5ecf7ac2..8772408bfbb 100644 --- a/tests/queries/0_stateless/00932_array_intersect_bug.reference +++ b/tests/queries/0_stateless/00932_array_intersect_bug.reference @@ -5,5 +5,5 @@ [2] [] [] -[3,1,2] +[1,2,3] [] diff --git a/tests/queries/0_stateless/00932_array_intersect_bug.sql b/tests/queries/0_stateless/00932_array_intersect_bug.sql index 6d9d2382ae1..fc9c03c6dcb 100644 --- a/tests/queries/0_stateless/00932_array_intersect_bug.sql +++ b/tests/queries/0_stateless/00932_array_intersect_bug.sql @@ -1,9 +1,9 @@ -SELECT arrayIntersect(['a', 'b', 'c'], ['a', 'a']); -SELECT arrayIntersect([1, 1], [2, 2]); -SELECT arrayIntersect([1, 1], [1, 2]); -SELECT arrayIntersect([1, 1, 1], [3], [2, 2, 2]); -SELECT arrayIntersect([1, 2], [1, 2], [2]); -SELECT arrayIntersect([1, 1], [2, 1], [2, 2], [1]); -SELECT arrayIntersect([]); -SELECT arrayIntersect([1, 2, 3]); -SELECT arrayIntersect([1, 1], [2, 1], [2, 2], [2, 2, 2]); +SELECT arraySort(arrayIntersect(['a', 'b', 'c'], ['a', 'a'])); +SELECT arraySort(arrayIntersect([1, 1], [2, 2])); +SELECT arraySort(arrayIntersect([1, 1], [1, 2])); +SELECT arraySort(arrayIntersect([1, 1, 1], [3], [2, 2, 2])); +SELECT arraySort(arrayIntersect([1, 2], [1, 2], [2])); +SELECT arraySort(arrayIntersect([1, 1], [2, 1], [2, 2], [1])); +SELECT arraySort(arrayIntersect([])); +SELECT arraySort(arrayIntersect([1, 2, 3])); +SELECT arraySort(arrayIntersect([1, 1], [2, 1], [2, 2], [2, 2, 2])); diff --git a/tests/queries/0_stateless/01323_add_scalars_in_time.reference b/tests/queries/0_stateless/01323_add_scalars_in_time.reference index 85d56962cdb..49e20d0fea8 100644 --- a/tests/queries/0_stateless/01323_add_scalars_in_time.reference +++ b/tests/queries/0_stateless/01323_add_scalars_in_time.reference @@ -1,2 +1,2 @@ -[0,3,2] id2 -[3,1,2] id1 +[0,2,3] id2 +[1,2,3] id1 diff --git a/tests/queries/0_stateless/01323_add_scalars_in_time.sql b/tests/queries/0_stateless/01323_add_scalars_in_time.sql index 9a71b0075d4..b49c2ef416e 100644 --- a/tests/queries/0_stateless/01323_add_scalars_in_time.sql +++ b/tests/queries/0_stateless/01323_add_scalars_in_time.sql @@ -11,7 +11,7 @@ INSERT INTO tags(id, seqs) VALUES ('id1', [1,2,3]), ('id2', [0,2,3]), ('id1', [1 WITH (SELECT [0, 1, 2, 3]) AS arr1 -SELECT arrayIntersect(argMax(seqs, create_time), arr1) AS common, id +SELECT arraySort(arrayIntersect(argMax(seqs, create_time), arr1)) AS common, id FROM tags WHERE id LIKE 'id%' GROUP BY id; From 8d21660dcd574f5bfa56a3829dfc6ddc2f543845 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 31 Jul 2020 00:12:02 +0300 Subject: [PATCH 11/19] Avoid too large stack frames even in debug build --- src/Core/SettingsCollectionImpl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Core/SettingsCollectionImpl.h b/src/Core/SettingsCollectionImpl.h index f0854f11b8a..94fa90fbddb 100644 --- a/src/Core/SettingsCollectionImpl.h +++ b/src/Core/SettingsCollectionImpl.h @@ -347,7 +347,7 @@ void SettingsCollection::deserialize(ReadBuffer & buf, SettingsBinaryFo #define IMPLEMENT_SETTINGS_COLLECTION_ADD_MEMBER_INFO_HELPER_(TYPE, NAME, DEFAULT, DESCRIPTION, FLAGS) \ - add({StringRef(#NAME, strlen(#NAME)), \ + { add({StringRef(#NAME, strlen(#NAME)), \ StringRef(DESCRIPTION, strlen(DESCRIPTION)), \ StringRef(#TYPE, strlen(#TYPE)), \ FLAGS & IMPORTANT, \ @@ -355,5 +355,5 @@ void SettingsCollection::deserialize(ReadBuffer & buf, SettingsBinaryFo &Functions::NAME##_getString, &Functions::NAME##_getField, \ &Functions::NAME##_setString, &Functions::NAME##_setField, \ &Functions::NAME##_serialize, &Functions::NAME##_deserialize, \ - &Functions::NAME##_valueToString, &Functions::NAME##_valueToCorrespondingType}); + &Functions::NAME##_valueToString, &Functions::NAME##_valueToCorrespondingType}); } } From 44606b25c95997825b370e8280a952fbcbf4281f Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Fri, 31 Jul 2020 16:10:35 +0300 Subject: [PATCH 12/19] Update SettingsCollectionImpl.h --- src/Core/SettingsCollectionImpl.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Core/SettingsCollectionImpl.h b/src/Core/SettingsCollectionImpl.h index 94fa90fbddb..809af8b62b6 100644 --- a/src/Core/SettingsCollectionImpl.h +++ b/src/Core/SettingsCollectionImpl.h @@ -345,9 +345,9 @@ void SettingsCollection::deserialize(ReadBuffer & buf, SettingsBinaryFo static String NAME##_valueToString(const Field & value) { TYPE temp{DEFAULT}; temp.set(value); return temp.toString(); } \ static Field NAME##_valueToCorrespondingType(const Field & value) { TYPE temp{DEFAULT}; temp.set(value); return temp.toField(); } \ - +/// Wrapped in lambda to avoid large stack frame if having too many invocations. #define IMPLEMENT_SETTINGS_COLLECTION_ADD_MEMBER_INFO_HELPER_(TYPE, NAME, DEFAULT, DESCRIPTION, FLAGS) \ - { add({StringRef(#NAME, strlen(#NAME)), \ + [&]{ add({StringRef(#NAME, strlen(#NAME)), \ StringRef(DESCRIPTION, strlen(DESCRIPTION)), \ StringRef(#TYPE, strlen(#TYPE)), \ FLAGS & IMPORTANT, \ @@ -355,5 +355,5 @@ void SettingsCollection::deserialize(ReadBuffer & buf, SettingsBinaryFo &Functions::NAME##_getString, &Functions::NAME##_getField, \ &Functions::NAME##_setString, &Functions::NAME##_setField, \ &Functions::NAME##_serialize, &Functions::NAME##_deserialize, \ - &Functions::NAME##_valueToString, &Functions::NAME##_valueToCorrespondingType}); } + &Functions::NAME##_valueToString, &Functions::NAME##_valueToCorrespondingType}); }(); } From 47e9ec3d58b280e364d509ed3f959585fbf3b21b Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sat, 1 Aug 2020 00:23:16 +0300 Subject: [PATCH 13/19] Smaller stack frames --- programs/copier/ClusterCopier.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp index 7fa0f663295..5a9e135a4fa 100644 --- a/programs/copier/ClusterCopier.cpp +++ b/programs/copier/ClusterCopier.cpp @@ -1323,7 +1323,7 @@ TaskStatus ClusterCopier::processPartitionPieceTaskImpl( /// Try start processing, create node about it { String start_state = TaskStateWithOwner::getData(TaskState::Started, host_id); - CleanStateClock new_clean_state_clock (zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); + CleanStateClock new_clean_state_clock(zookeeper, piece_is_dirty_flag_path, piece_is_dirty_cleaned_path); if (clean_state_clock != new_clean_state_clock) { LOG_INFO(log, "Partition {} piece {} clean state changed, cowardly bailing", task_partition.name, toString(current_piece_number)); @@ -1360,7 +1360,8 @@ TaskStatus ClusterCopier::processPartitionPieceTaskImpl( LOG_DEBUG(log, "Create destination tables. Query: {}", query); UInt64 shards = executeQueryOnCluster(task_table.cluster_push, query, task_cluster->settings_push, PoolMode::GET_MANY); - LOG_DEBUG(log, "Destination tables {} have been created on {} shards of {}", getQuotedTable(task_table.table_push), shards, task_table.cluster_push->getShardCount()); + LOG_DEBUG(log, "Destination tables {} have been created on {} shards of {}", + getQuotedTable(task_table.table_push), shards, task_table.cluster_push->getShardCount()); } /// Do the copying @@ -1392,17 +1393,17 @@ TaskStatus ClusterCopier::processPartitionPieceTaskImpl( try { /// Custom INSERT SELECT implementation - Context context_select = context; - context_select.setSettings(task_cluster->settings_pull); - - Context context_insert = context; - context_insert.setSettings(task_cluster->settings_push); - BlockInputStreamPtr input; BlockOutputStreamPtr output; { - BlockIO io_select = InterpreterFactory::get(query_select_ast, context_select)->execute(); - BlockIO io_insert = InterpreterFactory::get(query_insert_ast, context_insert)->execute(); + std::unique_ptr context_select = std::make_unique(context); + context_select->setSettings(task_cluster->settings_pull); + + std::unique_ptr context_insert = std::make_unique(context); + context_insert->setSettings(task_cluster->settings_push); + + BlockIO io_select = InterpreterFactory::get(query_select_ast, *context_select)->execute(); + BlockIO io_insert = InterpreterFactory::get(query_insert_ast, *context_insert)->execute(); input = io_select.getInputStream(); output = io_insert.out; From e4f923097ed427897631c49eeb5bc9804f1de734 Mon Sep 17 00:00:00 2001 From: alexey-milovidov Date: Sun, 2 Aug 2020 01:43:43 +0300 Subject: [PATCH 14/19] Update ClusterCopier.cpp --- programs/copier/ClusterCopier.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/programs/copier/ClusterCopier.cpp b/programs/copier/ClusterCopier.cpp index 5a9e135a4fa..d5544703aa2 100644 --- a/programs/copier/ClusterCopier.cpp +++ b/programs/copier/ClusterCopier.cpp @@ -1392,16 +1392,16 @@ TaskStatus ClusterCopier::processPartitionPieceTaskImpl( try { + std::unique_ptr context_select = std::make_unique(context); + context_select->setSettings(task_cluster->settings_pull); + + std::unique_ptr context_insert = std::make_unique(context); + context_insert->setSettings(task_cluster->settings_push); + /// Custom INSERT SELECT implementation BlockInputStreamPtr input; BlockOutputStreamPtr output; { - std::unique_ptr context_select = std::make_unique(context); - context_select->setSettings(task_cluster->settings_pull); - - std::unique_ptr context_insert = std::make_unique(context); - context_insert->setSettings(task_cluster->settings_push); - BlockIO io_select = InterpreterFactory::get(query_select_ast, *context_select)->execute(); BlockIO io_insert = InterpreterFactory::get(query_insert_ast, *context_insert)->execute(); From cf388cc32f083bc8eaf70b10a342c1e155d75c17 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 2 Aug 2020 04:35:49 +0300 Subject: [PATCH 15/19] Slightly lower the limit --- cmake/warnings.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 1ac2fb020fd..c0620258b18 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -21,7 +21,7 @@ endif () option (WEVERYTHING "Enables -Weverything option with some exceptions. This is intended for exploration of new compiler warnings that may be found to be useful. Only makes sense for clang." ON) # Control maximum size of stack frames. It can be important if the code is run in fibers with small stack size. -add_warning(frame-larger-than=16384) +add_warning(frame-larger-than=32768) if (COMPILER_CLANG) add_warning(pedantic) From 08e0d1c0dafc428c2848fa438501afb5cf643e20 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Sun, 2 Aug 2020 19:24:29 +0300 Subject: [PATCH 16/19] Fix build --- src/Core/BaseSettings.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Core/BaseSettings.h b/src/Core/BaseSettings.h index 75a76340a4f..0deacbcd6e7 100644 --- a/src/Core/BaseSettings.h +++ b/src/Core/BaseSettings.h @@ -827,9 +827,10 @@ bool BaseSettings::SettingFieldRef::isCustom() const \ template class BaseSettings; +/// Wrapped in lambda to avoid too large stack frame. //-V:IMPLEMENT_SETTINGS:501 #define IMPLEMENT_SETTINGS_TRAITS_(TYPE, NAME, DEFAULT, DESCRIPTION, FLAGS) \ - res.field_infos.emplace_back( \ + [&]{ res.field_infos.emplace_back( \ FieldInfo{#NAME, #TYPE, DESCRIPTION, FLAGS & IMPORTANT, \ [](const Field & value) -> Field { return static_cast(SettingField##TYPE{value}); }, \ [](const Field & value) -> String { return SettingField##TYPE{value}.toString(); }, \ @@ -842,5 +843,5 @@ bool BaseSettings::SettingFieldRef::isCustom() const [](Data & data) { data.NAME = SettingField##TYPE{DEFAULT}; }, \ [](const Data & data, WriteBuffer & out) { data.NAME.writeBinary(out); }, \ [](Data & data, ReadBuffer & in) { data.NAME.readBinary(in); } \ - }); + }); }(); } From f5f0c788b8b013a584fe513eab362d21980c1aea Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 3 Aug 2020 00:10:57 +0300 Subject: [PATCH 17/19] Relax the limit --- cmake/warnings.cmake | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index c0620258b18..467c246926c 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -21,7 +21,10 @@ endif () option (WEVERYTHING "Enables -Weverything option with some exceptions. This is intended for exploration of new compiler warnings that may be found to be useful. Only makes sense for clang." ON) # Control maximum size of stack frames. It can be important if the code is run in fibers with small stack size. -add_warning(frame-larger-than=32768) +# Only in release build because debug has too large stack frames. +if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") + add_warning(frame-larger-than=16384) +endif () if (COMPILER_CLANG) add_warning(pedantic) From cf6ccbc6568bbb6b6cec4b3b1490655fca935d92 Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Mon, 3 Aug 2020 20:44:23 +0300 Subject: [PATCH 18/19] Adjustments --- cmake/warnings.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/warnings.cmake b/cmake/warnings.cmake index 467c246926c..2f78dc34079 100644 --- a/cmake/warnings.cmake +++ b/cmake/warnings.cmake @@ -22,7 +22,7 @@ option (WEVERYTHING "Enables -Weverything option with some exceptions. This is i # Control maximum size of stack frames. It can be important if the code is run in fibers with small stack size. # Only in release build because debug has too large stack frames. -if (NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") +if ((NOT CMAKE_BUILD_TYPE_UC STREQUAL "DEBUG") AND (NOT SANITIZE)) add_warning(frame-larger-than=16384) endif () From c204035b559398bac1ba02006e99f24a1276d97a Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Tue, 4 Aug 2020 15:29:24 +0300 Subject: [PATCH 19/19] Revert one modification --- src/Core/BaseSettings.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Core/BaseSettings.h b/src/Core/BaseSettings.h index 5c463b9fab1..7de87b345c1 100644 --- a/src/Core/BaseSettings.h +++ b/src/Core/BaseSettings.h @@ -834,10 +834,9 @@ bool BaseSettings::SettingFieldRef::isCustom() const \ template class BaseSettings; -/// Wrapped in lambda to avoid too large stack frame. //-V:IMPLEMENT_SETTINGS:501 #define IMPLEMENT_SETTINGS_TRAITS_(TYPE, NAME, DEFAULT, DESCRIPTION, FLAGS) \ - [&]{ res.field_infos.emplace_back( \ + res.field_infos.emplace_back( \ FieldInfo{#NAME, #TYPE, DESCRIPTION, FLAGS & IMPORTANT, \ [](const Field & value) -> Field { return static_cast(SettingField##TYPE{value}); }, \ [](const Field & value) -> String { return SettingField##TYPE{value}.toString(); }, \ @@ -850,5 +849,5 @@ bool BaseSettings::SettingFieldRef::isCustom() const [](Data & data) { data.NAME = SettingField##TYPE{DEFAULT}; }, \ [](const Data & data, WriteBuffer & out) { data.NAME.writeBinary(out); }, \ [](Data & data, ReadBuffer & in) { data.NAME.readBinary(in); } \ - }); }(); + }); }