summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oslo_db/sqlalchemy/exc_filters.py13
-rw-r--r--oslo_db/tests/sqlalchemy/test_exc_filters.py6
2 files changed, 17 insertions, 2 deletions
diff --git a/oslo_db/sqlalchemy/exc_filters.py b/oslo_db/sqlalchemy/exc_filters.py
index 9e5a2e5..fb46440 100644
--- a/oslo_db/sqlalchemy/exc_filters.py
+++ b/oslo_db/sqlalchemy/exc_filters.py
@@ -252,6 +252,9 @@ def _check_constraint_error(
@filters("mysql", sqla_exc.InternalError,
r".*1091,.*Can't DROP '(?P<constraint>.+)'; "
"check that column/key exists")
+@filters("mysql", sqla_exc.OperationalError,
+ r".*1091,.*Can't DROP '(?P<constraint>.+)'; "
+ "check that column/key exists")
@filters("mysql", sqla_exc.InternalError,
r".*1025,.*Error on rename of '.+/(?P<relation>.+)' to ")
def _check_constraint_non_existing(
@@ -277,6 +280,8 @@ def _check_constraint_non_existing(
r".* no such table: (?P<table>.+)")
@filters("mysql", sqla_exc.InternalError,
r".*1051,.*Unknown table '(.+\.)?(?P<table>.+)'\"")
+@filters("mysql", sqla_exc.OperationalError,
+ r".*1051,.*Unknown table '(.+\.)?(?P<table>.+)'\"")
@filters("postgresql", sqla_exc.ProgrammingError,
r".* table \"(?P<table>.+)\" does not exist")
def _check_table_non_existing(
@@ -331,6 +336,14 @@ def _raise_data_error(error, match, engine_name, is_disconnect):
raise exception.DBDataError(error)
+@filters("mysql", sqla_exc.OperationalError,
+ r".*\(1305,\s+\'SAVEPOINT\s+(.+)\s+does not exist\'\)")
+def _raise_savepoints_as_dberrors(error, match, engine_name, is_disconnect):
+ # NOTE(rpodolyaka): this is a special case of an OperationalError that used
+ # to be an InternalError. It's expected to be wrapped into oslo.db error.
+ raise exception.DBError(error)
+
+
@filters("*", sqla_exc.OperationalError, r".*")
def _raise_operational_errors_directly_filter(operational_error,
match, engine_name,
diff --git a/oslo_db/tests/sqlalchemy/test_exc_filters.py b/oslo_db/tests/sqlalchemy/test_exc_filters.py
index e31f8dd..101b2eb 100644
--- a/oslo_db/tests/sqlalchemy/test_exc_filters.py
+++ b/oslo_db/tests/sqlalchemy/test_exc_filters.py
@@ -305,7 +305,8 @@ class TestNonExistentConstraintMySQL(
# NOTE(jd) Cannot check precisely with assertInnerException since MySQL
# error are not the same depending on its version…
self.assertIsInstance(matched.inner_exception,
- sqlalchemy.exc.InternalError)
+ (sqlalchemy.exc.InternalError,
+ sqlalchemy.exc.OperationalError))
if matched.table is not None:
self.assertEqual("resource_foo", matched.table)
if matched.constraint is not None:
@@ -375,7 +376,8 @@ class TestNonExistentTableMySQL(
# NOTE(jd) Cannot check precisely with assertInnerException since MySQL
# error are not the same depending on its version…
self.assertIsInstance(matched.inner_exception,
- sqlalchemy.exc.InternalError)
+ (sqlalchemy.exc.InternalError,
+ sqlalchemy.exc.OperationalError))
self.assertEqual("foo", matched.table)