Commit eeef80d0 authored by Sergei Petrunia's avatar Sergei Petrunia

EXPLAIN FORMAT=JSON : Fix MDEV-7266, bug in pretty-printer

- Single_line_formatting_helper should not accidentally exit the
  DISABLED state. No JSON construct should be able to move the
  Single_line_formatting_helper from DISABLED state.
parent dc259324
drop table if exists t0,t1; drop table if exists t0,t1,t2;
create table t0(a int); create table t0(a int);
insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
explain format=json select * from t0; explain format=json select * from t0;
......
drop table if exists t0,t1,t2;
#
# MDEV-7266: Assertion `!element_started' failed in Json_writer& Json_writer::add_member
#
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (column_name_1 INT, column_name_2 VARCHAR(52)) ENGINE=InnoDB;
INSERT INTO t2 VALUES (3,'United States');
CREATE TABLE t3 (b INT, c VARCHAR(3), PRIMARY KEY (c,b)) ENGINE=InnoDB;
INSERT INTO t3 VALUES (4,'USA'),(5,'CAN');
EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE 0 < ALL (
SELECT tbl_alias1.column_name_1 FROM t2 AS tbl_alias1, t3 AS tbl_alias2
WHERE tbl_alias2.b = tbl_alias1.column_name_1 AND tbl_alias2.c = tbl_alias1.column_name_2
);
EXPLAIN
{
"query_block": {
"select_id": 1,
"table": {
"table_name": "t1",
"access_type": "ALL",
"rows": 2,
"filtered": 100
},
"subqueries": [
{
"query_block": {
"select_id": 2,
"table": {
"table_name": "tbl_alias1",
"access_type": "ALL",
"rows": 1,
"filtered": 100,
"attached_condition": "((tbl_alias1.column_name_2 is not null) and (tbl_alias1.column_name_1 is not null))"
},
"table": {
"table_name": "tbl_alias2",
"access_type": "eq_ref",
"possible_keys": ["PRIMARY"],
"key": "PRIMARY",
"key_length": "9",
"used_key_parts": ["c", "b"],
"ref": [
"test.tbl_alias1.column_name_2",
"test.tbl_alias1.column_name_1"
],
"rows": 1,
"filtered": 100,
"attached_condition": "(tbl_alias2.c = tbl_alias1.column_name_2)",
"using_index": true
}
}
}
]
}
}
drop table t1,t2,t3;
#
# MariaDB's EXPLAIN FORMAT=JSON tests that require InnoDB.
#
--source include/have_innodb.inc
--disable_warnings
drop table if exists t0,t1,t2;
--enable_warnings
--echo #
--echo # MDEV-7266: Assertion `!element_started' failed in Json_writer& Json_writer::add_member
--echo #
CREATE TABLE t1 (a INT) ENGINE=InnoDB;
INSERT INTO t1 VALUES (1),(2);
CREATE TABLE t2 (column_name_1 INT, column_name_2 VARCHAR(52)) ENGINE=InnoDB;
INSERT INTO t2 VALUES (3,'United States');
CREATE TABLE t3 (b INT, c VARCHAR(3), PRIMARY KEY (c,b)) ENGINE=InnoDB;
INSERT INTO t3 VALUES (4,'USA'),(5,'CAN');
EXPLAIN FORMAT=JSON SELECT * FROM t1 WHERE 0 < ALL (
SELECT tbl_alias1.column_name_1 FROM t2 AS tbl_alias1, t3 AS tbl_alias2
WHERE tbl_alias2.b = tbl_alias1.column_name_1 AND tbl_alias2.c = tbl_alias1.column_name_2
);
drop table t1,t2,t3;
...@@ -218,6 +218,7 @@ bool Single_line_formatting_helper::on_start_array() ...@@ -218,6 +218,7 @@ bool Single_line_formatting_helper::on_start_array()
} }
else else
{ {
if (state != DISABLED)
state= INACTIVE; state= INACTIVE;
// TODO: what if we have accumulated some stuff already? shouldn't we // TODO: what if we have accumulated some stuff already? shouldn't we
// flush it? // flush it?
...@@ -313,6 +314,9 @@ void Single_line_formatting_helper::flush_on_one_line() ...@@ -313,6 +314,9 @@ void Single_line_formatting_helper::flush_on_one_line()
void Single_line_formatting_helper::disable_and_flush() void Single_line_formatting_helper::disable_and_flush()
{ {
if (state == DISABLED)
return;
bool start_array= (state == IN_ARRAY); bool start_array= (state == IN_ARRAY);
state= DISABLED; state= DISABLED;
// deactivate ourselves and flush all accumulated calls. // deactivate ourselves and flush all accumulated calls.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment