From: Mike Bayer Date: Fri, 11 Feb 2011 05:49:28 +0000 (-0500) Subject: - need to limit the list of oracle fn's that don't get parens to a X-Git-Tag: rel_0_7b1~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=09efc11fbc95f8a47200dd102d304b90609e9408;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - need to limit the list of oracle fn's that don't get parens to a fixed list. window functions need parens --- diff --git a/lib/sqlalchemy/dialects/firebird/base.py b/lib/sqlalchemy/dialects/firebird/base.py index 84222e428d..4b8df55bb1 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 5ef11c37d9..d3c1bc1391 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 a4c3f0a834..d208191041 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 13116a4bbc..b0106b21ba 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)