From: huuyafwww Date: Sat, 5 Oct 2024 05:45:49 +0000 (+0900) Subject: fix: Fixed cases where tests failed depending on mysql and mariadb versions. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d93ac419a9201134e9c4845dd2e4dc48db4b6f78;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git fix: Fixed cases where tests failed depending on mysql and mariadb versions. --- diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index 1a3032434a..f5eb169f8c 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -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 diff --git a/test/dialect/mysql/test_compiler.py b/test/dialect/mysql/test_compiler.py index f291a9d527..4acb21a467 100644 --- a/test/dialect/mysql/test_compiler.py +++ b/test/dialect/mysql/test_compiler.py @@ -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):