summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2021-08-10 14:57:51 +0000
committerGerrit Code Review <review@openstack.org>2021-08-10 14:57:51 +0000
commitfe704d6460dba2a54be597e441cf025d43724351 (patch)
treebba38d9385c387c1d7ad20ab7bc476c4f1fa9ff2
parent0646eb6595a79edb62801232ee2f6af0886d3013 (diff)
parentb32b643acc0528099a88504d4d824cdc002a85df (diff)
downloadoslo-db-fe704d6460dba2a54be597e441cf025d43724351.tar.gz
Merge "Added handler for mysql 8.0.19 duplicate key error update" into stable/wallaby
-rw-r--r--oslo_db/sqlalchemy/exc_filters.py9
-rw-r--r--oslo_db/tests/sqlalchemy/test_exc_filters.py26
2 files changed, 35 insertions, 0 deletions
diff --git a/oslo_db/sqlalchemy/exc_filters.py b/oslo_db/sqlalchemy/exc_filters.py
index 7f186a3..2b3ce2c 100644
--- a/oslo_db/sqlalchemy/exc_filters.py
+++ b/oslo_db/sqlalchemy/exc_filters.py
@@ -120,6 +120,12 @@ def _default_dupe_key_error(integrity_error, match, engine_name,
N columns - (IntegrityError) duplicate key value violates unique
constraint "name_of_our_constraint"
+ mysql since 8.0.19:
+ 1 column - (IntegrityError) (1062, "Duplicate entry 'value_of_c1' for key
+ 'table_name.c1'")
+ N columns - (IntegrityError) (1062, "Duplicate entry 'values joined
+ with -' for key 'table_name.name_of_our_constraint'")
+
mysql+mysqldb:
1 column - (IntegrityError) (1062, "Duplicate entry 'value_of_c1' for key
'c1'")
@@ -145,6 +151,9 @@ def _default_dupe_key_error(integrity_error, match, engine_name,
if not columns.startswith(uniqbase):
if engine_name == "postgresql":
columns = [columns[columns.index("_") + 1:columns.rindex("_")]]
+ elif (engine_name == "mysql") and \
+ (uniqbase in str(columns.split("0")[:1])):
+ columns = columns.split("0")[1:]
else:
columns = [columns]
else:
diff --git a/oslo_db/tests/sqlalchemy/test_exc_filters.py b/oslo_db/tests/sqlalchemy/test_exc_filters.py
index 0451c89..f6e6e9a 100644
--- a/oslo_db/tests/sqlalchemy/test_exc_filters.py
+++ b/oslo_db/tests/sqlalchemy/test_exc_filters.py
@@ -821,6 +821,14 @@ class TestDuplicate(TestsExceptionFilter):
expected_value='2'
)
+ def test_mysql_duplicate_entry_key_start_with_tablename(self):
+ self._run_dupe_constraint_test(
+ "mysql",
+ "1062 (23000): Duplicate entry '2' for key 'tbl.uniq_tbl0b'",
+ expected_columns=['b'],
+ expected_value='2'
+ )
+
def test_mysql_binary(self):
self._run_dupe_constraint_test(
"mysql",
@@ -839,6 +847,24 @@ class TestDuplicate(TestsExceptionFilter):
expected_value="'\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E!,"
)
+ def test_mysql_duplicate_entry_key_start_with_tablename_binary(self):
+ self._run_dupe_constraint_test(
+ "mysql",
+ "(1062, \'Duplicate entry "
+ "\\\'\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E\\\' "
+ "for key \\\'tbl.uniq_tbl0c1\\\'\')",
+ expected_columns=['c1'],
+ expected_value="\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E"
+ )
+ self._run_dupe_constraint_test(
+ "mysql",
+ "(1062, \'Duplicate entry "
+ "''\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E!,' "
+ "for key 'tbl.uniq_tbl0c1'\')",
+ expected_columns=['c1'],
+ expected_value="'\\\\x8A$\\\\x8D\\\\xA6\"s\\\\x8E!,"
+ )
+
def test_postgresql_single(self):
self._run_dupe_constraint_test(
'postgresql',