diff options
author | Sergei Krivonos <sergei.krivonos@mariadb.com> | 2021-11-12 03:36:10 +0200 |
---|---|---|
committer | Sergei Krivonos <sergeikrivonos@gmail.com> | 2021-11-26 15:11:06 +0200 |
commit | 3a96a61eaec6679c6c5b3872383c7fd45e668647 (patch) | |
tree | 57079277468b02e0c33263933eefd26ad4287cb5 /sql/my_json_writer.cc | |
parent | 73df7a30094a0fac8f59de1c91a7bce6cd3ff643 (diff) | |
download | mariadb-git-3a96a61eaec6679c6c5b3872383c7fd45e668647.tar.gz |
MDEV-27036: add assert to detect duplicated JSON keys
Diffstat (limited to 'sql/my_json_writer.cc')
-rw-r--r-- | sql/my_json_writer.cc | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/sql/my_json_writer.cc b/sql/my_json_writer.cc index 9470ba57855..8284c9bbfca 100644 --- a/sql/my_json_writer.cc +++ b/sql/my_json_writer.cc @@ -19,6 +19,8 @@ #include "my_json_writer.h" #if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST) +#include <iostream> + bool Json_writer::named_item_expected() const { return named_items_expectation.size() @@ -39,7 +41,13 @@ inline void Json_writer::on_start_object() #if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST) if(!fmt_helper.is_making_writer_calls()) { - VALIDITY_ASSERT(got_name == named_item_expected()); + if (got_name != named_item_expected()) + { + sql_print_error(got_name + ? "Json_writer got a member name which is not expected.\n" + : "Json_writer: a member name was expected.\n"); + VALIDITY_ASSERT(got_name == named_item_expected()); + } named_items_expectation.push_back(true); } #endif @@ -60,6 +68,7 @@ void Json_writer::start_object() document_start= false; #if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST) got_name= false; + named_items.emplace(); #endif } @@ -71,6 +80,8 @@ void Json_writer::start_array() VALIDITY_ASSERT(got_name == named_item_expected()); named_items_expectation.push_back(false); got_name= false; + if (document_start) + named_items.emplace(); } #endif @@ -95,6 +106,8 @@ void Json_writer::end_object() named_items_expectation.pop_back(); VALIDITY_ASSERT(!got_name); got_name= false; + VALIDITY_ASSERT(named_items.size()); + named_items.pop(); #endif indent_level-=INDENT_SIZE; if (!first_child) @@ -140,7 +153,19 @@ Json_writer& Json_writer::add_member(const char *name, size_t len) } #if !defined(NDEBUG) || defined(JSON_WRITER_UNIT_TEST) if (!fmt_helper.is_making_writer_calls()) + { + VALIDITY_ASSERT(!got_name); got_name= true; + VALIDITY_ASSERT(named_items.size()); + auto& named_items_keys= named_items.top(); + auto emplaced= named_items_keys.emplace(name, len); + auto is_uniq_key= emplaced.second; + if(!is_uniq_key) + { + sql_print_error("Duplicated key: %s\n", emplaced.first->c_str()); + VALIDITY_ASSERT(is_uniq_key); + } + } #endif return *this; } |