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
3eaa9535
Commit
3eaa9535
authored
Aug 18, 2005
by
monty@mysql.com
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Cleanups and optimization during review of new code
parent
8589f14d
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
160 additions
and
161 deletions
+160
-161
mysql-test/t/kill.test
mysql-test/t/kill.test
+1
-1
sql/sql_help.cc
sql/sql_help.cc
+14
-16
sql/sql_insert.cc
sql/sql_insert.cc
+4
-2
sql/sql_lex.cc
sql/sql_lex.cc
+2
-2
sql/sql_parse.cc
sql/sql_parse.cc
+37
-24
sql/sql_view.cc
sql/sql_view.cc
+24
-28
sql/sql_yacc.yy
sql/sql_yacc.yy
+4
-2
sql/table.cc
sql/table.cc
+74
-86
No files found.
mysql-test/t/kill.test
View file @
3eaa9535
...
@@ -15,6 +15,7 @@ connection con1;
...
@@ -15,6 +15,7 @@ connection con1;
drop
table
if
exists
t1
;
drop
table
if
exists
t1
;
--
enable_warnings
--
enable_warnings
--
disable_reconnect
create
table
t1
(
kill_id
int
);
create
table
t1
(
kill_id
int
);
insert
into
t1
values
(
connection_id
());
insert
into
t1
values
(
connection_id
());
...
@@ -25,7 +26,6 @@ kill @id;
...
@@ -25,7 +26,6 @@ kill @id;
connection
con1
;
connection
con1
;
--
disable_reconnect
# this statement should fail
# this statement should fail
--
error
2006
,
2013
--
error
2006
,
2013
select
1
;
select
1
;
...
...
sql/sql_help.cc
View file @
3eaa9535
...
@@ -623,38 +623,37 @@ bool mysqld_help(THD *thd, const char *mask)
...
@@ -623,38 +623,37 @@ bool mysqld_help(THD *thd, const char *mask)
Protocol
*
protocol
=
thd
->
protocol
;
Protocol
*
protocol
=
thd
->
protocol
;
SQL_SELECT
*
select
;
SQL_SELECT
*
select
;
st_find_field
used_fields
[
array_elements
(
init_used_fields
)];
st_find_field
used_fields
[
array_elements
(
init_used_fields
)];
DBUG_ENTER
(
"mysqld_help"
);
TABLE_LIST
*
leaves
=
0
;
TABLE_LIST
*
leaves
=
0
;
TABLE_LIST
tables
[
4
];
TABLE_LIST
tables
[
4
];
List
<
String
>
topics_list
,
categories_list
,
subcategories_list
;
String
name
,
description
,
example
;
int
count_topics
,
count_categories
,
error
;
uint
mlen
=
strlen
(
mask
);
size_t
i
;
MEM_ROOT
*
mem_root
=
thd
->
mem_root
;
DBUG_ENTER
(
"mysqld_help"
);
bzero
((
gptr
)
tables
,
sizeof
(
tables
));
bzero
((
gptr
)
tables
,
sizeof
(
tables
));
tables
[
0
].
alias
=
tables
[
0
].
table_name
=
(
char
*
)
"help_topic"
;
tables
[
0
].
alias
=
tables
[
0
].
table_name
=
(
char
*
)
"help_topic"
;
tables
[
0
].
lock_type
=
TL_READ
;
tables
[
0
].
lock_type
=
TL_READ
;
tables
[
0
].
next_global
=
tables
[
0
].
next_local
=
&
tables
[
1
];
tables
[
0
].
next_global
=
tables
[
0
].
next_local
=
tables
[
0
].
next_name_resolution_table
=
tables
[
0
].
next_local
;
tables
[
0
].
next_name_resolution_table
=
&
tables
[
1
]
;
tables
[
1
].
alias
=
tables
[
1
].
table_name
=
(
char
*
)
"help_category"
;
tables
[
1
].
alias
=
tables
[
1
].
table_name
=
(
char
*
)
"help_category"
;
tables
[
1
].
lock_type
=
TL_READ
;
tables
[
1
].
lock_type
=
TL_READ
;
tables
[
1
].
next_global
=
tables
[
1
].
next_local
=
&
tables
[
2
];
tables
[
1
].
next_global
=
tables
[
1
].
next_local
=
tables
[
1
].
next_name_resolution_table
=
tables
[
1
].
next_local
;
tables
[
1
].
next_name_resolution_table
=
&
tables
[
2
]
;
tables
[
2
].
alias
=
tables
[
2
].
table_name
=
(
char
*
)
"help_relation"
;
tables
[
2
].
alias
=
tables
[
2
].
table_name
=
(
char
*
)
"help_relation"
;
tables
[
2
].
lock_type
=
TL_READ
;
tables
[
2
].
lock_type
=
TL_READ
;
tables
[
2
].
next_global
=
tables
[
2
].
next_local
=
&
tables
[
3
];
tables
[
2
].
next_global
=
tables
[
2
].
next_local
=
tables
[
2
].
next_name_resolution_table
=
tables
[
2
].
next_local
;
tables
[
2
].
next_name_resolution_table
=
&
tables
[
3
]
;
tables
[
3
].
alias
=
tables
[
3
].
table_name
=
(
char
*
)
"help_keyword"
;
tables
[
3
].
alias
=
tables
[
3
].
table_name
=
(
char
*
)
"help_keyword"
;
tables
[
3
].
lock_type
=
TL_READ
;
tables
[
3
].
lock_type
=
TL_READ
;
tables
[
0
].
db
=
tables
[
1
].
db
=
tables
[
2
].
db
=
tables
[
3
].
db
=
(
char
*
)
"mysql"
;
tables
[
0
].
db
=
tables
[
1
].
db
=
tables
[
2
].
db
=
tables
[
3
].
db
=
(
char
*
)
"mysql"
;
List
<
String
>
topics_list
,
categories_list
,
subcategories_list
;
String
name
,
description
,
example
;
int
count_topics
,
count_categories
,
error
;
uint
mlen
=
strlen
(
mask
);
MEM_ROOT
*
mem_root
=
thd
->
mem_root
;
if
(
open_and_lock_tables
(
thd
,
tables
))
if
(
open_and_lock_tables
(
thd
,
tables
))
goto
error
;
goto
error
;
/*
/*
Init tables and fields to be usable from items
Init tables and fields to be usable from items
tables do not contain VIEWs => we can pass 0 as conds
tables do not contain VIEWs => we can pass 0 as conds
*/
*/
setup_tables
(
thd
,
&
thd
->
lex
->
select_lex
.
context
,
setup_tables
(
thd
,
&
thd
->
lex
->
select_lex
.
context
,
...
@@ -663,7 +662,6 @@ bool mysqld_help(THD *thd, const char *mask)
...
@@ -663,7 +662,6 @@ bool mysqld_help(THD *thd, const char *mask)
memcpy
((
char
*
)
used_fields
,
(
char
*
)
init_used_fields
,
sizeof
(
used_fields
));
memcpy
((
char
*
)
used_fields
,
(
char
*
)
init_used_fields
,
sizeof
(
used_fields
));
if
(
init_fields
(
thd
,
tables
,
used_fields
,
array_elements
(
used_fields
)))
if
(
init_fields
(
thd
,
tables
,
used_fields
,
array_elements
(
used_fields
)))
goto
error
;
goto
error
;
size_t
i
;
for
(
i
=
0
;
i
<
sizeof
(
tables
)
/
sizeof
(
TABLE_LIST
);
i
++
)
for
(
i
=
0
;
i
<
sizeof
(
tables
)
/
sizeof
(
TABLE_LIST
);
i
++
)
tables
[
i
].
table
->
file
->
init_table_handle_for_HANDLER
();
tables
[
i
].
table
->
file
->
init_table_handle_for_HANDLER
();
...
...
sql/sql_insert.cc
View file @
3eaa9535
...
@@ -891,8 +891,9 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
...
@@ -891,8 +891,9 @@ bool mysql_prepare_insert(THD *thd, TABLE_LIST *table_list,
if
(
select_lex
->
group_list
.
elements
==
0
)
if
(
select_lex
->
group_list
.
elements
==
0
)
{
{
context
->
table_list
->
next_local
=
save_next_local
;
context
->
table_list
->
next_local
=
save_next_local
;
/* first_name_resolution_table was set by resolve_in_table_list_only() */
context
->
first_name_resolution_table
->
context
->
first_name_resolution_table
->
next_name_resolution_table
=
save_next_local
;
next_name_resolution_table
=
save_next_local
;
}
}
if
(
!
res
)
if
(
!
res
)
res
=
setup_fields
(
thd
,
0
,
update_values
,
1
,
0
,
0
);
res
=
setup_fields
(
thd
,
0
,
update_values
,
1
,
0
,
0
);
...
@@ -2199,8 +2200,9 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
...
@@ -2199,8 +2200,9 @@ select_insert::prepare(List<Item> &values, SELECT_LEX_UNIT *u)
if
(
lex
->
select_lex
.
group_list
.
elements
==
0
)
if
(
lex
->
select_lex
.
group_list
.
elements
==
0
)
{
{
context
->
table_list
->
next_local
=
save_next_local
;
context
->
table_list
->
next_local
=
save_next_local
;
/* first_name_resolution_table was set by resolve_in_table_list_only() */
context
->
first_name_resolution_table
->
context
->
first_name_resolution_table
->
next_name_resolution_table
=
save_next_local
;
next_name_resolution_table
=
save_next_local
;
}
}
res
=
res
||
setup_fields
(
thd
,
0
,
*
info
.
update_values
,
1
,
0
,
0
);
res
=
res
||
setup_fields
(
thd
,
0
,
*
info
.
update_values
,
1
,
0
,
0
);
...
...
sql/sql_lex.cc
View file @
3eaa9535
...
@@ -1867,8 +1867,8 @@ TABLE_LIST *st_lex::unlink_first_table(bool *link_to_local)
...
@@ -1867,8 +1867,8 @@ TABLE_LIST *st_lex::unlink_first_table(bool *link_to_local)
*/
*/
if
((
*
link_to_local
=
test
(
select_lex
.
table_list
.
first
)))
if
((
*
link_to_local
=
test
(
select_lex
.
table_list
.
first
)))
{
{
select_lex
.
context
.
table_list
=
first
->
next_local
;
select_lex
.
context
.
table_list
=
select_lex
.
context
.
first_name_resolution_table
=
first
->
next_local
;
select_lex
.
context
.
first_name_resolution_table
=
first
->
next_local
;
select_lex
.
table_list
.
first
=
(
byte
*
)
(
first
->
next_local
);
select_lex
.
table_list
.
first
=
(
byte
*
)
(
first
->
next_local
);
select_lex
.
table_list
.
elements
--
;
//safety
select_lex
.
table_list
.
elements
--
;
//safety
first
->
next_local
=
0
;
first
->
next_local
=
0
;
...
...
sql/sql_parse.cc
View file @
3eaa9535
...
@@ -3258,8 +3258,8 @@ end_with_restore_list:
...
@@ -3258,8 +3258,8 @@ end_with_restore_list:
/* Skip first table, which is the table we are inserting in */
/* Skip first table, which is the table we are inserting in */
TABLE_LIST
*
second_table
=
first_table
->
next_local
;
TABLE_LIST
*
second_table
=
first_table
->
next_local
;
select_lex
->
table_list
.
first
=
(
byte
*
)
second_table
;
select_lex
->
table_list
.
first
=
(
byte
*
)
second_table
;
select_lex
->
context
.
table_list
=
second_table
;
select_lex
->
context
.
table_list
=
select_lex
->
context
.
first_name_resolution_table
=
second_table
;
select_lex
->
context
.
first_name_resolution_table
=
second_table
;
res
=
mysql_insert_select_prepare
(
thd
);
res
=
mysql_insert_select_prepare
(
thd
);
if
(
!
res
&&
(
result
=
new
select_insert
(
first_table
,
first_table
->
table
,
if
(
!
res
&&
(
result
=
new
select_insert
(
first_table
,
first_table
->
table
,
&
lex
->
field_list
,
&
lex
->
field_list
,
...
@@ -3274,8 +3274,8 @@ end_with_restore_list:
...
@@ -3274,8 +3274,8 @@ end_with_restore_list:
which in turn resets context.table_list and
which in turn resets context.table_list and
context.first_name_resolution_table.
context.first_name_resolution_table.
*/
*/
select_lex
->
context
.
table_list
=
first_table
->
next_local
;
select_lex
->
context
.
table_list
=
select_lex
->
context
.
first_name_resolution_table
=
first_table
->
next_local
;
select_lex
->
context
.
first_name_resolution_table
=
second_table
;
res
=
handle_select
(
thd
,
lex
,
result
,
OPTION_SETUP_TABLES_DONE
);
res
=
handle_select
(
thd
,
lex
,
result
,
OPTION_SETUP_TABLES_DONE
);
delete
result
;
delete
result
;
}
}
...
@@ -6016,6 +6016,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
...
@@ -6016,6 +6016,7 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
char
*
alias_str
;
char
*
alias_str
;
LEX
*
lex
=
thd
->
lex
;
LEX
*
lex
=
thd
->
lex
;
DBUG_ENTER
(
"add_table_to_list"
);
DBUG_ENTER
(
"add_table_to_list"
);
LINT_INIT
(
previous_table_ref
);
if
(
!
table
)
if
(
!
table
)
DBUG_RETURN
(
0
);
// End of memory
DBUG_RETURN
(
0
);
// End of memory
...
@@ -6111,9 +6112,23 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
...
@@ -6111,9 +6112,23 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
/* Store the table reference preceding the current one. */
/* Store the table reference preceding the current one. */
if
(
table_list
.
elements
>
0
)
if
(
table_list
.
elements
>
0
)
{
{
previous_table_ref
=
(
TABLE_LIST
*
)
table_list
.
next
;
/*
table_list.next points to the last inserted TABLE_LIST->next_local'
element
*/
previous_table_ref
=
(
TABLE_LIST
*
)
(
table_list
.
next
-
offsetof
(
TABLE_LIST
,
next_local
));
DBUG_ASSERT
(
previous_table_ref
);
DBUG_ASSERT
(
previous_table_ref
);
/*
Set next_name_resolution_table of the previous table reference to point
to the current table reference. In effect the list
TABLE_LIST::next_name_resolution_table coincides with
TABLE_LIST::next_local. Later this may be changed in
store_top_level_join_columns() for NATURAL/USING joins.
*/
previous_table_ref
->
next_name_resolution_table
=
ptr
;
}
}
/*
/*
Link the current table reference in a local list (list for current select).
Link the current table reference in a local list (list for current select).
Notice that as a side effect here we set the next_local field of the
Notice that as a side effect here we set the next_local field of the
...
@@ -6121,15 +6136,6 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
...
@@ -6121,15 +6136,6 @@ TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
list 'table_list'.
list 'table_list'.
*/
*/
table_list
.
link_in_list
((
byte
*
)
ptr
,
(
byte
**
)
&
ptr
->
next_local
);
table_list
.
link_in_list
((
byte
*
)
ptr
,
(
byte
**
)
&
ptr
->
next_local
);
/*
Set next_name_resolution_table of the previous table reference to point to
the current table reference. In effect the list
TABLE_LIST::next_name_resolution_table coincides with
TABLE_LIST::next_local. Later this may be changed in
store_top_level_join_columns() for NATURAL/USING joins.
*/
if
(
table_list
.
elements
>
1
)
previous_table_ref
->
next_name_resolution_table
=
ptr
;
ptr
->
next_name_resolution_table
=
NULL
;
ptr
->
next_name_resolution_table
=
NULL
;
/* Link table in global list (all used tables) */
/* Link table in global list (all used tables) */
lex
->
add_to_query_tables
(
ptr
);
lex
->
add_to_query_tables
(
ptr
);
...
@@ -6164,10 +6170,12 @@ bool st_select_lex::init_nested_join(THD *thd)
...
@@ -6164,10 +6170,12 @@ bool st_select_lex::init_nested_join(THD *thd)
NESTED_JOIN
*
nested_join
;
NESTED_JOIN
*
nested_join
;
DBUG_ENTER
(
"init_nested_join"
);
DBUG_ENTER
(
"init_nested_join"
);
if
(
!
(
ptr
=
(
TABLE_LIST
*
)
thd
->
calloc
(
sizeof
(
TABLE_LIST
)))
||
if
(
!
(
ptr
=
(
TABLE_LIST
*
)
thd
->
calloc
(
ALIGN_SIZE
(
sizeof
(
TABLE_LIST
))
+
!
(
nested_join
=
ptr
->
nested_join
=
sizeof
(
NESTED_JOIN
))))
(
NESTED_JOIN
*
)
thd
->
calloc
(
sizeof
(
NESTED_JOIN
))))
DBUG_RETURN
(
1
);
DBUG_RETURN
(
1
);
nested_join
=
ptr
->
nested_join
=
((
NESTED_JOIN
*
)
((
byte
*
)
ptr
+
ALIGN_SIZE
(
sizeof
(
TABLE_LIST
))));
join_list
->
push_front
(
ptr
);
join_list
->
push_front
(
ptr
);
ptr
->
embedding
=
embedding
;
ptr
->
embedding
=
embedding
;
ptr
->
join_list
=
join_list
;
ptr
->
join_list
=
join_list
;
...
@@ -6235,25 +6243,30 @@ TABLE_LIST *st_select_lex::end_nested_join(THD *thd)
...
@@ -6235,25 +6243,30 @@ TABLE_LIST *st_select_lex::end_nested_join(THD *thd)
The function nest last join operation as if it was enclosed in braces.
The function nest last join operation as if it was enclosed in braces.
RETURN VALUE
RETURN VALUE
Pointer to TABLE_LIST element created for the new nested join, if success
0 Error
0, otherwise
# Pointer to TABLE_LIST element created for the new nested join
*/
*/
TABLE_LIST
*
st_select_lex
::
nest_last_join
(
THD
*
thd
)
TABLE_LIST
*
st_select_lex
::
nest_last_join
(
THD
*
thd
)
{
{
TABLE_LIST
*
ptr
;
TABLE_LIST
*
ptr
;
NESTED_JOIN
*
nested_join
;
NESTED_JOIN
*
nested_join
;
List
<
TABLE_LIST
>
*
embedded_list
;
DBUG_ENTER
(
"nest_last_join"
);
DBUG_ENTER
(
"nest_last_join"
);
if
(
!
(
ptr
=
(
TABLE_LIST
*
)
thd
->
calloc
(
sizeof
(
TABLE_LIST
)))
||
if
(
!
(
ptr
=
(
TABLE_LIST
*
)
thd
->
calloc
(
ALIGN_SIZE
(
sizeof
(
TABLE_LIST
))
+
!
(
nested_join
=
ptr
->
nested_join
=
sizeof
(
NESTED_JOIN
))))
(
NESTED_JOIN
*
)
thd
->
calloc
(
sizeof
(
NESTED_JOIN
))))
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
nested_join
=
ptr
->
nested_join
=
((
NESTED_JOIN
*
)
((
byte
*
)
ptr
+
ALIGN_SIZE
(
sizeof
(
TABLE_LIST
))));
ptr
->
embedding
=
embedding
;
ptr
->
embedding
=
embedding
;
ptr
->
join_list
=
join_list
;
ptr
->
join_list
=
join_list
;
List
<
TABLE_LIST
>
*
embedded_list
=
&
nested_join
->
join_list
;
embedded_list
=
&
nested_join
->
join_list
;
embedded_list
->
empty
();
embedded_list
->
empty
();
for
(
int
i
=
0
;
i
<
2
;
i
++
)
for
(
uint
i
=
0
;
i
<
2
;
i
++
)
{
{
TABLE_LIST
*
table
=
join_list
->
pop
();
TABLE_LIST
*
table
=
join_list
->
pop
();
table
->
join_list
=
embedded_list
;
table
->
join_list
=
embedded_list
;
...
...
sql/sql_view.cc
View file @
3eaa9535
...
@@ -120,42 +120,38 @@ static void make_unique_view_field_name(Item *target,
...
@@ -120,42 +120,38 @@ static void make_unique_view_field_name(Item *target,
bool
check_duplicate_names
(
List
<
Item
>
&
item_list
,
bool
gen_unique_view_name
)
bool
check_duplicate_names
(
List
<
Item
>
&
item_list
,
bool
gen_unique_view_name
)
{
{
Item
*
item
;
List_iterator_fast
<
Item
>
it
(
item_list
);
List_iterator_fast
<
Item
>
itc
(
item_list
);
DBUG_ENTER
(
"check_duplicate_names"
);
DBUG_ENTER
(
"check_duplicate_names"
);
/* Test absence of duplicates names */
while
((
item
=
it
++
))
{
{
Item
*
item
;
Item
*
check
;
List_iterator_fast
<
Item
>
it
(
item_list
);
/* treat underlying fields like set by user names */
List_iterator_fast
<
Item
>
itc
(
item_list
);
if
(
item
->
real_item
()
->
type
()
==
Item
::
FIELD_ITEM
)
while
((
item
=
it
++
))
item
->
is_autogenerated_name
=
FALSE
;
itc
.
rewind
();
while
((
check
=
itc
++
)
&&
check
!=
item
)
{
{
Item
*
check
;
if
(
my_strcasecmp
(
system_charset_info
,
item
->
name
,
check
->
name
)
==
0
)
/* treat underlying fields like set by user names */
if
(
item
->
real_item
()
->
type
()
==
Item
::
FIELD_ITEM
)
item
->
is_autogenerated_name
=
FALSE
;
itc
.
rewind
();
while
((
check
=
itc
++
)
&&
check
!=
item
)
{
{
if
(
my_strcasecmp
(
system_charset_info
,
item
->
name
,
check
->
name
)
==
0
)
if
(
!
gen_unique_view_name
)
{
goto
err
;
if
(
!
gen_unique_view_name
)
if
(
item
->
is_autogenerated_name
)
{
make_unique_view_field_name
(
item
,
item_list
,
item
);
my_error
(
ER_DUP_FIELDNAME
,
MYF
(
0
),
item
->
name
);
else
if
(
check
->
is_autogenerated_name
)
DBUG_RETURN
(
TRUE
);
make_unique_view_field_name
(
check
,
item_list
,
item
);
}
else
else
if
(
item
->
is_autogenerated_name
)
goto
err
;
make_unique_view_field_name
(
item
,
item_list
,
item
);
else
if
(
check
->
is_autogenerated_name
)
make_unique_view_field_name
(
check
,
item_list
,
item
);
else
{
my_error
(
ER_DUP_FIELDNAME
,
MYF
(
0
),
item
->
name
);
DBUG_RETURN
(
TRUE
);
}
}
}
}
}
}
}
}
DBUG_RETURN
(
FALSE
);
DBUG_RETURN
(
FALSE
);
err:
my_error
(
ER_DUP_FIELDNAME
,
MYF
(
0
),
item
->
name
);
DBUG_RETURN
(
TRUE
);
}
}
...
...
sql/sql_yacc.yy
View file @
3eaa9535
...
@@ -8681,8 +8681,10 @@ union_list:
...
@@ -8681,8 +8681,10 @@ union_list:
}
}
select_init
select_init
{
{
/* Remove from the name resolution context stack the context of the
/*
last select in the union. */
Remove from the name resolution context stack the context of the
last select in the union.
*/
Lex->pop_context();
Lex->pop_context();
}
}
;
;
...
...
sql/table.cc
View file @
3eaa9535
...
@@ -2186,21 +2186,24 @@ bool st_table_list::is_leaf_for_name_resolution()
...
@@ -2186,21 +2186,24 @@ bool st_table_list::is_leaf_for_name_resolution()
reverse order.
reverse order.
RETURN
RETURN
-
If 'this' is a nested table reference - the left-most child of
If 'this' is a nested table reference - the left-most child of
the tree rooted in 'this',
the tree rooted in 'this',
- else -
'this'
else return
'this'
*/
*/
TABLE_LIST
*
st_table_list
::
first_leaf_for_name_resolution
()
TABLE_LIST
*
st_table_list
::
first_leaf_for_name_resolution
()
{
{
TABLE_LIST
*
cur_table_ref
=
this
;
TABLE_LIST
*
cur_table_ref
;
TABLE_LIST
*
next
;
NESTED_JOIN
*
cur_nested_join
;
NESTED_JOIN
*
cur_nested_join
=
nested_join
;
LINT_INIT
(
cur_table_ref
)
;
if
(
this
->
is_leaf_for_name_resolution
())
if
(
is_leaf_for_name_resolution
())
return
this
;
return
this
;
DBUG_ASSERT
(
nested_join
);
while
(
cur_nested_join
)
for
(
cur_nested_join
=
nested_join
;
cur_nested_join
;
cur_nested_join
=
cur_table_ref
->
nested_join
)
{
{
List_iterator_fast
<
TABLE_LIST
>
it
(
cur_nested_join
->
join_list
);
List_iterator_fast
<
TABLE_LIST
>
it
(
cur_nested_join
->
join_list
);
cur_table_ref
=
it
++
;
cur_table_ref
=
it
++
;
...
@@ -2210,12 +2213,12 @@ TABLE_LIST *st_table_list::first_leaf_for_name_resolution()
...
@@ -2210,12 +2213,12 @@ TABLE_LIST *st_table_list::first_leaf_for_name_resolution()
*/
*/
if
(
!
(
cur_table_ref
->
outer_join
&
JOIN_TYPE_RIGHT
))
if
(
!
(
cur_table_ref
->
outer_join
&
JOIN_TYPE_RIGHT
))
{
{
TABLE_LIST
*
next
;
while
((
next
=
it
++
))
while
((
next
=
it
++
))
cur_table_ref
=
next
;
cur_table_ref
=
next
;
}
}
if
(
cur_table_ref
->
is_leaf_for_name_resolution
())
if
(
cur_table_ref
->
is_leaf_for_name_resolution
())
break
;
break
;
cur_nested_join
=
cur_table_ref
->
nested_join
;
}
}
return
cur_table_ref
;
return
cur_table_ref
;
}
}
...
@@ -2247,13 +2250,16 @@ TABLE_LIST *st_table_list::first_leaf_for_name_resolution()
...
@@ -2247,13 +2250,16 @@ TABLE_LIST *st_table_list::first_leaf_for_name_resolution()
TABLE_LIST
*
st_table_list
::
last_leaf_for_name_resolution
()
TABLE_LIST
*
st_table_list
::
last_leaf_for_name_resolution
()
{
{
TABLE_LIST
*
cur_table_ref
=
this
;
TABLE_LIST
*
cur_table_ref
=
this
;
TABLE_LIST
*
next
;
NESTED_JOIN
*
cur_nested_join
;
NESTED_JOIN
*
cur_nested_join
=
nested_join
;
LINT_INIT
(
cur_table_ref
)
;
if
(
this
->
is_leaf_for_name_resolution
())
if
(
is_leaf_for_name_resolution
())
return
this
;
return
this
;
DBUG_ASSERT
(
nested_join
);
while
(
cur_nested_join
)
for
(
cur_nested_join
=
nested_join
;
cur_nested_join
;
cur_nested_join
=
cur_table_ref
->
nested_join
)
{
{
/*
/*
If 'this' is a RIGHT JOIN, the operands in 'join_list' are in reverse
If 'this' is a RIGHT JOIN, the operands in 'join_list' are in reverse
...
@@ -2262,6 +2268,7 @@ TABLE_LIST *st_table_list::last_leaf_for_name_resolution()
...
@@ -2262,6 +2268,7 @@ TABLE_LIST *st_table_list::last_leaf_for_name_resolution()
if
((
cur_table_ref
->
outer_join
&
JOIN_TYPE_RIGHT
))
if
((
cur_table_ref
->
outer_join
&
JOIN_TYPE_RIGHT
))
{
{
List_iterator_fast
<
TABLE_LIST
>
it
(
cur_nested_join
->
join_list
);
List_iterator_fast
<
TABLE_LIST
>
it
(
cur_nested_join
->
join_list
);
TABLE_LIST
*
next
;
cur_table_ref
=
it
++
;
cur_table_ref
=
it
++
;
while
((
next
=
it
++
))
while
((
next
=
it
++
))
cur_table_ref
=
next
;
cur_table_ref
=
next
;
...
@@ -2270,7 +2277,6 @@ TABLE_LIST *st_table_list::last_leaf_for_name_resolution()
...
@@ -2270,7 +2277,6 @@ TABLE_LIST *st_table_list::last_leaf_for_name_resolution()
cur_table_ref
=
cur_nested_join
->
join_list
.
head
();
cur_table_ref
=
cur_nested_join
->
join_list
.
head
();
if
(
cur_table_ref
->
is_leaf_for_name_resolution
())
if
(
cur_table_ref
->
is_leaf_for_name_resolution
())
break
;
break
;
cur_nested_join
=
cur_table_ref
->
nested_join
;
}
}
return
cur_table_ref
;
return
cur_table_ref
;
}
}
...
@@ -2306,11 +2312,8 @@ const char *Natural_join_column::name()
...
@@ -2306,11 +2312,8 @@ const char *Natural_join_column::name()
DBUG_ASSERT
(
table_field
==
NULL
);
DBUG_ASSERT
(
table_field
==
NULL
);
return
view_field
->
name
;
return
view_field
->
name
;
}
}
else
{
return
table_field
->
field_name
;
DBUG_ASSERT
(
view_field
==
NULL
);
return
table_field
->
field_name
;
}
}
}
...
@@ -2319,13 +2322,10 @@ Item *Natural_join_column::create_item(THD *thd)
...
@@ -2319,13 +2322,10 @@ Item *Natural_join_column::create_item(THD *thd)
if
(
view_field
)
if
(
view_field
)
{
{
DBUG_ASSERT
(
table_field
==
NULL
);
DBUG_ASSERT
(
table_field
==
NULL
);
return
create_view_field
(
thd
,
table_ref
,
&
view_field
->
item
,
view_field
->
name
);
return
create_view_field
(
thd
,
table_ref
,
&
view_field
->
item
,
}
view_field
->
name
);
else
{
DBUG_ASSERT
(
view_field
==
NULL
);
return
new
Item_field
(
thd
,
&
thd
->
lex
->
current_select
->
context
,
table_field
);
}
}
return
new
Item_field
(
thd
,
&
thd
->
lex
->
current_select
->
context
,
table_field
);
}
}
...
@@ -2336,31 +2336,29 @@ Field *Natural_join_column::field()
...
@@ -2336,31 +2336,29 @@ Field *Natural_join_column::field()
DBUG_ASSERT
(
table_field
==
NULL
);
DBUG_ASSERT
(
table_field
==
NULL
);
return
NULL
;
return
NULL
;
}
}
else
return
table_field
;
{
DBUG_ASSERT
(
view_field
==
NULL
);
return
table_field
;
}
}
}
const
char
*
Natural_join_column
::
table_name
()
const
char
*
Natural_join_column
::
table_name
()
{
{
return
table_ref
->
alias
;
return
table_ref
->
alias
;
/*
/*
TODO: I think that it is sufficient to return just
TODO:
table->alias, which is correctly set to either
I think that it is sufficient to return just
the view name, the table name, or the alias to
table->alias, which is correctly set to either
the table reference (view or stored table).
the view name, the table name, or the alias to
the table reference (view or stored table).
*/
#ifdef NOT_YET
if
(
view_field
)
if
(
view_field
)
return
table_ref
->
view_name
.
str
;
return
table_ref
->
view_name
.
str
;
else
{
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
table_name
,
DBUG_ASSERT(!strcmp(table_ref->table_name,
table_ref
->
table
->
s
->
table_name
));
table_ref->table->s->table_name));
return
table_ref
->
table_name
;
return table_ref->table_name;
}
}
#endif
*/
}
}
...
@@ -2368,12 +2366,10 @@ const char *Natural_join_column::db_name()
...
@@ -2368,12 +2366,10 @@ const char *Natural_join_column::db_name()
{
{
if
(
view_field
)
if
(
view_field
)
return
table_ref
->
view_db
.
str
;
return
table_ref
->
view_db
.
str
;
else
{
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
db
,
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
db
,
table_ref
->
table
->
s
->
db
));
table_ref
->
table
->
s
->
db
));
return
table_ref
->
db
;
return
table_ref
->
db
;
}
}
}
...
@@ -2381,8 +2377,7 @@ GRANT_INFO *Natural_join_column::grant()
...
@@ -2381,8 +2377,7 @@ GRANT_INFO *Natural_join_column::grant()
{
{
if
(
view_field
)
if
(
view_field
)
return
&
(
table_ref
->
grant
);
return
&
(
table_ref
->
grant
);
else
return
&
(
table_ref
->
table
->
grant
);
return
&
(
table_ref
->
table
->
grant
);
}
}
...
@@ -2402,16 +2397,17 @@ GRANT_INFO *Natural_join_column::grant()
...
@@ -2402,16 +2397,17 @@ GRANT_INFO *Natural_join_column::grant()
it is a view or a stored table colum.
it is a view or a stored table colum.
RETURN
RETURN
FALSE
- if t
he column can be accessed
FALSE
T
he column can be accessed
TRUE
- if t
here are no access rights to all equivalent columns
TRUE
T
here are no access rights to all equivalent columns
*/
*/
bool
bool
Natural_join_column
::
check_grants
(
THD
*
thd
,
const
char
*
name
,
uint
length
)
Natural_join_column
::
check_grants
(
THD
*
thd
,
const
char
*
name
,
uint
length
)
{
{
GRANT_INFO
*
grant
=
NULL
;
/* If NULL do not check access rights. */
GRANT_INFO
*
grant
;
const
char
*
db_name
;
const
char
*
db_name
;
const
char
*
table_name
;
const
char
*
table_name
;
if
(
view_field
)
if
(
view_field
)
{
{
DBUG_ASSERT
(
table_field
==
NULL
);
DBUG_ASSERT
(
table_field
==
NULL
);
...
@@ -2544,7 +2540,6 @@ void Field_iterator_table_ref::set_field_iterator()
...
@@ -2544,7 +2540,6 @@ void Field_iterator_table_ref::set_field_iterator()
(
!
table_ref
->
field_translation
&&
(
!
table_ref
->
field_translation
&&
table_ref
->
join_columns
->
elements
==
table_ref
->
join_columns
->
elements
==
table_ref
->
table
->
s
->
fields
)));
table_ref
->
table
->
s
->
fields
)));
natural_join_it
.
set
(
table_ref
);
field_it
=
&
natural_join_it
;
field_it
=
&
natural_join_it
;
DBUG_PRINT
(
"info"
,(
"field_it for '%s' is Field_iterator_natural_join"
,
DBUG_PRINT
(
"info"
,(
"field_it for '%s' is Field_iterator_natural_join"
,
table_ref
->
table_name
));
table_ref
->
table_name
));
...
@@ -2554,7 +2549,6 @@ void Field_iterator_table_ref::set_field_iterator()
...
@@ -2554,7 +2549,6 @@ void Field_iterator_table_ref::set_field_iterator()
{
{
DBUG_ASSERT
(
table_ref
->
view
&&
DBUG_ASSERT
(
table_ref
->
view
&&
table_ref
->
effective_algorithm
==
VIEW_ALGORITHM_MERGE
);
table_ref
->
effective_algorithm
==
VIEW_ALGORITHM_MERGE
);
view_field_it
.
set
(
table_ref
);
field_it
=
&
view_field_it
;
field_it
=
&
view_field_it
;
DBUG_PRINT
(
"info"
,
(
"field_it for '%s' is Field_iterator_view"
,
DBUG_PRINT
(
"info"
,
(
"field_it for '%s' is Field_iterator_view"
,
table_ref
->
table_name
));
table_ref
->
table_name
));
...
@@ -2563,12 +2557,11 @@ void Field_iterator_table_ref::set_field_iterator()
...
@@ -2563,12 +2557,11 @@ void Field_iterator_table_ref::set_field_iterator()
else
else
{
{
DBUG_ASSERT
(
table_ref
->
table
||
table_ref
->
view
);
DBUG_ASSERT
(
table_ref
->
table
||
table_ref
->
view
);
table_field_it
.
set
(
table_ref
);
field_it
=
&
table_field_it
;
field_it
=
&
table_field_it
;
DBUG_PRINT
(
"info"
,
(
"field_it for '%s' is Field_iterator_table"
,
DBUG_PRINT
(
"info"
,
(
"field_it for '%s' is Field_iterator_table"
,
table_ref
->
table_name
));
table_ref
->
table_name
));
}
}
field_it
->
set
(
table_ref
);
DBUG_VOID_RETURN
;
DBUG_VOID_RETURN
;
}
}
...
@@ -2607,12 +2600,10 @@ const char *Field_iterator_table_ref::table_name()
...
@@ -2607,12 +2600,10 @@ const char *Field_iterator_table_ref::table_name()
return
table_ref
->
view_name
.
str
;
return
table_ref
->
view_name
.
str
;
else
if
(
table_ref
->
is_natural_join
)
else
if
(
table_ref
->
is_natural_join
)
return
natural_join_it
.
column_ref
()
->
table_name
();
return
natural_join_it
.
column_ref
()
->
table_name
();
else
{
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
table_name
,
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
table_name
,
table_ref
->
table
->
s
->
table_name
));
table_ref
->
table
->
s
->
table_name
));
return
table_ref
->
table_name
;
return
table_ref
->
table_name
;
}
}
}
...
@@ -2622,11 +2613,9 @@ const char *Field_iterator_table_ref::db_name()
...
@@ -2622,11 +2613,9 @@ const char *Field_iterator_table_ref::db_name()
return
table_ref
->
view_db
.
str
;
return
table_ref
->
view_db
.
str
;
else
if
(
table_ref
->
is_natural_join
)
else
if
(
table_ref
->
is_natural_join
)
return
natural_join_it
.
column_ref
()
->
db_name
();
return
natural_join_it
.
column_ref
()
->
db_name
();
else
{
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
db
,
table_ref
->
table
->
s
->
db
));
DBUG_ASSERT
(
!
strcmp
(
table_ref
->
db
,
table_ref
->
table
->
s
->
db
));
return
table_ref
->
db
;
return
table_ref
->
db
;
}
}
}
...
@@ -2636,8 +2625,7 @@ GRANT_INFO *Field_iterator_table_ref::grant()
...
@@ -2636,8 +2625,7 @@ GRANT_INFO *Field_iterator_table_ref::grant()
return
&
(
table_ref
->
grant
);
return
&
(
table_ref
->
grant
);
else
if
(
table_ref
->
is_natural_join
)
else
if
(
table_ref
->
is_natural_join
)
return
natural_join_it
.
column_ref
()
->
grant
();
return
natural_join_it
.
column_ref
()
->
grant
();
else
return
&
(
table_ref
->
table
->
grant
);
return
&
(
table_ref
->
table
->
grant
);
}
}
...
@@ -2645,8 +2633,7 @@ bool Field_iterator_table_ref::is_coalesced()
...
@@ -2645,8 +2633,7 @@ bool Field_iterator_table_ref::is_coalesced()
{
{
if
(
table_ref
->
is_natural_join
)
if
(
table_ref
->
is_natural_join
)
return
natural_join_it
.
column_ref
()
->
is_coalesced
;
return
natural_join_it
.
column_ref
()
->
is_coalesced
;
else
return
FALSE
;
return
FALSE
;
}
}
/*
/*
...
@@ -2663,29 +2650,30 @@ bool Field_iterator_table_ref::is_coalesced()
...
@@ -2663,29 +2650,30 @@ bool Field_iterator_table_ref::is_coalesced()
TODO
TODO
RETURN
RETURN
Pointer to a column of a natural join (or its operand)
#
Pointer to a column of a natural join (or its operand)
NULL
if there was n
o memory to allocate the column
NULL
N
o memory to allocate the column
*/
*/
Natural_join_column
*
Natural_join_column
*
Field_iterator_table_ref
::
get_or_create_column_ref
(
THD
*
thd
,
bool
*
is_created
)
Field_iterator_table_ref
::
get_or_create_column_ref
(
THD
*
thd
,
bool
*
is_created
)
{
{
Natural_join_column
*
nj_col
;
*
is_created
=
TRUE
;
*
is_created
=
TRUE
;
if
(
field_it
==
&
table_field_it
)
if
(
field_it
==
&
table_field_it
)
return
new
Natural_join_column
(
table_field_it
.
field
(),
table_ref
);
return
new
Natural_join_column
(
table_field_it
.
field
(),
table_ref
);
else
if
(
field_it
==
&
view_field_it
)
if
(
field_it
==
&
view_field_it
)
return
new
Natural_join_column
(
view_field_it
.
field_translator
(),
table_ref
);
return
new
Natural_join_column
(
view_field_it
.
field_translator
(),
else
table_ref
);
{
/*
/*
This is NATURAL join, we already have created a column reference,
This is NATURAL join, we already have created a column reference,
so just return it.
so just return it.
*/
*/
*
is_created
=
FALSE
;
*
is_created
=
FALSE
;
Natural_join_column
*
nj_col
=
natural_join_it
.
column_ref
();
nj_col
=
natural_join_it
.
column_ref
();
DBUG_ASSERT
(
nj_col
);
DBUG_ASSERT
(
nj_col
);
return
nj_col
;
return
nj_col
;
}
}
}
...
...
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