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
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
0fdb17e6
Commit
0fdb17e6
authored
Jun 28, 2016
by
Sergei Golubchik
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '5.5' into 10.0
parents
6dfe3fb2
79f852a0
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
50 additions
and
42 deletions
+50
-42
sql/item_subselect.cc
sql/item_subselect.cc
+35
-23
sql/item_subselect.h
sql/item_subselect.h
+15
-19
No files found.
sql/item_subselect.cc
View file @
0fdb17e6
...
...
@@ -83,7 +83,6 @@ void Item_subselect::init(st_select_lex *select_lex,
DBUG_PRINT
(
"enter"
,
(
"select_lex: 0x%lx this: 0x%lx"
,
(
ulong
)
select_lex
,
(
ulong
)
this
));
unit
=
select_lex
->
master_unit
();
thd
=
unit
->
thd
;
if
(
unit
->
item
)
{
...
...
@@ -102,7 +101,7 @@ void Item_subselect::init(st_select_lex *select_lex,
Item can be changed in JOIN::prepare while engine in JOIN::optimize
=> we do not copy old_engine here
*/
thd
->
change_item_tree
((
Item
**
)
&
unit
->
item
,
this
);
unit
->
thd
->
change_item_tree
((
Item
**
)
&
unit
->
item
,
this
);
engine
->
change_result
(
this
,
result
,
TRUE
);
}
}
...
...
@@ -117,9 +116,9 @@ void Item_subselect::init(st_select_lex *select_lex,
NO_MATTER
:
outer_select
->
parsing_place
);
if
(
unit
->
is_union
())
engine
=
new
subselect_union_engine
(
thd
,
unit
,
result
,
this
);
engine
=
new
subselect_union_engine
(
unit
,
result
,
this
);
else
engine
=
new
subselect_single_select_engine
(
thd
,
select_lex
,
result
,
this
);
engine
=
new
subselect_single_select_engine
(
select_lex
,
result
,
this
);
}
{
SELECT_LEX
*
upper
=
unit
->
outer_select
();
...
...
@@ -233,6 +232,10 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
uint8
uncacheable
;
bool
res
;
thd
=
thd_param
;
DBUG_ASSERT
(
unit
->
thd
==
thd
);
status_var_increment
(
thd_param
->
status_var
.
feature_subquery
);
DBUG_ASSERT
(
fixed
==
0
);
...
...
@@ -255,7 +258,7 @@ bool Item_subselect::fix_fields(THD *thd_param, Item **ref)
return
TRUE
;
if
(
!
(
res
=
engine
->
prepare
()))
if
(
!
(
res
=
engine
->
prepare
(
thd
)))
{
// all transformation is done (used by prepared statements)
changed
=
1
;
...
...
@@ -3105,9 +3108,12 @@ bool Item_in_subselect::fix_fields(THD *thd_arg, Item **ref)
{
uint
outer_cols_num
;
List
<
Item
>
*
inner_cols
;
char
const
*
save_where
=
thd
->
where
;
char
const
*
save_where
=
thd
_arg
->
where
;
DBUG_ENTER
(
"Item_in_subselect::fix_fields"
);
thd
=
thd_arg
;
DBUG_ASSERT
(
unit
->
thd
==
thd
);
if
(
test_strategy
(
SUBS_SEMI_JOIN
))
DBUG_RETURN
(
!
(
(
*
ref
)
=
new
Item_int
(
1
))
);
...
...
@@ -3224,7 +3230,8 @@ bool Item_in_subselect::setup_mat_engine()
if
(
!
(
mat_engine
=
new
subselect_hash_sj_engine
(
thd
,
this
,
select_engine
)))
DBUG_RETURN
(
TRUE
);
if
(
mat_engine
->
init
(
&
select_engine
->
join
->
fields_list
,
if
(
mat_engine
->
prepare
(
thd
)
||
mat_engine
->
init
(
&
select_engine
->
join
->
fields_list
,
engine
->
get_identifier
()))
DBUG_RETURN
(
TRUE
);
...
...
@@ -3340,10 +3347,10 @@ void subselect_engine::set_thd(THD *thd_arg)
subselect_single_select_engine
::
subselect_single_select_engine
(
THD
*
thd_arg
,
st_select_lex
*
select
,
subselect_single_select_engine
(
st_select_lex
*
select
,
select_result_interceptor
*
result_arg
,
Item_subselect
*
item_arg
)
:
subselect_engine
(
thd_arg
,
item_arg
,
result_arg
),
:
subselect_engine
(
item_arg
,
result_arg
),
prepared
(
0
),
executed
(
0
),
select_lex
(
select
),
join
(
0
)
{
...
...
@@ -3421,10 +3428,10 @@ void subselect_uniquesubquery_engine::cleanup()
}
subselect_union_engine
::
subselect_union_engine
(
THD
*
thd_arg
,
st_select_lex_unit
*
u
,
subselect_union_engine
::
subselect_union_engine
(
st_select_lex_unit
*
u
,
select_result_interceptor
*
result_arg
,
Item_subselect
*
item_arg
)
:
subselect_engine
(
thd_arg
,
item_arg
,
result_arg
)
:
subselect_engine
(
item_arg
,
result_arg
)
{
unit
=
u
;
unit
->
item
=
item_arg
;
...
...
@@ -3457,10 +3464,11 @@ subselect_union_engine::subselect_union_engine(THD *thd_arg, st_select_lex_unit
@retval 1 if error
*/
int
subselect_single_select_engine
::
prepare
()
int
subselect_single_select_engine
::
prepare
(
THD
*
thd
)
{
if
(
prepared
)
return
0
;
set_thd
(
thd
);
if
(
select_lex
->
join
)
{
select_lex
->
cleanup
();
...
...
@@ -3489,12 +3497,13 @@ int subselect_single_select_engine::prepare()
return
0
;
}
int
subselect_union_engine
::
prepare
()
int
subselect_union_engine
::
prepare
(
THD
*
thd_arg
)
{
set_thd
(
thd_arg
);
return
unit
->
prepare
(
thd
,
result
,
SELECT_NO_UNLOCK
);
}
int
subselect_uniquesubquery_engine
::
prepare
()
int
subselect_uniquesubquery_engine
::
prepare
(
THD
*
)
{
/* Should never be called. */
DBUG_ASSERT
(
FALSE
);
...
...
@@ -4956,13 +4965,14 @@ subselect_hash_sj_engine::~subselect_hash_sj_engine()
}
int
subselect_hash_sj_engine
::
prepare
()
int
subselect_hash_sj_engine
::
prepare
(
THD
*
thd_arg
)
{
/*
Create and optimize the JOIN that will be used to materialize
the subquery if not yet created.
*/
return
materialize_engine
->
prepare
();
set_thd
(
thd_arg
);
return
materialize_engine
->
prepare
(
thd
);
}
...
...
@@ -5334,7 +5344,7 @@ int subselect_hash_sj_engine::exec()
if
(
strategy
==
PARTIAL_MATCH_MERGE
)
{
pm_engine
=
new
subselect_rowid_merge_engine
(
thd
,
(
subselect_uniquesubquery_engine
*
)
new
subselect_rowid_merge_engine
((
subselect_uniquesubquery_engine
*
)
lookup_engine
,
tmp_table
,
count_pm_keys
,
has_covering_null_row
,
...
...
@@ -5343,6 +5353,7 @@ int subselect_hash_sj_engine::exec()
item
,
result
,
semi_join_conds
->
argument_list
());
if
(
!
pm_engine
||
pm_engine
->
prepare
(
thd
)
||
((
subselect_rowid_merge_engine
*
)
pm_engine
)
->
init
(
nn_key_parts
,
&
partial_match_key_parts
))
{
...
...
@@ -5360,13 +5371,14 @@ int subselect_hash_sj_engine::exec()
if
(
strategy
==
PARTIAL_MATCH_SCAN
)
{
if
(
!
(
pm_engine
=
new
subselect_table_scan_engine
(
thd
,
(
subselect_uniquesubquery_engine
*
)
new
subselect_table_scan_engine
((
subselect_uniquesubquery_engine
*
)
lookup_engine
,
tmp_table
,
item
,
result
,
semi_join_conds
->
argument_list
(),
has_covering_null_row
,
has_covering_null_columns
,
count_columns_with_nulls
)))
count_columns_with_nulls
))
||
pm_engine
->
prepare
(
thd
))
{
/* This is an irrecoverable error. */
res
=
1
;
...
...
@@ -5815,14 +5827,14 @@ void Ordered_key::print(String *str)
subselect_partial_match_engine
::
subselect_partial_match_engine
(
THD
*
thd_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
TABLE
*
tmp_table_arg
,
Item_subselect
*
item_arg
,
select_result_interceptor
*
result_arg
,
List
<
Item
>
*
equi_join_conds_arg
,
bool
has_covering_null_row_arg
,
bool
has_covering_null_columns_arg
,
uint
count_columns_with_nulls_arg
)
:
subselect_engine
(
thd_arg
,
item_arg
,
result_arg
),
:
subselect_engine
(
item_arg
,
result_arg
),
tmp_table
(
tmp_table_arg
),
lookup_engine
(
engine_arg
),
equi_join_conds
(
equi_join_conds_arg
),
has_covering_null_row
(
has_covering_null_row_arg
),
...
...
@@ -6435,7 +6447,7 @@ bool subselect_rowid_merge_engine::partial_match()
subselect_table_scan_engine
::
subselect_table_scan_engine
(
THD
*
thd_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
TABLE
*
tmp_table_arg
,
Item_subselect
*
item_arg
,
select_result_interceptor
*
result_arg
,
...
...
@@ -6443,7 +6455,7 @@ subselect_table_scan_engine::subselect_table_scan_engine(
bool
has_covering_null_row_arg
,
bool
has_covering_null_columns_arg
,
uint
count_columns_with_nulls_arg
)
:
subselect_partial_match_engine
(
thd_arg
,
engine_arg
,
tmp_table_arg
,
item_arg
,
:
subselect_partial_match_engine
(
engine_arg
,
tmp_table_arg
,
item_arg
,
result_arg
,
equi_join_conds_arg
,
has_covering_null_row_arg
,
has_covering_null_columns_arg
,
...
...
sql/item_subselect.h
View file @
0fdb17e6
...
...
@@ -750,7 +750,7 @@ class subselect_engine: public Sql_alloc
INDEXSUBQUERY_ENGINE
,
HASH_SJ_ENGINE
,
ROWID_MERGE_ENGINE
,
TABLE_SCAN_ENGINE
};
subselect_engine
(
THD
*
thd_arg
,
Item_subselect
*
si
,
subselect_engine
(
Item_subselect
*
si
,
select_result_interceptor
*
res
)
{
result
=
res
;
...
...
@@ -758,7 +758,6 @@ class subselect_engine: public Sql_alloc
cmp_type
=
res_type
=
STRING_RESULT
;
res_field_type
=
MYSQL_TYPE_VAR_STRING
;
maybe_null
=
0
;
set_thd
(
thd_arg
);
}
virtual
~
subselect_engine
()
{};
// to satisfy compiler
virtual
void
cleanup
()
=
0
;
...
...
@@ -769,7 +768,7 @@ class subselect_engine: public Sql_alloc
*/
void
set_thd
(
THD
*
thd_arg
);
THD
*
get_thd
()
{
return
thd
;
}
virtual
int
prepare
()
=
0
;
virtual
int
prepare
(
THD
*
)
=
0
;
virtual
void
fix_length_and_dec
(
Item_cache
**
row
)
=
0
;
/*
Execute the engine
...
...
@@ -824,11 +823,11 @@ class subselect_single_select_engine: public subselect_engine
st_select_lex
*
select_lex
;
/* corresponding select_lex */
JOIN
*
join
;
/* corresponding JOIN structure */
public:
subselect_single_select_engine
(
THD
*
thd_arg
,
st_select_lex
*
select
,
subselect_single_select_engine
(
st_select_lex
*
select
,
select_result_interceptor
*
result
,
Item_subselect
*
item
);
void
cleanup
();
int
prepare
();
int
prepare
(
THD
*
thd
);
void
fix_length_and_dec
(
Item_cache
**
row
);
int
exec
();
uint
cols
();
...
...
@@ -858,11 +857,11 @@ class subselect_union_engine: public subselect_engine
{
st_select_lex_unit
*
unit
;
/* corresponding unit structure */
public:
subselect_union_engine
(
THD
*
thd_arg
,
st_select_lex_unit
*
u
,
subselect_union_engine
(
st_select_lex_unit
*
u
,
select_result_interceptor
*
result
,
Item_subselect
*
item
);
void
cleanup
();
int
prepare
();
int
prepare
(
THD
*
);
void
fix_length_and_dec
(
Item_cache
**
row
);
int
exec
();
uint
cols
();
...
...
@@ -915,11 +914,11 @@ class subselect_uniquesubquery_engine: public subselect_engine
// constructor can assign THD because it will be called after JOIN::prepare
subselect_uniquesubquery_engine
(
THD
*
thd_arg
,
st_join_table
*
tab_arg
,
Item_subselect
*
subs
,
Item
*
where
)
:
subselect_engine
(
thd_arg
,
subs
,
0
),
tab
(
tab_arg
),
cond
(
where
)
:
subselect_engine
(
subs
,
0
),
tab
(
tab_arg
),
cond
(
where
)
{}
~
subselect_uniquesubquery_engine
();
void
cleanup
();
int
prepare
();
int
prepare
(
THD
*
);
void
fix_length_and_dec
(
Item_cache
**
row
);
int
exec
();
uint
cols
()
{
return
1
;
}
...
...
@@ -1047,7 +1046,7 @@ class subselect_hash_sj_engine : public subselect_engine
subselect_hash_sj_engine
(
THD
*
thd
,
Item_subselect
*
in_predicate
,
subselect_single_select_engine
*
old_engine
)
:
subselect_engine
(
thd
,
in_predicate
,
NULL
),
:
subselect_engine
(
in_predicate
,
NULL
),
tmp_table
(
NULL
),
is_materialized
(
FALSE
),
materialize_engine
(
old_engine
),
materialize_join
(
NULL
),
semi_join_conds
(
NULL
),
lookup_engine
(
NULL
),
count_partial_match_columns
(
0
),
count_null_only_columns
(
0
),
...
...
@@ -1057,7 +1056,7 @@ class subselect_hash_sj_engine : public subselect_engine
bool
init
(
List
<
Item
>
*
tmp_columns
,
uint
subquery_id
);
void
cleanup
();
int
prepare
();
int
prepare
(
THD
*
);
int
exec
();
virtual
void
print
(
String
*
str
,
enum_query_type
query_type
);
uint
cols
()
...
...
@@ -1336,15 +1335,14 @@ class subselect_partial_match_engine : public subselect_engine
protected:
virtual
bool
partial_match
()
=
0
;
public:
subselect_partial_match_engine
(
THD
*
thd_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
subselect_partial_match_engine
(
subselect_uniquesubquery_engine
*
engine_arg
,
TABLE
*
tmp_table_arg
,
Item_subselect
*
item_arg
,
select_result_interceptor
*
result_arg
,
List
<
Item
>
*
equi_join_conds_arg
,
bool
has_covering_null_row_arg
,
bool
has_covering_null_columns_arg
,
uint
count_columns_with_nulls_arg
);
int
prepare
(
)
{
return
0
;
}
int
prepare
(
THD
*
thd_arg
)
{
set_thd
(
thd_arg
);
return
0
;
}
int
exec
();
void
fix_length_and_dec
(
Item_cache
**
)
{}
uint
cols
()
{
/* TODO: what is the correct value? */
return
1
;
}
...
...
@@ -1431,8 +1429,7 @@ class subselect_rowid_merge_engine: public subselect_partial_match_engine
bool
exists_complementing_null_row
(
MY_BITMAP
*
keys_to_complement
);
bool
partial_match
();
public:
subselect_rowid_merge_engine
(
THD
*
thd_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
subselect_rowid_merge_engine
(
subselect_uniquesubquery_engine
*
engine_arg
,
TABLE
*
tmp_table_arg
,
uint
merge_keys_count_arg
,
bool
has_covering_null_row_arg
,
bool
has_covering_null_columns_arg
,
...
...
@@ -1440,7 +1437,7 @@ class subselect_rowid_merge_engine: public subselect_partial_match_engine
Item_subselect
*
item_arg
,
select_result_interceptor
*
result_arg
,
List
<
Item
>
*
equi_join_conds_arg
)
:
subselect_partial_match_engine
(
thd_arg
,
engine_arg
,
tmp_table_arg
,
:
subselect_partial_match_engine
(
engine_arg
,
tmp_table_arg
,
item_arg
,
result_arg
,
equi_join_conds_arg
,
has_covering_null_row_arg
,
has_covering_null_columns_arg
,
...
...
@@ -1459,8 +1456,7 @@ class subselect_table_scan_engine: public subselect_partial_match_engine
protected:
bool
partial_match
();
public:
subselect_table_scan_engine
(
THD
*
thd_arg
,
subselect_uniquesubquery_engine
*
engine_arg
,
subselect_table_scan_engine
(
subselect_uniquesubquery_engine
*
engine_arg
,
TABLE
*
tmp_table_arg
,
Item_subselect
*
item_arg
,
select_result_interceptor
*
result_arg
,
List
<
Item
>
*
equi_join_conds_arg
,
...
...
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