You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							1575 lines
						
					
					
						
							47 KiB
						
					
					
				
			
		
		
	
	
							1575 lines
						
					
					
						
							47 KiB
						
					
					
				# sql/functions.py
 | 
						|
# Copyright (C) 2005-2022 the SQLAlchemy authors and contributors
 | 
						|
# <see AUTHORS file>
 | 
						|
#
 | 
						|
# This module is part of SQLAlchemy and is released under
 | 
						|
# the MIT License: https://www.opensource.org/licenses/mit-license.php
 | 
						|
 | 
						|
"""SQL function API, factories, and built-in functions.
 | 
						|
 | 
						|
"""
 | 
						|
from . import annotation
 | 
						|
from . import coercions
 | 
						|
from . import operators
 | 
						|
from . import roles
 | 
						|
from . import schema
 | 
						|
from . import sqltypes
 | 
						|
from . import util as sqlutil
 | 
						|
from .base import _entity_namespace
 | 
						|
from .base import ColumnCollection
 | 
						|
from .base import Executable
 | 
						|
from .base import Generative
 | 
						|
from .base import HasMemoized
 | 
						|
from .elements import _type_from_args
 | 
						|
from .elements import BinaryExpression
 | 
						|
from .elements import BindParameter
 | 
						|
from .elements import Cast
 | 
						|
from .elements import ClauseList
 | 
						|
from .elements import ColumnElement
 | 
						|
from .elements import Extract
 | 
						|
from .elements import FunctionFilter
 | 
						|
from .elements import Grouping
 | 
						|
from .elements import literal_column
 | 
						|
from .elements import NamedColumn
 | 
						|
from .elements import Over
 | 
						|
from .elements import WithinGroup
 | 
						|
from .selectable import FromClause
 | 
						|
from .selectable import Select
 | 
						|
from .selectable import TableValuedAlias
 | 
						|
from .visitors import InternalTraversal
 | 
						|
from .visitors import TraversibleType
 | 
						|
from .. import util
 | 
						|
 | 
						|
 | 
						|
_registry = util.defaultdict(dict)
 | 
						|
 | 
						|
 | 
						|
def register_function(identifier, fn, package="_default"):
 | 
						|
    """Associate a callable with a particular func. name.
 | 
						|
 | 
						|
    This is normally called by _GenericMeta, but is also
 | 
						|
    available by itself so that a non-Function construct
 | 
						|
    can be associated with the :data:`.func` accessor (i.e.
 | 
						|
    CAST, EXTRACT).
 | 
						|
 | 
						|
    """
 | 
						|
    reg = _registry[package]
 | 
						|
 | 
						|
    identifier = util.text_type(identifier).lower()
 | 
						|
 | 
						|
    # Check if a function with the same identifier is registered.
 | 
						|
    if identifier in reg:
 | 
						|
        util.warn(
 | 
						|
            "The GenericFunction '{}' is already registered and "
 | 
						|
            "is going to be overridden.".format(identifier)
 | 
						|
        )
 | 
						|
    reg[identifier] = fn
 | 
						|
 | 
						|
 | 
						|
class FunctionElement(Executable, ColumnElement, FromClause, Generative):
 | 
						|
    """Base for SQL function-oriented constructs.
 | 
						|
 | 
						|
    .. seealso::
 | 
						|
 | 
						|
        :ref:`coretutorial_functions` - in the Core tutorial
 | 
						|
 | 
						|
        :class:`.Function` - named SQL function.
 | 
						|
 | 
						|
        :data:`.func` - namespace which produces registered or ad-hoc
 | 
						|
        :class:`.Function` instances.
 | 
						|
 | 
						|
        :class:`.GenericFunction` - allows creation of registered function
 | 
						|
        types.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    _traverse_internals = [
 | 
						|
        ("clause_expr", InternalTraversal.dp_clauseelement),
 | 
						|
        ("_with_ordinality", InternalTraversal.dp_boolean),
 | 
						|
        ("_table_value_type", InternalTraversal.dp_has_cache_key),
 | 
						|
    ]
 | 
						|
 | 
						|
    packagenames = ()
 | 
						|
 | 
						|
    _has_args = False
 | 
						|
    _with_ordinality = False
 | 
						|
    _table_value_type = None
 | 
						|
 | 
						|
    def __init__(self, *clauses, **kwargs):
 | 
						|
        r"""Construct a :class:`.FunctionElement`.
 | 
						|
 | 
						|
        :param \*clauses: list of column expressions that form the arguments
 | 
						|
         of the SQL function call.
 | 
						|
 | 
						|
        :param \**kwargs:  additional kwargs are typically consumed by
 | 
						|
         subclasses.
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :data:`.func`
 | 
						|
 | 
						|
            :class:`.Function`
 | 
						|
 | 
						|
        """
 | 
						|
        args = [
 | 
						|
            coercions.expect(
 | 
						|
                roles.ExpressionElementRole,
 | 
						|
                c,
 | 
						|
                name=getattr(self, "name", None),
 | 
						|
                apply_propagate_attrs=self,
 | 
						|
            )
 | 
						|
            for c in clauses
 | 
						|
        ]
 | 
						|
        self._has_args = self._has_args or bool(args)
 | 
						|
        self.clause_expr = ClauseList(
 | 
						|
            operator=operators.comma_op, group_contents=True, *args
 | 
						|
        ).self_group()
 | 
						|
 | 
						|
    _non_anon_label = None
 | 
						|
 | 
						|
    @property
 | 
						|
    def _proxy_key(self):
 | 
						|
        return super(FunctionElement, self)._proxy_key or getattr(
 | 
						|
            self, "name", None
 | 
						|
        )
 | 
						|
 | 
						|
    def _execute_on_connection(
 | 
						|
        self, connection, multiparams, params, execution_options
 | 
						|
    ):
 | 
						|
        return connection._execute_function(
 | 
						|
            self, multiparams, params, execution_options
 | 
						|
        )
 | 
						|
 | 
						|
    def scalar_table_valued(self, name, type_=None):
 | 
						|
        """Return a column expression that's against this
 | 
						|
        :class:`_functions.FunctionElement` as a scalar
 | 
						|
        table-valued expression.
 | 
						|
 | 
						|
        The returned expression is similar to that returned by a single column
 | 
						|
        accessed off of a :meth:`_functions.FunctionElement.table_valued`
 | 
						|
        construct, except no FROM clause is generated; the function is rendered
 | 
						|
        in the similar way as a scalar subquery.
 | 
						|
 | 
						|
        E.g.::
 | 
						|
 | 
						|
            >>> from sqlalchemy import func, select
 | 
						|
            >>> fn = func.jsonb_each("{'k', 'v'}").scalar_table_valued("key")
 | 
						|
            >>> print(select(fn))
 | 
						|
            SELECT (jsonb_each(:jsonb_each_1)).key
 | 
						|
 | 
						|
        .. versionadded:: 1.4.0b2
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.table_valued`
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.alias`
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.column_valued`
 | 
						|
 | 
						|
        """  # noqa: E501
 | 
						|
 | 
						|
        return ScalarFunctionColumn(self, name, type_)
 | 
						|
 | 
						|
    def table_valued(self, *expr, **kw):
 | 
						|
        r"""Return a :class:`_sql.TableValuedAlias` representation of this
 | 
						|
        :class:`_functions.FunctionElement` with table-valued expressions added.
 | 
						|
 | 
						|
        e.g.::
 | 
						|
 | 
						|
            >>> fn = (
 | 
						|
            ...     func.generate_series(1, 5).
 | 
						|
            ...     table_valued("value", "start", "stop", "step")
 | 
						|
            ... )
 | 
						|
 | 
						|
            >>> print(select(fn))
 | 
						|
            SELECT anon_1.value, anon_1.start, anon_1.stop, anon_1.step
 | 
						|
            FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1
 | 
						|
 | 
						|
            >>> print(select(fn.c.value, fn.c.stop).where(fn.c.value > 2))
 | 
						|
            SELECT anon_1.value, anon_1.stop
 | 
						|
            FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1
 | 
						|
            WHERE anon_1.value > :value_1
 | 
						|
 | 
						|
        A WITH ORDINALITY expression may be generated by passing the keyword
 | 
						|
        argument "with_ordinality"::
 | 
						|
 | 
						|
            >>> fn = func.generate_series(4, 1, -1).table_valued("gen", with_ordinality="ordinality")
 | 
						|
            >>> print(select(fn))
 | 
						|
            SELECT anon_1.gen, anon_1.ordinality
 | 
						|
            FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) WITH ORDINALITY AS anon_1
 | 
						|
 | 
						|
        :param \*expr: A series of string column names that will be added to the
 | 
						|
         ``.c`` collection of the resulting :class:`_sql.TableValuedAlias`
 | 
						|
         construct as columns.  :func:`_sql.column` objects with or without
 | 
						|
         datatypes may also be used.
 | 
						|
 | 
						|
        :param name: optional name to assign to the alias name that's generated.
 | 
						|
         If omitted, a unique anonymizing name is used.
 | 
						|
 | 
						|
        :param with_ordinality: string name that when present results in the
 | 
						|
         ``WITH ORDINALITY`` clause being added to the alias, and the given
 | 
						|
         string name will be added as a column to the .c collection
 | 
						|
         of the resulting :class:`_sql.TableValuedAlias`.
 | 
						|
 | 
						|
        :param joins_implicitly: when True, the table valued function may be
 | 
						|
         used in the FROM clause without any explicit JOIN to other tables
 | 
						|
         in the SQL query, and no "cartesian product" warning will be generated.
 | 
						|
         May be useful for SQL functions such as ``func.json_each()``.
 | 
						|
 | 
						|
         .. versionadded:: 1.4.33
 | 
						|
 | 
						|
        .. versionadded:: 1.4.0b2
 | 
						|
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`tutorial_functions_table_valued` - in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
            :ref:`postgresql_table_valued` - in the :ref:`postgresql_toplevel` documentation
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.scalar_table_valued` - variant of
 | 
						|
            :meth:`_functions.FunctionElement.table_valued` which delivers the
 | 
						|
            complete table valued expression as a scalar column expression
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.column_valued`
 | 
						|
 | 
						|
            :meth:`_sql.TableValuedAlias.render_derived` - renders the alias
 | 
						|
            using a derived column clause, e.g. ``AS name(col1, col2, ...)``
 | 
						|
 | 
						|
        """  # noqa: 501
 | 
						|
 | 
						|
        new_func = self._generate()
 | 
						|
 | 
						|
        with_ordinality = kw.pop("with_ordinality", None)
 | 
						|
        joins_implicitly = kw.pop("joins_implicitly", None)
 | 
						|
        name = kw.pop("name", None)
 | 
						|
 | 
						|
        if with_ordinality:
 | 
						|
            expr += (with_ordinality,)
 | 
						|
            new_func._with_ordinality = True
 | 
						|
 | 
						|
        new_func.type = new_func._table_value_type = sqltypes.TableValueType(
 | 
						|
            *expr
 | 
						|
        )
 | 
						|
 | 
						|
        return new_func.alias(name=name, joins_implicitly=joins_implicitly)
 | 
						|
 | 
						|
    def column_valued(self, name=None):
 | 
						|
        """Return this :class:`_functions.FunctionElement` as a column expression that
 | 
						|
        selects from itself as a FROM clause.
 | 
						|
 | 
						|
        E.g.::
 | 
						|
 | 
						|
            >>> from sqlalchemy import select, func
 | 
						|
            >>> gs = func.generate_series(1, 5, -1).column_valued()
 | 
						|
            >>> print(select(gs))
 | 
						|
            SELECT anon_1
 | 
						|
            FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) AS anon_1
 | 
						|
 | 
						|
        This is shorthand for::
 | 
						|
 | 
						|
            gs = func.generate_series(1, 5, -1).alias().column
 | 
						|
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`tutorial_functions_column_valued` - in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
            :ref:`postgresql_column_valued` - in the :ref:`postgresql_toplevel` documentation
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.table_valued`
 | 
						|
 | 
						|
        """  # noqa: 501
 | 
						|
 | 
						|
        return self.alias(name=name).column
 | 
						|
 | 
						|
    @property
 | 
						|
    def columns(self):
 | 
						|
        r"""The set of columns exported by this :class:`.FunctionElement`.
 | 
						|
 | 
						|
        This is a placeholder collection that allows the function to be
 | 
						|
        placed in the FROM clause of a statement::
 | 
						|
 | 
						|
            >>> from sqlalchemy import column, select, func
 | 
						|
            >>> stmt = select(column('x'), column('y')).select_from(func.myfunction())
 | 
						|
            >>> print(stmt)
 | 
						|
            SELECT x, y FROM myfunction()
 | 
						|
 | 
						|
        The above form is a legacy feature that is now superseded by the
 | 
						|
        fully capable :meth:`_functions.FunctionElement.table_valued`
 | 
						|
        method; see that method for details.
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.table_valued` - generates table-valued
 | 
						|
            SQL function expressions.
 | 
						|
 | 
						|
        """  # noqa: E501
 | 
						|
 | 
						|
        return ColumnCollection(
 | 
						|
            columns=[(col.key, col) for col in self._all_selected_columns]
 | 
						|
        )
 | 
						|
 | 
						|
    @property
 | 
						|
    def _all_selected_columns(self):
 | 
						|
        if self.type._is_table_value:
 | 
						|
            cols = self.type._elements
 | 
						|
        else:
 | 
						|
            cols = [self.label(None)]
 | 
						|
 | 
						|
        return cols
 | 
						|
 | 
						|
    @property
 | 
						|
    def exported_columns(self):
 | 
						|
        return self.columns
 | 
						|
 | 
						|
    @HasMemoized.memoized_attribute
 | 
						|
    def clauses(self):
 | 
						|
        """Return the underlying :class:`.ClauseList` which contains
 | 
						|
        the arguments for this :class:`.FunctionElement`.
 | 
						|
 | 
						|
        """
 | 
						|
        return self.clause_expr.element
 | 
						|
 | 
						|
    def over(self, partition_by=None, order_by=None, rows=None, range_=None):
 | 
						|
        """Produce an OVER clause against this function.
 | 
						|
 | 
						|
        Used against aggregate or so-called "window" functions,
 | 
						|
        for database backends that support window functions.
 | 
						|
 | 
						|
        The expression::
 | 
						|
 | 
						|
            func.row_number().over(order_by='x')
 | 
						|
 | 
						|
        is shorthand for::
 | 
						|
 | 
						|
            from sqlalchemy import over
 | 
						|
            over(func.row_number(), order_by='x')
 | 
						|
 | 
						|
        See :func:`_expression.over` for a full description.
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :func:`_expression.over`
 | 
						|
 | 
						|
            :ref:`tutorial_window_functions` - in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
        """
 | 
						|
        return Over(
 | 
						|
            self,
 | 
						|
            partition_by=partition_by,
 | 
						|
            order_by=order_by,
 | 
						|
            rows=rows,
 | 
						|
            range_=range_,
 | 
						|
        )
 | 
						|
 | 
						|
    def within_group(self, *order_by):
 | 
						|
        """Produce a WITHIN GROUP (ORDER BY expr) clause against this function.
 | 
						|
 | 
						|
        Used against so-called "ordered set aggregate" and "hypothetical
 | 
						|
        set aggregate" functions, including :class:`.percentile_cont`,
 | 
						|
        :class:`.rank`, :class:`.dense_rank`, etc.
 | 
						|
 | 
						|
        See :func:`_expression.within_group` for a full description.
 | 
						|
 | 
						|
        .. versionadded:: 1.1
 | 
						|
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`tutorial_functions_within_group` -
 | 
						|
            in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
 | 
						|
        """
 | 
						|
        return WithinGroup(self, *order_by)
 | 
						|
 | 
						|
    def filter(self, *criterion):
 | 
						|
        """Produce a FILTER clause against this function.
 | 
						|
 | 
						|
        Used against aggregate and window functions,
 | 
						|
        for database backends that support the "FILTER" clause.
 | 
						|
 | 
						|
        The expression::
 | 
						|
 | 
						|
            func.count(1).filter(True)
 | 
						|
 | 
						|
        is shorthand for::
 | 
						|
 | 
						|
            from sqlalchemy import funcfilter
 | 
						|
            funcfilter(func.count(1), True)
 | 
						|
 | 
						|
        .. versionadded:: 1.0.0
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`tutorial_functions_within_group` -
 | 
						|
            in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
            :class:`.FunctionFilter`
 | 
						|
 | 
						|
            :func:`.funcfilter`
 | 
						|
 | 
						|
 | 
						|
        """
 | 
						|
        if not criterion:
 | 
						|
            return self
 | 
						|
        return FunctionFilter(self, *criterion)
 | 
						|
 | 
						|
    def as_comparison(self, left_index, right_index):
 | 
						|
        """Interpret this expression as a boolean comparison between two values.
 | 
						|
 | 
						|
        This method is used for an ORM use case described at
 | 
						|
        :ref:`relationship_custom_operator_sql_function`.
 | 
						|
 | 
						|
        A hypothetical SQL function "is_equal()" which compares to values
 | 
						|
        for equality would be written in the Core expression language as::
 | 
						|
 | 
						|
            expr = func.is_equal("a", "b")
 | 
						|
 | 
						|
        If "is_equal()" above is comparing "a" and "b" for equality, the
 | 
						|
        :meth:`.FunctionElement.as_comparison` method would be invoked as::
 | 
						|
 | 
						|
            expr = func.is_equal("a", "b").as_comparison(1, 2)
 | 
						|
 | 
						|
        Where above, the integer value "1" refers to the first argument of the
 | 
						|
        "is_equal()" function and the integer value "2" refers to the second.
 | 
						|
 | 
						|
        This would create a :class:`.BinaryExpression` that is equivalent to::
 | 
						|
 | 
						|
            BinaryExpression("a", "b", operator=op.eq)
 | 
						|
 | 
						|
        However, at the SQL level it would still render as
 | 
						|
        "is_equal('a', 'b')".
 | 
						|
 | 
						|
        The ORM, when it loads a related object or collection, needs to be able
 | 
						|
        to manipulate the "left" and "right" sides of the ON clause of a JOIN
 | 
						|
        expression. The purpose of this method is to provide a SQL function
 | 
						|
        construct that can also supply this information to the ORM, when used
 | 
						|
        with the :paramref:`_orm.relationship.primaryjoin` parameter. The
 | 
						|
        return value is a containment object called :class:`.FunctionAsBinary`.
 | 
						|
 | 
						|
        An ORM example is as follows::
 | 
						|
 | 
						|
            class Venue(Base):
 | 
						|
                __tablename__ = 'venue'
 | 
						|
                id = Column(Integer, primary_key=True)
 | 
						|
                name = Column(String)
 | 
						|
 | 
						|
                descendants = relationship(
 | 
						|
                    "Venue",
 | 
						|
                    primaryjoin=func.instr(
 | 
						|
                        remote(foreign(name)), name + "/"
 | 
						|
                    ).as_comparison(1, 2) == 1,
 | 
						|
                    viewonly=True,
 | 
						|
                    order_by=name
 | 
						|
                )
 | 
						|
 | 
						|
        Above, the "Venue" class can load descendant "Venue" objects by
 | 
						|
        determining if the name of the parent Venue is contained within the
 | 
						|
        start of the hypothetical descendant value's name, e.g. "parent1" would
 | 
						|
        match up to "parent1/child1", but not to "parent2/child1".
 | 
						|
 | 
						|
        Possible use cases include the "materialized path" example given above,
 | 
						|
        as well as making use of special SQL functions such as geometric
 | 
						|
        functions to create join conditions.
 | 
						|
 | 
						|
        :param left_index: the integer 1-based index of the function argument
 | 
						|
         that serves as the "left" side of the expression.
 | 
						|
        :param right_index: the integer 1-based index of the function argument
 | 
						|
         that serves as the "right" side of the expression.
 | 
						|
 | 
						|
        .. versionadded:: 1.3
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`relationship_custom_operator_sql_function` -
 | 
						|
            example use within the ORM
 | 
						|
 | 
						|
        """
 | 
						|
        return FunctionAsBinary(self, left_index, right_index)
 | 
						|
 | 
						|
    @property
 | 
						|
    def _from_objects(self):
 | 
						|
        return self.clauses._from_objects
 | 
						|
 | 
						|
    def within_group_type(self, within_group):
 | 
						|
        """For types that define their return type as based on the criteria
 | 
						|
        within a WITHIN GROUP (ORDER BY) expression, called by the
 | 
						|
        :class:`.WithinGroup` construct.
 | 
						|
 | 
						|
        Returns None by default, in which case the function's normal ``.type``
 | 
						|
        is used.
 | 
						|
 | 
						|
        """
 | 
						|
 | 
						|
        return None
 | 
						|
 | 
						|
    def alias(self, name=None, joins_implicitly=False):
 | 
						|
        r"""Produce a :class:`_expression.Alias` construct against this
 | 
						|
        :class:`.FunctionElement`.
 | 
						|
 | 
						|
        .. tip::
 | 
						|
 | 
						|
            The :meth:`_functions.FunctionElement.alias` method is part of the
 | 
						|
            mechanism by which "table valued" SQL functions are created.
 | 
						|
            However, most use cases are covered by higher level methods on
 | 
						|
            :class:`_functions.FunctionElement` including
 | 
						|
            :meth:`_functions.FunctionElement.table_valued`, and
 | 
						|
            :meth:`_functions.FunctionElement.column_valued`.
 | 
						|
 | 
						|
        This construct wraps the function in a named alias which
 | 
						|
        is suitable for the FROM clause, in the style accepted for example
 | 
						|
        by PostgreSQL.  A column expression is also provided using the
 | 
						|
        special ``.column`` attribute, which may
 | 
						|
        be used to refer to the output of the function as a scalar value
 | 
						|
        in the columns or where clause, for a backend such as PostgreSQL.
 | 
						|
 | 
						|
        For a full table-valued expression, use the
 | 
						|
        :meth:`_function.FunctionElement.table_valued` method first to
 | 
						|
        establish named columns.
 | 
						|
 | 
						|
        e.g.::
 | 
						|
 | 
						|
            >>> from sqlalchemy import func, select, column
 | 
						|
            >>> data_view = func.unnest([1, 2, 3]).alias("data_view")
 | 
						|
            >>> print(select(data_view.column))
 | 
						|
            SELECT data_view
 | 
						|
            FROM unnest(:unnest_1) AS data_view
 | 
						|
 | 
						|
        The :meth:`_functions.FunctionElement.column_valued` method provides
 | 
						|
        a shortcut for the above pattern::
 | 
						|
 | 
						|
            >>> data_view = func.unnest([1, 2, 3]).column_valued("data_view")
 | 
						|
            >>> print(select(data_view))
 | 
						|
            SELECT data_view
 | 
						|
            FROM unnest(:unnest_1) AS data_view
 | 
						|
 | 
						|
        .. versionadded:: 1.4.0b2  Added the ``.column`` accessor
 | 
						|
 | 
						|
        :param name: alias name, will be rendered as ``AS <name>`` in the
 | 
						|
         FROM clause
 | 
						|
 | 
						|
        :param joins_implicitly: when True, the table valued function may be
 | 
						|
         used in the FROM clause without any explicit JOIN to other tables
 | 
						|
         in the SQL query, and no "cartesian product" warning will be
 | 
						|
         generated.  May be useful for SQL functions such as
 | 
						|
         ``func.json_each()``.
 | 
						|
 | 
						|
         .. versionadded:: 1.4.33
 | 
						|
 | 
						|
        .. seealso::
 | 
						|
 | 
						|
            :ref:`tutorial_functions_table_valued` -
 | 
						|
            in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.table_valued`
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.scalar_table_valued`
 | 
						|
 | 
						|
            :meth:`_functions.FunctionElement.column_valued`
 | 
						|
 | 
						|
 | 
						|
        """
 | 
						|
 | 
						|
        return TableValuedAlias._construct(
 | 
						|
            self,
 | 
						|
            name,
 | 
						|
            table_value_type=self.type,
 | 
						|
            joins_implicitly=joins_implicitly,
 | 
						|
        )
 | 
						|
 | 
						|
    def select(self):
 | 
						|
        """Produce a :func:`_expression.select` construct
 | 
						|
        against this :class:`.FunctionElement`.
 | 
						|
 | 
						|
        This is shorthand for::
 | 
						|
 | 
						|
            s = select(function_element)
 | 
						|
 | 
						|
        """
 | 
						|
        s = Select._create_select(self)
 | 
						|
        if self._execution_options:
 | 
						|
            s = s.execution_options(**self._execution_options)
 | 
						|
        return s
 | 
						|
 | 
						|
    @util.deprecated_20(
 | 
						|
        ":meth:`.FunctionElement.scalar`",
 | 
						|
        alternative="Scalar execution in SQLAlchemy 2.0 is performed "
 | 
						|
        "by the :meth:`_engine.Connection.scalar` method of "
 | 
						|
        ":class:`_engine.Connection`, "
 | 
						|
        "or in the ORM by the :meth:`.Session.scalar` method of "
 | 
						|
        ":class:`.Session`.",
 | 
						|
    )
 | 
						|
    def scalar(self):
 | 
						|
        """Execute this :class:`.FunctionElement` against an embedded
 | 
						|
        'bind' and return a scalar value.
 | 
						|
 | 
						|
        This first calls :meth:`~.FunctionElement.select` to
 | 
						|
        produce a SELECT construct.
 | 
						|
 | 
						|
        Note that :class:`.FunctionElement` can be passed to
 | 
						|
        the :meth:`.Connectable.scalar` method of :class:`_engine.Connection`
 | 
						|
        or :class:`_engine.Engine`.
 | 
						|
 | 
						|
        """
 | 
						|
        return self.select().execute().scalar()
 | 
						|
 | 
						|
    @util.deprecated_20(
 | 
						|
        ":meth:`.FunctionElement.execute`",
 | 
						|
        alternative="All statement execution in SQLAlchemy 2.0 is performed "
 | 
						|
        "by the :meth:`_engine.Connection.execute` method of "
 | 
						|
        ":class:`_engine.Connection`, "
 | 
						|
        "or in the ORM by the :meth:`.Session.execute` method of "
 | 
						|
        ":class:`.Session`.",
 | 
						|
    )
 | 
						|
    def execute(self):
 | 
						|
        """Execute this :class:`.FunctionElement` against an embedded
 | 
						|
        'bind'.
 | 
						|
 | 
						|
        This first calls :meth:`~.FunctionElement.select` to
 | 
						|
        produce a SELECT construct.
 | 
						|
 | 
						|
        Note that :class:`.FunctionElement` can be passed to
 | 
						|
        the :meth:`.Connectable.execute` method of :class:`_engine.Connection`
 | 
						|
        or :class:`_engine.Engine`.
 | 
						|
 | 
						|
        """
 | 
						|
        return self.select().execute()
 | 
						|
 | 
						|
    def _bind_param(self, operator, obj, type_=None, **kw):
 | 
						|
        return BindParameter(
 | 
						|
            None,
 | 
						|
            obj,
 | 
						|
            _compared_to_operator=operator,
 | 
						|
            _compared_to_type=self.type,
 | 
						|
            unique=True,
 | 
						|
            type_=type_,
 | 
						|
            **kw
 | 
						|
        )
 | 
						|
 | 
						|
    def self_group(self, against=None):
 | 
						|
        # for the moment, we are parenthesizing all array-returning
 | 
						|
        # expressions against getitem.  This may need to be made
 | 
						|
        # more portable if in the future we support other DBs
 | 
						|
        # besides postgresql.
 | 
						|
        if against is operators.getitem and isinstance(
 | 
						|
            self.type, sqltypes.ARRAY
 | 
						|
        ):
 | 
						|
            return Grouping(self)
 | 
						|
        else:
 | 
						|
            return super(FunctionElement, self).self_group(against=against)
 | 
						|
 | 
						|
    @property
 | 
						|
    def entity_namespace(self):
 | 
						|
        """overrides FromClause.entity_namespace as functions are generally
 | 
						|
        column expressions and not FromClauses.
 | 
						|
 | 
						|
        """
 | 
						|
        # ideally functions would not be fromclauses but we failed to make
 | 
						|
        # this adjustment in 1.4
 | 
						|
        return _entity_namespace(self.clause_expr)
 | 
						|
 | 
						|
 | 
						|
class FunctionAsBinary(BinaryExpression):
 | 
						|
    _traverse_internals = [
 | 
						|
        ("sql_function", InternalTraversal.dp_clauseelement),
 | 
						|
        ("left_index", InternalTraversal.dp_plain_obj),
 | 
						|
        ("right_index", InternalTraversal.dp_plain_obj),
 | 
						|
        ("modifiers", InternalTraversal.dp_plain_dict),
 | 
						|
    ]
 | 
						|
 | 
						|
    def _gen_cache_key(self, anon_map, bindparams):
 | 
						|
        return ColumnElement._gen_cache_key(self, anon_map, bindparams)
 | 
						|
 | 
						|
    def __init__(self, fn, left_index, right_index):
 | 
						|
        self.sql_function = fn
 | 
						|
        self.left_index = left_index
 | 
						|
        self.right_index = right_index
 | 
						|
 | 
						|
        self.operator = operators.function_as_comparison_op
 | 
						|
        self.type = sqltypes.BOOLEANTYPE
 | 
						|
        self.negate = None
 | 
						|
        self._is_implicitly_boolean = True
 | 
						|
        self.modifiers = {}
 | 
						|
 | 
						|
    @property
 | 
						|
    def left(self):
 | 
						|
        return self.sql_function.clauses.clauses[self.left_index - 1]
 | 
						|
 | 
						|
    @left.setter
 | 
						|
    def left(self, value):
 | 
						|
        self.sql_function.clauses.clauses[self.left_index - 1] = value
 | 
						|
 | 
						|
    @property
 | 
						|
    def right(self):
 | 
						|
        return self.sql_function.clauses.clauses[self.right_index - 1]
 | 
						|
 | 
						|
    @right.setter
 | 
						|
    def right(self, value):
 | 
						|
        self.sql_function.clauses.clauses[self.right_index - 1] = value
 | 
						|
 | 
						|
 | 
						|
class ScalarFunctionColumn(NamedColumn):
 | 
						|
    __visit_name__ = "scalar_function_column"
 | 
						|
 | 
						|
    _traverse_internals = [
 | 
						|
        ("name", InternalTraversal.dp_anon_name),
 | 
						|
        ("type", InternalTraversal.dp_type),
 | 
						|
        ("fn", InternalTraversal.dp_clauseelement),
 | 
						|
    ]
 | 
						|
 | 
						|
    is_literal = False
 | 
						|
    table = None
 | 
						|
 | 
						|
    def __init__(self, fn, name, type_=None):
 | 
						|
        self.fn = fn
 | 
						|
        self.name = name
 | 
						|
        self.type = sqltypes.to_instance(type_)
 | 
						|
 | 
						|
 | 
						|
class _FunctionGenerator(object):
 | 
						|
    """Generate SQL function expressions.
 | 
						|
 | 
						|
    :data:`.func` is a special object instance which generates SQL
 | 
						|
    functions based on name-based attributes, e.g.::
 | 
						|
 | 
						|
        >>> print(func.count(1))
 | 
						|
        count(:param_1)
 | 
						|
 | 
						|
    The returned object is an instance of :class:`.Function`, and  is a
 | 
						|
    column-oriented SQL element like any other, and is used in that way::
 | 
						|
 | 
						|
        >>> print(select(func.count(table.c.id)))
 | 
						|
        SELECT count(sometable.id) FROM sometable
 | 
						|
 | 
						|
    Any name can be given to :data:`.func`. If the function name is unknown to
 | 
						|
    SQLAlchemy, it will be rendered exactly as is. For common SQL functions
 | 
						|
    which SQLAlchemy is aware of, the name may be interpreted as a *generic
 | 
						|
    function* which will be compiled appropriately to the target database::
 | 
						|
 | 
						|
        >>> print(func.current_timestamp())
 | 
						|
        CURRENT_TIMESTAMP
 | 
						|
 | 
						|
    To call functions which are present in dot-separated packages,
 | 
						|
    specify them in the same manner::
 | 
						|
 | 
						|
        >>> print(func.stats.yield_curve(5, 10))
 | 
						|
        stats.yield_curve(:yield_curve_1, :yield_curve_2)
 | 
						|
 | 
						|
    SQLAlchemy can be made aware of the return type of functions to enable
 | 
						|
    type-specific lexical and result-based behavior. For example, to ensure
 | 
						|
    that a string-based function returns a Unicode value and is similarly
 | 
						|
    treated as a string in expressions, specify
 | 
						|
    :class:`~sqlalchemy.types.Unicode` as the type:
 | 
						|
 | 
						|
        >>> print(func.my_string(u'hi', type_=Unicode) + ' ' +
 | 
						|
        ...       func.my_string(u'there', type_=Unicode))
 | 
						|
        my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3)
 | 
						|
 | 
						|
    The object returned by a :data:`.func` call is usually an instance of
 | 
						|
    :class:`.Function`.
 | 
						|
    This object meets the "column" interface, including comparison and labeling
 | 
						|
    functions.  The object can also be passed the :meth:`~.Connectable.execute`
 | 
						|
    method of a :class:`_engine.Connection` or :class:`_engine.Engine`,
 | 
						|
    where it will be
 | 
						|
    wrapped inside of a SELECT statement first::
 | 
						|
 | 
						|
        print(connection.execute(func.current_timestamp()).scalar())
 | 
						|
 | 
						|
    In a few exception cases, the :data:`.func` accessor
 | 
						|
    will redirect a name to a built-in expression such as :func:`.cast`
 | 
						|
    or :func:`.extract`, as these names have well-known meaning
 | 
						|
    but are not exactly the same as "functions" from a SQLAlchemy
 | 
						|
    perspective.
 | 
						|
 | 
						|
    Functions which are interpreted as "generic" functions know how to
 | 
						|
    calculate their return type automatically. For a listing of known generic
 | 
						|
    functions, see :ref:`generic_functions`.
 | 
						|
 | 
						|
    .. note::
 | 
						|
 | 
						|
        The :data:`.func` construct has only limited support for calling
 | 
						|
        standalone "stored procedures", especially those with special
 | 
						|
        parameterization concerns.
 | 
						|
 | 
						|
        See the section :ref:`stored_procedures` for details on how to use
 | 
						|
        the DBAPI-level ``callproc()`` method for fully traditional stored
 | 
						|
        procedures.
 | 
						|
 | 
						|
    .. seealso::
 | 
						|
 | 
						|
        :ref:`coretutorial_functions` - in the Core Tutorial
 | 
						|
 | 
						|
        :class:`.Function`
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    def __init__(self, **opts):
 | 
						|
        self.__names = []
 | 
						|
        self.opts = opts
 | 
						|
 | 
						|
    def __getattr__(self, name):
 | 
						|
        # passthru __ attributes; fixes pydoc
 | 
						|
        if name.startswith("__"):
 | 
						|
            try:
 | 
						|
                return self.__dict__[name]
 | 
						|
            except KeyError:
 | 
						|
                raise AttributeError(name)
 | 
						|
 | 
						|
        elif name.endswith("_"):
 | 
						|
            name = name[0:-1]
 | 
						|
        f = _FunctionGenerator(**self.opts)
 | 
						|
        f.__names = list(self.__names) + [name]
 | 
						|
        return f
 | 
						|
 | 
						|
    def __call__(self, *c, **kwargs):
 | 
						|
        o = self.opts.copy()
 | 
						|
        o.update(kwargs)
 | 
						|
 | 
						|
        tokens = len(self.__names)
 | 
						|
 | 
						|
        if tokens == 2:
 | 
						|
            package, fname = self.__names
 | 
						|
        elif tokens == 1:
 | 
						|
            package, fname = "_default", self.__names[0]
 | 
						|
        else:
 | 
						|
            package = None
 | 
						|
 | 
						|
        if package is not None:
 | 
						|
            func = _registry[package].get(fname.lower())
 | 
						|
            if func is not None:
 | 
						|
                return func(*c, **o)
 | 
						|
 | 
						|
        return Function(
 | 
						|
            self.__names[-1], packagenames=tuple(self.__names[0:-1]), *c, **o
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
func = _FunctionGenerator()
 | 
						|
func.__doc__ = _FunctionGenerator.__doc__
 | 
						|
 | 
						|
modifier = _FunctionGenerator(group=False)
 | 
						|
 | 
						|
 | 
						|
class Function(FunctionElement):
 | 
						|
    r"""Describe a named SQL function.
 | 
						|
 | 
						|
    The :class:`.Function` object is typically generated from the
 | 
						|
    :data:`.func` generation object.
 | 
						|
 | 
						|
 | 
						|
    :param \*clauses: list of column expressions that form the arguments
 | 
						|
     of the SQL function call.
 | 
						|
 | 
						|
    :param type\_: optional :class:`.TypeEngine` datatype object that will be
 | 
						|
     used as the return value of the column expression generated by this
 | 
						|
     function call.
 | 
						|
 | 
						|
    :param packagenames: a string which indicates package prefix names
 | 
						|
     to be prepended to the function name when the SQL is generated.
 | 
						|
     The :data:`.func` generator creates these when it is called using
 | 
						|
     dotted format, e.g.::
 | 
						|
 | 
						|
        func.mypackage.some_function(col1, col2)
 | 
						|
 | 
						|
    .. seealso::
 | 
						|
 | 
						|
        :ref:`tutorial_functions` - in the :ref:`unified_tutorial`
 | 
						|
 | 
						|
        :data:`.func` - namespace which produces registered or ad-hoc
 | 
						|
        :class:`.Function` instances.
 | 
						|
 | 
						|
        :class:`.GenericFunction` - allows creation of registered function
 | 
						|
        types.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    __visit_name__ = "function"
 | 
						|
 | 
						|
    _traverse_internals = FunctionElement._traverse_internals + [
 | 
						|
        ("packagenames", InternalTraversal.dp_plain_obj),
 | 
						|
        ("name", InternalTraversal.dp_string),
 | 
						|
        ("type", InternalTraversal.dp_type),
 | 
						|
    ]
 | 
						|
 | 
						|
    type = sqltypes.NULLTYPE
 | 
						|
    """A :class:`_types.TypeEngine` object which refers to the SQL return
 | 
						|
    type represented by this SQL function.
 | 
						|
 | 
						|
    This datatype may be configured when generating a
 | 
						|
    :class:`_functions.Function` object by passing the
 | 
						|
    :paramref:`_functions.Function.type_` parameter, e.g.::
 | 
						|
 | 
						|
        >>> select(func.lower("some VALUE", type_=String))
 | 
						|
 | 
						|
    The small number of built-in classes of :class:`_functions.Function` come
 | 
						|
    with a built-in datatype that's appropriate to the class of function and
 | 
						|
    its arguments. For functions that aren't known, the type defaults to the
 | 
						|
    "null type".
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    @util.deprecated_params(
 | 
						|
        bind=(
 | 
						|
            "2.0",
 | 
						|
            "The :paramref:`_sql.text.bind` argument is deprecated and "
 | 
						|
            "will be removed in SQLAlchemy 2.0.",
 | 
						|
        ),
 | 
						|
    )
 | 
						|
    def __init__(self, name, *clauses, **kw):
 | 
						|
        """Construct a :class:`.Function`.
 | 
						|
 | 
						|
        The :data:`.func` construct is normally used to construct
 | 
						|
        new :class:`.Function` instances.
 | 
						|
 | 
						|
        """
 | 
						|
        self.packagenames = kw.pop("packagenames", None) or ()
 | 
						|
        self.name = name
 | 
						|
 | 
						|
        self._bind = self._get_bind(kw)
 | 
						|
        self.type = sqltypes.to_instance(kw.get("type_", None))
 | 
						|
 | 
						|
        FunctionElement.__init__(self, *clauses, **kw)
 | 
						|
 | 
						|
    def _get_bind(self, kw):
 | 
						|
        if "bind" in kw:
 | 
						|
            util.warn_deprecated_20(
 | 
						|
                "The Function.bind argument is deprecated and "
 | 
						|
                "will be removed in SQLAlchemy 2.0.",
 | 
						|
            )
 | 
						|
            return kw["bind"]
 | 
						|
 | 
						|
    def _bind_param(self, operator, obj, type_=None, **kw):
 | 
						|
        return BindParameter(
 | 
						|
            self.name,
 | 
						|
            obj,
 | 
						|
            _compared_to_operator=operator,
 | 
						|
            _compared_to_type=self.type,
 | 
						|
            type_=type_,
 | 
						|
            unique=True,
 | 
						|
            **kw
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
class _GenericMeta(TraversibleType):
 | 
						|
    def __init__(cls, clsname, bases, clsdict):
 | 
						|
        if annotation.Annotated not in cls.__mro__:
 | 
						|
            cls.name = name = clsdict.get("name", clsname)
 | 
						|
            cls.identifier = identifier = clsdict.get("identifier", name)
 | 
						|
            package = clsdict.pop("package", "_default")
 | 
						|
            # legacy
 | 
						|
            if "__return_type__" in clsdict:
 | 
						|
                cls.type = clsdict["__return_type__"]
 | 
						|
 | 
						|
            # Check _register attribute status
 | 
						|
            cls._register = getattr(cls, "_register", True)
 | 
						|
 | 
						|
            # Register the function if required
 | 
						|
            if cls._register:
 | 
						|
                register_function(identifier, cls, package)
 | 
						|
            else:
 | 
						|
                # Set _register to True to register child classes by default
 | 
						|
                cls._register = True
 | 
						|
 | 
						|
        super(_GenericMeta, cls).__init__(clsname, bases, clsdict)
 | 
						|
 | 
						|
 | 
						|
class GenericFunction(util.with_metaclass(_GenericMeta, Function)):
 | 
						|
    """Define a 'generic' function.
 | 
						|
 | 
						|
    A generic function is a pre-established :class:`.Function`
 | 
						|
    class that is instantiated automatically when called
 | 
						|
    by name from the :data:`.func` attribute.    Note that
 | 
						|
    calling any name from :data:`.func` has the effect that
 | 
						|
    a new :class:`.Function` instance is created automatically,
 | 
						|
    given that name.  The primary use case for defining
 | 
						|
    a :class:`.GenericFunction` class is so that a function
 | 
						|
    of a particular name may be given a fixed return type.
 | 
						|
    It can also include custom argument parsing schemes as well
 | 
						|
    as additional methods.
 | 
						|
 | 
						|
    Subclasses of :class:`.GenericFunction` are automatically
 | 
						|
    registered under the name of the class.  For
 | 
						|
    example, a user-defined function ``as_utc()`` would
 | 
						|
    be available immediately::
 | 
						|
 | 
						|
        from sqlalchemy.sql.functions import GenericFunction
 | 
						|
        from sqlalchemy.types import DateTime
 | 
						|
 | 
						|
        class as_utc(GenericFunction):
 | 
						|
            type = DateTime
 | 
						|
            inherit_cache = True
 | 
						|
 | 
						|
        print(select(func.as_utc()))
 | 
						|
 | 
						|
    User-defined generic functions can be organized into
 | 
						|
    packages by specifying the "package" attribute when defining
 | 
						|
    :class:`.GenericFunction`.   Third party libraries
 | 
						|
    containing many functions may want to use this in order
 | 
						|
    to avoid name conflicts with other systems.   For example,
 | 
						|
    if our ``as_utc()`` function were part of a package
 | 
						|
    "time"::
 | 
						|
 | 
						|
        class as_utc(GenericFunction):
 | 
						|
            type = DateTime
 | 
						|
            package = "time"
 | 
						|
            inherit_cache = True
 | 
						|
 | 
						|
    The above function would be available from :data:`.func`
 | 
						|
    using the package name ``time``::
 | 
						|
 | 
						|
        print(select(func.time.as_utc()))
 | 
						|
 | 
						|
    A final option is to allow the function to be accessed
 | 
						|
    from one name in :data:`.func` but to render as a different name.
 | 
						|
    The ``identifier`` attribute will override the name used to
 | 
						|
    access the function as loaded from :data:`.func`, but will retain
 | 
						|
    the usage of ``name`` as the rendered name::
 | 
						|
 | 
						|
        class GeoBuffer(GenericFunction):
 | 
						|
            type = Geometry
 | 
						|
            package = "geo"
 | 
						|
            name = "ST_Buffer"
 | 
						|
            identifier = "buffer"
 | 
						|
            inherit_cache = True
 | 
						|
 | 
						|
    The above function will render as follows::
 | 
						|
 | 
						|
        >>> print(func.geo.buffer())
 | 
						|
        ST_Buffer()
 | 
						|
 | 
						|
    The name will be rendered as is, however without quoting unless the name
 | 
						|
    contains special characters that require quoting.  To force quoting
 | 
						|
    on or off for the name, use the :class:`.sqlalchemy.sql.quoted_name`
 | 
						|
    construct::
 | 
						|
 | 
						|
        from sqlalchemy.sql import quoted_name
 | 
						|
 | 
						|
        class GeoBuffer(GenericFunction):
 | 
						|
            type = Geometry
 | 
						|
            package = "geo"
 | 
						|
            name = quoted_name("ST_Buffer", True)
 | 
						|
            identifier = "buffer"
 | 
						|
            inherit_cache = True
 | 
						|
 | 
						|
    The above function will render as::
 | 
						|
 | 
						|
        >>> print(func.geo.buffer())
 | 
						|
        "ST_Buffer"()
 | 
						|
 | 
						|
    .. versionadded:: 1.3.13  The :class:`.quoted_name` construct is now
 | 
						|
       recognized for quoting when used with the "name" attribute of the
 | 
						|
       object, so that quoting can be forced on or off for the function
 | 
						|
       name.
 | 
						|
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    coerce_arguments = True
 | 
						|
    _register = False
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        parsed_args = kwargs.pop("_parsed_args", None)
 | 
						|
        if parsed_args is None:
 | 
						|
            parsed_args = [
 | 
						|
                coercions.expect(
 | 
						|
                    roles.ExpressionElementRole,
 | 
						|
                    c,
 | 
						|
                    name=self.name,
 | 
						|
                    apply_propagate_attrs=self,
 | 
						|
                )
 | 
						|
                for c in args
 | 
						|
            ]
 | 
						|
        self._has_args = self._has_args or bool(parsed_args)
 | 
						|
        self.packagenames = ()
 | 
						|
        self._bind = self._get_bind(kwargs)
 | 
						|
        self.clause_expr = ClauseList(
 | 
						|
            operator=operators.comma_op, group_contents=True, *parsed_args
 | 
						|
        ).self_group()
 | 
						|
        self.type = sqltypes.to_instance(
 | 
						|
            kwargs.pop("type_", None) or getattr(self, "type", None)
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
register_function("cast", Cast)
 | 
						|
register_function("extract", Extract)
 | 
						|
 | 
						|
 | 
						|
class next_value(GenericFunction):
 | 
						|
    """Represent the 'next value', given a :class:`.Sequence`
 | 
						|
    as its single argument.
 | 
						|
 | 
						|
    Compiles into the appropriate function on each backend,
 | 
						|
    or will raise NotImplementedError if used on a backend
 | 
						|
    that does not provide support for sequences.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.Integer()
 | 
						|
    name = "next_value"
 | 
						|
 | 
						|
    _traverse_internals = [
 | 
						|
        ("sequence", InternalTraversal.dp_named_ddl_element)
 | 
						|
    ]
 | 
						|
 | 
						|
    def __init__(self, seq, **kw):
 | 
						|
        assert isinstance(
 | 
						|
            seq, schema.Sequence
 | 
						|
        ), "next_value() accepts a Sequence object as input."
 | 
						|
        self._bind = self._get_bind(kw)
 | 
						|
        self.sequence = seq
 | 
						|
        self.type = sqltypes.to_instance(
 | 
						|
            seq.data_type or getattr(self, "type", None)
 | 
						|
        )
 | 
						|
 | 
						|
    def compare(self, other, **kw):
 | 
						|
        return (
 | 
						|
            isinstance(other, next_value)
 | 
						|
            and self.sequence.name == other.sequence.name
 | 
						|
        )
 | 
						|
 | 
						|
    @property
 | 
						|
    def _from_objects(self):
 | 
						|
        return []
 | 
						|
 | 
						|
 | 
						|
class AnsiFunction(GenericFunction):
 | 
						|
    """Define a function in "ansi" format, which doesn't render parenthesis."""
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        GenericFunction.__init__(self, *args, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class ReturnTypeFromArgs(GenericFunction):
 | 
						|
    """Define a function whose return type is the same as its arguments."""
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        args = [
 | 
						|
            coercions.expect(
 | 
						|
                roles.ExpressionElementRole,
 | 
						|
                c,
 | 
						|
                name=self.name,
 | 
						|
                apply_propagate_attrs=self,
 | 
						|
            )
 | 
						|
            for c in args
 | 
						|
        ]
 | 
						|
        kwargs.setdefault("type_", _type_from_args(args))
 | 
						|
        kwargs["_parsed_args"] = args
 | 
						|
        super(ReturnTypeFromArgs, self).__init__(*args, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class coalesce(ReturnTypeFromArgs):
 | 
						|
    _has_args = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class max(ReturnTypeFromArgs):  # noqa:  A001
 | 
						|
    """The SQL MAX() aggregate function."""
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class min(ReturnTypeFromArgs):  # noqa: A001
 | 
						|
    """The SQL MIN() aggregate function."""
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class sum(ReturnTypeFromArgs):  # noqa: A001
 | 
						|
    """The SQL SUM() aggregate function."""
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class now(GenericFunction):
 | 
						|
    """The SQL now() datetime function.
 | 
						|
 | 
						|
    SQLAlchemy dialects will usually render this particular function
 | 
						|
    in a backend-specific way, such as rendering it as ``CURRENT_TIMESTAMP``.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.DateTime
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class concat(GenericFunction):
 | 
						|
    """The SQL CONCAT() function, which concatenates strings.
 | 
						|
 | 
						|
    E.g.::
 | 
						|
 | 
						|
        >>> print(select(func.concat('a', 'b')))
 | 
						|
        SELECT concat(:concat_2, :concat_3) AS concat_1
 | 
						|
 | 
						|
    String concatenation in SQLAlchemy is more commonly available using the
 | 
						|
    Python ``+`` operator with string datatypes, which will render a
 | 
						|
    backend-specific concatenation operator, such as ::
 | 
						|
 | 
						|
        >>> print(select(literal("a") + "b"))
 | 
						|
        SELECT :param_1 || :param_2 AS anon_1
 | 
						|
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.String
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class char_length(GenericFunction):
 | 
						|
    """The CHAR_LENGTH() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.Integer
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, arg, **kwargs):
 | 
						|
        GenericFunction.__init__(self, arg, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class random(GenericFunction):
 | 
						|
    """The RANDOM() SQL function."""
 | 
						|
 | 
						|
    _has_args = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class count(GenericFunction):
 | 
						|
    r"""The ANSI COUNT aggregate function.  With no arguments,
 | 
						|
    emits COUNT \*.
 | 
						|
 | 
						|
    E.g.::
 | 
						|
 | 
						|
        from sqlalchemy import func
 | 
						|
        from sqlalchemy import select
 | 
						|
        from sqlalchemy import table, column
 | 
						|
 | 
						|
        my_table = table('some_table', column('id'))
 | 
						|
 | 
						|
        stmt = select(func.count()).select_from(my_table)
 | 
						|
 | 
						|
    Executing ``stmt`` would emit::
 | 
						|
 | 
						|
        SELECT count(*) AS count_1
 | 
						|
        FROM some_table
 | 
						|
 | 
						|
 | 
						|
    """
 | 
						|
    type = sqltypes.Integer
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, expression=None, **kwargs):
 | 
						|
        if expression is None:
 | 
						|
            expression = literal_column("*")
 | 
						|
        super(count, self).__init__(expression, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class current_date(AnsiFunction):
 | 
						|
    """The CURRENT_DATE() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.Date
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class current_time(AnsiFunction):
 | 
						|
    """The CURRENT_TIME() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.Time
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class current_timestamp(AnsiFunction):
 | 
						|
    """The CURRENT_TIMESTAMP() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.DateTime
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class current_user(AnsiFunction):
 | 
						|
    """The CURRENT_USER() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.String
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class localtime(AnsiFunction):
 | 
						|
    """The localtime() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.DateTime
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class localtimestamp(AnsiFunction):
 | 
						|
    """The localtimestamp() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.DateTime
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class session_user(AnsiFunction):
 | 
						|
    """The SESSION_USER() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.String
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class sysdate(AnsiFunction):
 | 
						|
    """The SYSDATE() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.DateTime
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class user(AnsiFunction):
 | 
						|
    """The USER() SQL function."""
 | 
						|
 | 
						|
    type = sqltypes.String
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class array_agg(GenericFunction):
 | 
						|
    """Support for the ARRAY_AGG function.
 | 
						|
 | 
						|
    The ``func.array_agg(expr)`` construct returns an expression of
 | 
						|
    type :class:`_types.ARRAY`.
 | 
						|
 | 
						|
    e.g.::
 | 
						|
 | 
						|
        stmt = select(func.array_agg(table.c.values)[2:5])
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    .. seealso::
 | 
						|
 | 
						|
        :func:`_postgresql.array_agg` - PostgreSQL-specific version that
 | 
						|
        returns :class:`_postgresql.ARRAY`, which has PG-specific operators
 | 
						|
        added.
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.ARRAY
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def __init__(self, *args, **kwargs):
 | 
						|
        args = [
 | 
						|
            coercions.expect(
 | 
						|
                roles.ExpressionElementRole, c, apply_propagate_attrs=self
 | 
						|
            )
 | 
						|
            for c in args
 | 
						|
        ]
 | 
						|
 | 
						|
        default_array_type = kwargs.pop("_default_array_type", sqltypes.ARRAY)
 | 
						|
        if "type_" not in kwargs:
 | 
						|
 | 
						|
            type_from_args = _type_from_args(args)
 | 
						|
            if isinstance(type_from_args, sqltypes.ARRAY):
 | 
						|
                kwargs["type_"] = type_from_args
 | 
						|
            else:
 | 
						|
                kwargs["type_"] = default_array_type(type_from_args)
 | 
						|
        kwargs["_parsed_args"] = args
 | 
						|
        super(array_agg, self).__init__(*args, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class OrderedSetAgg(GenericFunction):
 | 
						|
    """Define a function where the return type is based on the sort
 | 
						|
    expression type as defined by the expression passed to the
 | 
						|
    :meth:`.FunctionElement.within_group` method."""
 | 
						|
 | 
						|
    array_for_multi_clause = False
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
    def within_group_type(self, within_group):
 | 
						|
        func_clauses = self.clause_expr.element
 | 
						|
        order_by = sqlutil.unwrap_order_by(within_group.order_by)
 | 
						|
        if self.array_for_multi_clause and len(func_clauses.clauses) > 1:
 | 
						|
            return sqltypes.ARRAY(order_by[0].type)
 | 
						|
        else:
 | 
						|
            return order_by[0].type
 | 
						|
 | 
						|
 | 
						|
class mode(OrderedSetAgg):
 | 
						|
    """Implement the ``mode`` ordered-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is the same as the sort expression.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class percentile_cont(OrderedSetAgg):
 | 
						|
    """Implement the ``percentile_cont`` ordered-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is the same as the sort expression,
 | 
						|
    or if the arguments are an array, an :class:`_types.ARRAY` of the sort
 | 
						|
    expression's type.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    array_for_multi_clause = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class percentile_disc(OrderedSetAgg):
 | 
						|
    """Implement the ``percentile_disc`` ordered-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is the same as the sort expression,
 | 
						|
    or if the arguments are an array, an :class:`_types.ARRAY` of the sort
 | 
						|
    expression's type.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    array_for_multi_clause = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class rank(GenericFunction):
 | 
						|
    """Implement the ``rank`` hypothetical-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is :class:`.Integer`.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.Integer()
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class dense_rank(GenericFunction):
 | 
						|
    """Implement the ``dense_rank`` hypothetical-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is :class:`.Integer`.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.Integer()
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class percent_rank(GenericFunction):
 | 
						|
    """Implement the ``percent_rank`` hypothetical-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is :class:`.Numeric`.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.Numeric()
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class cume_dist(GenericFunction):
 | 
						|
    """Implement the ``cume_dist`` hypothetical-set aggregate function.
 | 
						|
 | 
						|
    This function must be used with the :meth:`.FunctionElement.within_group`
 | 
						|
    modifier to supply a sort expression to operate upon.
 | 
						|
 | 
						|
    The return type of this function is :class:`.Numeric`.
 | 
						|
 | 
						|
    .. versionadded:: 1.1
 | 
						|
 | 
						|
    """
 | 
						|
 | 
						|
    type = sqltypes.Numeric()
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class cube(GenericFunction):
 | 
						|
    r"""Implement the ``CUBE`` grouping operation.
 | 
						|
 | 
						|
    This function is used as part of the GROUP BY of a statement,
 | 
						|
    e.g. :meth:`_expression.Select.group_by`::
 | 
						|
 | 
						|
        stmt = select(
 | 
						|
            func.sum(table.c.value), table.c.col_1, table.c.col_2
 | 
						|
        ).group_by(func.cube(table.c.col_1, table.c.col_2))
 | 
						|
 | 
						|
    .. versionadded:: 1.2
 | 
						|
 | 
						|
    """
 | 
						|
    _has_args = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class rollup(GenericFunction):
 | 
						|
    r"""Implement the ``ROLLUP`` grouping operation.
 | 
						|
 | 
						|
    This function is used as part of the GROUP BY of a statement,
 | 
						|
    e.g. :meth:`_expression.Select.group_by`::
 | 
						|
 | 
						|
        stmt = select(
 | 
						|
            func.sum(table.c.value), table.c.col_1, table.c.col_2
 | 
						|
        ).group_by(func.rollup(table.c.col_1, table.c.col_2))
 | 
						|
 | 
						|
    .. versionadded:: 1.2
 | 
						|
 | 
						|
    """
 | 
						|
    _has_args = True
 | 
						|
    inherit_cache = True
 | 
						|
 | 
						|
 | 
						|
class grouping_sets(GenericFunction):
 | 
						|
    r"""Implement the ``GROUPING SETS`` grouping operation.
 | 
						|
 | 
						|
    This function is used as part of the GROUP BY of a statement,
 | 
						|
    e.g. :meth:`_expression.Select.group_by`::
 | 
						|
 | 
						|
        stmt = select(
 | 
						|
            func.sum(table.c.value), table.c.col_1, table.c.col_2
 | 
						|
        ).group_by(func.grouping_sets(table.c.col_1, table.c.col_2))
 | 
						|
 | 
						|
    In order to group by multiple sets, use the :func:`.tuple_` construct::
 | 
						|
 | 
						|
        from sqlalchemy import tuple_
 | 
						|
 | 
						|
        stmt = select(
 | 
						|
            func.sum(table.c.value),
 | 
						|
            table.c.col_1, table.c.col_2,
 | 
						|
            table.c.col_3
 | 
						|
        ).group_by(
 | 
						|
            func.grouping_sets(
 | 
						|
                tuple_(table.c.col_1, table.c.col_2),
 | 
						|
                tuple_(table.c.value, table.c.col_3),
 | 
						|
            )
 | 
						|
        )
 | 
						|
 | 
						|
 | 
						|
    .. versionadded:: 1.2
 | 
						|
 | 
						|
    """
 | 
						|
    _has_args = True
 | 
						|
    inherit_cache = True
 |