summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-11-15 20:22:57 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-11-15 20:22:57 +0000
commit943ce6bf16e27dd21c0c463e52988edf58d691bb (patch)
tree2f3cccc2d27fdce05a1f57c809e422d37fbb07fa
parent92a00ee663d178ff2c7a7a668f8c6d70bae95867 (diff)
downloadsqlalchemy-943ce6bf16e27dd21c0c463e52988edf58d691bb.tar.gz
merge r6504 from 0.5 plus an enhancement to the unit test, [ticket:1611]
-rw-r--r--CHANGES5
-rw-r--r--lib/sqlalchemy/dialects/postgresql/base.py4
-rw-r--r--test/dialect/test_postgresql.py21
3 files changed, 27 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index 04d62f105..917ea9b56 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 9c6de3623..0c386cc29 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 152ca40da..2a2322441 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,