Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/sqlalchemy/sql/functions.py: 58%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

592 statements  

1# sql/functions.py 

2# Copyright (C) 2005-2026 the SQLAlchemy authors and contributors 

3# <see AUTHORS file> 

4# 

5# This module is part of SQLAlchemy and is released under 

6# the MIT License: https://www.opensource.org/licenses/mit-license.php 

7 

8"""SQL function API, factories, and built-in functions.""" 

9 

10from __future__ import annotations 

11 

12import datetime 

13import decimal 

14from typing import Any 

15from typing import cast 

16from typing import Dict 

17from typing import List 

18from typing import Mapping 

19from typing import Optional 

20from typing import overload 

21from typing import Sequence 

22from typing import Tuple 

23from typing import Type 

24from typing import TYPE_CHECKING 

25from typing import TypeAlias 

26from typing import TypeVar 

27from typing import Union 

28 

29from . import annotation 

30from . import coercions 

31from . import operators 

32from . import roles 

33from . import schema 

34from . import sqltypes 

35from . import type_api 

36from . import util as sqlutil 

37from ._typing import is_table_value_type 

38from .base import _entity_namespace 

39from .base import ColumnCollection 

40from .base import ExecutableStatement 

41from .base import Generative 

42from .base import HasMemoized 

43from .base import ReadOnlyColumnCollection 

44from .base import WriteableColumnCollection 

45from .elements import _type_from_args 

46from .elements import AggregateOrderBy 

47from .elements import BinaryExpression 

48from .elements import BindParameter 

49from .elements import Cast 

50from .elements import ClauseList 

51from .elements import ColumnElement 

52from .elements import Extract 

53from .elements import FunctionFilter 

54from .elements import Grouping 

55from .elements import literal_column 

56from .elements import NamedColumn 

57from .elements import Over 

58from .elements import WithinGroup 

59from .selectable import FromClause 

60from .selectable import Select 

61from .selectable import TableValuedAlias 

62from .sqltypes import TableValueType 

63from .type_api import TypeEngine 

64from .visitors import InternalTraversal 

65from .. import util 

66 

67if TYPE_CHECKING: 

68 from ._typing import _ByArgument 

69 from ._typing import _ColumnExpressionArgument 

70 from ._typing import _ColumnExpressionOrLiteralArgument 

71 from ._typing import _ColumnExpressionOrStrLabelArgument 

72 from ._typing import _StarOrOne 

73 from ._typing import _TypeEngineArgument 

74 from .base import _EntityNamespace 

75 from .elements import _FrameIntTuple 

76 from .elements import ClauseElement 

77 from .elements import FrameClause 

78 from .elements import KeyedColumnElement 

79 from .elements import TableValuedColumn 

80 from .operators import OperatorType 

81 from ..engine.base import Connection 

82 from ..engine.cursor import CursorResult 

83 from ..engine.interfaces import _CoreMultiExecuteParams 

84 from ..engine.interfaces import CoreExecuteOptionsParameter 

85 from ..util.typing import Self 

86 

87_T = TypeVar("_T", bound=Any) 

88_S = TypeVar("_S", bound=Any) 

89 

90_registry: util.defaultdict[str, Dict[str, Type[Function[Any]]]] = ( 

91 util.defaultdict(dict) 

92) 

93 

94 

95def register_function( 

96 identifier: str, fn: Type[Function[Any]], package: str = "_default" 

97) -> None: 

98 """Associate a callable with a particular func. name. 

99 

100 This is normally called by GenericFunction, but is also 

101 available by itself so that a non-Function construct 

102 can be associated with the :data:`.func` accessor (i.e. 

103 CAST, EXTRACT). 

104 

105 """ 

106 reg = _registry[package] 

107 

108 identifier = str(identifier).lower() 

109 

110 # Check if a function with the same identifier is registered. 

111 if identifier in reg: 

112 util.warn( 

113 "The GenericFunction '{}' is already registered and " 

114 "is going to be overridden.".format(identifier) 

115 ) 

116 reg[identifier] = fn 

117 

118 

119class FunctionElement( 

120 ColumnElement[_T], ExecutableStatement, FromClause, Generative 

121): 

122 """Base for SQL function-oriented constructs. 

123 

124 This is a `generic type <https://peps.python.org/pep-0484/#generics>`_, 

125 meaning that type checkers and IDEs can be instructed on the types to 

126 expect in a :class:`_engine.Result` for this function. See 

127 :class:`.GenericFunction` for an example of how this is done. 

128 

129 .. seealso:: 

130 

131 :ref:`tutorial_functions` - in the :ref:`unified_tutorial` 

132 

133 :class:`.Function` - named SQL function. 

134 

135 :data:`.func` - namespace which produces registered or ad-hoc 

136 :class:`.Function` instances. 

137 

138 :class:`.GenericFunction` - allows creation of registered function 

139 types. 

140 

141 """ 

142 

143 _traverse_internals = [ 

144 ("clause_expr", InternalTraversal.dp_clauseelement), 

145 ("_with_ordinality", InternalTraversal.dp_boolean), 

146 ("_table_value_type", InternalTraversal.dp_has_cache_key), 

147 ] + ExecutableStatement._executable_traverse_internals 

148 

149 packagenames: Tuple[str, ...] = () 

150 

151 monotonic: bool = False 

152 

153 _has_args = False 

154 _with_ordinality = False 

155 _table_value_type: Optional[TableValueType] = None 

156 

157 # some attributes that are defined between both ColumnElement and 

158 # FromClause are set to Any here to avoid typing errors 

159 primary_key: Any 

160 _is_clone_of: Any 

161 

162 clause_expr: Grouping[Any] 

163 

164 def __init__( 

165 self, *clauses: _ColumnExpressionOrLiteralArgument[Any] 

166 ) -> None: 

167 r"""Construct a :class:`.FunctionElement`. 

168 

169 :param \*clauses: list of column expressions that form the arguments 

170 of the SQL function call. 

171 

172 :param \**kwargs: additional kwargs are typically consumed by 

173 subclasses. 

174 

175 .. seealso:: 

176 

177 :data:`.func` 

178 

179 :class:`.Function` 

180 

181 """ 

182 args: Sequence[_ColumnExpressionArgument[Any]] = [ 

183 coercions.expect( 

184 roles.ExpressionElementRole, 

185 c, 

186 name=getattr(self, "name", None), 

187 apply_propagate_attrs=self, 

188 ) 

189 for c in clauses 

190 ] 

191 self._has_args = self._has_args or bool(args) 

192 self.clause_expr = Grouping( 

193 ClauseList(operator=operators.comma_op, group_contents=True, *args) 

194 ) 

195 

196 _non_anon_label = None 

197 

198 @property 

199 def _proxy_key(self) -> Any: 

200 return super()._proxy_key or getattr(self, "name", None) 

201 

202 def _execute_on_connection( 

203 self, 

204 connection: Connection, 

205 distilled_params: _CoreMultiExecuteParams, 

206 execution_options: CoreExecuteOptionsParameter, 

207 ) -> CursorResult[Any]: 

208 return connection._execute_function( 

209 self, distilled_params, execution_options 

210 ) 

211 

212 def scalar_table_valued( 

213 self, name: str, type_: Optional[_TypeEngineArgument[_T]] = None 

214 ) -> ScalarFunctionColumn[_T]: 

215 """Return a column expression that's against this 

216 :class:`_functions.FunctionElement` as a scalar 

217 table-valued expression. 

218 

219 The returned expression is similar to that returned by a single column 

220 accessed off of a :meth:`_functions.FunctionElement.table_valued` 

221 construct, except no FROM clause is generated; the function is rendered 

222 in the similar way as a scalar subquery. 

223 

224 E.g.: 

225 

226 .. sourcecode:: pycon+sql 

227 

228 >>> from sqlalchemy import func, select 

229 >>> fn = func.jsonb_each("{'k', 'v'}").scalar_table_valued("key") 

230 >>> print(select(fn)) 

231 {printsql}SELECT (jsonb_each(:jsonb_each_1)).key 

232 

233 .. versionadded:: 1.4.0b2 

234 

235 .. seealso:: 

236 

237 :meth:`_functions.FunctionElement.table_valued` 

238 

239 :meth:`_functions.FunctionElement.alias` 

240 

241 :meth:`_functions.FunctionElement.column_valued` 

242 

243 """ # noqa: E501 

244 

245 return ScalarFunctionColumn(self, name, type_) 

246 

247 def table_valued( 

248 self, *expr: _ColumnExpressionOrStrLabelArgument[Any], **kw: Any 

249 ) -> TableValuedAlias: 

250 r"""Return a :class:`_sql.TableValuedAlias` representation of this 

251 :class:`_functions.FunctionElement` with table-valued expressions added. 

252 

253 e.g. to use the SQLite form of ``generate_series()`` (including 

254 hidden columns "start", "stop", "step"): 

255 

256 .. sourcecode:: pycon+sql 

257 

258 >>> fn = func.generate_series(1, 5).table_valued( 

259 ... "value", "start", "stop", "step" 

260 ... ) 

261 

262 >>> print(select(fn)) 

263 {printsql}SELECT anon_1.value, anon_1.start, anon_1.stop, anon_1.step 

264 FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1{stop} 

265 

266 >>> print(select(fn.c.value, fn.c.stop).where(fn.c.value > 2)) 

267 {printsql}SELECT anon_1.value, anon_1.stop 

268 FROM generate_series(:generate_series_1, :generate_series_2) AS anon_1 

269 WHERE anon_1.value > :value_1{stop} 

270 

271 Backends like PostgreSQL need the accessed columns to be explicitly 

272 named in "AS" clause. To achieve this, use 

273 :meth:`_sql.TableValuedAlias.render_derived`; be sure to consult the 

274 :ref:`PostgreSQL-specific documentation for table valued functions 

275 <postgresql_table_valued>` for additional examples: 

276 

277 .. sourcecode:: pycon+sql 

278 

279 >>> fn = func.generate_series(1, 5).table_valued("value").render_derived() 

280 

281 >>> print(select(fn)) 

282 {printsql}SELECT anon_1.value FROM 

283 generate_series(:generate_series_1, :generate_series_2) AS anon_1(value){stop} 

284 

285 A WITH ORDINALITY expression may be generated by passing the keyword 

286 argument :paramref:`.FunctionElement.table_valued.with_ordinality`, 

287 illustrated below using PostgreSQL's syntax: 

288 

289 .. sourcecode:: pycon+sql 

290 

291 >>> fn = func.generate_series(4, 1, -1).table_valued( 

292 ... "gen", with_ordinality="ordinality" 

293 ... ) 

294 >>> print(select(fn.render_derived())) 

295 {printsql}SELECT anon_1.gen, anon_1.ordinality 

296 FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) 

297 WITH ORDINALITY AS anon_1(gen, ordinality) 

298 

299 :param \*expr: A series of string column names that will be added to the 

300 ``.c`` collection of the resulting :class:`_sql.TableValuedAlias` 

301 construct as columns. :func:`_sql.column` objects with or without 

302 datatypes may also be used. 

303 

304 :param name: optional name to assign to the alias name that's generated. 

305 If omitted, a unique anonymizing name is used. 

306 

307 :param with_ordinality: string name that when present results in the 

308 ``WITH ORDINALITY`` clause being added to the alias, and the given 

309 string name will be added as a column to the .c collection 

310 of the resulting :class:`_sql.TableValuedAlias`. 

311 

312 :param joins_implicitly: when True, the table valued function may be 

313 used in the FROM clause without any explicit JOIN to other tables 

314 in the SQL query, and no "cartesian product" warning will be generated. 

315 May be useful for SQL functions such as ``func.json_each()``. 

316 

317 .. versionadded:: 1.4.33 

318 

319 .. versionadded:: 1.4.0b2 

320 

321 

322 .. seealso:: 

323 

324 :ref:`tutorial_functions_table_valued` - in the :ref:`unified_tutorial` 

325 

326 :ref:`Table-Valued Functions on PostgreSQL <postgresql_table_valued>` - in the :ref:`postgresql_toplevel` documentation 

327 

328 :meth:`_functions.FunctionElement.scalar_table_valued` - variant of 

329 :meth:`_functions.FunctionElement.table_valued` which delivers the 

330 complete table valued expression as a scalar column expression 

331 

332 :meth:`_functions.FunctionElement.column_valued` 

333 

334 :meth:`_sql.TableValuedAlias.render_derived` - renders the alias 

335 using a derived column clause, e.g. ``AS name(col1, col2, ...)`` 

336 

337 """ # noqa: 501 

338 

339 new_func = self._generate() 

340 

341 with_ordinality = kw.pop("with_ordinality", None) 

342 joins_implicitly = kw.pop("joins_implicitly", None) 

343 name = kw.pop("name", None) 

344 

345 if with_ordinality: 

346 expr += (with_ordinality,) 

347 new_func._with_ordinality = True 

348 

349 new_func.type = new_func._table_value_type = TableValueType(*expr) 

350 

351 return new_func.alias(name=name, joins_implicitly=joins_implicitly) 

352 

353 def column_valued( 

354 self, name: Optional[str] = None, joins_implicitly: bool = False 

355 ) -> TableValuedColumn[_T]: 

356 """Return this :class:`_functions.FunctionElement` as a column expression that 

357 selects from itself as a FROM clause. 

358 

359 E.g.: 

360 

361 .. sourcecode:: pycon+sql 

362 

363 >>> from sqlalchemy import select, func 

364 >>> gs = func.generate_series(1, 5, -1).column_valued() 

365 >>> print(select(gs)) 

366 {printsql}SELECT anon_1 

367 FROM generate_series(:generate_series_1, :generate_series_2, :generate_series_3) AS anon_1 

368 

369 This is shorthand for:: 

370 

371 gs = func.generate_series(1, 5, -1).alias().column 

372 

373 :param name: optional name to assign to the alias name that's generated. 

374 If omitted, a unique anonymizing name is used. 

375 

376 :param joins_implicitly: when True, the "table" portion of the column 

377 valued function may be a member of the FROM clause without any 

378 explicit JOIN to other tables in the SQL query, and no "cartesian 

379 product" warning will be generated. May be useful for SQL functions 

380 such as ``func.json_array_elements()``. 

381 

382 .. versionadded:: 1.4.46 

383 

384 .. seealso:: 

385 

386 :ref:`tutorial_functions_column_valued` - in the :ref:`unified_tutorial` 

387 

388 :ref:`postgresql_column_valued` - in the :ref:`postgresql_toplevel` documentation 

389 

390 :meth:`_functions.FunctionElement.table_valued` 

391 

392 """ # noqa: 501 

393 

394 return self.alias(name=name, joins_implicitly=joins_implicitly).column 

395 

396 @util.ro_non_memoized_property 

397 def columns( 

398 self, 

399 ) -> ReadOnlyColumnCollection[str, KeyedColumnElement[Any]]: 

400 r"""The set of columns exported by this :class:`.FunctionElement`. 

401 

402 This is a placeholder collection that allows the function to be 

403 placed in the FROM clause of a statement: 

404 

405 .. sourcecode:: pycon+sql 

406 

407 >>> from sqlalchemy import column, select, func 

408 >>> stmt = select(column("x"), column("y")).select_from(func.myfunction()) 

409 >>> print(stmt) 

410 {printsql}SELECT x, y FROM myfunction() 

411 

412 The above form is a legacy feature that is now superseded by the 

413 fully capable :meth:`_functions.FunctionElement.table_valued` 

414 method; see that method for details. 

415 

416 .. seealso:: 

417 

418 :meth:`_functions.FunctionElement.table_valued` - generates table-valued 

419 SQL function expressions. 

420 

421 """ # noqa: E501 

422 return self.c 

423 

424 @util.ro_memoized_property 

425 def c(self) -> ReadOnlyColumnCollection[str, KeyedColumnElement[Any]]: 

426 """synonym for :attr:`.FunctionElement.columns`.""" 

427 

428 return WriteableColumnCollection( 

429 columns=[(col.key, col) for col in self._all_selected_columns] 

430 ).as_readonly() 

431 

432 @property 

433 def _all_selected_columns(self) -> Sequence[KeyedColumnElement[Any]]: 

434 if is_table_value_type(self.type): 

435 # TODO: this might not be fully accurate 

436 cols = cast( 

437 "Sequence[KeyedColumnElement[Any]]", self.type._elements 

438 ) 

439 else: 

440 cols = [self.label(None)] 

441 

442 return cols 

443 

444 @property 

445 def exported_columns( # type: ignore[override] 

446 self, 

447 ) -> ColumnCollection[str, KeyedColumnElement[Any]]: 

448 return self.columns 

449 

450 @HasMemoized.memoized_attribute 

451 def clauses(self) -> ClauseList: 

452 """Return the underlying :class:`.ClauseList` which contains 

453 the arguments for this :class:`.FunctionElement`. 

454 

455 """ 

456 return cast(ClauseList, self.clause_expr.element) 

457 

458 def over( 

459 self, 

460 *, 

461 partition_by: _ByArgument | None = None, 

462 order_by: _ByArgument | None = None, 

463 rows: _FrameIntTuple | FrameClause | None = None, 

464 range_: _FrameIntTuple | FrameClause | None = None, 

465 groups: _FrameIntTuple | FrameClause | None = None, 

466 exclude: str | None = None, 

467 ) -> Over[_T]: 

468 """Produce an OVER clause against this function. 

469 

470 Used against aggregate or so-called "window" functions, 

471 for database backends that support window functions. 

472 

473 The expression:: 

474 

475 func.row_number().over(order_by="x") 

476 

477 is shorthand for:: 

478 

479 from sqlalchemy import over 

480 

481 over(func.row_number(), order_by="x") 

482 

483 See :func:`_expression.over` for a full description. 

484 

485 .. seealso:: 

486 

487 :func:`_expression.over` 

488 

489 :ref:`tutorial_window_functions` - in the :ref:`unified_tutorial` 

490 

491 """ 

492 return Over( 

493 self, 

494 partition_by=partition_by, 

495 order_by=order_by, 

496 rows=rows, 

497 range_=range_, 

498 groups=groups, 

499 exclude=exclude, 

500 ) 

501 

502 def aggregate_order_by( 

503 self, *order_by: _ColumnExpressionArgument[Any] 

504 ) -> AggregateOrderBy[_T]: 

505 r"""Produce a :class:`.AggregateOrderBy` object against a function. 

506 

507 Used for aggregating functions such as :class:`_functions.array_agg`, 

508 ``group_concat``, ``json_agg`` on backends that support ordering via an 

509 embedded ORDER BY parameter, e.g. PostgreSQL, MySQL/MariaDB, SQLite. 

510 When used on backends like Oracle and SQL Server, SQL compilation uses 

511 that of :class:`.WithinGroup`. 

512 

513 See :func:`_expression.aggregate_order_by` for a full description. 

514 

515 .. versionadded:: 2.1 Generalized the PostgreSQL-specific 

516 :func:`_postgresql.aggregate_order_by` function to a method on 

517 :class:`.Function` that is backend agnostic. 

518 

519 .. seealso:: 

520 

521 :class:`_functions.aggregate_strings` - backend-agnostic string 

522 concatenation function which also supports ORDER BY 

523 

524 """ 

525 

526 return AggregateOrderBy(self, *order_by) 

527 

528 def within_group( 

529 self, *order_by: _ColumnExpressionArgument[Any] 

530 ) -> WithinGroup[_T]: 

531 """Produce a WITHIN GROUP (ORDER BY expr) clause against this function. 

532 

533 Used against so-called "ordered set aggregate" and "hypothetical 

534 set aggregate" functions, including :class:`.percentile_cont`, 

535 :class:`.rank`, :class:`.dense_rank`, etc. This feature is typically 

536 used by PostgreSQL, Oracle Database, and Microsoft SQL Server. 

537 

538 For simple ORDER BY expressions within aggregate functions on 

539 PostgreSQL, MySQL/MariaDB, SQLite, see :func:`_sql.aggregate_order_by`. 

540 

541 See :func:`_expression.within_group` for a full description. 

542 

543 .. seealso:: 

544 

545 :ref:`tutorial_functions_within_group` - 

546 in the :ref:`unified_tutorial` 

547 

548 

549 """ 

550 return WithinGroup(self, *order_by) 

551 

552 @overload 

553 def filter(self) -> Self: ... 

554 

555 @overload 

556 def filter( 

557 self, 

558 __criterion0: _ColumnExpressionArgument[bool], 

559 *criterion: _ColumnExpressionArgument[bool], 

560 ) -> FunctionFilter[_T]: ... 

561 

562 def filter( 

563 self, *criterion: _ColumnExpressionArgument[bool] 

564 ) -> Union[Self, FunctionFilter[_T]]: 

565 """Produce a FILTER clause against this function. 

566 

567 Used against aggregate and window functions, 

568 for database backends that support the "FILTER" clause. 

569 

570 The expression:: 

571 

572 func.count(1).filter(True) 

573 

574 is shorthand for:: 

575 

576 from sqlalchemy import funcfilter 

577 

578 funcfilter(func.count(1), True) 

579 

580 .. seealso:: 

581 

582 :ref:`tutorial_functions_within_group` - 

583 in the :ref:`unified_tutorial` 

584 

585 :class:`.FunctionFilter` 

586 

587 :func:`.funcfilter` 

588 

589 

590 """ 

591 if not criterion: 

592 return self 

593 return FunctionFilter(self, *criterion) 

594 

595 def as_comparison( 

596 self, left_index: int, right_index: int 

597 ) -> FunctionAsBinary: 

598 """Interpret this expression as a boolean comparison between two 

599 values. 

600 

601 This method is used for an ORM use case described at 

602 :ref:`relationship_custom_operator_sql_function`. 

603 

604 A hypothetical SQL function "is_equal()" which compares to values 

605 for equality would be written in the Core expression language as:: 

606 

607 expr = func.is_equal("a", "b") 

608 

609 If "is_equal()" above is comparing "a" and "b" for equality, the 

610 :meth:`.FunctionElement.as_comparison` method would be invoked as:: 

611 

612 expr = func.is_equal("a", "b").as_comparison(1, 2) 

613 

614 Where above, the integer value "1" refers to the first argument of the 

615 "is_equal()" function and the integer value "2" refers to the second. 

616 

617 This would create a :class:`.BinaryExpression` that is equivalent to:: 

618 

619 BinaryExpression("a", "b", operator=op.eq) 

620 

621 However, at the SQL level it would still render as 

622 "is_equal('a', 'b')". 

623 

624 The ORM, when it loads a related object or collection, needs to be able 

625 to manipulate the "left" and "right" sides of the ON clause of a JOIN 

626 expression. The purpose of this method is to provide a SQL function 

627 construct that can also supply this information to the ORM, when used 

628 with the :paramref:`_orm.relationship.primaryjoin` parameter. The 

629 return value is a containment object called :class:`.FunctionAsBinary`. 

630 

631 An ORM example is as follows:: 

632 

633 class Venue(Base): 

634 __tablename__ = "venue" 

635 id = Column(Integer, primary_key=True) 

636 name = Column(String) 

637 

638 descendants = relationship( 

639 "Venue", 

640 primaryjoin=func.instr( 

641 remote(foreign(name)), name + "/" 

642 ).as_comparison(1, 2) 

643 == 1, 

644 viewonly=True, 

645 order_by=name, 

646 ) 

647 

648 Above, the "Venue" class can load descendant "Venue" objects by 

649 determining if the name of the parent Venue is contained within the 

650 start of the hypothetical descendant value's name, e.g. "parent1" would 

651 match up to "parent1/child1", but not to "parent2/child1". 

652 

653 Possible use cases include the "materialized path" example given above, 

654 as well as making use of special SQL functions such as geometric 

655 functions to create join conditions. 

656 

657 :param left_index: the integer 1-based index of the function argument 

658 that serves as the "left" side of the expression. 

659 :param right_index: the integer 1-based index of the function argument 

660 that serves as the "right" side of the expression. 

661 

662 .. seealso:: 

663 

664 :ref:`relationship_custom_operator_sql_function` - 

665 example use within the ORM 

666 

667 """ 

668 return FunctionAsBinary(self, left_index, right_index) 

669 

670 @property 

671 def _from_objects(self) -> Any: 

672 return self.clauses._from_objects 

673 

674 def within_group_type( 

675 self, within_group: WithinGroup[_S] 

676 ) -> Optional[TypeEngine[_S]]: 

677 """For types that define their return type as based on the criteria 

678 within a WITHIN GROUP (ORDER BY) expression, called by the 

679 :class:`.WithinGroup` construct. 

680 

681 Returns None by default, in which case the function's normal ``.type`` 

682 is used. 

683 

684 """ 

685 

686 return None 

687 

688 def alias( 

689 self, name: Optional[str] = None, joins_implicitly: bool = False 

690 ) -> TableValuedAlias: 

691 r"""Produce a :class:`_expression.Alias` construct against this 

692 :class:`.FunctionElement`. 

693 

694 .. tip:: 

695 

696 The :meth:`_functions.FunctionElement.alias` method is part of the 

697 mechanism by which "table valued" SQL functions are created. 

698 However, most use cases are covered by higher level methods on 

699 :class:`_functions.FunctionElement` including 

700 :meth:`_functions.FunctionElement.table_valued`, and 

701 :meth:`_functions.FunctionElement.column_valued`. 

702 

703 This construct wraps the function in a named alias which 

704 is suitable for the FROM clause, in the style accepted for example 

705 by PostgreSQL. A column expression is also provided using the 

706 special ``.column`` attribute, which may 

707 be used to refer to the output of the function as a scalar value 

708 in the columns or where clause, for a backend such as PostgreSQL. 

709 

710 For a full table-valued expression, use the 

711 :meth:`_functions.FunctionElement.table_valued` method first to 

712 establish named columns. 

713 

714 e.g.: 

715 

716 .. sourcecode:: pycon+sql 

717 

718 >>> from sqlalchemy import func, select, column 

719 >>> data_view = func.unnest([1, 2, 3]).alias("data_view") 

720 >>> print(select(data_view.column)) 

721 {printsql}SELECT data_view 

722 FROM unnest(:unnest_1) AS data_view 

723 

724 The :meth:`_functions.FunctionElement.column_valued` method provides 

725 a shortcut for the above pattern: 

726 

727 .. sourcecode:: pycon+sql 

728 

729 >>> data_view = func.unnest([1, 2, 3]).column_valued("data_view") 

730 >>> print(select(data_view)) 

731 {printsql}SELECT data_view 

732 FROM unnest(:unnest_1) AS data_view 

733 

734 .. versionadded:: 1.4.0b2 Added the ``.column`` accessor 

735 

736 :param name: alias name, will be rendered as ``AS <name>`` in the 

737 FROM clause 

738 

739 :param joins_implicitly: when True, the table valued function may be 

740 used in the FROM clause without any explicit JOIN to other tables 

741 in the SQL query, and no "cartesian product" warning will be 

742 generated. May be useful for SQL functions such as 

743 ``func.json_each()``. 

744 

745 .. versionadded:: 1.4.33 

746 

747 .. seealso:: 

748 

749 :ref:`tutorial_functions_table_valued` - 

750 in the :ref:`unified_tutorial` 

751 

752 :meth:`_functions.FunctionElement.table_valued` 

753 

754 :meth:`_functions.FunctionElement.scalar_table_valued` 

755 

756 :meth:`_functions.FunctionElement.column_valued` 

757 

758 

759 """ 

760 

761 return TableValuedAlias._construct( 

762 self, 

763 name=name, 

764 table_value_type=self.type, 

765 joins_implicitly=joins_implicitly, 

766 ) 

767 

768 def select(self) -> Select[_T]: 

769 """Produce a :func:`_expression.select` construct 

770 against this :class:`.FunctionElement`. 

771 

772 This is shorthand for:: 

773 

774 s = select(function_element) 

775 

776 """ 

777 s: Select[_T] = Select(self) 

778 if self._execution_options: 

779 s = s.execution_options(**self._execution_options) 

780 return s 

781 

782 def _bind_param( 

783 self, 

784 operator: OperatorType, 

785 obj: Any, 

786 type_: Optional[TypeEngine[_T]] = None, 

787 expanding: bool = False, 

788 **kw: Any, 

789 ) -> BindParameter[_T]: 

790 return BindParameter( 

791 None, 

792 obj, 

793 _compared_to_operator=operator, 

794 _compared_to_type=self.type, 

795 unique=True, 

796 type_=type_, 

797 expanding=expanding, 

798 **kw, 

799 ) 

800 

801 def self_group(self, against: Optional[OperatorType] = None) -> ClauseElement: # type: ignore[override] # noqa E501 

802 # for the moment, we are parenthesizing all array-returning 

803 # expressions against getitem. This may need to be made 

804 # more portable if in the future we support other DBs 

805 # besides postgresql. 

806 if against is operators.getitem and isinstance( 

807 self.type, sqltypes.ARRAY 

808 ): 

809 return Grouping(self) 

810 else: 

811 return super().self_group(against=against) 

812 

813 @property 

814 def entity_namespace(self) -> _EntityNamespace: 

815 """overrides FromClause.entity_namespace as functions are generally 

816 column expressions and not FromClauses. 

817 

818 """ 

819 # ideally functions would not be fromclauses but we failed to make 

820 # this adjustment in 1.4 

821 return _entity_namespace(self.clause_expr) 

822 

823 

824class FunctionAsBinary(BinaryExpression[Any]): 

825 _traverse_internals = [ 

826 ("sql_function", InternalTraversal.dp_clauseelement), 

827 ("left_index", InternalTraversal.dp_plain_obj), 

828 ("right_index", InternalTraversal.dp_plain_obj), 

829 ("modifiers", InternalTraversal.dp_plain_dict), 

830 ] 

831 

832 sql_function: FunctionElement[Any] 

833 left_index: int 

834 right_index: int 

835 

836 def _gen_cache_key(self, anon_map: Any, bindparams: Any) -> Any: 

837 return ColumnElement._gen_cache_key(self, anon_map, bindparams) 

838 

839 def __init__( 

840 self, fn: FunctionElement[Any], left_index: int, right_index: int 

841 ) -> None: 

842 self.sql_function = fn 

843 self.left_index = left_index 

844 self.right_index = right_index 

845 

846 self.operator = operators.function_as_comparison_op 

847 self.type = sqltypes.BOOLEANTYPE 

848 self.negate = None 

849 self._is_implicitly_boolean = True 

850 self.modifiers = util.immutabledict({}) 

851 

852 @property 

853 def left_expr(self) -> ColumnElement[Any]: 

854 return self.sql_function.clauses.clauses[self.left_index - 1] 

855 

856 @left_expr.setter 

857 def left_expr(self, value: ColumnElement[Any]) -> None: 

858 self.sql_function.clauses.clauses[self.left_index - 1] = value 

859 

860 @property 

861 def right_expr(self) -> ColumnElement[Any]: 

862 return self.sql_function.clauses.clauses[self.right_index - 1] 

863 

864 @right_expr.setter 

865 def right_expr(self, value: ColumnElement[Any]) -> None: 

866 self.sql_function.clauses.clauses[self.right_index - 1] = value 

867 

868 if not TYPE_CHECKING: 

869 # mypy can't accommodate @property to replace an instance 

870 # variable 

871 

872 left = left_expr 

873 right = right_expr 

874 

875 

876class ScalarFunctionColumn(NamedColumn[_T]): 

877 __visit_name__ = "scalar_function_column" 

878 

879 _traverse_internals = [ 

880 ("name", InternalTraversal.dp_anon_name), 

881 ("type", InternalTraversal.dp_type), 

882 ("fn", InternalTraversal.dp_clauseelement), 

883 ] 

884 

885 is_literal = False 

886 table = None 

887 

888 def __init__( 

889 self, 

890 fn: FunctionElement[_T], 

891 name: str, 

892 type_: Optional[_TypeEngineArgument[_T]] = None, 

893 ) -> None: 

894 self.fn = fn 

895 self.name = name 

896 

897 # if type is None, we get NULLTYPE, which is our _T. But I don't 

898 # know how to get the overloads to express that correctly 

899 self.type = type_api.to_instance(type_) # type: ignore 

900 

901 

902class _FunctionGenerator: 

903 """Generate SQL function expressions. 

904 

905 :data:`.func` is a special object instance which generates SQL 

906 functions based on name-based attributes, e.g.: 

907 

908 .. sourcecode:: pycon+sql 

909 

910 >>> print(func.count(1)) 

911 {printsql}count(:param_1) 

912 

913 The returned object is an instance of :class:`.Function`, and is a 

914 column-oriented SQL element like any other, and is used in that way: 

915 

916 .. sourcecode:: pycon+sql 

917 

918 >>> print(select(func.count(table.c.id))) 

919 {printsql}SELECT count(sometable.id) FROM sometable 

920 

921 Any name can be given to :data:`.func`. If the function name is unknown to 

922 SQLAlchemy, it will be rendered exactly as is. For common SQL functions 

923 which SQLAlchemy is aware of, the name may be interpreted as a *generic 

924 function* which will be compiled appropriately to the target database: 

925 

926 .. sourcecode:: pycon+sql 

927 

928 >>> print(func.current_timestamp()) 

929 {printsql}CURRENT_TIMESTAMP 

930 

931 To call functions which are present in dot-separated packages, 

932 specify them in the same manner: 

933 

934 .. sourcecode:: pycon+sql 

935 

936 >>> print(func.stats.yield_curve(5, 10)) 

937 {printsql}stats.yield_curve(:yield_curve_1, :yield_curve_2) 

938 

939 SQLAlchemy can be made aware of the return type of functions to enable 

940 type-specific lexical and result-based behavior. For example, to ensure 

941 that a string-based function returns a Unicode value and is similarly 

942 treated as a string in expressions, specify 

943 :class:`~sqlalchemy.types.Unicode` as the type: 

944 

945 .. sourcecode:: pycon+sql 

946 

947 >>> print( 

948 ... func.my_string("hi", type_=Unicode) 

949 ... + " " 

950 ... + func.my_string("there", type_=Unicode) 

951 ... ) 

952 {printsql}my_string(:my_string_1) || :my_string_2 || my_string(:my_string_3) 

953 

954 The object returned by a :data:`.func` call is usually an instance of 

955 :class:`.Function`. 

956 This object meets the "column" interface, including comparison and labeling 

957 functions. The object can also be passed the :meth:`~.Connectable.execute` 

958 method of a :class:`_engine.Connection` or :class:`_engine.Engine`, 

959 where it will be 

960 wrapped inside of a SELECT statement first:: 

961 

962 print(connection.execute(func.current_timestamp()).scalar()) 

963 

964 In a few exception cases, the :data:`.func` accessor 

965 will redirect a name to a built-in expression such as :func:`.cast` 

966 or :func:`.extract`, as these names have well-known meaning 

967 but are not exactly the same as "functions" from a SQLAlchemy 

968 perspective. 

969 

970 Functions which are interpreted as "generic" functions know how to 

971 calculate their return type automatically. For a listing of known generic 

972 functions, see :ref:`generic_functions`. 

973 

974 .. note:: 

975 

976 The :data:`.func` construct has only limited support for calling 

977 standalone "stored procedures", especially those with special 

978 parameterization concerns. 

979 

980 See the section :ref:`stored_procedures` for details on how to use 

981 the DBAPI-level ``callproc()`` method for fully traditional stored 

982 procedures. 

983 

984 .. seealso:: 

985 

986 :ref:`tutorial_functions` - in the :ref:`unified_tutorial` 

987 

988 :class:`.Function` 

989 

990 """ # noqa 

991 

992 def __init__(self, **opts: Any) -> None: 

993 self.__names: List[str] = [] 

994 self.opts = opts 

995 

996 def __getattr__(self, name: str) -> _FunctionGenerator: 

997 # passthru __ attributes; fixes pydoc 

998 if name.startswith("__"): 

999 try: 

1000 return self.__dict__[name] # type: ignore 

1001 except KeyError: 

1002 raise AttributeError(name) 

1003 

1004 elif name.endswith("_"): 

1005 name = name[0:-1] 

1006 f = _FunctionGenerator(**self.opts) 

1007 f.__names = list(self.__names) + [name] 

1008 return f 

1009 

1010 @overload 

1011 def __call__( 

1012 self, *c: Any, type_: _TypeEngineArgument[_T], **kwargs: Any 

1013 ) -> Function[_T]: ... 

1014 

1015 @overload 

1016 def __call__(self, *c: Any, **kwargs: Any) -> Function[Any]: ... 

1017 

1018 def __call__(self, *c: Any, **kwargs: Any) -> Function[Any]: 

1019 o = self.opts.copy() 

1020 o.update(kwargs) 

1021 

1022 tokens = len(self.__names) 

1023 

1024 if tokens == 2: 

1025 package, fname = self.__names 

1026 elif tokens == 1: 

1027 package, fname = "_default", self.__names[0] 

1028 else: 

1029 package = None 

1030 

1031 if package is not None: 

1032 func = _registry[package].get(fname.lower()) 

1033 if func is not None: 

1034 return func(*c, **o) 

1035 

1036 return Function( 

1037 self.__names[-1], packagenames=tuple(self.__names[0:-1]), *c, **o 

1038 ) 

1039 

1040 if TYPE_CHECKING: 

1041 # START GENERATED FUNCTION ACCESSORS 

1042 

1043 # code within this block is **programmatically, 

1044 # statically generated** by tools/generate_sql_functions.py 

1045 

1046 @property 

1047 def aggregate_strings(self) -> Type[_aggregate_strings_func]: ... 

1048 

1049 @property 

1050 def ansifunction(self) -> Type[_AnsiFunction_func[Any]]: ... 

1051 

1052 # set ColumnElement[_T] as a separate overload, to appease 

1053 # mypy which seems to not want to accept _T from 

1054 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1055 # _HasClauseElement as of mypy 1.15 

1056 

1057 @overload 

1058 def array_agg( 

1059 self, 

1060 col: ColumnElement[_T], 

1061 *args: _ColumnExpressionOrLiteralArgument[Any], 

1062 **kwargs: Any, 

1063 ) -> _array_agg_func[_T]: ... 

1064 

1065 @overload 

1066 def array_agg( 

1067 self, 

1068 col: _ColumnExpressionArgument[_T], 

1069 *args: _ColumnExpressionOrLiteralArgument[Any], 

1070 **kwargs: Any, 

1071 ) -> _array_agg_func[_T]: ... 

1072 

1073 @overload 

1074 def array_agg( 

1075 self, 

1076 col: _T, 

1077 *args: _ColumnExpressionOrLiteralArgument[Any], 

1078 **kwargs: Any, 

1079 ) -> _array_agg_func[_T]: ... 

1080 

1081 def array_agg( 

1082 self, 

1083 col: _ColumnExpressionOrLiteralArgument[_T], 

1084 *args: _ColumnExpressionOrLiteralArgument[Any], 

1085 **kwargs: Any, 

1086 ) -> _array_agg_func[_T]: ... 

1087 

1088 @property 

1089 def cast(self) -> Type[_Cast_func[Any]]: ... 

1090 

1091 @property 

1092 def char_length(self) -> Type[_char_length_func]: ... 

1093 

1094 # set ColumnElement[_T] as a separate overload, to appease 

1095 # mypy which seems to not want to accept _T from 

1096 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1097 # _HasClauseElement as of mypy 1.15 

1098 

1099 @overload 

1100 def coalesce( 

1101 self, 

1102 col: ColumnElement[_T], 

1103 *args: _ColumnExpressionOrLiteralArgument[Any], 

1104 **kwargs: Any, 

1105 ) -> _coalesce_func[_T]: ... 

1106 

1107 @overload 

1108 def coalesce( 

1109 self, 

1110 col: _ColumnExpressionArgument[Optional[_T]], 

1111 *args: _ColumnExpressionOrLiteralArgument[Any], 

1112 **kwargs: Any, 

1113 ) -> _coalesce_func[_T]: ... 

1114 

1115 @overload 

1116 def coalesce( 

1117 self, 

1118 col: Optional[_T], 

1119 *args: _ColumnExpressionOrLiteralArgument[Any], 

1120 **kwargs: Any, 

1121 ) -> _coalesce_func[_T]: ... 

1122 

1123 def coalesce( 

1124 self, 

1125 col: _ColumnExpressionOrLiteralArgument[Optional[_T]], 

1126 *args: _ColumnExpressionOrLiteralArgument[Any], 

1127 **kwargs: Any, 

1128 ) -> _coalesce_func[_T]: ... 

1129 

1130 @property 

1131 def concat(self) -> Type[_concat_func]: ... 

1132 

1133 @property 

1134 def count(self) -> Type[_count_func]: ... 

1135 

1136 @property 

1137 def cube(self) -> Type[_cube_func[Any]]: ... 

1138 

1139 @property 

1140 def cume_dist(self) -> Type[_cume_dist_func]: ... 

1141 

1142 @property 

1143 def current_date(self) -> Type[_current_date_func]: ... 

1144 

1145 @property 

1146 def current_time(self) -> Type[_current_time_func]: ... 

1147 

1148 @property 

1149 def current_timestamp(self) -> Type[_current_timestamp_func]: ... 

1150 

1151 @property 

1152 def current_user(self) -> Type[_current_user_func]: ... 

1153 

1154 @property 

1155 def dense_rank(self) -> Type[_dense_rank_func]: ... 

1156 

1157 @property 

1158 def extract(self) -> Type[_Extract_func]: ... 

1159 

1160 @property 

1161 def grouping_sets(self) -> Type[_grouping_sets_func[Any]]: ... 

1162 

1163 @property 

1164 def localtime(self) -> Type[_localtime_func]: ... 

1165 

1166 @property 

1167 def localtimestamp(self) -> Type[_localtimestamp_func]: ... 

1168 

1169 # set ColumnElement[_T] as a separate overload, to appease 

1170 # mypy which seems to not want to accept _T from 

1171 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1172 # _HasClauseElement as of mypy 1.15 

1173 

1174 @overload 

1175 def max( # noqa: A001 

1176 self, 

1177 col: ColumnElement[_T], 

1178 *args: _ColumnExpressionOrLiteralArgument[Any], 

1179 **kwargs: Any, 

1180 ) -> _max_func[_T]: ... 

1181 

1182 @overload 

1183 def max( # noqa: A001 

1184 self, 

1185 col: _ColumnExpressionArgument[_T], 

1186 *args: _ColumnExpressionOrLiteralArgument[Any], 

1187 **kwargs: Any, 

1188 ) -> _max_func[_T]: ... 

1189 

1190 @overload 

1191 def max( # noqa: A001 

1192 self, 

1193 col: _T, 

1194 *args: _ColumnExpressionOrLiteralArgument[Any], 

1195 **kwargs: Any, 

1196 ) -> _max_func[_T]: ... 

1197 

1198 def max( # noqa: A001 

1199 self, 

1200 col: _ColumnExpressionOrLiteralArgument[_T], 

1201 *args: _ColumnExpressionOrLiteralArgument[Any], 

1202 **kwargs: Any, 

1203 ) -> _max_func[_T]: ... 

1204 

1205 # set ColumnElement[_T] as a separate overload, to appease 

1206 # mypy which seems to not want to accept _T from 

1207 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1208 # _HasClauseElement as of mypy 1.15 

1209 

1210 @overload 

1211 def min( # noqa: A001 

1212 self, 

1213 col: ColumnElement[_T], 

1214 *args: _ColumnExpressionOrLiteralArgument[Any], 

1215 **kwargs: Any, 

1216 ) -> _min_func[_T]: ... 

1217 

1218 @overload 

1219 def min( # noqa: A001 

1220 self, 

1221 col: _ColumnExpressionArgument[_T], 

1222 *args: _ColumnExpressionOrLiteralArgument[Any], 

1223 **kwargs: Any, 

1224 ) -> _min_func[_T]: ... 

1225 

1226 @overload 

1227 def min( # noqa: A001 

1228 self, 

1229 col: _T, 

1230 *args: _ColumnExpressionOrLiteralArgument[Any], 

1231 **kwargs: Any, 

1232 ) -> _min_func[_T]: ... 

1233 

1234 def min( # noqa: A001 

1235 self, 

1236 col: _ColumnExpressionOrLiteralArgument[_T], 

1237 *args: _ColumnExpressionOrLiteralArgument[Any], 

1238 **kwargs: Any, 

1239 ) -> _min_func[_T]: ... 

1240 

1241 @property 

1242 def mode(self) -> Type[_mode_func[Any]]: ... 

1243 

1244 @property 

1245 def next_value(self) -> Type[_next_value_func]: ... 

1246 

1247 @property 

1248 def now(self) -> Type[_now_func]: ... 

1249 

1250 @property 

1251 def orderedsetagg(self) -> Type[_OrderedSetAgg_func[Any]]: ... 

1252 

1253 @property 

1254 def percent_rank(self) -> Type[_percent_rank_func]: ... 

1255 

1256 @property 

1257 def percentile_cont(self) -> Type[_percentile_cont_func[Any]]: ... 

1258 

1259 @property 

1260 def percentile_disc(self) -> Type[_percentile_disc_func[Any]]: ... 

1261 

1262 # set ColumnElement[_T] as a separate overload, to appease 

1263 # mypy which seems to not want to accept _T from 

1264 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1265 # _HasClauseElement as of mypy 1.15 

1266 

1267 @overload 

1268 def pow( # noqa: A001 

1269 self, 

1270 col: ColumnElement[_T], 

1271 *args: _ColumnExpressionOrLiteralArgument[Any], 

1272 **kwargs: Any, 

1273 ) -> _pow_func[_T]: ... 

1274 

1275 @overload 

1276 def pow( # noqa: A001 

1277 self, 

1278 col: _ColumnExpressionArgument[_T], 

1279 *args: _ColumnExpressionOrLiteralArgument[Any], 

1280 **kwargs: Any, 

1281 ) -> _pow_func[_T]: ... 

1282 

1283 @overload 

1284 def pow( # noqa: A001 

1285 self, 

1286 col: _T, 

1287 *args: _ColumnExpressionOrLiteralArgument[Any], 

1288 **kwargs: Any, 

1289 ) -> _pow_func[_T]: ... 

1290 

1291 def pow( # noqa: A001 

1292 self, 

1293 col: _ColumnExpressionOrLiteralArgument[_T], 

1294 *args: _ColumnExpressionOrLiteralArgument[Any], 

1295 **kwargs: Any, 

1296 ) -> _pow_func[_T]: ... 

1297 

1298 @property 

1299 def random(self) -> Type[_random_func]: ... 

1300 

1301 @property 

1302 def rank(self) -> Type[_rank_func]: ... 

1303 

1304 @property 

1305 def rollup(self) -> Type[_rollup_func[Any]]: ... 

1306 

1307 @property 

1308 def session_user(self) -> Type[_session_user_func]: ... 

1309 

1310 # set ColumnElement[_T] as a separate overload, to appease 

1311 # mypy which seems to not want to accept _T from 

1312 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1313 # _HasClauseElement as of mypy 1.15 

1314 

1315 @overload 

1316 def sum( # noqa: A001 

1317 self, 

1318 col: ColumnElement[_T], 

1319 *args: _ColumnExpressionOrLiteralArgument[Any], 

1320 **kwargs: Any, 

1321 ) -> _sum_func[_T]: ... 

1322 

1323 @overload 

1324 def sum( # noqa: A001 

1325 self, 

1326 col: _ColumnExpressionArgument[_T], 

1327 *args: _ColumnExpressionOrLiteralArgument[Any], 

1328 **kwargs: Any, 

1329 ) -> _sum_func[_T]: ... 

1330 

1331 @overload 

1332 def sum( # noqa: A001 

1333 self, 

1334 col: _T, 

1335 *args: _ColumnExpressionOrLiteralArgument[Any], 

1336 **kwargs: Any, 

1337 ) -> _sum_func[_T]: ... 

1338 

1339 def sum( # noqa: A001 

1340 self, 

1341 col: _ColumnExpressionOrLiteralArgument[_T], 

1342 *args: _ColumnExpressionOrLiteralArgument[Any], 

1343 **kwargs: Any, 

1344 ) -> _sum_func[_T]: ... 

1345 

1346 @property 

1347 def sysdate(self) -> Type[_sysdate_func]: ... 

1348 

1349 @property 

1350 def user(self) -> Type[_user_func]: ... 

1351 

1352 # END GENERATED FUNCTION ACCESSORS 

1353 

1354 

1355func = _FunctionGenerator() 

1356func.__doc__ = _FunctionGenerator.__doc__ 

1357 

1358modifier = _FunctionGenerator(group=False) 

1359 

1360 

1361class Function(FunctionElement[_T]): 

1362 r"""Describe a named SQL function. 

1363 

1364 The :class:`.Function` object is typically generated from the 

1365 :data:`.func` generation object. 

1366 

1367 

1368 :param \*clauses: list of column expressions that form the arguments 

1369 of the SQL function call. 

1370 

1371 :param type\_: optional :class:`.TypeEngine` datatype object that will be 

1372 used as the return value of the column expression generated by this 

1373 function call. 

1374 

1375 :param packagenames: a string which indicates package prefix names 

1376 to be prepended to the function name when the SQL is generated. 

1377 The :data:`.func` generator creates these when it is called using 

1378 dotted format, e.g.:: 

1379 

1380 func.mypackage.some_function(col1, col2) 

1381 

1382 .. seealso:: 

1383 

1384 :ref:`tutorial_functions` - in the :ref:`unified_tutorial` 

1385 

1386 :data:`.func` - namespace which produces registered or ad-hoc 

1387 :class:`.Function` instances. 

1388 

1389 :class:`.GenericFunction` - allows creation of registered function 

1390 types. 

1391 

1392 """ 

1393 

1394 __visit_name__ = "function" 

1395 

1396 _traverse_internals = FunctionElement._traverse_internals + [ 

1397 ("packagenames", InternalTraversal.dp_plain_obj), 

1398 ("name", InternalTraversal.dp_string), 

1399 ("type", InternalTraversal.dp_type), 

1400 ] 

1401 

1402 name: str 

1403 

1404 identifier: str 

1405 

1406 type: TypeEngine[_T] 

1407 """A :class:`_types.TypeEngine` object which refers to the SQL return 

1408 type represented by this SQL function. 

1409 

1410 This datatype may be configured when generating a 

1411 :class:`_functions.Function` object by passing the 

1412 :paramref:`_functions.Function.type_` parameter, e.g.:: 

1413 

1414 >>> select(func.lower("some VALUE", type_=String)) 

1415 

1416 The small number of built-in classes of :class:`_functions.Function` come 

1417 with a built-in datatype that's appropriate to the class of function and 

1418 its arguments. For functions that aren't known, the type defaults to the 

1419 "null type". 

1420 

1421 """ 

1422 

1423 @overload 

1424 def __init__( 

1425 self, 

1426 name: str, 

1427 *clauses: _ColumnExpressionOrLiteralArgument[_T], 

1428 type_: None = ..., 

1429 packagenames: Optional[Tuple[str, ...]] = ..., 

1430 monotonic: bool = ..., 

1431 ) -> None: ... 

1432 

1433 @overload 

1434 def __init__( 

1435 self, 

1436 name: str, 

1437 *clauses: _ColumnExpressionOrLiteralArgument[Any], 

1438 type_: _TypeEngineArgument[_T] = ..., 

1439 packagenames: Optional[Tuple[str, ...]] = ..., 

1440 monotonic: bool = ..., 

1441 ) -> None: ... 

1442 

1443 def __init__( 

1444 self, 

1445 name: str, 

1446 *clauses: _ColumnExpressionOrLiteralArgument[Any], 

1447 type_: Optional[_TypeEngineArgument[_T]] = None, 

1448 packagenames: Optional[Tuple[str, ...]] = None, 

1449 monotonic: bool = False, 

1450 ) -> None: 

1451 """Construct a :class:`.Function`. 

1452 

1453 The :data:`.func` construct is normally used to construct 

1454 new :class:`.Function` instances. 

1455 

1456 """ 

1457 self.packagenames = packagenames or () 

1458 self.name = name 

1459 self.monotonic = monotonic 

1460 

1461 # if type is None, we get NULLTYPE, which is our _T. But I don't 

1462 # know how to get the overloads to express that correctly 

1463 self.type = type_api.to_instance(type_) # type: ignore 

1464 

1465 FunctionElement.__init__(self, *clauses) 

1466 

1467 def _bind_param( 

1468 self, 

1469 operator: OperatorType, 

1470 obj: Any, 

1471 type_: Optional[TypeEngine[_T]] = None, 

1472 expanding: bool = False, 

1473 **kw: Any, 

1474 ) -> BindParameter[_T]: 

1475 return BindParameter( 

1476 self.name, 

1477 obj, 

1478 _compared_to_operator=operator, 

1479 _compared_to_type=self.type, 

1480 type_=type_, 

1481 unique=True, 

1482 expanding=expanding, 

1483 **kw, 

1484 ) 

1485 

1486 

1487class GenericFunction(Function[_T]): 

1488 """Define a 'generic' function. 

1489 

1490 A generic function is a pre-established :class:`.Function` 

1491 class that is instantiated automatically when called 

1492 by name from the :data:`.func` attribute. Note that 

1493 calling any name from :data:`.func` has the effect that 

1494 a new :class:`.Function` instance is created automatically, 

1495 given that name. The primary use case for defining 

1496 a :class:`.GenericFunction` class is so that a function 

1497 of a particular name may be given a fixed return type. 

1498 It can also include custom argument parsing schemes as well 

1499 as additional methods. 

1500 

1501 Subclasses of :class:`.GenericFunction` are automatically 

1502 registered under the name of the class. For 

1503 example, a user-defined function ``as_utc()`` would 

1504 be available immediately:: 

1505 

1506 from sqlalchemy.sql.functions import GenericFunction 

1507 from sqlalchemy.types import DateTime 

1508 

1509 

1510 class as_utc(GenericFunction): 

1511 type = DateTime() 

1512 inherit_cache = True 

1513 

1514 

1515 print(select(func.as_utc())) 

1516 

1517 User-defined generic functions can be organized into 

1518 packages by specifying the "package" attribute when defining 

1519 :class:`.GenericFunction`. Third party libraries 

1520 containing many functions may want to use this in order 

1521 to avoid name conflicts with other systems. For example, 

1522 if our ``as_utc()`` function were part of a package 

1523 "time":: 

1524 

1525 class as_utc(GenericFunction): 

1526 type = DateTime() 

1527 package = "time" 

1528 inherit_cache = True 

1529 

1530 The above function would be available from :data:`.func` 

1531 using the package name ``time``:: 

1532 

1533 print(select(func.time.as_utc())) 

1534 

1535 A final option is to allow the function to be accessed 

1536 from one name in :data:`.func` but to render as a different name. 

1537 The ``identifier`` attribute will override the name used to 

1538 access the function as loaded from :data:`.func`, but will retain 

1539 the usage of ``name`` as the rendered name:: 

1540 

1541 class GeoBuffer(GenericFunction): 

1542 type = Geometry() 

1543 package = "geo" 

1544 name = "ST_Buffer" 

1545 identifier = "buffer" 

1546 inherit_cache = True 

1547 

1548 The above function will render as follows: 

1549 

1550 .. sourcecode:: pycon+sql 

1551 

1552 >>> print(func.geo.buffer()) 

1553 {printsql}ST_Buffer() 

1554 

1555 The name will be rendered as is, however without quoting unless the name 

1556 contains special characters that require quoting. To force quoting 

1557 on or off for the name, use the :class:`.sqlalchemy.sql.quoted_name` 

1558 construct:: 

1559 

1560 from sqlalchemy.sql import quoted_name 

1561 

1562 

1563 class GeoBuffer(GenericFunction): 

1564 type = Geometry() 

1565 package = "geo" 

1566 name = quoted_name("ST_Buffer", True) 

1567 identifier = "buffer" 

1568 inherit_cache = True 

1569 

1570 The above function will render as: 

1571 

1572 .. sourcecode:: pycon+sql 

1573 

1574 >>> print(func.geo.buffer()) 

1575 {printsql}"ST_Buffer"() 

1576 

1577 Type parameters for this class as a 

1578 `generic type <https://peps.python.org/pep-0484/#generics>`_ can be passed 

1579 and should match the type seen in a :class:`_engine.Result`. For example:: 

1580 

1581 class as_utc(GenericFunction[datetime.datetime]): 

1582 type = DateTime() 

1583 inherit_cache = True 

1584 

1585 The above indicates that the following expression returns a ``datetime`` 

1586 object:: 

1587 

1588 connection.scalar(select(func.as_utc())) 

1589 

1590 """ 

1591 

1592 coerce_arguments = True 

1593 inherit_cache = True 

1594 

1595 _register: bool 

1596 

1597 name = "GenericFunction" 

1598 

1599 def __init_subclass__(cls) -> None: 

1600 if annotation.Annotated not in cls.__mro__: 

1601 cls._register_generic_function(cls.__name__, cls.__dict__) 

1602 super().__init_subclass__() 

1603 

1604 @classmethod 

1605 def _register_generic_function( 

1606 cls, clsname: str, clsdict: Mapping[str, Any] 

1607 ) -> None: 

1608 cls.name = name = clsdict.get("name", clsname) 

1609 cls.identifier = identifier = clsdict.get("identifier", name) 

1610 package = clsdict.get("package", "_default") 

1611 # legacy 

1612 if "__return_type__" in clsdict: 

1613 cls.type = clsdict["__return_type__"] 

1614 

1615 # Check _register attribute status 

1616 cls._register = getattr(cls, "_register", True) 

1617 

1618 # Register the function if required 

1619 if cls._register: 

1620 register_function(identifier, cls, package) 

1621 else: 

1622 # Set _register to True to register child classes by default 

1623 cls._register = True 

1624 

1625 def __init__( 

1626 self, *args: _ColumnExpressionOrLiteralArgument[Any], **kwargs: Any 

1627 ) -> None: 

1628 parsed_args = kwargs.pop("_parsed_args", None) 

1629 if parsed_args is None: 

1630 parsed_args = [ 

1631 coercions.expect( 

1632 roles.ExpressionElementRole, 

1633 c, 

1634 name=self.name, 

1635 apply_propagate_attrs=self, 

1636 ) 

1637 for c in args 

1638 ] 

1639 self._has_args = self._has_args or bool(parsed_args) 

1640 self.packagenames = () 

1641 

1642 self.clause_expr = Grouping( 

1643 ClauseList( 

1644 operator=operators.comma_op, group_contents=True, *parsed_args 

1645 ) 

1646 ) 

1647 

1648 self.type = type_api.to_instance( # type: ignore 

1649 kwargs.pop("type_", None) or getattr(self, "type", None) 

1650 ) 

1651 

1652 

1653register_function("cast", Cast) # type: ignore 

1654register_function("extract", Extract) # type: ignore 

1655 

1656 

1657class next_value(GenericFunction[int]): 

1658 """Represent the 'next value', given a :class:`.Sequence` 

1659 as its single argument. 

1660 

1661 Compiles into the appropriate function on each backend, 

1662 or will raise NotImplementedError if used on a backend 

1663 that does not provide support for sequences. 

1664 

1665 """ 

1666 

1667 type = sqltypes.Integer() 

1668 name = "next_value" 

1669 

1670 _traverse_internals = [ 

1671 ("sequence", InternalTraversal.dp_named_ddl_element) 

1672 ] 

1673 

1674 def __init__(self, seq: schema.Sequence, **kw: Any) -> None: 

1675 assert isinstance( 

1676 seq, schema.Sequence 

1677 ), "next_value() accepts a Sequence object as input." 

1678 self.sequence = seq 

1679 self.type = sqltypes.to_instance( # type: ignore 

1680 seq.data_type or getattr(self, "type", None) 

1681 ) 

1682 

1683 def compare(self, other: Any, **kw: Any) -> bool: 

1684 return ( 

1685 isinstance(other, next_value) 

1686 and self.sequence.name == other.sequence.name 

1687 ) 

1688 

1689 @property 

1690 def _from_objects(self) -> Any: 

1691 return [] 

1692 

1693 

1694class AnsiFunction(GenericFunction[_T]): 

1695 """Define a function in "ansi" format, which doesn't render parenthesis.""" 

1696 

1697 inherit_cache = True 

1698 

1699 def __init__( 

1700 self, *args: _ColumnExpressionArgument[Any], **kwargs: Any 

1701 ) -> None: 

1702 GenericFunction.__init__(self, *args, **kwargs) 

1703 

1704 

1705class ReturnTypeFromArgs(GenericFunction[_T]): 

1706 """Define a function whose return type is bound to the type of its 

1707 arguments. 

1708 """ 

1709 

1710 inherit_cache = True 

1711 

1712 # set ColumnElement[_T] as a separate overload, to appease 

1713 # mypy which seems to not want to accept _T from 

1714 # _ColumnExpressionArgument. Seems somewhat related to the covariant 

1715 # _HasClauseElement as of mypy 1.15 

1716 

1717 @overload 

1718 def __init__( 

1719 self, 

1720 col: ColumnElement[_T], 

1721 *args: _ColumnExpressionOrLiteralArgument[Any], 

1722 **kwargs: Any, 

1723 ) -> None: ... 

1724 

1725 @overload 

1726 def __init__( 

1727 self, 

1728 col: _ColumnExpressionArgument[_T], 

1729 *args: _ColumnExpressionOrLiteralArgument[Any], 

1730 **kwargs: Any, 

1731 ) -> None: ... 

1732 

1733 @overload 

1734 def __init__( 

1735 self, 

1736 col: _T, 

1737 *args: _ColumnExpressionOrLiteralArgument[Any], 

1738 **kwargs: Any, 

1739 ) -> None: ... 

1740 

1741 def __init__( 

1742 self, *args: _ColumnExpressionOrLiteralArgument[_T], **kwargs: Any 

1743 ) -> None: 

1744 fn_args: Sequence[ColumnElement[Any]] = [ 

1745 coercions.expect( 

1746 roles.ExpressionElementRole, 

1747 c, 

1748 name=self.name, 

1749 apply_propagate_attrs=self, 

1750 ) 

1751 for c in args 

1752 ] 

1753 kwargs.setdefault("type_", _type_from_args(fn_args)) 

1754 kwargs["_parsed_args"] = fn_args 

1755 super().__init__(*fn_args, **kwargs) 

1756 

1757 

1758class ReturnTypeFromOptionalArgs(ReturnTypeFromArgs[_T]): 

1759 inherit_cache = True 

1760 

1761 @overload 

1762 def __init__( 

1763 self, 

1764 col: ColumnElement[_T], 

1765 *args: _ColumnExpressionOrLiteralArgument[Any], 

1766 **kwargs: Any, 

1767 ) -> None: ... 

1768 

1769 @overload 

1770 def __init__( 

1771 self, 

1772 col: _ColumnExpressionArgument[Optional[_T]], 

1773 *args: _ColumnExpressionOrLiteralArgument[Any], 

1774 **kwargs: Any, 

1775 ) -> None: ... 

1776 

1777 @overload 

1778 def __init__( 

1779 self, 

1780 col: Optional[_T], 

1781 *args: _ColumnExpressionOrLiteralArgument[Any], 

1782 **kwargs: Any, 

1783 ) -> None: ... 

1784 

1785 def __init__( 

1786 self, 

1787 *args: _ColumnExpressionOrLiteralArgument[Optional[_T]], 

1788 **kwargs: Any, 

1789 ) -> None: 

1790 super().__init__(*args, **kwargs) # type: ignore 

1791 

1792 

1793class coalesce(ReturnTypeFromOptionalArgs[_T]): 

1794 _has_args = True 

1795 inherit_cache = True 

1796 

1797 

1798class max(ReturnTypeFromArgs[_T]): # noqa: A001 

1799 """The SQL MAX() aggregate function.""" 

1800 

1801 inherit_cache = True 

1802 

1803 

1804class min(ReturnTypeFromArgs[_T]): # noqa: A001 

1805 """The SQL MIN() aggregate function.""" 

1806 

1807 inherit_cache = True 

1808 

1809 

1810class sum(ReturnTypeFromArgs[_T]): # noqa: A001 

1811 """The SQL SUM() aggregate function.""" 

1812 

1813 inherit_cache = True 

1814 

1815 

1816class now(GenericFunction[datetime.datetime]): 

1817 """The SQL now() datetime function. 

1818 

1819 SQLAlchemy dialects will usually render this particular function 

1820 in a backend-specific way, such as rendering it as ``CURRENT_TIMESTAMP``. 

1821 

1822 """ 

1823 

1824 type = sqltypes.DateTime() 

1825 inherit_cache = True 

1826 

1827 

1828class pow(ReturnTypeFromArgs[_T]): # noqa: A001 

1829 """The SQL POW() function which performs the power operator. 

1830 

1831 E.g.: 

1832 

1833 .. sourcecode:: pycon+sql 

1834 

1835 >>> print(select(func.pow(2, 8))) 

1836 {printsql}SELECT pow(:pow_2, :pow_3) AS pow_1 

1837 

1838 .. versionadded:: 2.1 

1839 

1840 """ 

1841 

1842 inherit_cache = True 

1843 

1844 

1845class concat(GenericFunction[str]): 

1846 """The SQL CONCAT() function, which concatenates strings. 

1847 

1848 E.g.: 

1849 

1850 .. sourcecode:: pycon+sql 

1851 

1852 >>> print(select(func.concat("a", "b"))) 

1853 {printsql}SELECT concat(:concat_2, :concat_3) AS concat_1 

1854 

1855 String concatenation in SQLAlchemy is more commonly available using the 

1856 Python ``+`` operator with string datatypes, which will render a 

1857 backend-specific concatenation operator, such as : 

1858 

1859 .. sourcecode:: pycon+sql 

1860 

1861 >>> print(select(literal("a") + "b")) 

1862 {printsql}SELECT :param_1 || :param_2 AS anon_1 

1863 

1864 

1865 """ 

1866 

1867 type = sqltypes.String() 

1868 inherit_cache = True 

1869 

1870 

1871class char_length(GenericFunction[int]): 

1872 """The CHAR_LENGTH() SQL function.""" 

1873 

1874 type = sqltypes.Integer() 

1875 inherit_cache = True 

1876 

1877 def __init__(self, arg: _ColumnExpressionArgument[str], **kw: Any) -> None: 

1878 # slight hack to limit to just one positional argument 

1879 # not sure why this one function has this special treatment 

1880 super().__init__(arg, **kw) 

1881 

1882 

1883class random(GenericFunction[float]): 

1884 """The RANDOM() SQL function.""" 

1885 

1886 _has_args = True 

1887 inherit_cache = True 

1888 

1889 

1890class count(GenericFunction[int]): 

1891 r"""The ANSI COUNT aggregate function. With no arguments, 

1892 emits COUNT \*. 

1893 

1894 E.g.:: 

1895 

1896 from sqlalchemy import func 

1897 from sqlalchemy import select 

1898 from sqlalchemy import table, column 

1899 

1900 my_table = table("some_table", column("id")) 

1901 

1902 stmt = select(func.count()).select_from(my_table) 

1903 

1904 Executing ``stmt`` would emit: 

1905 

1906 .. sourcecode:: sql 

1907 

1908 SELECT count(*) AS count_1 

1909 FROM some_table 

1910 

1911 

1912 """ 

1913 

1914 type = sqltypes.Integer() 

1915 inherit_cache = True 

1916 

1917 def __init__( 

1918 self, 

1919 expression: Union[ 

1920 _ColumnExpressionArgument[Any], _StarOrOne, None 

1921 ] = None, 

1922 **kwargs: Any, 

1923 ) -> None: 

1924 if expression is None: 

1925 expression = literal_column("*") 

1926 super().__init__(expression, **kwargs) 

1927 

1928 

1929class current_date(AnsiFunction[datetime.date]): 

1930 """The CURRENT_DATE() SQL function.""" 

1931 

1932 type = sqltypes.Date() 

1933 inherit_cache = True 

1934 

1935 

1936class current_time(AnsiFunction[datetime.time]): 

1937 """The CURRENT_TIME() SQL function.""" 

1938 

1939 type = sqltypes.Time() 

1940 inherit_cache = True 

1941 

1942 

1943class current_timestamp(AnsiFunction[datetime.datetime]): 

1944 """The CURRENT_TIMESTAMP() SQL function.""" 

1945 

1946 type = sqltypes.DateTime() 

1947 inherit_cache = True 

1948 

1949 

1950class current_user(AnsiFunction[str]): 

1951 """The CURRENT_USER() SQL function.""" 

1952 

1953 type = sqltypes.String() 

1954 inherit_cache = True 

1955 

1956 

1957class localtime(AnsiFunction[datetime.datetime]): 

1958 """The localtime() SQL function.""" 

1959 

1960 type = sqltypes.DateTime() 

1961 inherit_cache = True 

1962 

1963 

1964class localtimestamp(AnsiFunction[datetime.datetime]): 

1965 """The localtimestamp() SQL function.""" 

1966 

1967 type = sqltypes.DateTime() 

1968 inherit_cache = True 

1969 

1970 

1971class session_user(AnsiFunction[str]): 

1972 """The SESSION_USER() SQL function.""" 

1973 

1974 type = sqltypes.String() 

1975 inherit_cache = True 

1976 

1977 

1978class sysdate(AnsiFunction[datetime.datetime]): 

1979 """The SYSDATE() SQL function.""" 

1980 

1981 type = sqltypes.DateTime() 

1982 inherit_cache = True 

1983 

1984 

1985class user(AnsiFunction[str]): 

1986 """The USER() SQL function.""" 

1987 

1988 type = sqltypes.String() 

1989 inherit_cache = True 

1990 

1991 

1992class array_agg(ReturnTypeFromArgs[Sequence[_T]]): 

1993 """Support for the ARRAY_AGG function. 

1994 

1995 The ``func.array_agg(expr)`` construct returns an expression of 

1996 type :class:`_types.ARRAY`. 

1997 

1998 e.g.:: 

1999 

2000 stmt = select(func.array_agg(table.c.values)[2:5]) 

2001 

2002 .. seealso:: 

2003 

2004 :func:`_postgresql.array_agg` - PostgreSQL-specific version that 

2005 returns :class:`_postgresql.ARRAY`, which has PG-specific operators 

2006 added. 

2007 

2008 """ 

2009 

2010 inherit_cache = True 

2011 

2012 def __init__( 

2013 self, *args: _ColumnExpressionArgument[Any], **kwargs: Any 

2014 ) -> None: 

2015 fn_args: Sequence[ColumnElement[Any]] = [ 

2016 coercions.expect( 

2017 roles.ExpressionElementRole, c, apply_propagate_attrs=self 

2018 ) 

2019 for c in args 

2020 ] 

2021 

2022 default_array_type = kwargs.pop("_default_array_type", sqltypes.ARRAY) 

2023 if "type_" not in kwargs: 

2024 type_from_args = _type_from_args(fn_args) 

2025 if isinstance(type_from_args, sqltypes.ARRAY): 

2026 kwargs["type_"] = type_from_args 

2027 else: 

2028 kwargs["type_"] = default_array_type( 

2029 type_from_args, dimensions=1 

2030 ) 

2031 kwargs["_parsed_args"] = fn_args 

2032 super().__init__(*fn_args, **kwargs) 

2033 

2034 

2035class OrderedSetAgg(GenericFunction[_T]): 

2036 """Define a function where the return type is based on the sort 

2037 expression type as defined by the expression passed to the 

2038 :meth:`.FunctionElement.within_group` method.""" 

2039 

2040 array_for_multi_clause = False 

2041 inherit_cache = True 

2042 

2043 def within_group_type( 

2044 self, within_group: WithinGroup[Any] 

2045 ) -> TypeEngine[Any]: 

2046 func_clauses = cast(ClauseList, self.clause_expr.element) 

2047 order_by: Sequence[ColumnElement[Any]] = sqlutil.unwrap_order_by( 

2048 within_group.order_by 

2049 ) 

2050 if self.array_for_multi_clause and len(func_clauses.clauses) > 1: 

2051 return sqltypes.ARRAY(order_by[0].type) 

2052 else: 

2053 return order_by[0].type 

2054 

2055 

2056class mode(OrderedSetAgg[_T]): 

2057 """Implement the ``mode`` ordered-set aggregate function. 

2058 

2059 This function must be used with the :meth:`.FunctionElement.within_group` 

2060 modifier to supply a sort expression to operate upon. 

2061 

2062 The return type of this function is the same as the sort expression. 

2063 

2064 """ 

2065 

2066 inherit_cache = True 

2067 

2068 

2069class percentile_cont(OrderedSetAgg[_T]): 

2070 """Implement the ``percentile_cont`` ordered-set aggregate function. 

2071 

2072 This function must be used with the :meth:`.FunctionElement.within_group` 

2073 modifier to supply a sort expression to operate upon. 

2074 

2075 The return type of this function is the same as the sort expression, 

2076 or if the arguments are an array, an :class:`_types.ARRAY` of the sort 

2077 expression's type. 

2078 

2079 """ 

2080 

2081 array_for_multi_clause = True 

2082 inherit_cache = True 

2083 

2084 

2085class percentile_disc(OrderedSetAgg[_T]): 

2086 """Implement the ``percentile_disc`` ordered-set aggregate function. 

2087 

2088 This function must be used with the :meth:`.FunctionElement.within_group` 

2089 modifier to supply a sort expression to operate upon. 

2090 

2091 The return type of this function is the same as the sort expression, 

2092 or if the arguments are an array, an :class:`_types.ARRAY` of the sort 

2093 expression's type. 

2094 

2095 """ 

2096 

2097 array_for_multi_clause = True 

2098 inherit_cache = True 

2099 

2100 

2101class rank(GenericFunction[int]): 

2102 """Implement the ``rank`` hypothetical-set aggregate function. 

2103 

2104 This function must be used with the :meth:`.FunctionElement.within_group` 

2105 modifier to supply a sort expression to operate upon. 

2106 

2107 The return type of this function is :class:`.Integer`. 

2108 

2109 """ 

2110 

2111 type = sqltypes.Integer() 

2112 inherit_cache = True 

2113 

2114 

2115class dense_rank(GenericFunction[int]): 

2116 """Implement the ``dense_rank`` hypothetical-set aggregate function. 

2117 

2118 This function must be used with the :meth:`.FunctionElement.within_group` 

2119 modifier to supply a sort expression to operate upon. 

2120 

2121 The return type of this function is :class:`.Integer`. 

2122 

2123 """ 

2124 

2125 type = sqltypes.Integer() 

2126 inherit_cache = True 

2127 

2128 

2129class percent_rank(GenericFunction[decimal.Decimal]): 

2130 """Implement the ``percent_rank`` hypothetical-set aggregate function. 

2131 

2132 This function must be used with the :meth:`.FunctionElement.within_group` 

2133 modifier to supply a sort expression to operate upon. 

2134 

2135 The return type of this function is :class:`.Numeric`. 

2136 

2137 """ 

2138 

2139 type: sqltypes.Numeric[decimal.Decimal] = sqltypes.Numeric() 

2140 inherit_cache = True 

2141 

2142 

2143class cume_dist(GenericFunction[decimal.Decimal]): 

2144 """Implement the ``cume_dist`` hypothetical-set aggregate function. 

2145 

2146 This function must be used with the :meth:`.FunctionElement.within_group` 

2147 modifier to supply a sort expression to operate upon. 

2148 

2149 The return type of this function is :class:`.Numeric`. 

2150 

2151 """ 

2152 

2153 type: sqltypes.Numeric[decimal.Decimal] = sqltypes.Numeric() 

2154 inherit_cache = True 

2155 

2156 

2157class cube(GenericFunction[_T]): 

2158 r"""Implement the ``CUBE`` grouping operation. 

2159 

2160 This function is used as part of the GROUP BY of a statement, 

2161 e.g. :meth:`_expression.Select.group_by`:: 

2162 

2163 stmt = select( 

2164 func.sum(table.c.value), table.c.col_1, table.c.col_2 

2165 ).group_by(func.cube(table.c.col_1, table.c.col_2)) 

2166 

2167 """ 

2168 

2169 _has_args = True 

2170 inherit_cache = True 

2171 

2172 

2173class rollup(GenericFunction[_T]): 

2174 r"""Implement the ``ROLLUP`` grouping operation. 

2175 

2176 This function is used as part of the GROUP BY of a statement, 

2177 e.g. :meth:`_expression.Select.group_by`:: 

2178 

2179 stmt = select( 

2180 func.sum(table.c.value), table.c.col_1, table.c.col_2 

2181 ).group_by(func.rollup(table.c.col_1, table.c.col_2)) 

2182 

2183 """ 

2184 

2185 _has_args = True 

2186 inherit_cache = True 

2187 

2188 

2189class grouping_sets(GenericFunction[_T]): 

2190 r"""Implement the ``GROUPING SETS`` grouping operation. 

2191 

2192 This function is used as part of the GROUP BY of a statement, 

2193 e.g. :meth:`_expression.Select.group_by`:: 

2194 

2195 stmt = select( 

2196 func.sum(table.c.value), table.c.col_1, table.c.col_2 

2197 ).group_by(func.grouping_sets(table.c.col_1, table.c.col_2)) 

2198 

2199 In order to group by multiple sets, use the :func:`.tuple_` construct:: 

2200 

2201 from sqlalchemy import tuple_ 

2202 

2203 stmt = select( 

2204 func.sum(table.c.value), table.c.col_1, table.c.col_2, table.c.col_3 

2205 ).group_by( 

2206 func.grouping_sets( 

2207 tuple_(table.c.col_1, table.c.col_2), 

2208 tuple_(table.c.value, table.c.col_3), 

2209 ) 

2210 ) 

2211 

2212 """ # noqa: E501 

2213 

2214 _has_args = True 

2215 inherit_cache = True 

2216 

2217 

2218class aggregate_strings(GenericFunction[str]): 

2219 """Implement a generic string aggregation function. 

2220 

2221 This function will concatenate non-null values into a string and 

2222 separate the values by a delimiter. 

2223 

2224 This function is compiled on a per-backend basis, into functions 

2225 such as ``group_concat()``, ``string_agg()``, or ``LISTAGG()``. 

2226 

2227 e.g. Example usage with delimiter '.':: 

2228 

2229 stmt = select(func.aggregate_strings(table.c.str_col, ".")) 

2230 

2231 .. versionadded:: 2.0.21 

2232 

2233 To add ordering to the expression, use the 

2234 :meth:`_functions.FunctionElement.aggregate_order_by` modifier method, 

2235 which will emit ORDER BY within the appropriate part of the column 

2236 expression (varies by backend):: 

2237 

2238 stmt = select( 

2239 func.aggregate_strings(table.c.str_col, ".").aggregate_order_by( 

2240 table.c.str_col 

2241 ) 

2242 ) 

2243 

2244 .. versionadded:: 2.1 added :meth:`_functions.FunctionElement.aggregate_order_by` 

2245 for all aggregate functions. 

2246 

2247 :param clause: the SQL expression to be concatenated 

2248 

2249 :param separator: separator string 

2250 

2251 

2252 """ # noqa: E501 

2253 

2254 type = sqltypes.String() 

2255 _has_args = True 

2256 inherit_cache = True 

2257 

2258 def __init__( 

2259 self, 

2260 clause: _ColumnExpressionArgument[Any], 

2261 separator: str, 

2262 ) -> None: 

2263 super().__init__(clause, separator) 

2264 

2265 

2266# These aliases are required to avoid shadowing the class with the function 

2267# name. See https://github.com/sqlalchemy/sqlalchemy/issues/13167 

2268# START GENERATED FUNCTION ALIASES 

2269_aggregate_strings_func: TypeAlias = aggregate_strings 

2270_AnsiFunction_func: TypeAlias = AnsiFunction[_T] 

2271_array_agg_func: TypeAlias = array_agg[_T] 

2272_Cast_func: TypeAlias = Cast[_T] 

2273_char_length_func: TypeAlias = char_length 

2274_coalesce_func: TypeAlias = coalesce[_T] 

2275_concat_func: TypeAlias = concat 

2276_count_func: TypeAlias = count 

2277_cube_func: TypeAlias = cube[_T] 

2278_cume_dist_func: TypeAlias = cume_dist 

2279_current_date_func: TypeAlias = current_date 

2280_current_time_func: TypeAlias = current_time 

2281_current_timestamp_func: TypeAlias = current_timestamp 

2282_current_user_func: TypeAlias = current_user 

2283_dense_rank_func: TypeAlias = dense_rank 

2284_Extract_func: TypeAlias = Extract 

2285_grouping_sets_func: TypeAlias = grouping_sets[_T] 

2286_localtime_func: TypeAlias = localtime 

2287_localtimestamp_func: TypeAlias = localtimestamp 

2288_max_func: TypeAlias = max[_T] 

2289_min_func: TypeAlias = min[_T] 

2290_mode_func: TypeAlias = mode[_T] 

2291_next_value_func: TypeAlias = next_value 

2292_now_func: TypeAlias = now 

2293_OrderedSetAgg_func: TypeAlias = OrderedSetAgg[_T] 

2294_percent_rank_func: TypeAlias = percent_rank 

2295_percentile_cont_func: TypeAlias = percentile_cont[_T] 

2296_percentile_disc_func: TypeAlias = percentile_disc[_T] 

2297_pow_func: TypeAlias = pow[_T] 

2298_random_func: TypeAlias = random 

2299_rank_func: TypeAlias = rank 

2300_rollup_func: TypeAlias = rollup[_T] 

2301_session_user_func: TypeAlias = session_user 

2302_sum_func: TypeAlias = sum[_T] 

2303_sysdate_func: TypeAlias = sysdate 

2304_user_func: TypeAlias = user 

2305# END GENERATED FUNCTION ALIASES