All Downloads are FREE. Search and download functionalities are using the official Maven repository.

data.Identifier.scala Maven / Gradle / Ivy

// Copyright (c) 2018-2021 by Rob Norris
// This software is licensed under the MIT License (MIT).
// For more information see LICENSE or https://opensource.org/licenses/MIT

package skunk.data

import cats.Eq

import scala.util.matching.Regex

sealed abstract case class Identifier(value: String) {
  override def toString: String = value // ok?
}

object Identifier {

  private[skunk] val dummy: Identifier = new Identifier("dummy") {}

  val maxLen = 63
  val pat: Regex = "([A-Za-z_][A-Za-z_0-9$]*)".r

  implicit val EqIdentifier: Eq[Identifier] =
    Eq.by(_.value)

  def fromString(s: String): Either[String, Identifier] =
    s match {
      case pat(s) =>
        if (s.length > maxLen)
          Left(s"Identifier too long: ${s.length} (max allowed is $maxLen)")
        else if (keywords(s.toUpperCase))
          Left(s"Illegal identifier: ${s.toUpperCase} is a keyword.")
        else
          Right(new Identifier(s) {})
      case _ => Left(s"Malformed identifier: does not match ${pat.regex}")
    }

  val keywords: Set[String] =
    Set(
      "A",                               "ABORT",                   "ABS",                              "ABSENT",                   "ABSOLUTE",
      "ACCESS",                          "ACCORDING",               "ACTION",                           "ADA",                      "ADD",
      "ADMIN",                           "AFTER",                   "AGGREGATE",                        "ALL",                      "ALLOCATE",
      "ALSO",                            "ALTER",                   "ALWAYS",                           "ANALYSE",                  "ANALYZE",
      "AND",                             "ANY",                     "ARE",                              "ARRAY",                    "ARRAY_AGG",
      "ARRAY_MAX_CARDINALITY",           "AS",                      "ASC",                              "ASENSITIVE",               "ASSERTION",
      "ASSIGNMENT",                      "ASYMMETRIC",              "AT",                               "ATOMIC",                   "ATTACH",
      "ATTRIBUTE",                       "ATTRIBUTES",              "AUTHORIZATION",                    "AVG",                      "BACKWARD",
      "BASE64",                          "BEFORE",                  "BEGIN",                            "BEGIN_FRAME",              "BEGIN_PARTITION",
      "BERNOULLI",                       "BETWEEN",                 "BIGINT",                           "BINARY",                   "BIT",
      "BIT_LENGTH",                      "BLOB",                    "BLOCKED",                          "BOM",                      "BOOLEAN",
      "BOTH",                            "BREADTH",                 "BY",                               "C",                        "CACHE",
      "CALL",                            "CALLED",                  "CARDINALITY",                      "CASCADE",                  "CASCADED",
      "CASE",                            "CAST",                    "CATALOG",                          "CATALOG_NAME",             "CEIL",
      "CEILING",                         "CHAIN",                   "CHAR",                             "CHARACTER",                "CHARACTERISTICS",
      "CHARACTERS",                      "CHARACTER_LENGTH",        "CHARACTER_SET_CATALOG",            "CHARACTER_SET_NAME",       "CHARACTER_SET_SCHEMA",
      "CHAR_LENGTH",                     "CHECK",                   "CHECKPOINT",                       "CLASS",                    "CLASS_ORIGIN",
      "CLOB",                            "CLOSE",                   "CLUSTER",                          "COALESCE",                 "COBOL",
      "COLLATE",                         "COLLATION",               "COLLATION_CATALOG",                "COLLATION_NAME",           "COLLATION_SCHEMA",
      "COLLECT",                         "COLUMN",                  "COLUMNS",                          "COLUMN_NAME",              "COMMAND_FUNCTION",
      "COMMAND_FUNCTION_CODE",           "COMMENT",                 "COMMENTS",                         "COMMIT",                   "COMMITTED",
      "CONCURRENTLY",                    "CONDITION",               "CONDITION_NUMBER",                 "CONFIGURATION",            "CONFLICT",
      "CONNECT",                         "CONNECTION",              "CONNECTION_NAME",                  "CONSTRAINT",               "CONSTRAINTS",
      "CONSTRAINT_CATALOG",              "CONSTRAINT_NAME",         "CONSTRAINT_SCHEMA",                "CONSTRUCTOR",              "CONTAINS",
      "CONTENT",                         "CONTINUE",                "CONTROL",                          "CONVERSION",               "CONVERT",
      "COPY",                            "CORR",                    "CORRESPONDING",                    "COST",                     "COUNT",
      "COVAR_POP",                       "COVAR_SAMP",              "CREATE",                           "CROSS",                    "CSV",
      "CUBE",                            "CUME_DIST",               "CURRENT",                          "CURRENT_CATALOG",          "CURRENT_DATE",
      "CURRENT_DEFAULT_TRANSFORM_GROUP", "CURRENT_PATH",            "CURRENT_ROLE",                     "CURRENT_ROW",              "CURRENT_SCHEMA",
      "CURRENT_TIME",                    "CURRENT_TIMESTAMP",       "CURRENT_TRANSFORM_GROUP_FOR_TYPE", "CURRENT_USER",             "CURSOR",
      "CURSOR_NAME",                     "CYCLE",                   "DATA",                             "DATABASE",                 "DATALINK",
      "DATE",                            "DATETIME_INTERVAL_CODE",  "DATETIME_INTERVAL_PRECISION",      "DAY",                      "DB",
      "DEALLOCATE",                      "DEC",                     "DECIMAL",                          "DECLARE",                  "DEFAULT",
      "DEFAULTS",                        "DEFERRABLE",              "DEFERRED",                         "DEFINED",                  "DEFINER",
      "DEGREE",                          "DELETE",                  "DELIMITER",                        "DELIMITERS",               "DENSE_RANK",
      "DEPENDS",                         "DEPTH",                   "DEREF",                            "DERIVED",                  "DESC",
      "DESCRIBE",                        "DESCRIPTOR",              "DETACH",                           "DETERMINISTIC",            "DIAGNOSTICS",
      "DICTIONARY",                      "DISABLE",                 "DISCARD",                          "DISCONNECT",               "DISPATCH",
      "DISTINCT",                        "DLNEWCOPY",               "DLPREVIOUSCOPY",                   "DLURLCOMPLETE",            "DLURLCOMPLETEONLY",
      "DLURLCOMPLETEWRITE",              "DLURLPATH",               "DLURLPATHONLY",                    "DLURLPATHWRITE",           "DLURLSCHEME",
      "DLURLSERVER",                     "DLVALUE",                 "DO",                               "DOCUMENT",                 "DOMAIN",
      "DOUBLE",                          "DROP",                    "DYNAMIC",                          "DYNAMIC_FUNCTION",         "DYNAMIC_FUNCTION_CODE",
      "EACH",                            "ELEMENT",                 "ELSE",                             "EMPTY",                    "ENABLE",
      "ENCODING",                        "ENCRYPTED",               "END",                              "END",                      "END_FRAME",
      "END_PARTITION",                   "ENFORCED",                "ENUM",                             "EQUALS",                   "ESCAPE",
      "EVENT",                           "EVERY",                   "EXCEPT",                           "EXCEPTION",                "EXCLUDE",
      "EXCLUDING",                       "EXCLUSIVE",               "EXEC",                             "EXECUTE",                  "EXISTS",
      "EXP",                             "EXPLAIN",                 "EXPRESSION",                       "EXTENSION",                "EXTERNAL",
      "EXTRACT",                         "FALSE",                   "FAMILY",                           "FETCH",                    "FILE",
      "FILTER",                          "FINAL",                   "FIRST",                            "FIRST_VALUE",              "FLAG",
      "FLOAT",                           "FLOOR",                   "FOLLOWING",                        "FOR",                      "FORCE",
      "FOREIGN",                         "FORTRAN",                 "FORWARD",                          "FOUND",                    "FRAME_ROW",
      "FREE",                            "FREEZE",                  "FROM",                             "FS",                       "FULL",
      "FUNCTION",                        "FUNCTIONS",               "FUSION",                           "G",                        "GENERAL",
      "GENERATED",                       "GET",                     "GLOBAL",                           "GO",                       "GOTO",
      "GRANT",                           "GRANTED",                 "GREATEST",                         "GROUP",                    "GROUPING",
      "GROUPS",                          "HANDLER",                 "HAVING",                           "HEADER",                   "HEX",
      "HIERARCHY",                       "HOLD",                    "HOUR",                             "ID",                       "IDENTITY",
      "IF",                              "IGNORE",                  "ILIKE",                            "IMMEDIATE",                "IMMEDIATELY",
      "IMMUTABLE",                       "IMPLEMENTATION",          "IMPLICIT",                         "IMPORT",                   "IN",
      "INCLUDING",                       "INCREMENT",               "INDENT",                           "INDEX",                    "INDEXES",
      "INDICATOR",                       "INHERIT",                 "INHERITS",                         "INITIALLY",                "INLINE",
      "INNER",                           "INOUT",                   "INPUT",                            "INSENSITIVE",              "INSERT",
      "INSTANCE",                        "INSTANTIABLE",            "INSTEAD",                          "INT",                      "INTEGER",
      "INTEGRITY",                       "INTERSECT",               "INTERSECTION",                     "INTERVAL",                 "INTO",
      "INVOKER",                         "IS",                      "ISNULL",                           "ISOLATION",                "JOIN",
      "K",                               "KEY",                     "KEY_MEMBER",                       "KEY_TYPE",                 "LABEL",
      "LAG",                             "LANGUAGE",                "LARGE",                            "LAST",                     "LAST_VALUE",
      "LATERAL",                         "LEAD",                    "LEADING",                          "LEAKPROOF",                "LEAST",
      "LEFT",                            "LENGTH",                  "LEVEL",                            "LIBRARY",                  "LIKE",
      "LIKE_REGEX",                      "LIMIT",                   "LINK",                             "LISTEN",                   "LN",
      "LOAD",                            "LOCAL",                   "LOCALTIME",                        "LOCALTIMESTAMP",           "LOCATION",
      "LOCATOR",                         "LOCK",                    "LOCKED",                           "LOGGED",                   "LOWER",
      "M",                               "MAP",                     "MAPPING",                          "MATCH",                    "MATCHED",
      "MATERIALIZED",                    "MAX",                     "MAXVALUE",                         "MAX_CARDINALITY",          "MEMBER",
      "MERGE",                           "MESSAGE_LENGTH",          "MESSAGE_OCTET_LENGTH",             "MESSAGE_TEXT",             "METHOD",
      "MIN",                             "MINUTE",                  "MINVALUE",                         "MOD",                      "MODE",
      "MODIFIES",                        "MODULE",                  "MONTH",                            "MORE",                     "MOVE",
      "MULTISET",                        "MUMPS",                   "NAME",                             "NAMES",                    "NAMESPACE",
      "NATIONAL",                        "NATURAL",                 "NCHAR",                            "NCLOB",                    "NESTING",
      "NEW",                             "NEXT",                    "NFC",                              "NFD",                      "NFKC",
      "NFKD",                            "NIL",                     "NO",                               "NONE",                     "NORMALIZE",
      "NORMALIZED",                      "NOT",                     "NOTHING",                          "NOTIFY",                   "NOTNULL",
      "NOWAIT",                          "NTH_VALUE",               "NTILE",                            "NULL",                     "NULLABLE",
      "NULLIF",                          "NULLS",                   "NUMBER",                           "NUMERIC",                  "OBJECT",
      "OCCURRENCES_REGEX",               "OCTETS",                  "OCTET_LENGTH",                     "OF",                       "OFF",
      "OFFSET",                          "OIDS",                    "OLD",                              "ON",                       "ONLY",
      "OPEN",                            "OPERATOR",                "OPTION",                           "OPTIONS",                  "OR",
      "ORDER",                           "ORDERING",                "ORDINALITY",                       "OTHERS",                   "OUT",
      "OUTER",                           "OUTPUT",                  "OVER",                             "OVERLAPS",                 "OVERLAY",
      "OVERRIDING",                      "OWNED",                   "OWNER",                            "P",                        "PAD",
      "PARALLEL",                        "PARAMETER",               "PARAMETER_MODE",                   "PARAMETER_NAME",           "PARAMETER_ORDINAL_POSITION",
      "PARAMETER_SPECIFIC_CATALOG",      "PARAMETER_SPECIFIC_NAME", "PARAMETER_SPECIFIC_SCHEMA",        "PARSER",                   "PARTIAL",
      "PARTITION",                       "PASCAL",                  "PASSING",                          "PASSTHROUGH",              "PASSWORD",
      "PATH",                            "PERCENT",                 "PERCENTILE_CONT",                  "PERCENTILE_DISC",          "PERCENT_RANK",
      "PERIOD",                          "PERMISSION",              "PLACING",                          "PLANS",                    "PLI",
      "POLICY",                          "PORTION",                 "POSITION",                         "POSITION_REGEX",           "POWER",
      "PRECEDES",                        "PRECEDING",               "PRECISION",                        "PREPARE",                  "PREPARED",
      "PRESERVE",                        "PRIMARY",                 "PRIOR",                            "PRIVILEGES",               "PROCEDURAL",
      "PROCEDURE",                       "PROGRAM",                 "PUBLIC",                           "PUBLICATION",              "QUOTE",
      "RANGE",                           "RANK",                    "READ",                             "READS",                    "REAL",
      "REASSIGN",                        "RECHECK",                 "RECOVERY",                         "RECURSIVE",                "REF",
      "REFERENCES",                      "REFERENCING",             "REFRESH",                          "REGR_AVGX",                "REGR_AVGY",
      "REGR_COUNT",                      "REGR_INTERCEPT",          "REGR_R2",                          "REGR_SLOPE",               "REGR_SXX",
      "REGR_SXY",                        "REGR_SYY",                "REINDEX",                          "RELATIVE",                 "RELEASE",
      "RENAME",                          "REPEATABLE",              "REPLACE",                          "REPLICA",                  "REQUIRING",
      "RESET",                           "RESPECT",                 "RESTART",                          "RESTORE",                  "RESTRICT",
      "RESULT",                          "RETURN",                  "RETURNED_CARDINALITY",             "RETURNED_LENGTH",          "RETURNED_OCTET_LENGTH",
      "RETURNED_SQLSTATE",               "RETURNING",               "RETURNS",                          "REVOKE",                   "RIGHT",
      "ROLE",                            "ROLLBACK",                "ROLLUP",                           "ROUTINE",                  "ROUTINE_CATALOG",
      "ROUTINE_NAME",                    "ROUTINE_SCHEMA",          "ROW",                              "ROWS",                     "ROW_COUNT",
      "ROW_NUMBER",                      "RULE",                    "SAVEPOINT",                        "SCALE",                    "SCHEMA",
      "SCHEMAS",                         "SCHEMA_NAME",             "SCOPE",                            "SCOPE_CATALOG",            "SCOPE_NAME",
      "SCOPE_SCHEMA",                    "SCROLL",                  "SEARCH",                           "SECOND",                   "SECTION",
      "SECURITY",                        "SELECT",                  "SELECTIVE",                        "SELF",                     "SENSITIVE",
      "SEQUENCE",                        "SEQUENCES",               "SERIALIZABLE",                     "SERVER",                   "SERVER_NAME",
      "SESSION",                         "SESSION_USER",            "SET",                              "SETOF",                    "SETS",
      "SHARE",                           "SHOW",                    "SIMILAR",                          "SIMPLE",                   "SIZE",
      "SKIP",                            "SMALLINT",                "SNAPSHOT",                         "SOME",                     "SOURCE",
      "SPACE",                           "SPECIFIC",                "SPECIFICTYPE",                     "SPECIFIC_NAME",            "SQL",
      "SQLCODE",                         "SQLERROR",                "SQLEXCEPTION",                     "SQLSTATE",                 "SQLWARNING",
      "SQRT",                            "STABLE",                  "STANDALONE",                       "START",                    "STATE",
      "STATEMENT",                       "STATIC",                  "STATISTICS",                       "STDDEV_POP",               "STDDEV_SAMP",
      "STDIN",                           "STDOUT",                  "STORAGE",                          "STRICT",                   "STRIP",
      "STRUCTURE",                       "STYLE",                   "SUBCLASS_ORIGIN",                  "SUBMULTISET",              "SUBSCRIPTION",
      "SUBSTRING",                       "SUBSTRING_REGEX",         "SUCCEEDS",                         "SUM",                      "SYMMETRIC",
      "SYSID",                           "SYSTEM",                  "SYSTEM_TIME",                      "SYSTEM_USER",              "T",
      "TABLE",                           "TABLES",                  "TABLESAMPLE",                      "TABLESPACE",               "TABLE_NAME",
      "TEMP",                            "TEMPLATE",                "TEMPORARY",                        "TEXT",                     "THEN",
      "TIES",                            "TIME",                    "TIMESTAMP",                        "TIMEZONE_HOUR",            "TIMEZONE_MINUTE",
      "TO",                              "TOKEN",                   "TOP_LEVEL_COUNT",                  "TRAILING",                 "TRANSACTION",
      "TRANSACTIONS_COMMITTED",          "TRANSACTIONS_ROLLED_BACK","TRANSACTION_ACTIVE",               "TRANSFORM",                "TRANSFORMS",
      "TRANSLATE",                       "TRANSLATE_REGEX",         "TRANSLATION",                      "TREAT",                    "TRIGGER",
      "TRIGGER_CATALOG",                 "TRIGGER_NAME",            "TRIGGER_SCHEMA",                   "TRIM",                     "TRIM_ARRAY",
      "TRUE",                            "TRUNCATE",                "TRUSTED",                          "TYPE",                     "TYPES",
      "UESCAPE",                         "UNBOUNDED",               "UNCOMMITTED",                      "UNDER",                    "UNENCRYPTED",
      "UNION",                           "UNIQUE",                  "UNKNOWN",                          "UNLINK",                   "UNLISTEN",
      "UNLOGGED",                        "UNNAMED",                 "UNNEST",                           "UNTIL",                    "UNTYPED",
      "UPDATE",                          "UPPER",                   "URI",                              "USAGE",                    "USER",
      "USER_DEFINED_TYPE_CATALOG",       "USER_DEFINED_TYPE_CODE",  "USER_DEFINED_TYPE_NAME",           "USER_DEFINED_TYPE_SCHEMA", "USING",
      "VACUUM",                          "VALID",                   "VALIDATE",                         "VALIDATOR",                "VALUE",
      "VALUES",                          "VALUE_OF",                "VARBINARY",                        "VARCHAR",                  "VARIADIC",
      "VARYING",                         "VAR_POP",                 "VAR_SAMP",                         "VERBOSE",                  "VERSION",
      "VERSIONING",                      "VIEW",                    "VIEWS",                            "VOLATILE",                 "WHEN",
      "WHENEVER",                        "WHERE",                   "WHITESPACE",                       "WIDTH_BUCKET",             "WINDOW",
      "WITH",                            "WITHIN",                  "WITHOUT",                          "WORK",                     "WRAPPER",
      "WRITE",                           "XML",                     "XMLAGG",                           "XMLATTRIBUTES",            "XMLBINARY",
      "XMLCAST",                         "XMLCOMMENT",              "XMLCONCAT",                        "XMLDECLARATION",           "XMLDOCUMENT",
      "XMLELEMENT",                      "XMLEXISTS",               "XMLFOREST",                        "XMLITERATE",               "XMLNAMESPACES",
      "XMLPARSE",                        "XMLPI",                   "XMLQUERY",                         "XMLROOT",                  "XMLSCHEMA",
      "XMLSERIALIZE",                    "XMLTABLE",                "XMLTEXT",                          "XMLVALIDATE",              "YEAR",
      "YES",                             "ZONE"
    )

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy