diff options
Diffstat (limited to 'innobase')
-rw-r--r-- | innobase/row/row0mysql.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c index 58bddcfd24a..9622a7cee32 100644 --- a/innobase/row/row0mysql.c +++ b/innobase/row/row0mysql.c @@ -1678,6 +1678,8 @@ row_scan_and_check_index( rec_t* rec; ibool is_ok = TRUE; int cmp; + ibool contains_null; + ulint i; char err_buf[1000]; *n_rows = 0; @@ -1723,6 +1725,21 @@ loop: cmp = cmp_dtuple_rec_with_match(prev_entry, rec, &matched_fields, &matched_bytes); + contains_null = FALSE; + + /* In a unique secondary index we allow equal key values if + they contain SQL NULLs */ + + for (i = 0; + i < dict_index_get_n_ordering_defined_by_user(index); + i++) { + if (UNIV_SQL_NULL == dfield_get_len( + dtuple_get_nth_field(prev_entry, i))) { + + contains_null = TRUE; + } + } + if (cmp > 0) { fprintf(stderr, "Error: index records in a wrong order in index %s\n", @@ -1736,6 +1753,7 @@ loop: is_ok = FALSE; } else if ((index->type & DICT_UNIQUE) + && !contains_null && matched_fields >= dict_index_get_n_ordering_defined_by_user(index)) { |