mirror of
https://github.com/MariaDB/server.git
synced 2026-05-14 19:07:15 +02:00
EXPLAIN FORMAT=JSON: further development
Writing JSON: - Fix a bug in Single_line_formatting_helper - Add Json_writer_nesting_guard - safety class EXPLAIN JSON support - Add basic subquery support - Add tests for UNION/UNION ALL.
This commit is contained in:
parent
3d5f97fd70
commit
37c444e1a0
9 changed files with 298 additions and 14 deletions
|
|
@ -34,9 +34,30 @@ class Single_line_formatting_helper
|
|||
DISABLED
|
||||
};
|
||||
|
||||
/*
|
||||
This works like a finite automaton.
|
||||
|
||||
state=DISABLED means the helper is disabled - all on_XXX functions will
|
||||
return false (which means "not handled") and do nothing.
|
||||
|
||||
+->-+
|
||||
| v
|
||||
INACTIVE ---> ADD_MEMBER ---> IN_ARRAY--->-+
|
||||
^ |
|
||||
+------------------<--------------------+
|
||||
|
||||
For other states:
|
||||
INACTIVE - initial state, we have nothing.
|
||||
ADD_MEMBER - add_member() was called, the buffer has "member_name\0".
|
||||
IN_ARRAY - start_array() was called.
|
||||
|
||||
|
||||
*/
|
||||
enum enum_state state;
|
||||
enum { MAX_LINE_LEN= 80 };
|
||||
char buffer[80];
|
||||
|
||||
/* The data in the buffer is located between buffer[0] and buf_ptr */
|
||||
char *buf_ptr;
|
||||
uint line_len;
|
||||
|
||||
|
|
@ -99,8 +120,9 @@ private:
|
|||
// TODO: a stack of (name, bool is_object_or_array) elements.
|
||||
int indent_level;
|
||||
enum { INDENT_SIZE = 2 };
|
||||
|
||||
|
||||
friend class Single_line_formatting_helper;
|
||||
friend class Json_writer_nesting_guard;
|
||||
bool document_start;
|
||||
bool element_started;
|
||||
bool first_child;
|
||||
|
|
@ -116,3 +138,40 @@ public:
|
|||
String output;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
RAII-based helper class to detect incorrect use of Json_writer.
|
||||
|
||||
The idea is that a function typically must leave Json_writer at the same
|
||||
identation level as it was when it was invoked. Leaving it at a different
|
||||
level typically means we forgot to close an object or an array
|
||||
|
||||
So, here is a way to guard
|
||||
void foo(Json_writer *writer)
|
||||
{
|
||||
Json_writer_nesting_guard(writer);
|
||||
.. do something with writer
|
||||
|
||||
// at the end of the function, ~Json_writer_nesting_guard() is called
|
||||
// and it makes sure that the nesting is the same as when the function was
|
||||
// entered.
|
||||
}
|
||||
*/
|
||||
|
||||
class Json_writer_nesting_guard
|
||||
{
|
||||
Json_writer* writer;
|
||||
int indent_level;
|
||||
public:
|
||||
Json_writer_nesting_guard(Json_writer *writer_arg) :
|
||||
writer(writer_arg),
|
||||
indent_level(writer->indent_level)
|
||||
{}
|
||||
|
||||
~Json_writer_nesting_guard()
|
||||
{
|
||||
DBUG_ASSERT(indent_level == writer->indent_level);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue