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
fd01314c
Commit
fd01314c
authored
Mar 19, 2004
by
ram@gw.mysql.r18.ru
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix for the bug #2976: NATURAL JOIN produces duplicate columns.
Improvement natural join code in the setup_conds().
parent
fc17aad7
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
41 deletions
+46
-41
mysql-test/r/join.result
mysql-test/r/join.result
+3
-3
mysql-test/r/join_outer.result
mysql-test/r/join_outer.result
+6
-6
mysql-test/r/select.result
mysql-test/r/select.result
+4
-4
sql/sql_base.cc
sql/sql_base.cc
+33
-28
No files found.
mysql-test/r/join.result
View file @
fd01314c
...
...
@@ -277,11 +277,11 @@ CREATE TABLE t2 (ID INTEGER NOT NULL PRIMARY KEY, Value2 VARCHAR(255));
INSERT INTO t1 VALUES (1, 'A');
INSERT INTO t2 VALUES (1, 'B');
SELECT * FROM t1 NATURAL JOIN t2 WHERE 1 AND (Value1 = 'A' AND Value2 <> 'B');
ID Value1
ID
Value2
ID Value1 Value2
SELECT * FROM t1 NATURAL JOIN t2 WHERE 1 AND Value1 = 'A' AND Value2 <> 'B';
ID Value1
ID
Value2
ID Value1 Value2
SELECT * FROM t1 NATURAL JOIN t2 WHERE (Value1 = 'A' AND Value2 <> 'B') AND 1;
ID Value1
ID
Value2
ID Value1 Value2
drop table t1,t2;
create table t1 (i int);
create table t2 (i int);
...
...
mysql-test/r/join_outer.result
View file @
fd01314c
...
...
@@ -124,8 +124,8 @@ grp a c id a c d
3 5 C 3 5 B 5
3 6 D 3 6 C 6
select t1.*,t2.* from t1 natural join t2;
grp a c id
a c
d
1 1 a 1 1
a 1
grp a c id d
1 1 a 1 1
drop table t1,t2;
CREATE TABLE t1 (
usr_id INT unsigned NOT NULL,
...
...
@@ -467,10 +467,10 @@ count color
15 white
7 green
select * from t2 natural join t1;
count color
color
name
10 green
green
lime
7 green
green
lime
5 black
black
grape
count color name
10 green lime
7 green lime
5 black grape
select t2.count, t1.name from t2 natural join t1;
count name
10 lime
...
...
mysql-test/r/select.result
View file @
fd01314c
...
...
@@ -2279,10 +2279,10 @@ a a a
2 2 2
3 3 3
select * from t1 natural join (t1 as t2 left join t1 as t3 using (a));
a a
a
1 1
1
2 2
2
3 3
3
a a
1 1
2 2
3 3
select * from (t1 as t2 left join t1 as t3 using (a)) natural join t1;
a a a
1 1 1
...
...
sql/sql_base.cc
View file @
fd01314c
...
...
@@ -2292,12 +2292,21 @@ insert_fields(THD *thd,TABLE_LIST *tables, const char *db_name,
Field
**
ptr
=
table
->
field
,
*
field
;
thd
->
used_tables
|=
table
->
map
;
while
((
field
=
*
ptr
++
))
{
/* Skip duplicate field names if NATURAL JOIN is used */
if
(
table
->
outer_join
||
!
tables
->
natural_join
||
tables
->
natural_join
->
table
->
outer_join
||
!
find_field_in_table
(
thd
,
tables
->
natural_join
->
table
,
field
->
field_name
,
strlen
(
field
->
field_name
),
0
,
0
))
{
Item_field
*
item
=
new
Item_field
(
field
);
if
(
!
found
++
)
(
void
)
it
->
replace
(
item
);
// Replace '*'
else
it
->
after
(
item
);
}
/*
Mark if field used before in this select.
Used by 'insert' to verify if a field name is used twice
...
...
@@ -2377,29 +2386,25 @@ int setup_conds(THD *thd,TABLE_LIST *tables,COND **conds)
DBUG_RETURN
(
1
);
cond_and
->
top_level_item
();
uint
i
,
j
;
for
(
i
=
0
;
i
<
t1
->
fields
;
i
++
)
{
// TODO: This could be optimized to use hashed names if t2 had a hash
for
(
j
=
0
;
j
<
t2
->
fields
;
j
++
)
Field
**
t1_field
,
*
t2_field
;
for
(
t1_field
=
t1
->
field
;
(
*
t1_field
);
t1_field
++
)
{
if
(
!
my_strcasecmp
(
system_charset_info
,
t1
->
field
[
i
]
->
field_name
,
t2
->
field
[
j
]
->
field_name
))
const
char
*
t1_field_name
=
(
*
t1_field
)
->
field_name
;
if
((
t2_field
=
find_field_in_table
(
thd
,
t2
,
t1_field_name
,
strlen
(
t1_field_name
),
0
,
0
)))
{
Item_func_eq
*
tmp
=
new
Item_func_eq
(
new
Item_field
(
t1
->
field
[
i
]
),
new
Item_field
(
t2
->
field
[
j
]
));
Item_func_eq
*
tmp
=
new
Item_func_eq
(
new
Item_field
(
*
t1_field
),
new
Item_field
(
t2_field
));
if
(
!
tmp
)
DBUG_RETURN
(
1
);
tmp
->
fix_length_and_dec
();
// Update cmp_type
tmp
->
const_item_cache
=
0
;
tmp
->
const_item_cache
=
0
;
/* Mark field used for table cache */
t1
->
field
[
i
]
->
query_id
=
t2
->
field
[
j
]
->
query_id
=
thd
->
query_id
;
(
*
t1_field
)
->
query_id
=
t2_field
->
query_id
=
thd
->
query_id
;
cond_and
->
list
.
push_back
(
tmp
);
t1
->
used_keys
.
intersect
(
t1
->
field
[
i
]
->
part_of_key
);
t2
->
used_keys
.
intersect
(
t2
->
field
[
j
]
->
part_of_key
);
break
;
}
t1
->
used_keys
.
intersect
((
*
t1_field
)
->
part_of_key
);
t2
->
used_keys
.
intersect
(
t2_field
->
part_of_key
);
}
}
cond_and
->
used_tables_cache
=
t1
->
map
|
t2
->
map
;
...
...
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