summaryrefslogtreecommitdiff
path: root/sql/handler.cc
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2020-03-11 00:46:24 +1000
committerNikita Malyavin <nikitamalyavin@gmail.com>2020-03-11 00:46:24 +1000
commitbbe056ac3fa8e3ca3e25f54fb397cba30989ac65 (patch)
tree34dc7bc64d11406cb7985206ed8396cb045bfc60 /sql/handler.cc
parent7a5d3316805c2b35c719ef612335e9c9a4cd9015 (diff)
downloadmariadb-git-bb-10.5-MDEV-16978-without-overlaps.tar.gz
support NULL fields in keybb-10.5-MDEV-16978-without-overlaps
Diffstat (limited to 'sql/handler.cc')
-rw-r--r--sql/handler.cc18
1 files changed, 14 insertions, 4 deletions
diff --git a/sql/handler.cc b/sql/handler.cc
index 917386f4392..16f57533f27 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -6983,8 +6983,10 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
if (!check_overlaps_buffer)
check_overlaps_buffer= (uchar*)alloc_root(&table_share->mem_root,
table_share->max_unique_length
+ + table_share->null_fields
+ table_share->reclength);
- auto *record_buffer= check_overlaps_buffer + table_share->max_unique_length;
+ auto *record_buffer= check_overlaps_buffer + table_share->max_unique_length
+ + table_share->null_fields;
auto *handler= this;
// handler->inited can be NONE on INSERT
if (handler->inited != NONE)
@@ -7015,7 +7017,8 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
bool key_used= false;
for (uint k= 0; k < key_parts && !key_used; k++)
key_used= bitmap_is_set(table->write_set,
- key_info.key_part[k].fieldnr - 1);
+ key_info.key_part[k].fieldnr - 1)
+ && !key_info.key_part[k].field->is_null_in_record(new_data);
if (!key_used)
continue;
}
@@ -7064,8 +7067,15 @@ int handler::ha_check_overlaps(const uchar *old_data, const uchar* new_data)
error= handler->ha_index_next(record_buffer);
}
- if (!error && table->check_period_overlaps(key_info, key_info,
- new_data, record_buffer) == 0)
+ bool null_in_key= false;
+ for (uint k= 0; k < key_parts && !null_in_key; k++)
+ {
+ null_in_key= key_info.key_part[k].field->is_null_in_record(record_buffer);
+ }
+
+ if (!null_in_key && !error
+ && table->check_period_overlaps(key_info, key_info,
+ new_data, record_buffer) == 0)
error= HA_ERR_FOUND_DUPP_KEY;
if (error == HA_ERR_KEY_NOT_FOUND || error == HA_ERR_END_OF_FILE)