]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fix: Fixed cases where tests failed depending on mysql and mariadb versions. 11953/head
authorhuuyafwww <huuya1234fwww@gmail.com>
Sat, 5 Oct 2024 05:45:49 +0000 (14:45 +0900)
committerhuuyafwww <huuya1234fwww@gmail.com>
Sat, 5 Oct 2024 05:45:49 +0000 (14:45 +0900)
lib/sqlalchemy/dialects/mysql/base.py
test/dialect/mysql/test_compiler.py

index 1a3032434a011ab043ec105864658f7e139d0292..f5eb169f8c46f09eeb62636f3462f4e8de4ed62a 100644 (file)
@@ -1850,8 +1850,11 @@ class MySQLDDLCompiler(compiler.DDLCompiler):
         else:
             default = self.get_column_default_string(column)
             if default is not None:
-                if isinstance(
-                    column.server_default.arg, functions.FunctionElement
+                if (
+                    isinstance(
+                        column.server_default.arg, functions.FunctionElement
+                    )
+                    and self.dialect._support_default_function
                 ):
                     colspec.append(f"DEFAULT ({default})")
                 else:
@@ -2900,6 +2903,17 @@ class MySQLDialect(default.DefaultDialect):
             # ref https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-17.html#mysqld-8-0-17-feature  # noqa
             return self.server_version_info >= (8, 0, 17)
 
+    @property
+    def _support_default_function(self):
+        if not self.server_version_info:
+            return False
+        elif self.is_mariadb:
+            # ref https://mariadb.com/kb/en/mariadb-1021-release-notes/
+            return self.server_version_info >= (10, 2, 1)
+        else:
+            # ref https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html # noqa
+            return self.server_version_info >= (8, 0, 13)
+
     @property
     def _is_mariadb(self):
         return self.is_mariadb
index f291a9d527dc051b4bb416c2d15d22c188861cd3..4acb21a46743c016a7d1d48d97a2b42d0e5abec9 100644 (file)
@@ -407,7 +407,21 @@ class CompileTest(ReservedWordFixture, fixtures.TestBase, AssertsCompiledSQL):
             "PRIMARY KEY (data) USING btree)",
         )
 
-    def test_create_server_default_with_function_using(self):
+    @testing.combinations(
+        (True, (10, 2, 2)),
+        (True, (10, 2, 1)),
+        (True, (10, 2, 0)),
+        (False, (8, 0, 14)),
+        (False, (8, 0, 13)),
+        (False, (8, 0, 12)),
+        argnames="is_mariadb,version",
+    )
+    def test_create_server_default_with_function_using(
+        self, is_mariadb, version
+    ):
+        dialect = mysql.dialect(is_mariadb=is_mariadb)
+        dialect.server_version_info = version
+
         m = MetaData()
         tbl = Table(
             "testtbl",
@@ -419,12 +433,17 @@ class CompileTest(ReservedWordFixture, fixtures.TestBase, AssertsCompiledSQL):
             ),
             Column("data", JSON, server_default=func.json_object()),
         )
+
+        if not dialect._support_default_function:
+            return
+
         self.assert_compile(
             schema.CreateTable(tbl),
             "CREATE TABLE testtbl (time DATETIME DEFAULT (CURRENT_TIMESTAMP), "
             "name VARCHAR(255) DEFAULT 'some str', "
             "description VARCHAR(255) DEFAULT (lower('hi')), "
             "data JSON DEFAULT (json_object()))",
+            dialect=dialect,
         )
 
     def test_create_index_expr(self):