should reduce the probability of "Attribute x was
not replaced during compile" warnings. (this generally
applies to SQLA hackers, like Elixir devs).
-
+
+- sql
+ - func.count() with no arguments renders as COUNT(*),
+ equivalent to func.count(text('*')).
+
- ext
- Class-bound attributes sent as arguments to
relation()'s remote_side and foreign_keys parameters
from sqlalchemy import types as sqltypes
from sqlalchemy.sql.expression import (
- ClauseList, _FigureVisitName, _Function, _literal_as_binds,
+ ClauseList, _FigureVisitName, _Function, _literal_as_binds, text
)
from sqlalchemy.sql import operators
kwargs.setdefault('type_', None)
GenericFunction.__init__(self, args=args, **kwargs)
+class count(GenericFunction):
+ """The ANSI COUNT aggregate function. With no arguments, emits COUNT *."""
+
+ __return_type__ = sqltypes.Integer
+
+ def __init__(self, expression=None, **kwargs):
+ if expression is None:
+ expression = text('*')
+ GenericFunction.__init__(self, args=(expression,), **kwargs)
+
class current_date(AnsiFunction):
__return_type__ = sqltypes.Date
from sqlalchemy import types as sqltypes
from testlib import *
from sqlalchemy.sql.functions import GenericFunction
+from testlib.testing import eq_
from sqlalchemy.databases import *
# every dialect in databases.__all__ is expected to pass these tests.
]:
self.assert_compile(func.random(), ret, dialect=dialect)
+ def test_generic_count(self):
+ assert isinstance(func.count().type, sqltypes.Integer)
+
+ self.assert_compile(func.count(), 'count(*)')
+ self.assert_compile(func.count(1), 'count(:param_1)')
+ c = column('abc')
+ self.assert_compile(func.count(c), 'count(abc)')
+
def test_constructor(self):
try:
func.current_timestamp('somearg')