ASQL docs / SQL

Functions

The functions below behave as in MySQL and MariaDB unless a note says otherwise. Names are not case-sensitive.

Aggregate functions

FunctionNotes
COUNT(*), COUNT([DISTINCT] x)
SUM(x), AVG(x), MIN(x), MAX(x)
GROUP_CONCAT([DISTINCT] x [ORDER BY ...] [SEPARATOR 's'])STRING_AGG(x, 's' [ORDER BY ...]) also works
JSON_ARRAYAGG(x [ORDER BY ...]), JSON_OBJECTAGG(k, v)
STD, STDDEV, STDDEV_POP, STDDEV_SAMP, VARIANCE, VAR_POP, VAR_SAMPno DISTINCT
BIT_AND, BIT_OR, BIT_XOR
ANY_VALUE(x)
ARG_MAX(value, by), ARG_MIN(value, by), MAX_BY, MIN_BYthe value of the row with the largest or smallest by
BOOL_AND(cond), EVERY(cond), BOOL_OR(cond)

Any aggregate takes FILTER (WHERE cond): SUM(amount) FILTER (WHERE status = 'paid').

Window functions

ROW_NUMBER, RANK, DENSE_RANK, PERCENT_RANK, CUME_DIST, NTILE(n), LAG, LEAD, FIRST_VALUE, LAST_VALUE, NTH_VALUE, and SUM, AVG, COUNT, MIN, MAX with OVER.

SELECT customer, amount,
       ROW_NUMBER() OVER (PARTITION BY customer ORDER BY trans_date DESC) AS rn,
       SUM(amount)  OVER (PARTITION BY customer ORDER BY trans_date
                          ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running
FROM sales;

Frames take ROWS or RANGE with UNBOUNDED PRECEDING, n PRECEDING, CURRENT ROW, n FOLLOWING and UNBOUNDED FOLLOWING. Named windows work: OVER w ... WINDOW w AS (...). Window functions are not allowed in WHERE, GROUP BY, HAVING or ON.

String

CONCAT, CONCAT_WS, LENGTH, CHAR_LENGTH, CHARACTER_LENGTH, OCTET_LENGTH, BIT_LENGTH, UPPER, UCASE, LOWER, LCASE, TRIM([LEADING | TRAILING | BOTH] x FROM s), LTRIM, RTRIM, SUBSTRING / SUBSTR / MID (also FROM ... FOR), LEFT, RIGHT, LPAD, RPAD, REPLACE, INSERT, REVERSE, REPEAT, SPACE, LOCATE, INSTR, POSITION(x IN s), SUBSTRING_INDEX, FIELD, FIND_IN_SET, MAKE_SET, ELT, ASCII, ORD, CHAR, CHR, HEX, UNHEX, BIN, OCT, CONV, STRCMP, FORMAT, QUOTE, SOUNDEX, REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR.

Numeric

ABS, ROUND, TRUNCATE, TRUNC, FLOOR, CEIL, CEILING, SIGN, MOD, POW, POWER, SQRT, EXP, LN, LOG, LOG2, LOG10, PI, SIN, COS, TAN, COT, ASIN, ACOS, ATAN, ATAN2, DEGREES, RADIANS, GREATEST, LEAST, RAND, BIT_COUNT, CRC32.

ROUND of a DOUBLE rounds the value as written; see Support and differences.

Date and time

GroupFunctions
NowNOW, CURRENT_TIMESTAMP, LOCALTIME, LOCALTIMESTAMP, SYSDATE, CURDATE, CURRENT_DATE, CURTIME, CURRENT_TIME, UTC_TIMESTAMP, UTC_DATE, UTC_TIME
PartsYEAR, QUARTER, MONTH, MONTHNAME, WEEK, WEEKOFYEAR, YEARWEEK, DAY, DAYOFMONTH, DAYOFWEEK, DAYOFYEAR, DAYNAME, WEEKDAY, HOUR, MINUTE, SECOND, MICROSECOND, EXTRACT(unit FROM d), DATE, TIME, LAST_DAY
ArithmeticDATE_ADD, DATE_SUB, ADDDATE, SUBDATE, ADDTIME, SUBTIME, DATEDIFF, TIMEDIFF, TIMESTAMPDIFF, TIMESTAMPADD, PERIOD_ADD, PERIOD_DIFF, d + INTERVAL n unit
ConversionDATE_FORMAT, TIME_FORMAT, STR_TO_DATE, UNIX_TIMESTAMP, FROM_UNIXTIME, TO_DAYS, FROM_DAYS, TO_SECONDS, TIME_TO_SEC, SEC_TO_TIME, MAKEDATE, MAKETIME, CONVERT_TZ

EXTRACT takes YEAR, QUARTER, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND and YEAR_MONTH.

Conditional and null handling

IF(cond, a, b), CASE ... END, IFNULL, NVL, COALESCE, NULLIF, ISNULL, INTERVAL(n, n1, n2, ...).

Conversion

CAST(x AS type), CONVERT(x, type), CONVERT(x USING charset), x::type, BINARY x.

CAST targets: SIGNED, UNSIGNED, INTEGER, DECIMAL(p,s), DOUBLE, FLOAT, REAL, CHAR(n), BINARY(n), DATE, DATETIME, TIME.

JSON

JSON_EXTRACT, JSON_UNQUOTE, JSON_VALUE, JSON_QUERY, JSON_OBJECT, JSON_ARRAY, JSON_SET, JSON_INSERT, JSON_REPLACE, JSON_REMOVE, JSON_ARRAY_APPEND, JSON_ARRAY_INSERT, JSON_MERGE, JSON_MERGE_PRESERVE, JSON_MERGE_PATCH, JSON_CONTAINS, JSON_CONTAINS_PATH, JSON_EXISTS, JSON_SEARCH, JSON_KEYS, JSON_LENGTH, JSON_DEPTH, JSON_TYPE, JSON_VALID, JSON_QUOTE, JSON_PRETTY, JSON_DETAILED, JSON_COMPACT, JSON_LOOSE.

doc->'$.path' is JSON_EXTRACT(doc, '$.path'); doc->>'$.path' also unquotes the result.

Hashing and encoding

MD5, SHA, SHA1, SHA2(s, bits), TO_BASE64, FROM_BASE64, AES_ENCRYPT, AES_DECRYPT (the default aes-128-ecb only), ENCODE, DECODE, COMPRESS, UNCOMPRESS, UNCOMPRESSED_LENGTH, RANDOM_BYTES, UUID.

Network

INET_ATON, INET_NTOA, IS_IPV4, IS_IPV6.

Geometry

WKT text in, WKT text out: ST_GEOMFROMTEXT, ST_POINTFROMTEXT, ST_LINESTRINGFROMTEXT, ST_POLYGONFROMTEXT, ST_ASTEXT, ST_ASWKT, POINT(x, y), ST_X, ST_Y, ST_LATITUDE, ST_LONGITUDE, ST_GEOMETRYTYPE, ST_SRID, ST_DISTANCE, ST_DISTANCE_SPHERE, ST_CONTAINS, ST_WITHIN, MBRCONTAINS, MBRWITHIN.

SELECT * FROM articles
WHERE MATCH(title, body) AGAINST ('replica lag' IN NATURAL LANGUAGE MODE);

IN BOOLEAN MODE and WITH QUERY EXPANSION are accepted.

Session and server

DATABASE, SCHEMA, VERSION, USER, CURRENT_USER, SESSION_USER, SYSTEM_USER, CONNECTION_ID, LAST_INSERT_ID, FOUND_ROWS, ROW_COUNT, CHARSET, COLLATION, BENCHMARK, SLEEP, VALUES(col), DEFAULT(col), NAME_CONST.

Named locks: GET_LOCK, RELEASE_LOCK, RELEASE_ALL_LOCKS, IS_FREE_LOCK, IS_USED_LOCK.

ASQL functions

FunctionReturns
ASQL_CHANGES('t1', 't2', ...)a token that changes whenever any of the tables is written; reads no rows
GENERATE_SERIES(start, stop [, step])a table of numbers, in FROM (with LATERAL for a per-row series)

Sequences

FunctionReturns
NEXTVAL(s), NEXT VALUE FOR sthe sequence's next value
LASTVAL(s), PREVIOUS VALUE FOR sthe value NEXTVAL last gave this connection, or NULL
SETVAL(s, n [, is_used [, round]])n, after setting the sequence so the next value follows n (is n with is_used = 0); NULL when n is behind the sequence

ASQL_CHANGES is how a client can tell cheaply whether to run a query again; Grain's live() uses it.

Not available

DATE_TRUNC, TO_CHAR, SPLIT_PART, MEDIAN, PERCENTILE_CONT, PERCENTILE_DISC, LISTAGG, UUID_SHORT and the INET6_ functions return "unknown function".