From: Mike Bayer Date: Wed, 20 Oct 2010 21:44:35 +0000 (-0400) Subject: - Fixed mysql bug involving reflection of CURRENT_TIMESTAMP X-Git-Tag: rel_0_6_5~12 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f3c9c87a24a5b3e6da9a33702ceee433b01f4905;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed mysql bug involving reflection of CURRENT_TIMESTAMP default used with ON UPDATE clause, thanks to Taavi Burns [ticket:1940] --- diff --git a/CHANGES b/CHANGES index c2ebff1c49..375ce90595 100644 --- a/CHANGES +++ b/CHANGES @@ -201,6 +201,11 @@ CHANGES - Fixed bug which prevented "domain" built from a custom type such as "enum" from being reflected. [ticket:1933] + +- mysql + - Fixed bug involving reflection of CURRENT_TIMESTAMP + default used with ON UPDATE clause, thanks to + Taavi Burns [ticket:1940] - mssql - Fixed reflection bug which did not properly handle diff --git a/lib/sqlalchemy/dialects/mysql/base.py b/lib/sqlalchemy/dialects/mysql/base.py index a2d3748f33..660d201d18 100644 --- a/lib/sqlalchemy/dialects/mysql/base.py +++ b/lib/sqlalchemy/dialects/mysql/base.py @@ -2371,8 +2371,8 @@ class MySQLTableDefinitionParser(object): r'(?: +COLLATE +(?P[\w_]+))?' r'(?: +(?PNOT NULL))?' r'(?: +DEFAULT +(?P' - r'(?:NULL|\x27(?:\x27\x27|[^\x27])*\x27|\w+)' - r'(?:ON UPDATE \w+)?' + r'(?:NULL|\x27(?:\x27\x27|[^\x27])*\x27|\w+' + r'(?: +ON UPDATE \w+)?)' r'))?' r'(?: +(?PAUTO_INCREMENT))?' r'(?: +COMMENT +(P(?:\x27\x27|[^\x27])+))?' diff --git a/test/dialect/test_mysql.py b/test/dialect/test_mysql.py index 7c4cc2309f..78e1b9ab0c 100644 --- a/test/dialect/test_mysql.py +++ b/test/dialect/test_mysql.py @@ -763,6 +763,9 @@ class ReflectionTest(TestBase, AssertsExecutionResults): Column('c4', TIMESTAMP, DefaultClause('2009-04-05 12:00:00' )), Column('c5', TIMESTAMP), + Column('c6', TIMESTAMP, + DefaultClause(sql.text("CURRENT_TIMESTAMP " + "ON UPDATE CURRENT_TIMESTAMP"))), ) def_table.create() try: @@ -780,6 +783,13 @@ class ReflectionTest(TestBase, AssertsExecutionResults): assert str(reflected.c.c3.server_default.arg) == "'abc'" assert str(reflected.c.c4.server_default.arg) \ == "'2009-04-05 12:00:00'" + assert reflected.c.c5.default is None + assert reflected.c.c5.server_default is None + assert reflected.c.c6.default is None + eq_( + str(reflected.c.c6.server_default.arg).upper(), + "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" + ) reflected.create() try: reflected2 = Table('mysql_def', MetaData(testing.db), @@ -791,6 +801,13 @@ class ReflectionTest(TestBase, AssertsExecutionResults): assert str(reflected2.c.c3.server_default.arg) == "'abc'" assert str(reflected2.c.c4.server_default.arg) \ == "'2009-04-05 12:00:00'" + assert reflected.c.c5.default is None + assert reflected.c.c5.server_default is None + assert reflected.c.c6.default is None + eq_( + str(reflected.c.c6.server_default.arg).upper(), + "CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" + ) def test_reflection_with_table_options(self): comment = r"""Comment types type speedily ' " \ '' Fun!"""