summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWeijun-H <huangweijun1001@gmail.com>2023-01-04 18:44:03 +0000
committerWeijun-H <huangweijun1001@gmail.com>2023-01-05 13:12:24 +0000
commit111a752b968561b34a88f33052519cb989a8a90f (patch)
tree5ffb06b86bc0b3d0b6c08388036661857a8c83f2
parentfb0808c450849e00993fa38839f33969a9daf7e8 (diff)
downloadmariadb-git-111a752b968561b34a88f33052519cb989a8a90f.tar.gz
MDEV-19160 JSON_DETAILED output unnecessarily verbose
-rw-r--r--mysql-test/main/func_json.result126
-rw-r--r--mysql-test/main/func_json.test100
-rw-r--r--mysql-test/main/opt_trace.result218
-rw-r--r--mysql-test/main/opt_trace_index_merge.result102
-rw-r--r--mysql-test/main/opt_trace_ucs2.result9
-rw-r--r--mysql-test/main/range_notembedded.result1
-rw-r--r--mysql-test/suite/plugins/r/multiauth.result3
-rw-r--r--sql/item_jsonfunc.cc47
8 files changed, 327 insertions, 279 deletions
diff --git a/mysql-test/main/func_json.result b/mysql-test/main/func_json.result
index b6605df547f..6ea8c78b2b6 100644
--- a/mysql-test/main/func_json.result
+++ b/mysql-test/main/func_json.result
@@ -1133,3 +1133,129 @@ DROP TABLE t1;
#
# End of 10.4 tests
#
+#
+# MDEV-19160 JSON_DETAILED output unnecessarily verbose
+#
+create table t200 (a text);
+insert into t200 values
+('{
+ "steps": [
+ {
+ "join_optimization": {
+ "select_id": 1,
+ "steps": [
+ {
+ "rows_estimation": [
+ {
+ "table": "t1",
+ "range_analysis": {
+ "table_scan": {
+ "rows": 1000,
+ "cost": 2e308
+ },
+ "potential_range_indexes": [
+ {
+ "index": "a_b",
+ "usable": true,
+ "key_parts": ["a", "b"]
+ }
+ ],
+ "best_covering_index_scan": {
+ "index": "a_b",
+ "cost": 52.195,
+ "chosen": true
+ },
+ "setup_range_conditions": [],
+ "group_index_range": {
+ "chosen": false,
+ "cause": "no group by or distinct"
+ },
+ "analyzing_range_alternatives": {
+ "range_scan_alternatives": [
+ {
+ "index": "a_b",
+ "ranges": ["2 <= a <= 2 AND 4 <= b <= 4", "123"],
+ "rowid_ordered": true,
+ "using_mrr": false,
+ "index_only": true,
+ "rows": 1,
+ "cost": 1.1752,
+ "chosen": true
+ }
+ ],
+ "analyzing_roworder_intersect": {
+ "cause": "too few roworder scans"
+ },
+ "analyzing_index_merge_union": [],
+ "test_one_line_array":["123"]
+ },
+ "chosen_range_access_summary": {
+ "range_access_plan": {
+ "type": "range_scan",
+ "index": "a_b",
+ "rows": 1,
+ "ranges": ["2 <= a <= 2 AND 4 <= b <= 4"]
+ },
+ "rows_for_plan": 1,
+ "cost_for_plan": 1.1752,
+ "chosen": true
+ }
+ }
+ },
+ {
+ "selectivity_for_indexes": [
+ {
+ "index_name": "a_b",
+ "selectivity_from_index": 0.001
+ }
+ ],
+ "selectivity_for_columns": [],
+ "cond_selectivity": 0.001
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "join_execution": {
+ "select_id": 1,
+ "steps": []
+ }
+ }
+ ]
+}');
+select JSON_DETAILED(JSON_EXTRACT(a, '$**.analyzing_range_alternatives')) from t200;
+JSON_DETAILED(JSON_EXTRACT(a, '$**.analyzing_range_alternatives'))
+[
+ {
+ "range_scan_alternatives":
+ [
+ {
+ "index": "a_b",
+ "ranges":
+ [
+ "2 <= a <= 2 AND 4 <= b <= 4",
+ "123"
+ ],
+ "rowid_ordered": true,
+ "using_mrr": false,
+ "index_only": true,
+ "rows": 1,
+ "cost": 1.1752,
+ "chosen": true
+ }
+ ],
+ "analyzing_roworder_intersect":
+ {
+ "cause": "too few roworder scans"
+ },
+ "analyzing_index_merge_union":
+ [],
+ "test_one_line_array":
+ ["123"]
+ }
+]
+select JSON_LOOSE(JSON_EXTRACT(a, '$**.analyzing_range_alternatives')) from t200;
+JSON_LOOSE(JSON_EXTRACT(a, '$**.analyzing_range_alternatives'))
+[{"range_scan_alternatives": [{"index": "a_b", "ranges": ["2 <= a <= 2 AND 4 <= b <= 4", "123"], "rowid_ordered": true, "using_mrr": false, "index_only": true, "rows": 1, "cost": 1.1752, "chosen": true}], "analyzing_roworder_intersect": {"cause": "too few roworder scans"}, "analyzing_index_merge_union": [], "test_one_line_array": ["123"]}]
diff --git a/mysql-test/main/func_json.test b/mysql-test/main/func_json.test
index 0987af80b79..6cfcefbee3d 100644
--- a/mysql-test/main/func_json.test
+++ b/mysql-test/main/func_json.test
@@ -718,3 +718,103 @@ DROP TABLE t1;
--echo #
--echo # End of 10.4 tests
--echo #
+
+
+--echo #
+--echo # MDEV-19160 JSON_DETAILED output unnecessarily verbose
+--echo #
+
+create table t200 (a text);
+
+insert into t200 values
+('{
+ "steps": [
+ {
+ "join_optimization": {
+ "select_id": 1,
+ "steps": [
+ {
+ "rows_estimation": [
+ {
+ "table": "t1",
+ "range_analysis": {
+ "table_scan": {
+ "rows": 1000,
+ "cost": 2e308
+ },
+ "potential_range_indexes": [
+ {
+ "index": "a_b",
+ "usable": true,
+ "key_parts": ["a", "b"]
+ }
+ ],
+ "best_covering_index_scan": {
+ "index": "a_b",
+ "cost": 52.195,
+ "chosen": true
+ },
+ "setup_range_conditions": [],
+ "group_index_range": {
+ "chosen": false,
+ "cause": "no group by or distinct"
+ },
+ "analyzing_range_alternatives": {
+ "range_scan_alternatives": [
+ {
+ "index": "a_b",
+ "ranges": ["2 <= a <= 2 AND 4 <= b <= 4", "123"],
+ "rowid_ordered": true,
+ "using_mrr": false,
+ "index_only": true,
+ "rows": 1,
+ "cost": 1.1752,
+ "chosen": true
+ }
+ ],
+ "analyzing_roworder_intersect": {
+ "cause": "too few roworder scans"
+ },
+ "analyzing_index_merge_union": [],
+ "test_one_line_array":["123"]
+ },
+ "chosen_range_access_summary": {
+ "range_access_plan": {
+ "type": "range_scan",
+ "index": "a_b",
+ "rows": 1,
+ "ranges": ["2 <= a <= 2 AND 4 <= b <= 4"]
+ },
+ "rows_for_plan": 1,
+ "cost_for_plan": 1.1752,
+ "chosen": true
+ }
+ }
+ },
+ {
+ "selectivity_for_indexes": [
+ {
+ "index_name": "a_b",
+ "selectivity_from_index": 0.001
+ }
+ ],
+ "selectivity_for_columns": [],
+ "cond_selectivity": 0.001
+ }
+ ]
+ }
+ ]
+ }
+ },
+ {
+ "join_execution": {
+ "select_id": 1,
+ "steps": []
+ }
+ }
+ ]
+}');
+
+
+select JSON_DETAILED(JSON_EXTRACT(a, '$**.analyzing_range_alternatives')) from t200;
+select JSON_LOOSE(JSON_EXTRACT(a, '$**.analyzing_range_alternatives')) from t200;
diff --git a/mysql-test/main/opt_trace.result b/mysql-test/main/opt_trace.result
index 79201d49474..2eef0da62bb 100644
--- a/mysql-test/main/opt_trace.result
+++ b/mysql-test/main/opt_trace.result
@@ -7459,17 +7459,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "a_b",
"ranges":
- [
- "(2,4) <= (a,b) <= (2,4)"
- ],
+ ["(2,4) <= (a,b) <= (2,4)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": true,
@@ -7483,8 +7479,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
explain select * from t1 where a >= 900 and b between 10 and 20;
@@ -7493,17 +7488,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "a_b",
"ranges":
- [
- "(900,10) <= (a,b)"
- ],
+ ["(900,10) <= (a,b)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": true,
@@ -7517,8 +7508,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t0,t1;
@@ -7530,17 +7520,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "start_date",
"ranges":
- [
- "(2019-02-10,NULL) < (start_date,end_date)"
- ],
+ ["(2019-02-10,NULL) < (start_date,end_date)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -7554,8 +7540,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1,one_k;
@@ -7575,17 +7560,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "a_b_c",
"ranges":
- [
- "(1) <= (a,b) < (4,50)"
- ],
+ ["(1) <= (a,b) < (4,50)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -7599,8 +7580,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table ten,t1;
@@ -7614,17 +7594,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(\xD9[\x943j\x99F\xA3\x9C\xF5\xB5\x8C\xFEw-\x8C) <= (b) <= (\xD9[\x943j\x99F\xA3\x9C\xF5\xB5\x8C\xFEw-\x8C)"
- ],
+ ["(\xD9[\x943j\x99F\xA3\x9C\xF5\xB5\x8C\xFEw-\x8C) <= (b) <= (\xD9[\x943j\x99F\xA3\x9C\xF5\xB5\x8C\xFEw-\x8C)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7638,8 +7614,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
EXPLAIN SELECT * FROM t1 WHERE b IS NULL;
@@ -7648,17 +7623,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(NULL) <= (b) <= (NULL)"
- ],
+ ["(NULL) <= (b) <= (NULL)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7672,8 +7643,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
@@ -7690,17 +7660,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\x0A) <= (b) <= (ab\x0A)"
- ],
+ ["(ab\x0A) <= (b) <= (ab\x0A)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7714,8 +7680,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
ALTER TABLE t1 modify column b BINARY(10) AFTER i;
@@ -7725,17 +7690,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\x0A\x00\x00\x00\x00\x00\x00\x00) <= (b) <= (ab\x0A\x00\x00\x00\x00\x00\x00\x00)"
- ],
+ ["(ab\x0A\x00\x00\x00\x00\x00\x00\x00) <= (b) <= (ab\x0A\x00\x00\x00\x00\x00\x00\x00)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7749,8 +7710,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
ALTER TABLE t1 modify column b VARBINARY(10) AFTER i;
@@ -7760,17 +7720,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\x0A) <= (b) <= (ab\x0A)"
- ],
+ ["(ab\x0A) <= (b) <= (ab\x0A)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7784,8 +7740,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
@@ -7798,17 +7753,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\n) <= (b) <= (ab\n)"
- ],
+ ["(ab\n) <= (b) <= (ab\n)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7822,8 +7773,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
@@ -7839,17 +7789,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\x0A) <= (b) <= (ab\x0A)"
- ],
+ ["(ab\x0A) <= (b) <= (ab\x0A)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -7863,8 +7809,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
@@ -7878,17 +7823,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "i_b",
"ranges":
- [
- "(ab\n) <= (b) <= (ab\n)"
- ],
+ ["(ab\n) <= (b) <= (ab\n)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -7902,8 +7843,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
@@ -7934,17 +7874,13 @@ EXPLAIN
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "start_date",
"ranges":
- [
- "(2019-02-10,NULL) < (start_date,end_date)"
- ],
+ ["(2019-02-10,NULL) < (start_date,end_date)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -7958,8 +7894,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1, t0, one_k;
@@ -7998,19 +7933,15 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
-
[
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "A",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 5.9375,
@@ -8030,18 +7961,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost_for_plan": 4.0171,
"rest_of_plan":
[
-
{
"plan_prefix":
- [
- "A"
- ],
+ ["A"],
"table": "B",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 804.69,
@@ -8063,17 +7990,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
}
]
},
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "B",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 804.69,
@@ -8104,19 +8028,15 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
-
[
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "A",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 10,
@@ -8136,18 +8056,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost_for_plan": 4.0171,
"rest_of_plan":
[
-
{
"plan_prefix":
- [
- "A"
- ],
+ ["A"],
"table": "B",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "ref",
"index": "b",
@@ -8158,7 +8074,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost": 20,
"chosen": true
},
-
{
"access_type": "scan",
"resulting_rows": 804.69,
@@ -8181,17 +8096,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
}
]
},
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "B",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 804.69,
@@ -8227,17 +8139,13 @@ a
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "a",
"ranges":
- [
- "() <= (a) <= ()"
- ],
+ ["() <= (a) <= ()"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -8251,8 +8159,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
DROP TABLE t1;
@@ -8274,7 +8181,6 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.semijoin_table_pullout')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.semijoin_table_pullout'))
[
-
{
"pulled_out_tables":
[
@@ -8295,15 +8201,11 @@ kp1 kp2
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives'))
[
-
[
-
{
"index": "kp1",
"ranges":
- [
- "(2,4) <= (kp1,kp2) <= (2)"
- ],
+ ["(2,4) <= (kp1,kp2) <= (2)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": true,
@@ -8330,19 +8232,15 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
[
-
[
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "t1",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 10,
@@ -8362,18 +8260,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost_for_plan": 4.022,
"rest_of_plan":
[
-
{
"plan_prefix":
- [
- "t1"
- ],
+ ["t1"],
"table": "t2",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "ref",
"index": "a",
@@ -8384,7 +8278,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost": 20,
"chosen": true
},
-
{
"access_type": "scan",
"resulting_rows": 100,
@@ -8407,17 +8300,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
}
]
},
-
{
"plan_prefix":
- [
- ],
+ [],
"table": "t2",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "scan",
"resulting_rows": 100,
@@ -8438,18 +8328,14 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost_for_plan": 22.22,
"rest_of_plan":
[
-
{
"plan_prefix":
- [
- "t2"
- ],
+ ["t2"],
"table": "t1",
"best_access_path":
{
"considered_access_paths":
[
-
{
"access_type": "ref",
"index": "a",
@@ -8460,7 +8346,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.considered_execution_plans'))
"cost": 200,
"chosen": true
},
-
{
"access_type": "scan",
"resulting_rows": 10,
@@ -8504,24 +8389,17 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
-
[
-
{
"column_name": "a",
"ranges":
- [
- "1 <= a <= 5"
- ],
+ ["1 <= a <= 5"],
"selectivity_from_histogram": 0.0469
},
-
{
"column_name": "b",
"ranges":
- [
- "NULL < b <= 5"
- ],
+ ["NULL < b <= 5"],
"selectivity_from_histogram": 0.0469
}
]
@@ -8534,9 +8412,7 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
-
[
-
{
"column_name": "a",
"ranges":
@@ -8556,15 +8432,11 @@ Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b` from `test`.`t1`
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.selectivity_for_columns'))
[
-
[
-
{
"column_name": "b",
"ranges":
- [
- "10 <= b < 25"
- ],
+ ["10 <= b < 25"],
"selectivity_from_histogram": 0.1562
}
]
@@ -8582,15 +8454,11 @@ UPDATE t1 SET b=10 WHERE a=1;
SELECT JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.range_scan_alternatives'))
[
-
[
-
{
"index": "PRIMARY",
"ranges":
- [
- "(1) <= (a) <= (1)"
- ],
+ ["(1) <= (a) <= (1)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
diff --git a/mysql-test/main/opt_trace_index_merge.result b/mysql-test/main/opt_trace_index_merge.result
index ed5ddfd69f4..554ddde66a9 100644
--- a/mysql-test/main/opt_trace_index_merge.result
+++ b/mysql-test/main/opt_trace_index_merge.result
@@ -307,17 +307,13 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "key1",
"ranges":
- [
- "(100) <= (key1) <= (100)"
- ],
+ ["(100) <= (key1) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -325,13 +321,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cost": 2844.1,
"chosen": true
},
-
{
"index": "key2",
"ranges":
- [
- "(100) <= (key2) <= (100)"
- ],
+ ["(100) <= (key2) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -340,13 +333,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"chosen": false,
"cause": "cost"
},
-
{
"index": "key3",
"ranges":
- [
- "(100) <= (key3) <= (100)"
- ],
+ ["(100) <= (key3) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": false,
@@ -360,7 +350,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
{
"intersecting_indexes":
[
-
{
"index": "key1",
"index_scan_cost": 58.252,
@@ -372,7 +361,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"intersect_covering_with_this_index": false,
"chosen": true
},
-
{
"index": "key2",
"index_scan_cost": 58.252,
@@ -384,7 +372,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"intersect_covering_with_this_index": false,
"chosen": true
},
-
{
"index": "key3",
"index_scan_cost": 58.252,
@@ -408,14 +395,12 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"chosen": true
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary'))
[
-
{
"range_access_plan":
{
@@ -426,35 +411,26 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary'))
"clustered_pk_scan": false,
"intersect_of":
[
-
{
"type": "range_scan",
"index": "key1",
"rows": 2243,
"ranges":
- [
- "(100) <= (key1) <= (100)"
- ]
+ ["(100) <= (key1) <= (100)"]
},
-
{
"type": "range_scan",
"index": "key2",
"rows": 2243,
"ranges":
- [
- "(100) <= (key2) <= (100)"
- ]
+ ["(100) <= (key2) <= (100)"]
},
-
{
"type": "range_scan",
"index": "key3",
"rows": 2243,
"ranges":
- [
- "(100) <= (key3) <= (100)"
- ]
+ ["(100) <= (key3) <= (100)"]
}
]
},
@@ -470,32 +446,25 @@ id select_type table type possible_keys key key_len ref rows Extra
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
- [
- ],
+ [],
"analyzing_roworder_intersect":
{
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
[
-
{
"indexes_to_merge":
[
-
{
"range_scan_alternatives":
[
-
{
"index": "key1",
"ranges":
- [
- "(100) <= (key1) <= (100)"
- ],
+ ["(100) <= (key1) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": true,
@@ -503,13 +472,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cost": 152.53,
"chosen": true
},
-
{
"index": "key2",
"ranges":
- [
- "(100) <= (key2) <= (100)"
- ],
+ ["(100) <= (key2) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": true,
@@ -522,17 +488,13 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"index_to_merge": "key1",
"cumulated_cost": 152.53
},
-
{
"range_scan_alternatives":
[
-
{
"index": "key3",
"ranges":
- [
- "(100) <= (key3) <= (100)"
- ],
+ ["(100) <= (key3) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": true,
@@ -540,13 +502,10 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cost": 152.53,
"chosen": true
},
-
{
"index": "key4",
"ranges":
- [
- "(100) <= (key4) <= (100)"
- ],
+ ["(100) <= (key4) <= (100)"],
"rowid_ordered": true,
"using_mrr": false,
"index_only": true,
@@ -565,20 +524,16 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "always cheaper than non roworder retrieval",
"analyzing_roworder_scans":
[
-
{
"type": "range_scan",
"index": "key1",
"rows": 2243,
"ranges":
- [
- "(100) <= (key1) <= (100)"
- ],
+ ["(100) <= (key1) <= (100)"],
"analyzing_roworder_intersect":
{
"intersecting_indexes":
[
-
{
"index": "key1",
"index_scan_cost": 58.252,
@@ -590,7 +545,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"intersect_covering_with_this_index": false,
"chosen": true
},
-
{
"index": "key2",
"index_scan_cost": 58.252,
@@ -614,20 +568,16 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"chosen": true
}
},
-
{
"type": "range_scan",
"index": "key3",
"rows": 2243,
"ranges":
- [
- "(100) <= (key3) <= (100)"
- ],
+ ["(100) <= (key3) <= (100)"],
"analyzing_roworder_intersect":
{
"intersecting_indexes":
[
-
{
"index": "key3",
"index_scan_cost": 58.252,
@@ -639,7 +589,6 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"intersect_covering_with_this_index": false,
"chosen": true
},
-
{
"index": "key4",
"index_scan_cost": 58.252,
@@ -674,14 +623,12 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary'))
[
-
{
"range_access_plan":
{
"type": "index_roworder_union",
"union_of":
[
-
{
"type": "index_roworder_intersect",
"rows": 77,
@@ -690,29 +637,22 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary'))
"clustered_pk_scan": false,
"intersect_of":
[
-
{
"type": "range_scan",
"index": "key1",
"rows": 2243,
"ranges":
- [
- "(100) <= (key1) <= (100)"
- ]
+ ["(100) <= (key1) <= (100)"]
},
-
{
"type": "range_scan",
"index": "key2",
"rows": 2243,
"ranges":
- [
- "(100) <= (key2) <= (100)"
- ]
+ ["(100) <= (key2) <= (100)"]
}
]
},
-
{
"type": "index_roworder_intersect",
"rows": 77,
@@ -721,25 +661,19 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.chosen_range_access_summary'))
"clustered_pk_scan": false,
"intersect_of":
[
-
{
"type": "range_scan",
"index": "key3",
"rows": 2243,
"ranges":
- [
- "(100) <= (key3) <= (100)"
- ]
+ ["(100) <= (key3) <= (100)"]
},
-
{
"type": "range_scan",
"index": "key4",
"rows": 2243,
"ranges":
- [
- "(100) <= (key4) <= (100)"
- ]
+ ["(100) <= (key4) <= (100)"]
}
]
}
diff --git a/mysql-test/main/opt_trace_ucs2.result b/mysql-test/main/opt_trace_ucs2.result
index 306fdbf94ad..945392d0ac1 100644
--- a/mysql-test/main/opt_trace_ucs2.result
+++ b/mysql-test/main/opt_trace_ucs2.result
@@ -23,17 +23,13 @@ EXPLAIN
select JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives')) from INFORMATION_SCHEMA.OPTIMIZER_TRACE;
JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
[
-
{
"range_scan_alternatives":
[
-
{
"index": "col1",
"ranges":
- [
- "(a) <= (col1)"
- ],
+ ["(a) <= (col1)"],
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
@@ -47,8 +43,7 @@ JSON_DETAILED(JSON_EXTRACT(trace, '$**.analyzing_range_alternatives'))
"cause": "too few roworder scans"
},
"analyzing_index_merge_union":
- [
- ]
+ []
}
]
drop table t1;
diff --git a/mysql-test/main/range_notembedded.result b/mysql-test/main/range_notembedded.result
index 7084e0ca7a0..e17f6341c6e 100644
--- a/mysql-test/main/range_notembedded.result
+++ b/mysql-test/main/range_notembedded.result
@@ -20,7 +20,6 @@ select json_detailed(JSON_EXTRACT(trace, '$**.ranges'))
from information_schema.optimizer_trace;
json_detailed(JSON_EXTRACT(trace, '$**.ranges'))
[
-
[
"(1) <= (key1) <= (1)",
"(2) <= (key1) <= (2)",
diff --git a/mysql-test/suite/plugins/r/multiauth.result b/mysql-test/suite/plugins/r/multiauth.result
index 75b604555a7..9651dac6740 100644
--- a/mysql-test/suite/plugins/r/multiauth.result
+++ b/mysql-test/suite/plugins/r/multiauth.result
@@ -110,16 +110,13 @@ json_detailed(priv)
"authentication_string": "*7D8C3DF236D9163B6C274A9D47704BC496988460",
"auth_or":
[
-
{
"plugin": "ed25519",
"authentication_string": "F4aF8bw7130VaRbdLCl4f/P/wkjDmgJXwWvpJ5gmsZc"
},
-
{
"plugin": "unix_socket"
},
-
{
}
],
diff --git a/sql/item_jsonfunc.cc b/sql/item_jsonfunc.cc
index 7e37fc7d096..ece35a40835 100644
--- a/sql/item_jsonfunc.cc
+++ b/sql/item_jsonfunc.cc
@@ -257,16 +257,22 @@ static int json_nice(json_engine_t *je, String *nice_js,
Item_func_json_format::formats mode, int tab_size=4)
{
int depth= 0;
- const char *comma, *colon;
+ static const char *comma= ", ", *colon= "\": ";
uint comma_len, colon_len;
int first_value= 1;
-
- DBUG_ASSERT(je->s.cs == nice_js->charset());
+ int value_size = 0;
+ int curr_state= -1;
+ int64_t value_len= 0;
+ String curr_str{};
+
+ nice_js->length(0);
+ nice_js->set_charset(je->s.cs);
+ nice_js->alloc(je->s.str_end - je->s.c_str + 32);
+
+
DBUG_ASSERT(mode != Item_func_json_format::DETAILED ||
(tab_size >= 0 && tab_size <= TAB_SIZE_LIMIT));
- comma= ", ";
- colon= "\": ";
if (mode == Item_func_json_format::LOOSE)
{
comma_len= 2;
@@ -285,6 +291,7 @@ static int json_nice(json_engine_t *je, String *nice_js,
do
{
+ curr_state= je->state;
switch (je->state)
{
case JST_KEY:
@@ -307,7 +314,7 @@ static int json_nice(json_engine_t *je, String *nice_js,
append_tab(nice_js, depth, tab_size))
goto error;
- nice_js->append("\"", 1);
+ nice_js->append('"');
append_simple(nice_js, key_start, key_end - key_start);
nice_js->append(colon, colon_len);
}
@@ -332,17 +339,23 @@ handle_value:
if (append_simple(nice_js, je->value_begin,
je->value_end - je->value_begin))
goto error;
-
+
+ curr_str.copy((const char *)je->value_begin,
+ je->value_end - je->value_begin, je->s.cs);
+ value_len= je->value_end - je->value_begin;
first_value= 0;
+ if (value_size != -1)
+ value_size++;
}
else
{
if (mode == Item_func_json_format::DETAILED &&
- depth > 0 &&
+ depth > 0 && !(curr_state != JST_KEY) &&
append_tab(nice_js, depth, tab_size))
goto error;
nice_js->append((je->value_type == JSON_VALUE_OBJECT) ? "{" : "[", 1);
first_value= 1;
+ value_size= (je->value_type == JSON_VALUE_OBJECT) ? -1: 0;
depth++;
}
@@ -351,11 +364,27 @@ handle_value:
case JST_OBJ_END:
case JST_ARRAY_END:
depth--;
- if (mode == Item_func_json_format::DETAILED &&
+ if (mode == Item_func_json_format::DETAILED && (value_size > 1 || value_size == -1) &&
append_tab(nice_js, depth, tab_size))
goto error;
+
+ if (mode == Item_func_json_format::DETAILED &&
+ value_size == 1 && je->state != JST_OBJ_END)
+ {
+ for (auto i = 0; i < value_len; i++)
+ {
+ nice_js->chop();
+ }
+ for (auto i = 0; i < (depth + 1) * tab_size + 1; i++)
+ {
+ nice_js->chop();
+ }
+ nice_js->append(curr_str);
+ }
+
nice_js->append((je->state == JST_OBJ_END) ? "}": "]", 1);
first_value= 0;
+ value_size= -1;
break;
default: