-- lx format
local format = require("core.format")
local patterns = require("core.format.patterns")

local symbols = {
	_expansion_flags = "rl",
	["CREATE"] = "keyword",
	["SELECT"] = "keyword",
	["INSERT"] = "keyword",
	["INTO"] = "keyword",
	["UPDATE"] = "keyword",
	["DELETE"] = "keyword",
	["TABLE"] = "keyword",
	["DROP"] = "keyword",
	["VALUES"] = "keyword",
	["NOT"] = "keyword",
	["PRIMARY"] = "keyword",
	["KEY"] = "keyword",
	["REFERENCES"] = "keyword",
	["DEFAULT"] = "keyword",
	["UNIQUE"] = "keyword",
	["CONSTRAINT"] = "keyword",
	["CHECK"] = "keyword",
	["ON"] = "keyword",
	["EXCLUDE"] = "keyword",
	["WITH"] = "keyword",
	["USING"] = "keyword",
	["WHERE"] = "keyword",
	["GROUP"] = "keyword",
	["BY"] = "keyword",
	["HAVING"] = "keyword",
	["DISTINCT"] = "keyword",
	["LIMIT"] = "keyword",
	["OFFSET"] = "keyword",
	["ONLY"] = "keyword",
	["CROSS"] = "keyword",
	["JOIN"] = "keyword",
	["INNER"] = "keyword",
	["LEFT"] = "keyword",
	["RIGHT"] = "keyword",
	["FULL"] = "keyword",
	["OUTER"] = "keyword",
	["NATURAL"] = "keyword",
	["AND"] = "keyword",
	["OR"] = "keyword",
	["AS"] = "keyword",
	["ORDER"] = "keyword",
	["ORDINALITY"] = "keyword",
	["UNNEST"] = "keyword",
	["FROM"] = "keyword",
	["VIEW"] = "keyword",
	["RETURNS"] = "keyword",
	["SETOF"] = "keyword",
	["LANGUAGE"] = "keyword",
	["SQL"] = "keyword",
	["LIKE"] = "keyword",
	["LATERAL"] = "keyword",
	["INTERVAL"] = "keyword",
	["PARTITION"] = "keyword",
	["UNION"] = "keyword",
	["INTERSECT"] = "keyword",
	["EXCEPT"] = "keyword",
	["ALL"] = "keyword",
	["ASC"] = "keyword",
	["DESC"] = "keyword",
	["NULLS"] = "keyword",
	["FIRST"] = "keyword",
	["LAST"] = "keyword",
	["IN"] = "keyword",
	["RECURSIVE"] = "keyword",
	["ARRAY"] = "keyword",
	["RETURNING"] = "keyword",
	["SET"] = "keyword",
	["ALSO"] = "keyword",
	["INSTEAD"] = "keyword",
	["ALTER"] = "keyword",
	["SEQUENCE"] = "keyword",
	["OWNED"] = "keyword",
	["AT"] = "keyword",
	["ZONE"] = "keyword",
	["WITHOUT"] = "keyword",
	["TO"] = "keyword",
	["TIMEZONE"] = "keyword",
	["TYPE"] = "keyword",
	["ENUM"] = "keyword",
	["DOCUMENT"] = "keyword",
	["XMLPARSE"] = "keyword",
	["XMLSERIALIZE"] = "keyword",
	["CONTENT"] = "keyword",
	["OPTION"] = "keyword",
	["INDEX"] = "keyword",
	["ANY"] = "keyword",
	["EXTENSION"] = "keyword",
	["ISNULL"] = "keyword",
	["NOTNULL"] = "keyword",
	["UNKNOWN"] = "keyword",
	["CASE"] = "keyword",
	["THEN"] = "keyword",
	["WHEN"] = "keyword",
	["ELSE"] = "keyword",
	["END"] = "keyword",
	["ROWS"] = "keyword",
	["BETWEEN"] = "keyword",
	["UNBOUNDED"] = "keyword",
	["PRECEDING"] = "keyword",
	["FOLLOWING"] = "keyword",
	["EXISTS"] = "keyword",
	["SOME"] = "keyword",
	["COLLATION"] = "keyword",
	["FOR"] = "keyword",
	["TRIGGER"] = "keyword",
	["BEFORE"] = "keyword",
	["EACH"] = "keyword",
	["ROW"] = "keyword",
	["EXECUTE"] = "keyword",
	["PROCEDURE"] = "keyword",
	["FUNCTION"] = "keyword",
	["DECLARE"] = "keyword",
	["BEGIN"] = "keyword",
	["LOOP"] = "keyword",
	["RAISE"] = "keyword",
	["NOTICE"] = "keyword",
	["EVENT"] = "keyword",
	["OPERATOR"] = "keyword",
	["DOMAIN"] = "keyword",
	["VARIADIC"] = "keyword",
	["FOREIGN"] = "keyword",
	["BIGINT"] = "keyword2",
	["INT8"] = "keyword2",
	["BIGSERIAL"] = "keyword2",
	["SERIAL8"] = "keyword2",
	["BIT"] = "keyword2",
	["VARBIT"] = "keyword2",
	["BOOLEAN"] = "keyword2",
	["BOOL"] = "keyword2",
	["BOX"] = "keyword2",
	["BYTEA"] = "keyword2",
	["CHARACTER"] = "keyword2",
	["CHAR"] = "keyword2",
	["VARCHAR"] = "keyword2",
	["CIDR"] = "keyword2",
	["CIRCLE"] = "keyword2",
	["DATE"] = "keyword2",
	["DOUBLE"] = "keyword2",
	["PRECISION"] = "keyword2",
	["FLOAT8"] = "keyword2",
	["INET"] = "keyword2",
	["INTEGER"] = "keyword2",
	["INT"] = "keyword2",
	["INT4"] = "keyword2",
	["JSON"] = "keyword2",
	["JSONB"] = "keyword2",
	["LINE"] = "keyword2",
	["LSEG"] = "keyword2",
	["MACADDR"] = "keyword2",
	["MONEY"] = "keyword2",
	["NUMERIC"] = "keyword2",
	["DECIMAL"] = "keyword2",
	["PATH"] = "keyword2",
	["POINT"] = "keyword2",
	["POLYGON"] = "keyword2",
	["REAL"] = "keyword2",
	["FLOAT4"] = "keyword2",
	["INT2"] = "keyword2",
	["SMALLINT"] = "keyword2",
	["SMALLSERIAL"] = "keyword2",
	["SERIAL2"] = "keyword2",
	["SERIAL"] = "keyword2",
	["SERIAL4"] = "keyword2",
	["TEXT"] = "keyword2",
	["TIME"] = "keyword2",
	["TIMEZ"] = "keyword2",
	["TIMESTAMP"] = "keyword2",
	["TIMESTAMPZ"] = "keyword2",
	["TSQUERY"] = "keyword2",
	["TSVECTOR"] = "keyword2",
	["TXID_SNAPSHOT"] = "keyword2",
	["UUID"] = "keyword2",
	["XML"] = "keyword2",
	["INT4RANGE"] = "keyword2",
	["INT8RANGE"] = "keyword2",
	["NUMRANGE"] = "keyword2",
	["TSRANGE"] = "keyword2",
	["TSTZRANGE"] = "keyword2",
	["DATERANGE"] = "keyword2",
	["PG_LSN"] = "keyword2",
	["CURRENT_TIMESTAMP"] = "keyword",
	["CURRENT_TIME"] = "keyword",
	["CURRENT_DATE"] = "keyword",
	["LOCALTIME"] = "keyword",
	["LOCALTIMESTAMP"] = "keyword",

	["NULL"] = "literal",
	["FALSE"] = "literal",
	["TRUE"] = "literal",
}

format.register({
	name = "PostgreSQL Script",
	shortname = "PgSQL",
	author = "liqube",
	extensions = { "psql", "pgsql.sql" },
	comment = "--",
	
	patterns = {
		{ pattern = "%-%-.-\n", type = "comment" },
		{ pattern = { "/%*", "%*/" }, type = "comment" },
		{ pattern = { "'", "'", "\\" }, type = "string" },
		patterns.hex_token({ caseless = true }),
		patterns.number_token(),
		patterns.float_token(),
		{ pattern = "[%+%-=/%*%%<>!~|&@%?$#]", type = "operator" },
		{ pattern = "[%a_][%w_]*%f[(]", type = "function" },
		{ pattern = "[%a_][%w_]*", type = "symbol" },
	},
	symbols = symbols,
})
