Commit bd980424 authored by unknown's avatar unknown

data0data.ic, data0data.h, row0sel.c:

  Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many


innobase/row/row0sel.c:
  Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
innobase/include/data0data.h:
  Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
innobase/include/data0data.ic:
  Fix bug #2483 with InnoDB, UNIQUE secondary index, and NULL values in that unique index; with the IS NULL predicate, InnoDB returned only the first matching row, though there can be many
parent 4db4ffef
...@@ -262,6 +262,14 @@ dtuple_set_types_binary( ...@@ -262,6 +262,14 @@ dtuple_set_types_binary(
/*====================*/ /*====================*/
dtuple_t* tuple, /* in: data tuple */ dtuple_t* tuple, /* in: data tuple */
ulint n); /* in: number of fields to set */ ulint n); /* in: number of fields to set */
/**************************************************************************
Checks if a dtuple contains an SQL null value. */
UNIV_INLINE
ibool
dtuple_contains_null(
/*=================*/
/* out: TRUE if some field is SQL null */
dtuple_t* tuple); /* in: dtuple */
/************************************************************** /**************************************************************
Checks that a data field is typed. Asserts an error if not. */ Checks that a data field is typed. Asserts an error if not. */
......
...@@ -406,3 +406,28 @@ data_write_sql_null( ...@@ -406,3 +406,28 @@ data_write_sql_null(
data[j] = '\0'; data[j] = '\0';
} }
} }
/**************************************************************************
Checks if a dtuple contains an SQL null value. */
UNIV_INLINE
ibool
dtuple_contains_null(
/*=================*/
/* out: TRUE if some field is SQL null */
dtuple_t* tuple) /* in: dtuple */
{
ulint n;
ulint i;
n = dtuple_get_n_fields(tuple);
for (i = 0; i < n; i++) {
if (dfield_get_len(dtuple_get_nth_field(tuple, i))
== UNIV_SQL_NULL) {
return(TRUE);
}
}
return(FALSE);
}
\ No newline at end of file
...@@ -2818,7 +2818,16 @@ row_search_for_mysql( ...@@ -2818,7 +2818,16 @@ row_search_for_mysql(
if (match_mode == ROW_SEL_EXACT if (match_mode == ROW_SEL_EXACT
&& index->type & DICT_UNIQUE && index->type & DICT_UNIQUE
&& dtuple_get_n_fields(search_tuple) && dtuple_get_n_fields(search_tuple)
== dict_index_get_n_unique(index)) { == dict_index_get_n_unique(index)
&& (index->type & DICT_CLUSTERED
|| !dtuple_contains_null(search_tuple))) {
/* Note above that a UNIQUE secondary index can contain many
rows with the same key value if one of the columns is the SQL
null. A clustered index under MySQL can never contain null
columns because we demand that all the columns in primary key
are non-null. */
unique_search = TRUE; unique_search = TRUE;
/* Even if the condition is unique, MySQL seems to try to /* Even if the condition is unique, MySQL seems to try to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment