From dc733bcea64a45f8aae3fa6f20392c8a41278ce1 Mon Sep 17 00:00:00 2001 From: Guillaume DOUMENC Date: Tue, 12 Jan 2016 04:46:32 +0000 Subject: [PATCH] Remove quote on first DATEPART paramater (cherry picked from commit c4f415d97988bc8a8d901b150bfb67571f29712e) - changelog for pr bitbucket:70, fixes #3624 (cherry picked from commit 215167d8d38a381d27c8448f5c6e50c70b9ba0cc) --- doc/build/changelog/changelog_10.rst | 9 +++++++++ lib/sqlalchemy/dialects/mssql/base.py | 2 +- test/dialect/mssql/test_types.py | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/doc/build/changelog/changelog_10.rst b/doc/build/changelog/changelog_10.rst index 4d017cfb15..c465c73ed1 100644 --- a/doc/build/changelog/changelog_10.rst +++ b/doc/build/changelog/changelog_10.rst @@ -19,6 +19,15 @@ :version: 1.0.12 :released: + .. change:: + :tags: bug, mssql + :tickets: 3624 + :pullreq: bitbucket:70 + + Fixed the syntax of the :func:`.extract` function when used on + MSSQL against a datetime value; the quotes around the keyword + are removed. Pull request courtesy Guillaume Doumenc. + .. change:: :tags: bug, orm :tickets: 3623 diff --git a/lib/sqlalchemy/dialects/mssql/base.py b/lib/sqlalchemy/dialects/mssql/base.py index f3d20b3aa8..8fdb8ee877 100644 --- a/lib/sqlalchemy/dialects/mssql/base.py +++ b/lib/sqlalchemy/dialects/mssql/base.py @@ -1181,7 +1181,7 @@ class MSSQLCompiler(compiler.SQLCompiler): def visit_extract(self, extract, **kw): field = self.extract_map.get(extract.field, extract.field) - return 'DATEPART("%s", %s)' % \ + return 'DATEPART(%s, %s)' % \ (field, self.process(extract.expr, **kw)) def visit_savepoint(self, savepoint_stmt): diff --git a/test/dialect/mssql/test_types.py b/test/dialect/mssql/test_types.py index a3dc6a91df..68a6908520 100644 --- a/test/dialect/mssql/test_types.py +++ b/test/dialect/mssql/test_types.py @@ -64,6 +64,18 @@ class MSDateTypeTest(fixtures.TestBase): result_processor, 'abc' ) + def test_extract(self): + from sqlalchemy import extract + fivedaysago = datetime.datetime.now() \ + - datetime.timedelta(days=5) + for field, exp in ('year', fivedaysago.year), \ + ('month', fivedaysago.month), ('day', fivedaysago.day): + r = testing.db.execute( + select([ + extract(field, fivedaysago)]) + ).scalar() + eq_(r, exp) + class TypeDDLTest(fixtures.TestBase): -- 2.47.3