]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- need to limit the list of oracle fn's that don't get parens to a
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 11 Feb 2011 05:49:28 +0000 (00:49 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 11 Feb 2011 05:49:28 +0000 (00:49 -0500)
fixed list.  window functions need parens

lib/sqlalchemy/dialects/firebird/base.py
lib/sqlalchemy/dialects/oracle/base.py
test/dialect/test_oracle.py
test/sql/test_functions.py

index 84222e428dbd489136058929a78f06d344015530..4b8df55bb1e6deb8e9575ba3240eddf1568c3ae9 100644 (file)
@@ -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:
index 5ef11c37d9591bad9bcac31de204084bb71dfb3a..d3c1bc1391688efe1338b22b9ff03c3a65e74d05 100644 (file)
@@ -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 ""
index a4c3f0a834d02fc81020b04d8bd45047a67d00e7..d208191041179c8145af2a99a220270cf7057594 100644 (file)
@@ -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'
 
index 13116a4bbc3545f8d6c2906d43cc57df0dbc876c..b0106b21baef8a90d7dcdc0193bb3fa686154ae8 100644 (file)
@@ -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)