summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorSergey Glukhov <Sergey.Glukhov@sun.com>2008-12-24 19:24:11 +0400
committerSergey Glukhov <Sergey.Glukhov@sun.com>2008-12-24 19:24:11 +0400
commitce985aa36e2fb9cb036ae66376bf3c0dfab433be (patch)
treefdc0f2ea6cae40151c879a4a9e0fc6abfded9632 /sql
parent7103f4c91631dd1e725996429a6f8ccaf4d844d8 (diff)
downloadmariadb-git-ce985aa36e2fb9cb036ae66376bf3c0dfab433be.tar.gz
Bug#40953 SELECT query throws "ERROR 1062 (23000): Duplicate entry..." error
Table could be marked dependent because it is either 1) an inner table of an outer join, or 2) it is a part of STRAIGHT_JOIN. In case of STRAIGHT_JOIN table->maybe_null should not be assigned. The fix is to set st_table::maybe_null to 'true' only for those tables which are used in outer join. mysql-test/r/select.result: test result mysql-test/t/select.test: test case sql/sql_select.cc: Table could be marked dependent because it is either 1) an inner table of an outer join, or 2) it is a part of STRAIGHT_JOIN. In case of STRAIGHT_JOIN table->maybe_null should not be assigned. The fix is to set st_table::maybe_null to 'true' only for those tables which are used in outer join. sql/sql_select.h: added comment
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_select.cc2
-rw-r--r--sql/sql_select.h6
2 files changed, 6 insertions, 2 deletions
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d2c469f99da..230b9bb36cf 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2489,7 +2489,7 @@ make_join_statistics(JOIN *join, TABLE_LIST *tables, COND *conds,
if (s->dependent & table->map)
s->dependent |= table->reginfo.join_tab->dependent;
}
- if (s->dependent)
+ if (outer_join & s->table->map)
s->table->maybe_null= 1;
}
/* Catch illegal cross references for outer joins */
diff --git a/sql/sql_select.h b/sql/sql_select.h
index c2f0780f5be..8ece01d3286 100644
--- a/sql/sql_select.h
+++ b/sql/sql_select.h
@@ -235,7 +235,11 @@ public:
fetching data from a cursor
*/
bool resume_nested_loop;
- table_map const_table_map,found_const_table_map,outer_join;
+ table_map const_table_map,found_const_table_map;
+ /*
+ Bitmap of all inner tables from outer joins
+ */
+ table_map outer_join;
ha_rows send_records,found_records,examined_rows,row_limit, select_limit;
/*
Used to fetch no more than given amount of rows per one