summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2011-02-11 00:49:28 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2011-02-11 00:49:28 -0500
commit09efc11fbc95f8a47200dd102d304b90609e9408 (patch)
tree58cbd0dafa6a8d0ae791b9dfc7652d1393beb84a
parented4534ea8a003c89441064b028b0b22c5b5ea97a (diff)
downloadsqlalchemy-09efc11fbc95f8a47200dd102d304b90609e9408.tar.gz
- need to limit the list of oracle fn's that don't get parens to a
fixed list. window functions need parens
-rw-r--r--lib/sqlalchemy/dialects/firebird/base.py4
-rw-r--r--lib/sqlalchemy/dialects/oracle/base.py24
-rw-r--r--test/dialect/test_oracle.py13
-rw-r--r--test/sql/test_functions.py4
4 files changed, 33 insertions, 12 deletions
diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py
index 84222e428..4b8df55bb 100644
--- a/lib/sqlalchemy/dialects/firebird/base.py
+++ b/lib/sqlalchemy/dialects/firebird/base.py
@@ -244,6 +244,10 @@ class FBCompiler(sql.compiler.SQLCompiler):
visit_char_length_func = visit_length_func
def function_argspec(self, func, **kw):
+ # TODO: this probably will need to be
+ # narrowed to a fixed list, some no-arg functions
+ # may require parens - see similar example in the oracle
+ # dialect
if func.clauses is not None and len(func.clauses):
return self.process(func.clause_expr)
else:
diff --git a/lib/sqlalchemy/dialects/oracle/base.py b/lib/sqlalchemy/dialects/oracle/base.py
index 5ef11c37d..d3c1bc139 100644
--- a/lib/sqlalchemy/dialects/oracle/base.py
+++ b/lib/sqlalchemy/dialects/oracle/base.py
@@ -133,15 +133,19 @@ from sqlalchemy import types as sqltypes
from sqlalchemy.types import VARCHAR, NVARCHAR, CHAR, DATE, DATETIME, \
BLOB, CLOB, TIMESTAMP, FLOAT
-RESERVED_WORDS = set('SHARE RAW DROP BETWEEN FROM DESC OPTION PRIOR LONG THEN '
- 'DEFAULT ALTER IS INTO MINUS INTEGER NUMBER GRANT IDENTIFIED '
- 'ALL TO ORDER ON FLOAT DATE HAVING CLUSTER NOWAIT RESOURCE ANY '
- 'TABLE INDEX FOR UPDATE WHERE CHECK SMALLINT WITH DELETE BY ASC '
- 'REVOKE LIKE SIZE RENAME NOCOMPRESS NULL GROUP VALUES AS IN VIEW '
- 'EXCLUSIVE COMPRESS SYNONYM SELECT INSERT EXISTS NOT TRIGGER '
- 'ELSE CREATE INTERSECT PCTFREE DISTINCT USER CONNECT SET MODE '
- 'OF UNIQUE VARCHAR2 VARCHAR LOCK OR CHAR DECIMAL UNION PUBLIC '
- 'AND START UID COMMENT'.split())
+RESERVED_WORDS = \
+ set('SHARE RAW DROP BETWEEN FROM DESC OPTION PRIOR LONG THEN '\
+ 'DEFAULT ALTER IS INTO MINUS INTEGER NUMBER GRANT IDENTIFIED '\
+ 'ALL TO ORDER ON FLOAT DATE HAVING CLUSTER NOWAIT RESOURCE '\
+ 'ANY TABLE INDEX FOR UPDATE WHERE CHECK SMALLINT WITH DELETE '\
+ 'BY ASC REVOKE LIKE SIZE RENAME NOCOMPRESS NULL GROUP VALUES '\
+ 'AS IN VIEW EXCLUSIVE COMPRESS SYNONYM SELECT INSERT EXISTS '\
+ 'NOT TRIGGER ELSE CREATE INTERSECT PCTFREE DISTINCT USER '\
+ 'CONNECT SET MODE OF UNIQUE VARCHAR2 VARCHAR LOCK OR CHAR '\
+ 'DECIMAL UNION PUBLIC AND START UID COMMENT'.split())
+
+NO_ARG_FNS = set('UID CURRENT_DATE SYSDATE USER '
+ 'CURRENT_TIME CURRENT_TIMESTAMP'.split())
class RAW(sqltypes.LargeBinary):
pass
@@ -382,7 +386,7 @@ class OracleCompiler(compiler.SQLCompiler):
)
def function_argspec(self, fn, **kw):
- if len(fn.clauses) > 0:
+ if len(fn.clauses) > 0 or fn.name.upper() not in NO_ARG_FNS:
return compiler.SQLCompiler.function_argspec(self, fn, **kw)
else:
return ""
diff --git a/test/dialect/test_oracle.py b/test/dialect/test_oracle.py
index a4c3f0a83..d20819104 100644
--- a/test/dialect/test_oracle.py
+++ b/test/dialect/test_oracle.py
@@ -360,6 +360,19 @@ class CompileTest(TestBase, AssertsCompiledSQL):
'SELECT t1.c1, t1.c2, t1.c3 FROM t1 MINUS '
'SELECT t2.c1, t2.c2, t2.c3 FROM t2')
+ def test_no_paren_fns(self):
+ for fn, expected in [
+ (func.uid(), "uid"),
+ (func.UID(), "UID"),
+ (func.sysdate(), "sysdate"),
+ (func.row_number(), "row_number()"),
+ (func.rank(), "rank()"),
+ (func.now(), "CURRENT_TIMESTAMP"),
+ (func.current_timestamp(), "CURRENT_TIMESTAMP"),
+ (func.user(), "USER"),
+ ]:
+ self.assert_compile(fn, expected)
+
class CompatFlagsTest(TestBase, AssertsCompiledSQL):
__only_on__ = 'oracle'
diff --git a/test/sql/test_functions.py b/test/sql/test_functions.py
index 13116a4bb..b0106b21b 100644
--- a/test/sql/test_functions.py
+++ b/test/sql/test_functions.py
@@ -22,7 +22,7 @@ class CompileTest(TestBase, AssertsCompiledSQL):
bindtemplate = BIND_TEMPLATES[dialect.paramstyle]
self.assert_compile(func.current_timestamp(), "CURRENT_TIMESTAMP", dialect=dialect)
self.assert_compile(func.localtime(), "LOCALTIME", dialect=dialect)
- if isinstance(dialect, (firebird.dialect, maxdb.dialect, oracle.dialect)):
+ if isinstance(dialect, (firebird.dialect, maxdb.dialect)):
self.assert_compile(func.nosuchfunction(), "nosuchfunction", dialect=dialect)
else:
self.assert_compile(func.nosuchfunction(), "nosuchfunction()", dialect=dialect)
@@ -66,7 +66,7 @@ class CompileTest(TestBase, AssertsCompiledSQL):
('random()', sqlite.dialect()),
('random()', postgresql.dialect()),
('rand()', mysql.dialect()),
- ('random', oracle.dialect())
+ ('random()', oracle.dialect())
]:
self.assert_compile(func.random(), ret, dialect=dialect)