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
0fa08520
Commit
0fa08520
authored
Jul 06, 2004
by
bell@sanja.is.com.ua
Browse files
Options
Browse Files
Download
Plain Diff
Merge sanja.is.com.ua:/home/bell/mysql/bk/mysql-5.0
into sanja.is.com.ua:/home/bell/mysql/bk/work-5.0
parents
731c2aca
1b54d08a
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
161 additions
and
127 deletions
+161
-127
mysql-test/r/join_nested.result
mysql-test/r/join_nested.result
+47
-22
mysql-test/t/join_nested.test
mysql-test/t/join_nested.test
+21
-12
sql/sql_lex.h
sql/sql_lex.h
+1
-1
sql/sql_select.cc
sql/sql_select.cc
+84
-86
sql/table.h
sql/table.h
+8
-6
No files found.
mysql-test/r/join_nested.result
View file @
0fa08520
This diff is collapsed.
Click to expand it.
mysql-test/t/join_nested.test
View file @
0fa08520
--
disable_warnings
DROP
TABLE
IF
EXISTS
t0
,
t1
,
t2
,
t3
,
t4
,
t5
,
t6
,
t7
,
t8
,
t9
;
--
enable_warnings
CREATE
TABLE
t0
(
a
int
,
b
int
,
c
int
);
CREATE
TABLE
t1
(
a
int
,
b
int
,
c
int
);
...
...
@@ -49,7 +50,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
(
t3
,
t4
)
ON
t3
.
a
=
1
AND
t2
.
b
=
t4
.
b
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
FROM
t2
LEFT
JOIN
...
...
@@ -83,7 +84,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
(
t3
,
t4
,
t5
)
ON
t2
.
b
=
t4
.
b
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
FROM
t2
LEFT
JOIN
...
...
@@ -98,7 +99,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,t5.a,t5.b
ON
t2
.
b
=
t4
.
b
WHERE
t3
.
a
>
1
OR
t3
.
c
IS
NULL
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
FROM
t2
LEFT
JOIN
...
...
@@ -127,7 +128,7 @@ SELECT t6.a,t6.b,t7.a,t7.b
SELECT
t8
.
a
,
t8
.
b
FROM
t8
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
FROM
t6
,
t7
...
...
@@ -267,7 +268,7 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
SELECT
t0
.
a
,
t0
.
b
FROM
t0
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
FROM
t0
,
t1
...
...
@@ -322,7 +323,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
t0
.
b
=
t1
.
b
AND
(
t2
.
a
>=
4
OR
t2
.
c
IS
NULL
);
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
,
t9
.
a
,
t9
.
b
FROM
t0
,
t1
...
...
@@ -457,9 +458,17 @@ SELECT t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
ON
t3
.
a
=
1
AND
t2
.
b
=
t4
.
b
WHERE
t1
.
a
<=
2
;
EXPLAIN
EXTENDED
SELECT
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
FROM
t1
,
t3
,
t4
RIGHT
JOIN
t2
ON
t3
.
a
=
1
AND
t2
.
b
=
t4
.
b
WHERE
t1
.
a
<=
2
;
CREATE
INDEX
idx_b
ON
t2
(
b
);
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
FROM
t3
,
t4
LEFT
JOIN
...
...
@@ -472,7 +481,7 @@ SELECT t2.a,t2.b,t3.a,t3.b,t4.a,t4.b
(
t1
,
t2
)
ON
t3
.
a
=
1
AND
t3
.
b
=
t2
.
b
AND
t2
.
b
=
t4
.
b
;
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
,
t9
.
a
,
t9
.
b
FROM
t0
,
t1
...
...
@@ -512,7 +521,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE
INDEX
idx_b
ON
t4
(
b
);
CREATE
INDEX
idx_b
ON
t5
(
b
);
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
,
t9
.
a
,
t9
.
b
FROM
t0
,
t1
...
...
@@ -551,7 +560,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE
INDEX
idx_b
ON
t8
(
b
);
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
,
t9
.
a
,
t9
.
b
FROM
t0
,
t1
...
...
@@ -591,7 +600,7 @@ SELECT t0.a,t0.b,t1.a,t1.b,t2.a,t2.b,t3.a,t3.b,t4.a,t4.b,
CREATE
INDEX
idx_b
ON
t1
(
b
);
CREATE
INDEX
idx_a
ON
t0
(
a
);
EXPLAIN
EXPLAIN
EXTENDED
SELECT
t0
.
a
,
t0
.
b
,
t1
.
a
,
t1
.
b
,
t2
.
a
,
t2
.
b
,
t3
.
a
,
t3
.
b
,
t4
.
a
,
t4
.
b
,
t5
.
a
,
t5
.
b
,
t6
.
a
,
t6
.
b
,
t7
.
a
,
t7
.
b
,
t8
.
a
,
t8
.
b
,
t9
.
a
,
t9
.
b
FROM
t0
,
t1
...
...
sql/sql_lex.h
View file @
0fa08520
...
...
@@ -417,7 +417,7 @@ class st_select_lex: public st_select_lex_node
List
<
Item_func_match
>
ftfunc_list_alloc
;
JOIN
*
join
;
/* after JOIN::prepare it is pointer to corresponding JOIN */
List
<
TABLE_LIST
>
top_join_list
;
/* join list of the top level */
List
<
TABLE_LIST
>
*
join_list
;
/* list for the currently parsed join */
List
<
TABLE_LIST
>
*
join_list
;
/* list for the currently parsed join */
TABLE_LIST
*
embedding
;
/* table embedding to the above list */
const
char
*
type
;
/* type of select for EXPLAIN */
...
...
sql/sql_select.cc
View file @
0fa08520
...
...
@@ -11178,6 +11178,88 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
}
/*
Print joins from the FROM clause
SYNOPSIS
print_join()
thd thread handler
str string where table should bbe printed
tables list of tables in join
*/
static
void
print_join
(
THD
*
thd
,
String
*
str
,
List
<
TABLE_LIST
>
*
tables
)
{
/* List is reversed => we should reverse it before using */
List_iterator_fast
<
TABLE_LIST
>
ti
(
*
tables
);
TABLE_LIST
**
table
=
(
TABLE_LIST
**
)
thd
->
alloc
(
sizeof
(
TABLE_LIST
*
)
*
tables
->
elements
);
if
(
table
==
0
)
return
;
// out of memory
for
(
TABLE_LIST
**
t
=
table
+
(
tables
->
elements
-
1
);
t
>=
table
;
t
--
)
*
t
=
ti
++
;
DBUG_ASSERT
(
tables
->
elements
>=
1
);
(
*
table
)
->
print
(
thd
,
str
);
TABLE_LIST
**
end
=
table
+
tables
->
elements
;
for
(
TABLE_LIST
**
tbl
=
table
+
1
;
tbl
<
end
;
tbl
++
)
{
TABLE_LIST
*
curr
=
*
tbl
;
if
(
curr
->
outer_join
)
str
->
append
(
" left join "
,
11
);
// MySQL converg right to left joins
else
if
(
curr
->
straight
)
str
->
append
(
" straight_join "
,
15
);
else
str
->
append
(
" join "
,
6
);
curr
->
print
(
thd
,
str
);
if
(
curr
->
on_expr
)
{
str
->
append
(
" on("
,
4
);
curr
->
on_expr
->
print
(
str
);
str
->
append
(
')'
);
}
}
}
/*
Print table as it should be in join list
SYNOPSIS
st_table_list::print();
str string where table should bbe printed
*/
void
st_table_list
::
print
(
THD
*
thd
,
String
*
str
)
{
if
(
nested_join
)
{
str
->
append
(
'('
);
print_join
(
thd
,
str
,
&
nested_join
->
join_list
);
str
->
append
(
')'
);
}
else
if
(
derived
)
{
str
->
append
(
'('
);
derived
->
print
(
str
);
str
->
append
(
") "
,
2
);
str
->
append
(
alias
);
}
else
{
str
->
append
(
db
);
str
->
append
(
'.'
);
str
->
append
(
real_name
);
if
(
my_strcasecmp
(
table_alias_charset
,
real_name
,
alias
))
{
str
->
append
(
' '
);
str
->
append
(
alias
);
}
}
}
void
st_select_lex
::
print
(
THD
*
thd
,
String
*
str
)
{
if
(
!
thd
)
...
...
@@ -11226,92 +11308,8 @@ void st_select_lex::print(THD *thd, String *str)
if
(
table_list
.
elements
)
{
str
->
append
(
" from "
,
6
);
for
(
TABLE_LIST
*
table
=
(
TABLE_LIST
*
)
table_list
.
first
;
table
;
table
=
table
->
next
)
{
TABLE_LIST
*
embedded
=
table
;
TABLE_LIST
*
embedding
=
table
->
embedding
;
while
(
embedding
)
{
TABLE_LIST
*
next
;
NESTED_JOIN
*
nested_join
=
table
->
embedding
->
nested_join
;
List_iterator_fast
<
TABLE_LIST
>
it
(
nested_join
->
join_list
);
TABLE_LIST
*
tab
=
it
++
;
while
((
next
=
it
++
))
tab
=
next
;
if
(
tab
!=
embedded
)
break
;
str
->
append
(
'('
);
if
(
embedded
->
outer_join
&
JOIN_TYPE_RIGHT
)
str
->
append
(
" right join "
,
12
);
else
if
(
embedded
->
outer_join
&
JOIN_TYPE_LEFT
)
str
->
append
(
" left join "
,
11
);
else
if
(
embedded
->
straight
)
str
->
append
(
" straight_join "
,
15
);
else
str
->
append
(
" join "
,
6
);
embedded
=
embedding
;
embedding
=
embedding
->
embedding
;
}
if
(
table
->
derived
)
{
str
->
append
(
'('
);
table
->
derived
->
print
(
str
);
str
->
append
(
") "
);
str
->
append
(
table
->
alias
);
}
else
{
str
->
append
(
table
->
db
);
str
->
append
(
'.'
);
str
->
append
(
table
->
real_name
);
if
(
my_strcasecmp
(
table_alias_charset
,
table
->
real_name
,
table
->
alias
))
{
str
->
append
(
' '
);
str
->
append
(
table
->
alias
);
}
}
if
(
table
->
on_expr
)
{
str
->
append
(
" on("
,
4
);
table
->
on_expr
->
print
(
str
);
str
->
append
(
')'
);
}
TABLE_LIST
*
next_table
;
if
((
next_table
=
table
->
next
))
{
if
(
next_table
->
outer_join
&
JOIN_TYPE_RIGHT
)
str
->
append
(
" right join "
,
12
);
else
if
(
next_table
->
outer_join
&
JOIN_TYPE_LEFT
)
str
->
append
(
" left join "
,
11
);
else
if
(
next_table
->
straight
)
str
->
append
(
" straight_join "
,
15
);
else
str
->
append
(
" join "
,
6
);
}
embedded
=
table
;
embedding
=
table
->
embedding
;
while
(
embedding
)
{
NESTED_JOIN
*
nested_join
=
table
->
embedding
->
nested_join
;
if
(
nested_join
->
join_list
.
head
()
!=
embedded
)
break
;
str
->
append
(
')'
);
if
(
embedding
->
on_expr
)
{
str
->
append
(
" on("
,
4
);
embedding
->
on_expr
->
print
(
str
);
str
->
append
(
')'
);
}
embedded
=
embedding
;
embedding
=
embedding
->
embedding
;
}
}
/* go through join tree */
print_join
(
thd
,
str
,
&
top_join_list
);
}
// Where
...
...
sql/table.h
View file @
0fa08520
...
...
@@ -173,11 +173,11 @@ typedef struct st_table_list
{
struct
st_table_list
*
next
;
char
*
db
,
*
alias
,
*
real_name
;
char
*
option
;
/* Used by cache index */
char
*
option
;
/* Used by cache index */
Item
*
on_expr
;
/* Used with outer join */
struct
st_table_list
*
natural_join
;
/* natural join on this table*/
/* ... join ... USE INDEX ... IGNORE INDEX */
List
<
String
>
*
use_index
,
*
ignore_index
;
List
<
String
>
*
use_index
,
*
ignore_index
;
TABLE
*
table
;
/* opened table */
st_table_list
*
table_list
;
/* pointer to node of list of all tables */
class
st_select_lex_unit
*
derived
;
/* SELECT_LEX_UNIT of derived table */
...
...
@@ -191,24 +191,26 @@ typedef struct st_table_list
bool
force_index
;
/* prefer index over table scan */
bool
ignore_leaves
;
/* preload only non-leaf nodes */
table_map
dep_tables
;
/* tables the table depends on */
table_map
on_expr_dep_tables
;
/* tables on expression depends on */
table_map
on_expr_dep_tables
;
/* tables on expression depends on */
struct
st_nested_join
*
nested_join
;
/* if the element is a nested join */
st_table_list
*
embedding
;
/* nested join containing the table */
List
<
struct
st_table_list
>
*
join_list
;
/* join list the table belongs to */
List
<
struct
st_table_list
>
*
join_list
;
/* join list the table belongs to */
bool
cacheable_table
;
/* stop PS caching */
/* used in multi-upd privelege check */
bool
table_in_update_from_clause
;
void
print
(
THD
*
thd
,
String
*
str
);
}
TABLE_LIST
;
typedef
struct
st_nested_join
{
List
<
TABLE_LIST
>
join_list
;
/* list of elements in the nested join */
table_map
used_tables
;
/* bitmap of tables in the nested join */
table_map
not_null_tables
;
/* tables that rejects nulls */
table_map
not_null_tables
;
/* tables that rejects nulls */
struct
st_join_table
*
first_nested
;
/* the first nested table in the plan */
uint
counter
;
/* to count tables in the nested join */
}
NESTED_JOIN
;
typedef
struct
st_changed_table_list
{
struct
st_changed_table_list
*
next
;
...
...
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