summaryrefslogtreecommitdiff
path: root/sql/my_json_writer.cc
diff options
context:
space:
mode:
authorSergei Krivonos <sergei.krivonos@mariadb.com>2021-11-12 03:36:10 +0200
committerSergei Krivonos <sergeikrivonos@gmail.com>2021-11-26 15:11:06 +0200
commit3a96a61eaec6679c6c5b3872383c7fd45e668647 (patch)
tree57079277468b02e0c33263933eefd26ad4287cb5 /sql/my_json_writer.cc
parent73df7a30094a0fac8f59de1c91a7bce6cd3ff643 (diff)
downloadmariadb-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.cc27
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;
}