﻿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	Nick Pope	"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** =||
||**Django**||**SQL**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||`NullIf`||`NULLIF`||Returns `NULL` if the first argument equals the second.||‎✔||‎✔||‎✔||‎✔||~~9543~~||
||||||||||||||||= **Math** =||
||**Django**||**SQL**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||`Abs`||`ABS`||Returns the absolute value.||‎✔||‎✔||‎✔||‎✔||~~9622~~||
||`ACos`||`ACOS`||Returns the arccosine.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`ASin`||`ASIN`||Returns the arcsine.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`ATan`||`ATAN`||Returns the arctangent.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`ATan2`||`ATAN2`||Returns the arctangent of the two variables passed to it.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Ceil`||`CEILING`||Returns the smallest integer value that is not less than a numeric expression||‎✔||`CEIL`||‎✔||✔**^1^**||~~9622~~||
||`Cos`||`COS`||Returns the cosine expressed in radians.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Cot`||`COT`||Returns the cotangent.||‎✔||‎✔**^5^**||‎✔||✔**^1^**||~~9622~~||
||`Degrees`||`DEGREES`||Returns a numeric expression converted from radians to degrees.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Exp`||`EXP`||Returns the base of the natural logarithm (e) raised to the power of a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Floor`||`FLOOR`||Returns the largest integer value that is not greater than a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Ln`||`LN`||Returns the natural logarithm of a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Log`||`LOG(B, X)`||Returns the logarithm of a numeric expression.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Mod`||`MOD`||Returns the remainder of one expression by diving by another expression.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Pi`||`PI`||Returns the value of π||‎✔||✔**^4^**||‎✔||✔**^1^**||~~9622~~||
||`Power`||`POWER`||Returns the value of one expression raised to the power of another expression||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Radians`||`RADIANS`||Returns the value of an expression converted from degrees to radians.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Round`||`ROUND`||Returns a numeric expression rounded to an integer.\\Can be used to round an expression to a number of decimal points||‎✔||‎✔||‎✔||‎✔||~~9622~~||
||`Sin`||`SIN`||Returns the sine given in radians.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Sqrt`||`SQRT`||Returns the square root.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||`Tan`||`TAN`||Returns the tangent expressed in radians.||‎✔||‎✔||‎✔||✔**^1^**||~~9622~~||
||||||||||||||||= **Text** =||
||**Django**||**SQL**||**Description**||**PostgreSQL**||**Oracle**||**MySQL**||**SQLite**||**PR**||
||`Ord`||`ASCII`||Returns numeric value of left-most character. (Equivalent to `ord()` in Python.)||‎✔||‎✔||‎✔||`UNICODE`||~~9583~~||
||`Chr`||`CHR`||Character with the given code||‎✔||‎✔||`CHAR`||`CHAR`||~~9583~~||
||`Left`||`LEFT`||Returns the leftmost number of characters as specified||‎✔||✔**^2, 6^**||‎✔||✔**^2^**||~~9583~~||
||`LPad`||`LPAD`||Returns the string argument, left-padded with the specified string||‎✔||‎✔||‎✔||✔**^1^**||~~9798~~||
||`LTrim`||`LTRIM`||Removes leading spaces||‎✔||‎✔||‎✔||‎✔||~~9220~~||
||`MD5`||`MD5`||Calculates the MD5 hash of string, returning the result in hexadecimal||‎✔||✔**^8^**||✔||✔**^1^**||11004||
||`Repeat`||`REPEAT`||Repeats a string the specified number of times||‎✔||✔**^3^**||‎✔||✔**^1^**||~~9808~~||
||`Replace`||`REPLACE`||Replaces occurrences of a specified string||‎✔||‎✔**^6^**||‎✔||‎✔||~~9539~~||
||`Reverse`||`REVERSE`||Reverse the characters in a string||‎✔||✔**^6, 7^**||‎✔||✔**^1^**||~~10827~~||
||`Right`||`RIGHT`||Returns the specified rightmost number of characters||‎✔||✔**^2^**||‎✔||✔**^2^**||~~9583~~||
||`RPad`||`RPAD`||Appends string the specified number of times||‎✔||‎✔**^6^**||✔||✔**^1^**||~~9798~~||
||`RTrim`||`RTRIM`||Removes trailing spaces||‎✔||‎✔||‎✔||‎✔||~~9220~~||
||`Trim`||`TRIM`||Removes leading and trailing spaces||‎✔||‎✔||‎✔||‎✔||~~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^** Can be emulated by using `SUBSTR`.
- **^3^** Can be emulated by using `LENGTH` and `RPAD`.
- **^4^** Can be emulated by directly substituting constant `math.pi`.
- **^5^** Can be emulated by using `1 / TAN(X)`.
- **^6^** Doesn't work properly with multibyte characters sets on Oracle.
- **^7^** The `REVERSE` function is undocumented on Oracle.
- **^8^** Can be supported by using `STANDARD_HASH` on Oracle."	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
