Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
69c386d9
Commit
69c386d9
authored
Sep 04, 2013
by
Sergey Petrunya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Code cleanup
parent
eeb67132
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
60 additions
and
58 deletions
+60
-58
mysql-test/r/explain_non_select.result
mysql-test/r/explain_non_select.result
+12
-0
sql/opt_qpf.cc
sql/opt_qpf.cc
+27
-19
sql/opt_qpf.h
sql/opt_qpf.h
+5
-2
sql/sql_select.cc
sql/sql_select.cc
+16
-36
sql/sql_select.h
sql/sql_select.h
+0
-1
No files found.
mysql-test/r/explain_non_select.result
View file @
69c386d9
...
...
@@ -102,3 +102,15 @@ id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 8 Using where
1 SIMPLE t1 ref a a 5 test.t0.a 4 Using index
drop table t0, t1;
#
# Try DELETE ... RETURNING ...
#
create table t0 (a int);
insert into t0 values (1),(2),(3),(4);
explain delete from t0 where a=1 returning a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 4 Using where
explain delete from t0 returning a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t0 ALL NULL NULL NULL NULL 4
drop table t0;
sql/opt_qpf.cc
View file @
69c386d9
...
...
@@ -14,8 +14,6 @@ QPF_query::QPF_query()
{
upd_del_plan
=
NULL
;
operations
=
0
;
//memset(&unions, 0, sizeof(unions));
//memset(&selects, 0, sizeof(selects));
}
...
...
@@ -105,18 +103,13 @@ int QPF_query::print_explain(select_result_sink *output,
}
else
{
// Start
with
id=1
// Start
printing from
id=1
QPF_node
*
node
=
get_node
(
1
);
return
node
->
print_explain
(
this
,
output
,
explain_flags
);
}
}
void
QPF_union
::
push_table_name
(
List
<
Item
>
*
item_list
)
{
}
static
void
push_str
(
List
<
Item
>
*
item_list
,
const
char
*
str
)
{
item_list
->
push_back
(
new
Item_string
(
str
,
...
...
@@ -134,7 +127,7 @@ static void push_string(List<Item> *item_list, String *str)
int
QPF_union
::
print_explain
(
QPF_query
*
query
,
select_result_sink
*
output
,
uint8
explain_flags
)
{
/
/ print all children, in order
/
* print all UNION children, in order */
for
(
int
i
=
0
;
i
<
(
int
)
union_members
.
elements
();
i
++
)
{
QPF_select
*
sel
=
query
->
get_select
(
union_members
.
at
(
i
));
...
...
@@ -152,7 +145,6 @@ int QPF_union::print_explain(QPF_query *query, select_result_sink *output,
push_str
(
&
item_list
,
fake_select_type
);
/* `table` column: something like "<union1,2>" */
//
{
char
table_name_buffer
[
SAFE_NAME_LEN
];
uint
childno
=
0
;
...
...
@@ -180,8 +172,6 @@ int QPF_union::print_explain(QPF_query *query, select_result_sink *output,
const
CHARSET_INFO
*
cs
=
system_charset_info
;
item_list
.
push_back
(
new
Item_string
(
table_name_buffer
,
len
,
cs
));
}
//
push_table_name
(
&
item_list
);
/* `partitions` column */
if
(
explain_flags
&
DESCRIBE_PARTITIONS
)
...
...
@@ -221,11 +211,19 @@ int QPF_union::print_explain(QPF_query *query, select_result_sink *output,
//output->unit.offset_limit_cnt= 0;
if
(
output
->
send_data
(
item_list
))
return
1
;
/*
Print all subquery children (UNION children have already been printed at
the start of this function)
*/
return
print_explain_for_children
(
query
,
output
,
explain_flags
);
}
/*
Print EXPLAINs for all children nodes (i.e. for subqueries)
*/
int
QPF_node
::
print_explain_for_children
(
QPF_query
*
query
,
select_result_sink
*
output
,
uint8
explain_flags
)
...
...
@@ -301,6 +299,12 @@ int QPF_select::print_explain(QPF_query *query, select_result_sink *output,
}
void
QPF_table_access
::
push_extra
(
enum
Extra_tag
extra_tag
)
{
extra_tags
.
append
(
extra_tag
);
}
int
QPF_table_access
::
print_explain
(
select_result_sink
*
output
,
uint8
explain_flags
,
uint
select_id
,
const
char
*
select_type
,
bool
using_temporary
,
bool
using_filesort
)
...
...
@@ -422,13 +426,17 @@ int QPF_table_access::print_explain(select_result_sink *output, uint8 explain_fl
}
/*
Elements in this array match members of enum Extra_tag, defined in opt_qpf.h.
*/
const
char
*
extra_tag_text
[]
=
{
"ET_none"
,
"Using index condition"
,
"Using index condition(BKA)"
,
"Using "
,
//
special
"Range checked for each record (index map: 0x"
,
//
special
"Using "
,
//
special handling
"Range checked for each record (index map: 0x"
,
//
special handling
"Using where with pushed condition"
,
"Using where"
,
"Not exists"
,
...
...
@@ -443,17 +451,17 @@ const char * extra_tag_text[]=
"Scanned 1 database"
,
"Scanned all databases"
,
"Using index for group-by"
,
//
Special?
"Using index for group-by"
,
//
special handling
"USING MRR: DONT PRINT ME"
,
//
Special!
"USING MRR: DONT PRINT ME"
,
//
special handling
"Distinct"
,
"LooseScan"
,
"Start temporary"
,
"End temporary"
,
"FirstMatch"
,
//
TODO: also handle special variant!
"FirstMatch"
,
//
special handling
"Using join buffer"
,
//
Special!,
"Using join buffer"
,
//
special handling
"const row not found"
,
"unique row not found"
,
...
...
sql/opt_qpf.h
View file @
69c386d9
...
...
@@ -146,7 +146,6 @@ public:
{
union_members
.
append
(
select_no
);
}
void
push_table_name
(
List
<
Item
>
*
item_list
);
int
print_explain
(
QPF_query
*
query
,
select_result_sink
*
output
,
uint8
explain_flags
);
...
...
@@ -231,6 +230,11 @@ private:
};
/*
Some of the tags have matching text. See extra_tag_text for text names, and
QPF_table_access::append_tag_name() for code to convert from tag form to text
form.
*/
enum
Extra_tag
{
ET_none
=
0
,
/* not-a-tag */
...
...
@@ -347,7 +351,6 @@ public:
StringBuffer
<
64
>
mrr_type
;
// valid with ET_USING_JOIN_BUFFER
//StringBuffer<64> join_buffer_type;
QPF_BKA_TYPE
bka_type
;
//TABLE *firstmatch_table;
...
...
sql/sql_select.cc
View file @
69c386d9
...
...
@@ -11172,7 +11172,7 @@ void JOIN::cleanup(bool full)
if
(
full
)
{
/* Save it again */
#if 0
#if 0
psergey-todo: remove?
if (select_lex->select_number != UINT_MAX &&
select_lex->select_number != INT_MAX /* this is not a UNION's "fake select */ &&
have_query_plan != QEP_NOT_PRESENT_YET &&
...
...
@@ -22487,11 +22487,7 @@ void explain_append_mrr_info(QUICK_RANGE_SELECT *quick, String *res)
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void
QPF_table_access
::
push_extra
(
enum
Extra_tag
extra_tag
)
{
extra_tags
.
append
(
extra_tag
);
}
///////////////////////////////////////////////////////////////////////////////
void
append_possible_keys
(
String
*
str
,
TABLE
*
table
,
key_map
possible_keys
)
{
...
...
@@ -22548,24 +22544,7 @@ int JOIN::save_qpf(QPF_query *output, bool need_tmp_table, bool need_order,
}
else
if
(
join
->
select_lex
==
join
->
unit
->
fake_select_lex
)
{
#if 0
select_lex->set_explain_type(on_the_fly);
QPF_union *qp_union= new (output->mem_root) QPF_union;
qp_node= qp_union;
SELECT_LEX *child;
for (child= select_lex->master_unit()->first_select(); child;
child=child->next_select())
{
qp_union->add_select(child->select_number);
}
qp_union->fake_select_type= select_lex->type;
qp_union->using_filesort=
test(select_lex->master_unit()->global_parameters->order_list.first);
output->add_node(qp_union);
#endif
/* Do nothing, QPF_union will create and print fake_select_lex */
}
else
if
(
!
join
->
select_lex
->
master_unit
()
->
derived
||
join
->
select_lex
->
master_unit
()
->
derived
->
is_materialized_derived
())
...
...
@@ -22713,7 +22692,7 @@ int JOIN::save_qpf(QPF_query *output, bool need_tmp_table, bool need_order,
// tmp2 holds key_name
// tmp3 holds key_length
// tmp4 holds ref
?
// tmp4 holds ref
if
(
tab_type
==
JT_NEXT
)
{
key_info
=
table
->
key_info
+
tab
->
index
;
...
...
@@ -23074,16 +23053,16 @@ int JOIN::save_qpf(QPF_query *output, bool need_tmp_table, bool need_order,
/*
This function serve
r
s as "shortcut point" for EXPLAIN queries.
For UNIONs and JOINs, EXPLAIN statement executes just like its SELECT
statement would execute, except that JOIN::exec() will call select_describe()
instead of
actually executing the query.
This function serves as "shortcut point" for EXPLAIN queries.
The EXPLAIN statement executes just like its SELECT counterpart would
execute, except that JOIN::exec() will call select_describe() instead of
actually executing the query.
The purpose of select_describe() is
:
-
update the query plan with info about last-minute choices made at the start
of JOIN::exec
-
Invoke "pseudo-execution"
for the children subqueries.
Inside select_describe()
:
-
Query plan is updated with latest QEP choices made at the start of
JOIN::exec().
-
the proces of "almost execution" is invoked
for the children subqueries.
Overall, select_describe() is a legacy of old EXPLAIN implementation and
should be removed.
...
...
@@ -23096,9 +23075,10 @@ static void select_describe(JOIN *join, bool need_tmp_table, bool need_order,
select_result
*
result
=
join
->
result
;
DBUG_ENTER
(
"select_describe"
);
/
/ Update the QPF:
/
* Update the QPF with latest values of using_temporary, using_filesort */
QPF_select
*
qp
;
if
((
qp
=
thd
->
lex
->
query_plan_footprint
->
get_select
(
join
->
select_lex
->
select_number
)))
uint
select_nr
=
join
->
select_lex
->
select_number
;
if
((
qp
=
thd
->
lex
->
query_plan_footprint
->
get_select
(
select_nr
)))
{
qp
->
using_temporary
=
need_tmp_table
;
qp
->
using_filesort
=
need_order
;
...
...
sql/sql_select.h
View file @
69c386d9
...
...
@@ -259,7 +259,6 @@ typedef struct st_join_table {
/* Special content for EXPLAIN 'Extra' column or NULL if none */
enum
Extra_tag
info
;
//const char *info;
/*
Bitmap of TAB_INFO_* bits that encodes special line for EXPLAIN 'Extra'
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment