From: Mike Bayer Date: Sun, 15 Nov 2009 20:22:57 +0000 (+0000) Subject: merge r6504 from 0.5 plus an enhancement to the unit test, [ticket:1611] X-Git-Tag: rel_0_6beta1~165 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=943ce6bf16e27dd21c0c463e52988edf58d691bb;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git merge r6504 from 0.5 plus an enhancement to the unit test, [ticket:1611] --- diff --git a/CHANGES b/CHANGES index 04d62f1050..917ea9b56f 100644 --- a/CHANGES +++ b/CHANGES @@ -749,6 +749,11 @@ CHANGES or explicit sequence-stated schema, into account. [ticket:1576] + - Fixed the behavior of extract() to apply operator + precedence rules to the "::" operator when applying + the "timestamp" cast - ensures proper parenthesization. + [ticket:1611] + - mssql - Changed the name of TrustedConnection to Trusted_Connection when constructing pyodbc connect diff --git a/lib/sqlalchemy/dialects/postgresql/base.py b/lib/sqlalchemy/dialects/postgresql/base.py index 9c6de36235..0c386cc29e 100644 --- a/lib/sqlalchemy/dialects/postgresql/base.py +++ b/lib/sqlalchemy/dialects/postgresql/base.py @@ -314,8 +314,8 @@ class PGCompiler(compiler.SQLCompiler): def visit_extract(self, extract, **kwargs): field = self.extract_map.get(extract.field, extract.field) - return "EXTRACT(%s FROM %s::timestamp)" % ( - field, self.process(extract.expr)) + return "EXTRACT(%s FROM %s)" % ( + field, self.process(extract.expr.op('::')(sql.literal_column('timestamp')))) class PGDDLCompiler(compiler.DDLCompiler): def get_column_specification(self, column, **kwargs): diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index 152ca40dab..2a23224414 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -104,9 +104,15 @@ class CompileTest(TestBase, AssertsCompiledSQL): for field in 'year', 'month', 'day': self.assert_compile( select([extract(field, t.c.col1)]), - "SELECT EXTRACT(%s FROM t.col1::timestamp) AS anon_1 " + "SELECT EXTRACT(%s FROM t.col1 :: timestamp) AS anon_1 " "FROM t" % field) + for field in 'year', 'month', 'day': + self.assert_compile( + select([extract(field, func.timestamp() - datetime.timedelta(days =5))]), + "SELECT EXTRACT(%s FROM (timestamp() - %%(timestamp_1)s) :: timestamp) AS anon_1" + % field) + class FloatCoercionTest(TablesTest, AssertsExecutionResults): __only_on__ = 'postgresql' __dialect__ = postgresql.dialect() @@ -938,6 +944,19 @@ class MiscTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): finally: meta1.drop_all() + def test_extract(self): + 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, func.now() + datetime.timedelta(days =-5))]) + ).scalar() + eq_(r, exp) + + def test_checksfor_sequence(self): meta1 = MetaData(testing.db) t = Table('mytable', meta1,