Do not register the GenericFunction in sql.functions._registry

Fixed that the :class:`.GenericFunction` class was inadvertently
registering itself as one of the named functions.  Pull request courtesy
Adrien Berchet.

Fixes: #4653

Closes: #4654
Pull-request: https://github.com/sqlalchemy/sqlalchemy/pull/4654
Pull-request-sha: 1112b89f0d

Change-Id: Ia0d366d3bff44a763aa496287814278dff732a19
(cherry picked from commit 61c47cbdc6)
This commit is contained in:
Adrien Berchet
2019-05-03 12:02:17 -04:00
committed by Mike Bayer
parent b058e7ae99
commit bb07dc17bd
3 changed files with 59 additions and 1 deletions
+40
View File
@@ -1057,3 +1057,43 @@ def exec_sorted(statement, *args, **kw):
return sorted(
[tuple(row) for row in statement.execute(*args, **kw).fetchall()]
)
class RegisterTest(fixtures.TestBase, AssertsCompiledSQL):
__dialect__ = "default"
def setup(self):
self._registry = deepcopy(functions._registry)
def teardown(self):
functions._registry = self._registry
def test_GenericFunction_is_registered(self):
assert 'GenericFunction' not in functions._registry['_default']
def test_register_function(self):
# test generic function registering
class registered_func(GenericFunction):
_register = True
def __init__(self, *args, **kwargs):
GenericFunction.__init__(self, *args, **kwargs)
class registered_func_child(registered_func):
type = sqltypes.Integer
assert 'registered_func' in functions._registry['_default']
assert isinstance(func.registered_func_child().type, Integer)
class not_registered_func(GenericFunction):
_register = False
def __init__(self, *args, **kwargs):
GenericFunction.__init__(self, *args, **kwargs)
class not_registered_func_child(not_registered_func):
type = sqltypes.Integer
assert 'not_registered_func' not in functions._registry['_default']
assert isinstance(func.not_registered_func_child().type, Integer)