From: Mike Bayer Date: Sun, 15 Nov 2009 20:11:42 +0000 (+0000) Subject: - Fixed the behavior of extract() to apply operator X-Git-Tag: rel_0_5_7~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ddfc946dd4d5d8a333933cebf9b41226ae8d29f;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Fixed the behavior of extract() to apply operator precedence rules to the "::" operator when applying the "timestamp" cast - ensures proper parenthesization. [ticket:1611] --- diff --git a/CHANGES b/CHANGES index 00bf891347..34b4455794 100644 --- a/CHANGES +++ b/CHANGES @@ -65,6 +65,11 @@ CHANGES - Corrected the "has_sequence" query to take current schema, 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 diff --git a/lib/sqlalchemy/databases/postgres.py b/lib/sqlalchemy/databases/postgres.py index f380bcb28f..a46ed6723d 100644 --- a/lib/sqlalchemy/databases/postgres.py +++ b/lib/sqlalchemy/databases/postgres.py @@ -821,8 +821,8 @@ class PGCompiler(compiler.DefaultCompiler): 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 PGSchemaGenerator(compiler.SchemaGenerator): diff --git a/test/dialect/test_postgres.py b/test/dialect/test_postgres.py index fb915665a7..f8eefec5c9 100644 --- a/test/dialect/test_postgres.py +++ b/test/dialect/test_postgres.py @@ -66,9 +66,14 @@ 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 ReturningTest(TestBase, AssertsExecutionResults): __only_on__ = 'postgres' @@ -507,7 +512,18 @@ class MiscTest(TestBase, AssertsExecutionResults): self.assert_((subject.c['id$']==referer.c.ref).compare(subject.join(referer).onclause)) finally: meta1.drop_all() - + + def test_extract(self): + for field, exp in ( + ('year', 2009), + ('month', 11), + ('day', 10), + ): + r = testing.db.execute( + select([extract(field, datetime.datetime(2009, 11, 15, 12, 15, 35) - datetime.timedelta(days =5))]) + ).scalar() + eq_(r, exp) + def test_checksfor_sequence(self): meta1 = MetaData(testing.db) t = Table('mytable', meta1,