safe_date_functions = {
    "date",
    "time",
    "datetime",
    "julianday",
    "unixepoch",
    "strftime",
}

safe_string_functions = {
    "char",
    "format",
    "glob",
    "hex",
    "instr",
    "length",
    "like",
    "lower",
    "ltrim",
    "max",
    "min",
    "printf",
    "quote",
    "randomblob",
    "replace",
    "rtrim",
    "soundex",
    "substr",
    "substring",
    "trim",
    "unhex",
    "unicode",
    "upper",
    "zeroblob",
}

safe_math_functions = {
    "abs",
    "acos",
    "acosh",
    "asin",
    "asinh",
    "atan",
    "atan2",
    "atanh",
    "ceil",
    "ceiling",
    "cos",
    "cosh",
    "degrees",
    "exp",
    "floor",
    "ln",
    "log",
    "log10",
    "log2",
    "mod",
    "pi",
    "pow",
    "power",
    "radians",
    "random",
    "round",
    "sin",
    "sinh",
    "sign",
    "sqrt",
    "tan",
    "tanh",
    "trunc",
}


safe_misc_functions = {
    "coalesce",
    "ifnull",
    "iff",
    "nullif",
    "typeof",
}


safe_json_functions = {
    "json",
    "json_array",
    "json_array_length",
    "json_error_position",
    "json_extract",
    "json_insert",
    "json_object",
    "json_patch",
    "json_remove",
    "json_replace",
    "json_set",
    "json_type",
    "json_valid",
    "json_quote",
}

safe_agg_functions = {
    "avg",
    "count",
    "group_concat",
    "max",
    "min",
    "sum",
    "total",
}

safe_functions = (
    safe_date_functions
    | safe_string_functions
    | safe_math_functions
    | safe_misc_functions
    | safe_json_functions
    | safe_agg_functions
)

# we ensure that no unquoted identifiers match these keywords
reserved_keywords = {
    "abort",
    "action",
    "add",
    "after",
    "all",
    "alter",
    "always",
    "analyze",
    "and",
    "as",
    "asc",
    "attach",
    "autoincrement",
    "before",
    "begin",
    "between",
    "by",
    "cascade",
    "case",
    "cast",
    "check",
    "collate",
    "column",
    "commit",
    "conflict",
    "constraint",
    "create",
    "cross",
    "current",
    "current_date",
    "current_time",
    "current_timestamp",
    "database",
    "default",
    "deferrable",
    "deferred",
    "delete",
    "desc",
    "detach",
    "distinct",
    "do",
    "drop",
    "each",
    "else",
    "end",
    "escape",
    "except",
    "exclude",
    "exclusive",
    "exists",
    "explain",
    "fail",
    "filter",
    "first",
    "following",
    "for",
    "foreign",
    "from",
    "full",
    "generated",
    "glob",
    "group",
    "groups",
    "having",
    "if",
    "ignore",
    "immediate",
    "in",
    "index",
    "indexed",
    "initially",
    "inner",
    "insert",
    "instead",
    "intersect",
    "into",
    "is",
    "isnull",
    "join",
    "key",
    "last",
    "left",
    "like",
    "limit",
    "match",
    "materialized",
    "natural",
    "no",
    "not",
    "nothing",
    "notnull",
    "null",
    "nulls",
    "of",
    "offset",
    "on",
    "or",
    "order",
    "others",
    "outer",
    "over",
    "partition",
    "plan",
    "pragma",
    "preceding",
    "primary",
    "query",
    "raise",
    "range",
    "recursive",
    "references",
    "regexp",
    "reindex",
    "release",
    "rename",
    "replace",
    "restrict",
    "returning",
    "right",
    "rollback",
    "row",
    "rows",
    "savepoint",
    "select",
    "set",
    "table",
    "temp",
    "temporary",
    "then",
    "ties",
    "to",
    "transaction",
    "trigger",
    "unbounded",
    "union",
    "unique",
    "update",
    "using",
    "vacuum",
    "values",
    "view",
    "virtual",
    "when",
    "where",
    "window",
    "with",
    "without",
}
