﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
28643	Complete the ORM Function Library	Matthew Pava	JunyiJ	"I was surprised to learn that we didn't have a StrIndex function until version 2, and yet we had Substr since at least version 1.8.  I wonder how users were using Substr without also finding a use for StrIndex this whole time.  Anyway, since we seem to be adding these functions one at a time, why don't we work on trying to get the built-ins implemented in one sweep instead?

We may even want to split the documentation page (https://docs.djangoproject.com/en/dev/ref/models/database-functions/) into further categories with String functions and Numeric functions.

This is just a sample checklist, with corresponding attributes to which backend has them available.

||||||||||||||= **Comparison** =||
||**Name**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||{{{NULLIF}}}||Returns {{{NULL}}} if the first argument equals the second.||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9543 9543]||
||||||||||||||= **Math** =||
||**Name**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||{{{ABS}}}||Returns the absolute value.||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9577 9577], [https://github.com/django/django/pull/9622 9622]||
||{{{ACOS}}}||Returns the arccosine.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{ASIN}}}||Returns the arcsine.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{ATAN}}}||Returns the arctangent.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{ATAN2}}}||Returns the arctangent of the two variables passed to it.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{CEILING}}}||Returns the smallest integer value that is not less than a numeric expression||‎✔||{{{CEIL}}}||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{COS}}}||Returns the cosine expressed in radians.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{COT}}}||Returns the cotangent.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{DEGREES}}}||Returns a numeric expression converted from radians to degrees.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{EXP}}}||Returns the base of the natural logarithm (e) raised to the power of a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{FLOOR}}}||Returns the largest integer value that is not greater than a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{LOG}}}||Returns the natural logarithm of a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{MOD}}}||Returns the remainder of one expression by diving by another expression.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{PI}}}||Returns the value of π||‎✔||-||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{POWER}}}||Returns the value of one expression raised to the power of another expression||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{RADIANS}}}||Returns the value of an expression converted from degrees to radians.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{ROUND}}}||Returns a numeric expression rounded to an integer.\\Can be used to round an expression to a number of decimal points||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9622 9622]||
||{{{SIN}}}||Returns the sine given in radians.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{SQRT}}}||Returns the square root.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||{{{TAN}}}||Returns the tangent expressed in radians.||‎✔||‎✔||‎✔||✔**^1^**||[https://github.com/django/django/pull/9622 9622]||
||||||||||||||= **Text** =||
||**Name**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||{{{ASCII}}}||Returns numeric value of left-most character. (Equivalent to {{{ord()}}} in Python.)||‎✔||‎✔||‎✔||{{{UNICODE}}}||[https://github.com/django/django/pull/9583 9583]||
||{{{CHR}}}||Character with the given code||‎✔||‎✔||{{{CHAR}}}||{{{CHAR}}}||[https://github.com/django/django/pull/9583 9583]||
||{{{LEFT}}}||Returns the leftmost number of characters as specified||‎✔||✔**^2^**||‎✔||✔**^2^**||[https://github.com/django/django/pull/9583 9583]||
||{{{LPAD}}}||Returns the string argument, left-padded with the specified string||‎✔||‎✔||‎✔||-||-||
||{{{LTRIM}}}||Removes leading spaces||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9220 9220]||
||{{{MD5}}}||Calculates the MD5 hash of string, returning the result in hexadecimal||‎✔||-||-||✔**^1^**||-||
||{{{REPEAT}}}||Repeats a string the specified number of times||‎✔||-||‎✔||-||-||
||{{{REPLACE}}}||Replaces occurrences of a specified string||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9539 9539] [[span(style=font-size:75%, (Merged))]]||
||{{{REVERSE}}}||Reverse the characters in a string||‎✔||-||‎✔||✔**^1^**||-||
||{{{RIGHT}}}||Returns the specified rightmost number of characters||‎✔||✔**^2^**||‎✔||✔**^2^**||[https://github.com/django/django/pull/9583 9583]||
||{{{RPAD}}}||Appends string the specified number of times||‎✔||‎✔||‎✔||-||-||
||{{{RTRIM}}}||Removes trailing spaces||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9220 9220]||
||{{{TRIM}}}||Removes leading and trailing spaces||‎✔||‎✔||‎✔||‎✔||[https://github.com/django/django/pull/9220 9220]||

- **^1^** Function can be easily supported on SQLite with a [https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.create_function user defined function].
- **^2^** Behaviour can be emulated by using {{{SUBSTR}}}."	New feature	assigned	Database layer (models, ORM)	dev	Normal			josh.smeaton@… Mariusz Felisiak Shai Berger Adam Johnson Thomas Lagae	Accepted	1	0	0	0	0	0
