From: Jeff Horemans Date: Wed, 7 Aug 2024 15:10:49 +0000 (+0200) Subject: Optimized SQLite's check constraint reflection pattern. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0c0d4040a33467d4cd7098b1d518d96ae97e3c7c;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Optimized SQLite's check constraint reflection pattern. --- diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index 16b8b8cc90..a093065aee 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -2624,7 +2624,14 @@ class SQLiteDialect(default.DefaultDialect): connection, table_name, schema=schema, **kw ) - CHECK_PATTERN = r"(?:CONSTRAINT ([^\n^\t]+) +)?CHECK *\( *(.+?) *\)(?:, ?\n|\n) *" + # Notes: + # * The pattern currently matches any character for the name of the constraint + # except tab and newline characters. + # * Because check constraints in the table data can contain space, newline and tab characters, + # the pattern matches any character untill either the beginning of the next CONSTRAINT + # statement using a non-capturing non-consuming group (allowing the next one to match), + # or the end of the table definition e.g. newline and closing ')'. + CHECK_PATTERN = r"(?:CONSTRAINT ([^\t\n]+) )?CHECK \((.+?)\)(?:, *\n\t?(?=CONSTRAINT)|\n\))" cks = [] for match in re.finditer(CHECK_PATTERN, table_data or "", re.I|re.S): diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index 3ccca50b66..c7e20d4c1a 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -2464,7 +2464,6 @@ class ConstraintReflectionTest(fixtures.TestBase): {"sqltext": "q > 1 AND q < 6", "name": None}, ], ) - print(inspector.get_check_constraints("r")) eq_( inspector.get_check_constraints("r"), [