summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-04-10 11:54:33 +0000
committerGerrit Code Review <review@openstack.org>2015-04-10 11:54:33 +0000
commit88dd9b0856a6ce7017a41ab1dc9e0cd00f78bfe2 (patch)
tree97682253a88b26212e20458bc733d78cee442691
parent7e747bf3633755629ce2166619e48f57c01acef9 (diff)
parentaf9a99b1b93fce7523be81860a6668cdbab03b49 (diff)
downloadoslo-db-88dd9b0856a6ce7017a41ab1dc9e0cd00f78bfe2.tar.gz
Merge "Add filters for DBDataError exception"
-rw-r--r--oslo_db/exception.py8
-rw-r--r--oslo_db/sqlalchemy/exc_filters.py12
-rw-r--r--oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py49
3 files changed, 69 insertions, 0 deletions
diff --git a/oslo_db/exception.py b/oslo_db/exception.py
index f950f6a..111c4b5 100644
--- a/oslo_db/exception.py
+++ b/oslo_db/exception.py
@@ -155,6 +155,14 @@ class DBConnectionError(DBError):
pass
+class DBDataError(DBError):
+ """Raised for errors that are due to problems with the processed data.
+
+ E.g. division by zero, numeric value out of range, incorrect data type, etc
+
+ """
+
+
class InvalidSortKey(Exception):
"""A sort key destined for database query usage is invalid."""
diff --git a/oslo_db/sqlalchemy/exc_filters.py b/oslo_db/sqlalchemy/exc_filters.py
index f1f7f88..75bd0fa 100644
--- a/oslo_db/sqlalchemy/exc_filters.py
+++ b/oslo_db/sqlalchemy/exc_filters.py
@@ -254,6 +254,18 @@ def _raise_mysql_table_doesnt_exist_asis(
raise error
+@filters("mysql", sqla_exc.OperationalError,
+ r".*(1292|1366).*Incorrect \w+ value.*")
+@filters("mysql", sqla_exc.DataError,
+ r".*1265.*Data truncated for column.*")
+@filters("mysql", sqla_exc.DataError,
+ r".*1264.*Out of range value for column.*")
+def _raise_data_error(error, match, engine_name, is_disconnect):
+ """Raise DBDataError exception for different data errors."""
+
+ raise exception.DBDataError(error)
+
+
@filters("*", sqla_exc.OperationalError, r".*")
def _raise_operational_errors_directly_filter(operational_error,
match, engine_name,
diff --git a/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py b/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py
index 4d4609a..77670be 100644
--- a/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py
+++ b/oslo_db/tests/old_import_api/sqlalchemy/test_exc_filters.py
@@ -78,6 +78,9 @@ class TestsExceptionFilter(_SQLAExceptionMatcher, oslo_test_base.BaseTestCase):
class ProgrammingError(Error):
pass
+ class DataError(Error):
+ pass
+
class TransactionRollbackError(OperationalError):
"""Special psycopg2-only error class.
@@ -223,6 +226,52 @@ class TestFallthroughsAndNonDBAPI(TestsExceptionFilter):
self.assertEqual("mysqldb has an attribute error", matched.args[0])
+class TestDataError(TestsExceptionFilter):
+
+ def test_mysql_incorrect_value(self):
+ matched = self._run_test(
+ "mysql", "insert into testtbl (id, b) values (4242, 4242)",
+ self.OperationalError(
+ "ERROR 1292 (22007): Incorrect datetime value: '4242' "
+ "for column 'b' at row 1"
+ ),
+ exception.DBDataError
+ )
+ self.assertInnerException(
+ matched,
+ "OperationalError",
+ ("ERROR 1292 (22007): Incorrect datetime value: '4242' for column "
+ "'b' at row 1"),
+ "insert into testtbl (id, b) values (4242, 4242)", ())
+
+ def test_mysql_data_truncated_for_column(self):
+ matched = self._run_test(
+ "mysql", "insert into testtbl (id, b) values (4242, '42aabbccdd')",
+ self.DataError(
+ "ERROR 1265 (01000): Data truncated for column 'b' at row 1"),
+ exception.DBDataError
+ )
+ self.assertInnerException(
+ matched,
+ "DataError",
+ "ERROR 1265 (01000): Data truncated for column 'b' at row 1",
+ "insert into testtbl (id, b) values (4242, '42aabbccdd')", ())
+
+ def test_mysql_out_of_range_value(self):
+ matched = self._run_test(
+ "mysql", "insert into testtbl (id, b) values (4242, 424242424242)",
+ self.DataError(
+ "ERROR 1264 (22003): Out of range value for column 'b' "
+ "at row 1"),
+ exception.DBDataError
+ )
+ self.assertInnerException(
+ matched,
+ "DataError",
+ "ERROR 1264 (22003): Out of range value for column 'b' at row 1",
+ "insert into testtbl (id, b) values (4242, 424242424242)", ())
+
+
class TestReferenceErrorSQLite(_SQLAExceptionMatcher, test_base.DbTestCase):
def setUp(self):