{
    "SQL": {
        "reservedWords": [
            "add",
            "all",
            "alter",
            "and",
            "as",
            "asc",
            "between",
            "by",
            "cascade",
            "case",
            "check",
            "collate",
            "column",
            "constraint",
            "create",
            "database",
            "default",
            "delete",
            "desc",
            "distinct",
            "drop",
            "else",
            "end",
            "escape",
            "exists",
            "false",
            "for",
            "foreign",
            "from",
            "full",
            "grant",
            "group",
            "having",
            "inner",
            "index",
            "insert",
            "into",
            "is",
            "join",
            "key",
            "left",
            "like",
            "limit",
            "not",
            "null",
            "on",
            "or",
            "order",
            "outer",
            "references",
            "right",
            "select",
            "set",
            "some",
            "table",
            "then",
            "to",
            "true",
            "union",
            "unique",
            "update",
            "using",
            "values",
            "when",
            "where",
            "with"
        ],
        "dbTypes": {
            "boolean": "BOOLEAN",
            "integer": "INTEGER",
            "decimal": "DECIMAL(10,4)",
            "string": "VARCHAR({0})",
            "dateTime": "DATETIME",
            "timestamp": "TIMESTAMP",
            "date": "DATE",
            "time": "TIME",
            "text": "TEXT",
            "buffer": "BLOB"
        },
        "types": {
            "tinyint": "integer",
            "int": "integer",
            "integer": "integer",
            "bigint": "integer",
            "smallint": "integer",
            "decimal": "decimal",
            "numeric": "decimal",
            "number": "decimal",
            "real": "decimal",
            "float": "decimal",
            "double": "decimal",
            "double precision": "decimal",
            "character varying": "string",
            "char": "string",
            "varchar": "string",
            "uuid": "string",
            "text": "text",
            "timestamp": "timestamp",
            "datetime": "dateTime",
            "date": "date",
            "time": "time",
            "boolean": "boolean",
            "blob": "buffer"
        },
        "format": {
            "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
            "dateTime": "yyyy-MM-dd HH:mm:ss",
            "date": "yyyy-MM-dd",
            "time": "HH:mm:ss"
        },
        "support": {
            "sequences": true,
            "tablespaces": true,
            "partitions": true,
            "pkTablespaces": true,
            "ukTablespaces": true,
            "composite": false
        },
        "ddl": {
            "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
            "createEntity": "CREATE TABLE {name} ({define})",
            "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
            "incrementalColumDefine": "{name} {type} {required} AUTO_INCREMENT",
            "columnDefine": "{name} {type} {required} ",
            "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
            "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
            "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
            "createIndex": "CREATE INDEX {name} ON {table} ({columns})",
            "alterTable": "ALTER TABLE {name}",
            "addProperty": "ADD {columnDefine}",
            "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
            "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
            "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
            "alterProperty": "MODIFY {columnDefine}",
            "alterPropertyType": "({name} {type})",
            "alterPropertyNullable": "({name} NULL)",
            "alterPropertyNotNullable": "({name} NOT NULL)",
            "dropDatabase": "DROP DATABASE IF EXISTS {name}",
            "dropEntity": "DROP TABLE IF EXISTS {name}",
            "dropSequence": "DROP SEQUENCE {name}",
            "dropProperty": "DROP COLUMN {name}",
            "dropPk": "DROP PRIMARY KEY {name}",
            "dropUk": "DROP UNIQUE {name}",
            "dropFk": "DROP FOREIGN KEY {name}",
            "dropIndex": "DROP INDEX {name} ON {table}",
            "truncateEntity": "TRUNCATE TABLE {name}"
        },
        "dml": {
            "map": "SELECT {0}",
            "select": "SELECT {0}",
            "distinct": "SELECT DISTINCT {0}",
            "filter": "WHERE {0}",
            "where": "WHERE {0}",
            "groupBy": "GROUP BY {0}",
            "having": "HAVING {0}",
            "sort": "ORDER BY {0}",
            "order": "ORDER BY {0}",
            "page": "{sentence} LIMIT {offset},{records}",
            "insert": "INSERT INTO {name}({fields}) VALUES({values})",
            "insertConditional": "INSERT INTO {name}({fields}) SELECT {values} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})",
            "update": "UPDATE {name} {alias} SET {assigns}",
            "upsert": "INSERT INTO {name}({fields}) VALUES({values}) ON DUPLICATE KEY UPDATE {assigns}",
            "remove": "DELETE FROM {name} {alias}",
            "delete": "DELETE FROM {name} {alias}",
            "removeAll": "DELETE FROM {name}",
            "deleteAll": "DELETE FROM {name}",
            "bulkInsert": "INSERT INTO {name}({fields}) VALUES {values}",
            "from": "FROM {name} {alias}",
            "join": "INNER JOIN {name} {alias} ON {relation}",
            "bulkMerge": "INSERT INTO {name} ({fields})\nVALUES {values}\nON DUPLICATE KEY UPDATE {assigns}\n",
            "callStoredProcedure": "call {name}({parameters})"
        },
        "others": {
            "delimiter": "\"{name}\"",
            "string": "'{name}'",
            "separatorSql": ";",
            "notNullable": "NOT NULL",
            "variable": ":{name}",
            "field": "{entityAlias}.{name}",
            "column": "{name}",
            "false": "FALSE",
            "true": "TRUE",
            "null": "NULL",
            "sequenceNextVal": "{name}.nextval",
            "sequenceName": "SQ_{name}"
        },
        "operators": {
            "unary": {
                "-": "- {0}",
                "~": "~ {0}",
                "!": "NOT {0}"
            },
            "binary": {
                "+": "({0} + {1})",
                "-": "({0} - {1})",
                "*": "({0} * {1})",
                "/": "({0} / {1})",
                "**": "POWER({0},{1})",
                "//": "POWER({0},(1/{1}))",
                "%": "MOD({0},{1})",
                "&": "{0} & {1}",
                "|": "{0} | {1}",
                "^": "{0} ^ {1}",
                "<<": "{0} << {1}",
                ">>": "{0} >> {1}",
                "==": "{0} = {1}",
                "===": "{0} = {1}",
                "!=": "{0} <> {1}",
                "!==": "{0} <> {1}",
                ">": "{0} > {1}",
                "<": "{0} < {1}",
                ">=": "{0} >= {1}",
                "<=": "{0} <= {1}",
                "&&": "({0} AND {1})",
                "||": "({0} OR {1})",
                "[]": "N/A",
                "=": "{0} = {1}",
                "+=": "{0} = ({0} + {1})",
                "-=": "{0} = ({0} - {1})",
                "*=": "{0} = ({0} * {1})",
                "/=": "{0} = ({0} / {1})",
                "**=": "{0} = POWER({0},{1})",
                "//=": "{0} = POWER({0},(1/{1}))",
                "%=": "{0} = MOD({0},{1})",
                "&=": "{0} = {0} & {1} ",
                "|=": "{0} = {0} | {1}",
                "^=": "{0} = {0} ^ {1}",
                "<<=": "{0} = {0} << {1}",
                ">>=": "{0} = {0} >> {1}"
            },
            "ternary": {
                "?": "IF {0} THEN {1} ELSE {2} END"
            }
        },
        "functions": {
            "general": {
                "as": "{value} AS {alias}",
                "desc": "{0} desc",
                "asc": "{0} asc",
                "between": "{0} BETWEEN {1} AND {2}",
                "includes": " {1} IN ({0})",
                "contains": " {1} IN ({0})",
                "in": " {0} IN ({1})",
                "distinct": "DISTINCT {0} "
            },
            "numeric": {
                "abs": "ABS({0})",
                "acos": "ACOS({0})",
                "asin": "ASIN({0})",
                "atan": "ATAN({0})",
                "atan2": "ATAN2({0},{1})",
                "ceil": "CEIL({0})",
                "cos": "COS({0})",
                "cosh": "COSH({0})",
                "exp": "EXP({0})",
                "floor": "FLOOR({0})",
                "ln": "LN({0})",
                "log10": "LOG10({0})",
                "log": "LOG({0},{1})",
                "remainder": "REMAINDER({0},{1})",
                "round": "ROUND({0},{1})",
                "sign": "SIGN({0})",
                "sin": "SIN({0})",
                "sinh": "SINH({0})",
                "tan": "TAN({0})",
                "tanh": "TANH({0})",
                "trunc": "TRUNC({0},{1})",
                "toNumber": "CAST({0} AS NUMBER)"
            },
            "string": {
                "chr": "CHR({0})",
                "initcap": "INITCAP({0})",
                "lower": "LOWER({0})",
                "lpad": "LPAD({0},{1},{2})",
                "ltrim": "LTRIM({0})",
                "regExpReplace": "REGEXP_REPLACE({0},{1})",
                "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                "replace": "REPLACE({0},{1},{2})",
                "rpad": "RPAD({0},{1},{2})",
                "rtrim": "RTRIM({0})",
                "substr": "SUBSTR({0},{1},{2})",
                "substring": "SUBSTR({0},{1},{2})",
                "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                "trim": "TRIM({0})",
                "upper": "UPPER({0})",
                "length": "LENGTH({0})",
                "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                "parse": "json_value({0})",
                "toString": "CAST({0} AS VARCHAR2)",
                "like": "{0} LIKE {1}",
                "startsWith": "{0} LIKE '{1}%'",
                "startWith": "{0} LIKE '{1}%'",
                "includes": "{0} LIKE '%{1}%'"
            },
            "dateTime": {
                "now": "SYSTIMESTAMP",
                "curTime": "CAST(SYSTIMESTAMP AS TIME)",
                "today": "TRUNC(SYSDATE)",
                "dateTime": "CAST({0} AS TIMESTAMP)",
                "date": "CAST({0} AS DATE)",
                "time": "CAST({0} AS TIME)",
                "year": "EXTRACT(YEAR FROM {0})",
                "month": "EXTRACT(MONTH FROM {0})",
                "day": "DAY(DAY FROM {0})",
                "weekday": "TO_NUMBER(TO_CHAR({0}, 'D'))",
                "hour": "EXTRACT(HOUR FROM {0})",
                "minute": "EXTRACT(MINUTE FROM {0})",
                "second": "EXTRACT(SECOND FROM {0})",
                "millisecond": "EXTRACT(MILLISECOND FROM {0})",
                "addYear": "{0} + interval '{1}' YEAR",
                "addMonth": "ADD_MONTHS({0},{1})",
                "addDay": "{0} + {1}",
                "addHour": "{0} + interval '{1}' HOUR",
                "addMinute": "{0} + interval '{1}' MINUTE",
                "addSecond": "{0} + interval '{1}' SECOND",
                "addMillisecond": "{0} + interval '{1}' MILLISECOND",
                "addTime": "ADDTIME({0},{1})",
                "subtractTime": "SUBTIME({0},{1})",
                "dayDiff": "DATEDIFF({0},{1})",
                "hourDiff": "TIMESTAMPDIFF(HOUR,({0},{1})",
                "secondDiff": "TIMESTAMPDIFF(SECOND,({0},{1})",
                "millisecondDiff": "TIMESTAMPDIFF(MICROSECOND,({0},{1})",
                "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600*1000), '%Y-%m-%dT%TZ')",
                "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600*1000), '%Y-%m-%dT%TZ')",
                "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*1000), '%Y-%m-%dT%TZ')",
                "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                "dateToString": "TO_CHAR({0},'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')"
            },
            "metadata": {
                "user": "USER",
                "source": "SYS_CONTEXT('USERENV','DB_NAME')"
            },
            "null": {
                "nvl": "NVL({0},{1})",
                "nvl2": "NVL2({0},{1},{2})",
                "isNull": "({0} IS NULL)",
                "isNotNull": "({0} IS NOT NULL)"
            },
            "multiple": {
                "concat": "{accumulated} || {value}"
            },
            "group": {
                "avg": "AVG({0})",
                "count": "COUNT({0})",
                "first": "FIRST({0})",
                "last": "LAST({0})",
                "max": "MAX({0})",
                "min": "MIN({0})",
                "sum": "SUM({0})"
            }
        }
    },
    "dialects": {
        "MariaDB": {
            "reservedWords": [
                "long",
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "dbTypes": {
                "buffer": "LONGBLOB",
                "decimal": "DECIMAL(10,4)",
                "boolean": "BOOLEAN",
                "integer": "INTEGER",
                "string": "VARCHAR({0})",
                "dateTime": "DATETIME",
                "timestamp": "TIMESTAMP",
                "date": "DATE",
                "time": "TIME",
                "text": "TEXT"
            },
            "types": {
                "mediumtext": "text",
                "longblob": "buffer",
                "tinyint": "integer",
                "int": "integer",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "date": "date",
                "time": "time",
                "boolean": "boolean",
                "blob": "buffer"
            },
            "support": {
                "sequences": false,
                "tablespaces": false,
                "partitions": false,
                "pkTablespaces": false,
                "ukTablespaces": false,
                "composite": false
            },
            "ddl": {
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createEntity": "CREATE TABLE IF NOT EXISTS {name} ({define})",
                "createIndex": "CREATE INDEX IF NOT EXISTS {name} ON {table} ({columns})",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropEntity": "DROP TABLE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE IF EXISTS {name}",
                "dropIndex": "DROP INDEX IF EXISTS {name} ON {table}",
                "objects": "SELECT CASE\n    WHEN t.table_type = 'BASE TABLE' THEN 'table'\n    WHEN t.table_type = 'VIEW' THEN 'view'\n    ELSE 'unknown'\n  END AS type,\n  t.table_name AS name,\n  null AS tablespace\nFROM information_schema.tables t\nWHERE t.table_schema = DATABASE()\n  AND t.table_type IN ('BASE TABLE', 'VIEW')\n",
                "tables": "SELECT\n  t.table_name AS tableName,\n  null AS tablespace,\n  c.column_name AS columnName,\n  c.data_type AS dbType,\n  c.is_nullable = 'NO' AS required,\n  c.extra = 'auto_increment' AS autoIncrement,\n  c.character_maximum_length AS length,\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS scale,\n  c.datetime_precision AS time\nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nWHERE t.table_schema = DATABASE()\n  AND t.table_type = 'BASE TABLE'\n  AND t.table_name IN ({names})\n",
                "views": "SELECT\n  t.table_name AS tableName,\n  null AS tablespace,\n  c.column_name AS columnName,\n  c.data_type AS dbType,\n  c.is_nullable = 'NO' AS required,\n  c.extra = 'auto_increment' AS autoIncrement,\n  c.character_maximum_length AS length,\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS scale,\n  c.datetime_precision AS time\nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nWHERE t.table_schema = DATABASE()\n  AND t.table_type = 'VIEW'\n  AND t.table_name IN ({names})\n",
                "primaryKeys": "SELECT DISTINCT\n  tc.table_name AS tableName,\n  kcu.column_name AS columnName,\n  tc.constraint_name AS constraintName\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'PRIMARY KEY'\n  AND tc.table_schema = DATABASE()\n  AND tc.table_name IN ({tableNames})\n",
                "uniqueKeys": "SELECT DISTINCT\n  tc.table_name AS tableName,\n  kcu.column_name AS columnName,\n  tc.constraint_name AS constraintName\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'UNIQUE'\n  AND tc.table_schema = DATABASE()\n  AND tc.table_name IN ({tableNames})\n",
                "foreignKeys": "SELECT DISTINCT \n  TABLE_NAME AS tableName,\n  COLUMN_NAME AS columnName,\n  CONSTRAINT_NAME AS constraintName,\n  REFERENCED_TABLE_NAME AS refTableName,\n  REFERENCED_COLUMN_NAME AS refColumnName\nFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\nWHERE \n    CONSTRAINT_SCHEMA = DATABASE() \n    AND REFERENCED_TABLE_NAME IS NOT NULL\n    AND TABLE_NAME IN ({tableNames})\n",
                "indexes": "SELECT DISTINCT\n  t.table_name AS tableName,\n  i.index_name AS indexName,\n  a.column_name AS columnName,\n  NOT i.non_unique AS isUnique,\n  CASE\n    WHEN i.index_name = 'PRIMARY' THEN TRUE\n    ELSE FALSE\n  END AS isPrimary\nFROM information_schema.tables t\nJOIN information_schema.statistics i ON t.table_schema = i.table_schema AND t.table_name = i.table_name\nJOIN information_schema.columns a ON t.table_schema = a.table_schema AND t.table_name = a.table_name\nWHERE t.table_type = 'BASE TABLE'\n  AND t.table_name IN ({tableNames})\n  AND FIND_IN_SET(a.ordinal_position, i.column_name) > 0\n  AND i.non_unique = 1\n  AND i.index_name != 'PRIMARY'\n",
                "sequences": null,
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "incrementalColumDefine": "{name} {type} {required} AUTO_INCREMENT",
                "columnDefine": "{name} {type} {required} ",
                "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterProperty": "MODIFY {columnDefine}",
                "alterPropertyType": "({name} {type})",
                "alterPropertyNullable": "({name} NULL)",
                "alterPropertyNotNullable": "({name} NOT NULL)",
                "dropProperty": "DROP COLUMN {name}",
                "dropPk": "DROP PRIMARY KEY {name}",
                "dropUk": "DROP UNIQUE {name}",
                "dropFk": "DROP FOREIGN KEY {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "dml": {
                "delete": "DELETE {alias} FROM {name} AS {alias}",
                "bulkInsert": "INSERT INTO {name}({fields}) VALUES ?",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "page": "{sentence} LIMIT {offset},{records}",
                "insert": "INSERT INTO {name}({fields}) VALUES({values})",
                "insertConditional": "INSERT INTO {name}({fields}) SELECT {values} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})",
                "update": "UPDATE {name} {alias} SET {assigns}",
                "upsert": "INSERT INTO {name}({fields}) VALUES({values}) ON DUPLICATE KEY UPDATE {assigns}",
                "remove": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}",
                "bulkMerge": "INSERT INTO {name} ({fields})\nVALUES {values}\nON DUPLICATE KEY UPDATE {assigns}\n",
                "callStoredProcedure": "call {name}({parameters})"
            },
            "others": {
                "delimiter": "`{name}`",
                "variable": "?",
                "string": "'{name}'",
                "separatorSql": ";",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "false": "FALSE",
                "true": "TRUE",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "functions": {
                "numeric": {
                    "atan2": "ATAN({0},{1})",
                    "cosh": "((EXP({0}) + EXP(-{0})) / 2)",
                    "remainder": "({0} - {1}*ROUND({0}/{1}))",
                    "sinh": "((EXP({0}) - EXP(-{0})) / 2)",
                    "tanh": "(EXP(2*{0}) - 1)/(EXP(2*{0}) + 1)",
                    "trunc": "TRUNCATE({0},{1})",
                    "toNumber": "CONVERT({0}, DECIMAL)",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "ceil": "CEIL({0})",
                    "cos": "COS({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "ln": "LN({0})",
                    "log10": "LOG10({0})",
                    "log": "LOG({0},{1})",
                    "round": "ROUND({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "tan": "TAN({0})"
                },
                "string": {
                    "chr": "CHAR({0} USING ASCII)",
                    "initcap": "INITCAP({0})",
                    "length": "CHAR_LENGTH({0})",
                    "toString": "CONVERT({0}, CHAR)",
                    "parse": "CONVERT({0}, JSON)",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "dateTime": {
                    "curTime": "CURTIME()",
                    "today": "CURDATE()",
                    "now": "NOW()",
                    "date": "CONVERT({0}, DATE)",
                    "dateTime": "CONVERT({0}, DATETIME)",
                    "time": "CONVERT({0}, TIME)",
                    "year": "EXTRACT(YEAR FROM {0})",
                    "month": "EXTRACT(MONTH FROM {0})",
                    "day": "DAYOFMONTH({0})",
                    "weekday": "DAYOFWEEK({0})",
                    "hours": "EXTRACT(HOUR FROM {0})",
                    "minutes": "EXTRACT(MINUTE FROM {0})",
                    "seconds": "EXTRACT(SECOND FROM {0})",
                    "millisecond": "ROUND(EXTRACT(MICROSECOND FROM {0})/1000,0)",
                    "addYear": "DATE_ADD({0}, INTERVAL {1} YEAR)",
                    "addMonth": "DATE_ADD({0}, INTERVAL {1} MONTH)",
                    "addDay": "DATE_ADD({0}, INTERVAL {1} DAY)",
                    "addHours": "DATE_ADD({0}, INTERVAL {1} HOUR)",
                    "addMinutes": "DATE_ADD({0}, INTERVAL {1} MINUTE)",
                    "addSeconds": "DATE_ADD({0}, INTERVAL {1} SECOND)",
                    "addMillisecond": "DATE_ADD({0}, INTERVAL ({1} * 1000) MICROSECOND)",
                    "addTime": "ADDTIME({0},{1})",
                    "subtractTime": "SUBTIME({0},{1})",
                    "dayDiff": "DATEDIFF({0},{1})",
                    "hourDiff": "TIMESTAMPDIFF(HOUR, {1},{0})",
                    "secondDiff": "TIMESTAMPDIFF(SECOND, {1},{0})",
                    "millisecondDiff": "ROUND(TIMESTAMPDIFF(MICROSECOND, {1},{0})/1000,0)",
                    "dateDiff": "DATEDIFF({0},{1})",
                    "timeDiff": "TIMEDIFF({0},{1})",
                    "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600), '%Y-%m-%dT%TZ')",
                    "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600), '%Y-%m-%dT%TZ')",
                    "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                    "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}/1000), '%Y-%m-%dT%TZ')",
                    "dateToString": "DATE_FORMAT({0}, '%Y-%m-%dT%TZ')",
                    "hour": "EXTRACT(HOUR FROM {0})",
                    "minute": "EXTRACT(MINUTE FROM {0})",
                    "second": "EXTRACT(SECOND FROM {0})",
                    "addHour": "{0} + interval '{1}' HOUR",
                    "addMinute": "{0} + interval '{1}' MINUTE",
                    "addSecond": "{0} + interval '{1}' SECOND"
                },
                "metadata": {
                    "user": "CURRENT_USER()",
                    "database": "DATABASE()",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "null": {
                    "nvl": "IFNULL({0},{1})",
                    "nvl2": "(CASE WHEN {0} IS NOT NULL THEN {1} ELSE {2} END)",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "multiple": {
                    "concat": "CONCAT({accumulated},{value})"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "format": {
                "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "date": "yyyy-MM-dd",
                "time": "HH:mm:ss"
            },
            "operators": {
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "binary": {
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "&": "{0} & {1}",
                    "|": "{0} | {1}",
                    "^": "{0} ^ {1}",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "&=": "{0} = {0} & {1} ",
                    "|=": "{0} = {0} | {1}",
                    "^=": "{0} = {0} ^ {1}",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            }
        },
        "MySQL": {
            "reservedWords": [
                "long",
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "dbTypes": {
                "buffer": "LONGBLOB",
                "decimal": "DECIMAL(10,4)",
                "boolean": "BOOLEAN",
                "integer": "INTEGER",
                "string": "VARCHAR({0})",
                "dateTime": "DATETIME",
                "timestamp": "TIMESTAMP",
                "date": "DATE",
                "time": "TIME",
                "text": "TEXT"
            },
            "types": {
                "mediumtext": "text",
                "longblob": "buffer",
                "tinyint": "integer",
                "int": "integer",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "date": "date",
                "time": "time",
                "boolean": "boolean",
                "blob": "buffer"
            },
            "support": {
                "sequences": false,
                "tablespaces": false,
                "partitions": false,
                "pkTablespaces": false,
                "ukTablespaces": false,
                "composite": false
            },
            "ddl": {
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createEntity": "CREATE TABLE IF NOT EXISTS {name} ({define})",
                "createIndex": "CREATE INDEX IF NOT EXISTS {name} ON {table} ({columns})",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropEntity": "DROP TABLE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE IF EXISTS {name}",
                "dropIndex": "DROP INDEX IF EXISTS {name} ON {table}",
                "objects": "SELECT CASE\n    WHEN t.table_type = 'BASE TABLE' THEN 'table'\n    WHEN t.table_type = 'VIEW' THEN 'view'\n    ELSE 'unknown'\n  END AS type,\n  t.table_name AS name,\n  null AS tablespace\nFROM information_schema.tables t\nWHERE t.table_schema = DATABASE()\n  AND t.table_type IN ('BASE TABLE', 'VIEW')\n",
                "tables": "SELECT\n  t.table_name AS tableName,\n  null AS tablespace,\n  c.column_name AS columnName,\n  c.data_type AS dbType,\n  c.is_nullable = 'NO' AS required,\n  c.extra = 'auto_increment' AS autoIncrement,\n  c.character_maximum_length AS length,\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS scale,\n  c.datetime_precision AS time\nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nWHERE t.table_schema = DATABASE()\n  AND t.table_type = 'BASE TABLE'\n  AND t.table_name IN ({names})\n",
                "views": "SELECT\n  t.table_name AS tableName,\n  null AS tablespace,\n  c.column_name AS columnName,\n  c.data_type AS dbType,\n  c.is_nullable = 'NO' AS required,\n  c.extra = 'auto_increment' AS autoIncrement,\n  c.character_maximum_length AS length,\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS scale,\n  c.datetime_precision AS time\nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nWHERE t.table_schema = DATABASE()\n  AND t.table_type = 'VIEW'\n  AND t.table_name IN ({names})\n",
                "primaryKeys": "SELECT DISTINCT\n  tc.table_name AS tableName,\n  kcu.column_name AS columnName,\n  tc.constraint_name AS constraintName\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'PRIMARY KEY'\n  AND tc.table_schema = DATABASE()\n  AND tc.table_name IN ({tableNames})\n",
                "uniqueKeys": "SELECT DISTINCT\n  tc.table_name AS tableName,\n  kcu.column_name AS columnName,\n  tc.constraint_name AS constraintName\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'UNIQUE'\n  AND tc.table_schema = DATABASE()\n  AND tc.table_name IN ({tableNames})\n",
                "foreignKeys": "SELECT DISTINCT \n  TABLE_NAME AS tableName,\n  COLUMN_NAME AS columnName,\n  CONSTRAINT_NAME AS constraintName,\n  REFERENCED_TABLE_NAME AS refTableName,\n  REFERENCED_COLUMN_NAME AS refColumnName\nFROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE\nWHERE \n    CONSTRAINT_SCHEMA = DATABASE() \n    AND REFERENCED_TABLE_NAME IS NOT NULL\n    AND TABLE_NAME IN ({tableNames})\n",
                "indexes": "SELECT DISTINCT\n  t.table_name AS tableName,\n  i.index_name AS indexName,\n  a.column_name AS columnName,\n  NOT i.non_unique AS isUnique,\n  CASE\n    WHEN i.index_name = 'PRIMARY' THEN TRUE\n    ELSE FALSE\n  END AS isPrimary\nFROM information_schema.tables t\nJOIN information_schema.statistics i ON t.table_schema = i.table_schema AND t.table_name = i.table_name\nJOIN information_schema.columns a ON t.table_schema = a.table_schema AND t.table_name = a.table_name\nWHERE t.table_type = 'BASE TABLE'\n  AND t.table_name IN ({tableNames})\n  AND FIND_IN_SET(a.ordinal_position, i.column_name) > 0\n  AND i.non_unique = 1\n  AND i.index_name != 'PRIMARY'\n",
                "sequences": null,
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "incrementalColumDefine": "{name} {type} {required} AUTO_INCREMENT",
                "columnDefine": "{name} {type} {required} ",
                "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterProperty": "MODIFY {columnDefine}",
                "alterPropertyType": "({name} {type})",
                "alterPropertyNullable": "({name} NULL)",
                "alterPropertyNotNullable": "({name} NOT NULL)",
                "dropProperty": "DROP COLUMN {name}",
                "dropPk": "DROP PRIMARY KEY {name}",
                "dropUk": "DROP UNIQUE {name}",
                "dropFk": "DROP FOREIGN KEY {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "dml": {
                "delete": "DELETE {alias} FROM {name} AS {alias}",
                "bulkInsert": "INSERT INTO {name}({fields}) VALUES ?",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "page": "{sentence} LIMIT {offset},{records}",
                "insert": "INSERT INTO {name}({fields}) VALUES({values})",
                "insertConditional": "INSERT INTO {name}({fields}) SELECT {values} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})",
                "update": "UPDATE {name} {alias} SET {assigns}",
                "upsert": "INSERT INTO {name}({fields}) VALUES({values}) ON DUPLICATE KEY UPDATE {assigns}",
                "remove": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}",
                "bulkMerge": "INSERT INTO {name} ({fields})\nVALUES {values}\nON DUPLICATE KEY UPDATE {assigns}\n",
                "callStoredProcedure": "call {name}({parameters})"
            },
            "others": {
                "delimiter": "`{name}`",
                "variable": "?",
                "string": "'{name}'",
                "separatorSql": ";",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "false": "FALSE",
                "true": "TRUE",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "functions": {
                "numeric": {
                    "atan2": "ATAN({0},{1})",
                    "cosh": "((EXP({0}) + EXP(-{0})) / 2)",
                    "remainder": "({0} - {1}*ROUND({0}/{1}))",
                    "sinh": "((EXP({0}) - EXP(-{0})) / 2)",
                    "tanh": "(EXP(2*{0}) - 1)/(EXP(2*{0}) + 1)",
                    "trunc": "TRUNCATE({0},{1})",
                    "toNumber": "CONVERT({0}, DECIMAL)",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "ceil": "CEIL({0})",
                    "cos": "COS({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "ln": "LN({0})",
                    "log10": "LOG10({0})",
                    "log": "LOG({0},{1})",
                    "round": "ROUND({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "tan": "TAN({0})"
                },
                "string": {
                    "chr": "CHAR({0} USING ASCII)",
                    "initcap": "INITCAP({0})",
                    "length": "CHAR_LENGTH({0})",
                    "toString": "CONVERT({0}, CHAR)",
                    "parse": "CONVERT({0}, JSON)",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "dateTime": {
                    "curTime": "CURTIME()",
                    "today": "CURDATE()",
                    "now": "NOW()",
                    "date": "CONVERT({0}, DATE)",
                    "dateTime": "CONVERT({0}, DATETIME)",
                    "time": "CONVERT({0}, TIME)",
                    "year": "EXTRACT(YEAR FROM {0})",
                    "month": "EXTRACT(MONTH FROM {0})",
                    "day": "DAYOFMONTH({0})",
                    "weekday": "DAYOFWEEK({0})",
                    "hours": "EXTRACT(HOUR FROM {0})",
                    "minutes": "EXTRACT(MINUTE FROM {0})",
                    "seconds": "EXTRACT(SECOND FROM {0})",
                    "millisecond": "ROUND(EXTRACT(MICROSECOND FROM {0})/1000,0)",
                    "addYear": "DATE_ADD({0}, INTERVAL {1} YEAR)",
                    "addMonth": "DATE_ADD({0}, INTERVAL {1} MONTH)",
                    "addDay": "DATE_ADD({0}, INTERVAL {1} DAY)",
                    "addHours": "DATE_ADD({0}, INTERVAL {1} HOUR)",
                    "addMinutes": "DATE_ADD({0}, INTERVAL {1} MINUTE)",
                    "addSeconds": "DATE_ADD({0}, INTERVAL {1} SECOND)",
                    "addMillisecond": "DATE_ADD({0}, INTERVAL ({1} * 1000) MICROSECOND)",
                    "addTime": "ADDTIME({0},{1})",
                    "subtractTime": "SUBTIME({0},{1})",
                    "dayDiff": "DATEDIFF({0},{1})",
                    "hourDiff": "TIMESTAMPDIFF(HOUR, {1},{0})",
                    "secondDiff": "TIMESTAMPDIFF(SECOND, {1},{0})",
                    "millisecondDiff": "ROUND(TIMESTAMPDIFF(MICROSECOND, {1},{0})/1000,0)",
                    "dateDiff": "DATEDIFF({0},{1})",
                    "timeDiff": "TIMEDIFF({0},{1})",
                    "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600), '%Y-%m-%dT%TZ')",
                    "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600), '%Y-%m-%dT%TZ')",
                    "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                    "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}/1000), '%Y-%m-%dT%TZ')",
                    "dateToString": "DATE_FORMAT({0}, '%Y-%m-%dT%TZ')",
                    "hour": "EXTRACT(HOUR FROM {0})",
                    "minute": "EXTRACT(MINUTE FROM {0})",
                    "second": "EXTRACT(SECOND FROM {0})",
                    "addHour": "{0} + interval '{1}' HOUR",
                    "addMinute": "{0} + interval '{1}' MINUTE",
                    "addSecond": "{0} + interval '{1}' SECOND"
                },
                "metadata": {
                    "user": "CURRENT_USER()",
                    "database": "DATABASE()",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "null": {
                    "nvl": "IFNULL({0},{1})",
                    "nvl2": "(CASE WHEN {0} IS NOT NULL THEN {1} ELSE {2} END)",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "multiple": {
                    "concat": "CONCAT({accumulated},{value})"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "format": {
                "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "date": "yyyy-MM-dd",
                "time": "HH:mm:ss"
            },
            "operators": {
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "binary": {
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "&": "{0} & {1}",
                    "|": "{0} | {1}",
                    "^": "{0} ^ {1}",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "&=": "{0} = {0} & {1} ",
                    "|=": "{0} = {0} | {1}",
                    "^=": "{0} = {0} ^ {1}",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            }
        },
        "Oracle": {
            "dbTypes": {
                "boolean": "CHAR(1)",
                "integer": "NUMBER(10)",
                "decimal": "NUMBER(19,4)",
                "string": "VARCHAR2({0})",
                "timestamp": "TIMESTAMP",
                "dateTime": "DATE",
                "date": "DATE",
                "time": "DATE",
                "text": "TEXT",
                "buffer": "BLOB"
            },
            "types": {
                "varchar2": "string",
                "nvarchar2": "string",
                "clob": "string",
                "nclob": "string",
                "date": "dateTime",
                "timestamp_with_time_zone": "timestamp",
                "interval_year_to_month": "string",
                "interval_day_to_second": "string",
                "binary_float": "decimal",
                "binary_double": "integer",
                "blob": "buffer",
                "raw": "buffer",
                "tinyint": "integer",
                "int": "integer",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "time": "time",
                "boolean": "boolean"
            },
            "others": {
                "false": "'N'",
                "true": "'Y'",
                "variable": ":{name}",
                "delimiter": "\"{name}\"",
                "string": "'{name}'",
                "separatorSql": ";",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "format": {
                "timestamp": "yyyy-MM-dd'T'HH:mm:ss.SSS",
                "date": "yyyy-MM-dd 00:00:00",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "time": "HH:mm:ss"
            },
            "ddl": {
                "createEntity": "CREATE TABLE {name} ({define})",
                "incrementalColumDefine": "{name} {type} {required}",
                "dropEntity": "DROP TABLE {name}",
                "dropPk": "DROP CONSTRAINT {name}",
                "dropUk": "DROP CONSTRAINT {name}",
                "dropFk": "DROP CONSTRAINT {name}",
                "dropIndex": "DROP INDEX {name} ON {table}",
                "objects": "SELECT 'table' as \"type\",\n  t.table_name AS \"name\",\n  NVL(t.tablespace_name, 'USERS')AS \"tablespace\"\nFROM user_tables t\nUNION ALL\nSELECT 'view' as \"type\",\n  t.view_name AS \"name\",\n  null AS \"tablespace\"\nFROM user_views t\n",
                "tables": "SELECT \n  t.table_name AS \"tableName\",\n  NVL(t.tablespace_name, 'USERS') AS \"tablespace\",\n  c.column_name AS \"columnName\",\n  c.data_type AS \"dbType\",\n  CASE WHEN c.nullable = 'N' THEN 'NO' ELSE 'YES' END AS \"required\",\n  NULL AS  \"autoIncrement\",\n  c.char_col_decl_length AS \"length\",\n  c.data_precision AS \"precision\",\n  c.data_scale AS \"scale\",\n  c.data_length AS \"time\"\nFROM user_tables t\nJOIN user_tab_columns c ON t.table_name = c.table_name\n    WHERE t.table_name IN ({names})\n",
                "views": "SELECT \n    t.view_name AS \"tableName\",\n    null AS \"tablespace\",\n    c.column_name AS \"columnName\",\n    c.data_type AS \"dbType\",\n    CASE WHEN c.nullable = 'N' THEN 'NO' ELSE 'YES' END AS \"required\",\n    NULL AS \"autoIncrement\", \n    c.data_length AS \"length\",\n    c.data_precision AS \"precision\",\n    c.data_scale AS \"scale\",\n    NULL AS \"time\" -- Oracle no tiene el concepto de \"datetime_precision\" para columnas en vistas\nFROM user_views t\nJOIN user_tab_columns c ON t.view_name = c.table_name\nWHERE t.table_name IN ({names})        \n",
                "primaryKeys": "SELECT\n    tc.table_name AS \"tableName\",\n    kcu.column_name AS \"columnName\",\n    tc.constraint_name AS \"constraintName\"\nFROM user_constraints tc\nJOIN user_cons_columns kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'P'\n  AND tc.table_name IN ({tableNames})\n",
                "uniqueKeys": "SELECT\n    tc.table_name AS \"tableName\",\n    kcu.column_name AS \"columnName\",\n    tc.constraint_name AS \"constraintName\"\nFROM user_constraints tc\nJOIN user_cons_columns kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'U'\n  AND tc.table_name IN ({tableNames})\n",
                "foreignKeys": "SELECT\n    tc.table_name AS \"tableName\",\n    kcu.column_name AS \"columnName\",\n    ccu.table_name AS \"refTableName\",\n    ccu.column_name AS \"refColumnName\",\n    tc.constraint_name AS \"constraintName\"\nFROM user_constraints tc\nJOIN user_cons_columns kcu ON tc.constraint_name = kcu.constraint_name\nJOIN user_cons_columns ccu ON tc.r_constraint_name = ccu.constraint_name\nWHERE tc.constraint_type = 'R'\n  AND tc.table_name IN ({tableNames})\n",
                "indexes": "SELECT\n    t.table_name AS \"tableName\",\n    i.index_name AS \"indexName\",\n    a.column_name AS \"columnName\",\n    CASE WHEN i.uniqueness = 'UNIQUE' THEN 'true' ELSE 'false' END AS \"isUnique\",\n    CASE WHEN i.index_type = 'NORMAL' THEN 'false' ELSE 'true' END AS \"isPrimary\"\nFROM user_indexes i\nJOIN user_ind_columns a ON i.index_name = a.index_name\nJOIN user_tables t ON t.table_name = a.table_name\nWHERE t.table_name IN ({tableNames})\n  AND i.uniqueness != 'UNIQUE'\n  AND i.index_type != 'NORMAL'\n",
                "sequences": "SELECT\n    sequence_name AS \"sequenceName\",\n    min_value AS \"startValue\",\n    increment_by AS \"increment\"\nFROM user_sequences\n",
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "columnDefine": "{name} {type} {required} ",
                "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "createIndex": "CREATE INDEX {name} ON {table} ({columns})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterProperty": "MODIFY {columnDefine}",
                "alterPropertyType": "({name} {type})",
                "alterPropertyNullable": "({name} NULL)",
                "alterPropertyNotNullable": "({name} NOT NULL)",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE {name}",
                "dropProperty": "DROP COLUMN {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "dml": {
                "page": "{sentence} OFFSET {offset} ROWS FETCH NEXT {records} ROWS ONLY",
                "bulkInsert": "INSERT INTO {name}({fields}) VALUES({values})",
                "insertConditional": "BEGIN \n  INSERT INTO {name} ({fields}) \n  SELECT {values} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition});\n  SELECT {autoIncrementField} AS id FROM {name} WHERE {condition} AND ROWNUM = 1;\nEND;\n",
                "upsert": "BEGIN\n  INSERT INTO {name}({fields}) VALUES({values});\n  EXCEPTION\n    WHEN DUP_VAL_ON_INDEX THEN\n      UPDATE {name} SET {assigns} WHERE {condition};\nEND;\n",
                "bulkMerge": "MERGE INTO {name} AS t USING \n(SELECT {values} FROM DUAL) AS s ON ({condition})\nWHEN MATCHED THEN UPDATE SET {assigns}\nWHEN NOT MATCHED THEN INSERT ({fields}) VALUES ({values})  \n",
                "callStoredProcedure": "BEGIN {name}({parameters}); END;",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "insert": "INSERT INTO {name}({fields}) VALUES({values})",
                "update": "UPDATE {name} {alias} SET {assigns}",
                "remove": "DELETE FROM {name} {alias}",
                "delete": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}"
            },
            "operators": {
                "binary": {
                    "&": "BITAND({0},{1})",
                    "|": "BITOR({0},{1})",
                    "^": "BITXOR({0},{1})",
                    "&=": "{0} = BITAND({0},{1})",
                    "|=": "{0} = BITOR({0},{1})",
                    "^=": "{0} = BITXOR({0},{1})",
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            },
            "functions": {
                "numeric": {
                    "toNumber": "TO_NUMBER(TO_CHAR({0}))",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "atan2": "ATAN2({0},{1})",
                    "ceil": "CEIL({0})",
                    "cos": "COS({0})",
                    "cosh": "COSH({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "ln": "LN({0})",
                    "log10": "LOG10({0})",
                    "log": "LOG({0},{1})",
                    "remainder": "REMAINDER({0},{1})",
                    "round": "ROUND({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "sinh": "SINH({0})",
                    "tan": "TAN({0})",
                    "tanh": "TANH({0})",
                    "trunc": "TRUNC({0},{1})"
                },
                "string": {
                    "toString": "TO_CHAR({0})",
                    "chr": "CHR({0})",
                    "initcap": "INITCAP({0})",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "length": "LENGTH({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "parse": "json_value({0})",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "dateTime": {
                    "dateTime": "TO_CHAR({0},'YYYY-MM-DD\"T\"hh24:mi:ss')",
                    "now": "SYSTIMESTAMP",
                    "curTime": "CAST(SYSTIMESTAMP AS TIME)",
                    "today": "TRUNC(SYSDATE)",
                    "date": "CAST({0} AS DATE)",
                    "time": "CAST({0} AS TIME)",
                    "year": "EXTRACT(YEAR FROM {0})",
                    "month": "EXTRACT(MONTH FROM {0})",
                    "day": "DAY(DAY FROM {0})",
                    "weekday": "TO_NUMBER(TO_CHAR({0}, 'D'))",
                    "hour": "EXTRACT(HOUR FROM {0})",
                    "minute": "EXTRACT(MINUTE FROM {0})",
                    "second": "EXTRACT(SECOND FROM {0})",
                    "millisecond": "EXTRACT(MILLISECOND FROM {0})",
                    "addYear": "{0} + interval '{1}' YEAR",
                    "addMonth": "ADD_MONTHS({0},{1})",
                    "addDay": "{0} + {1}",
                    "addHour": "{0} + interval '{1}' HOUR",
                    "addMinute": "{0} + interval '{1}' MINUTE",
                    "addSecond": "{0} + interval '{1}' SECOND",
                    "addMillisecond": "{0} + interval '{1}' MILLISECOND",
                    "addTime": "ADDTIME({0},{1})",
                    "subtractTime": "SUBTIME({0},{1})",
                    "dayDiff": "DATEDIFF({0},{1})",
                    "hourDiff": "TIMESTAMPDIFF(HOUR,({0},{1})",
                    "secondDiff": "TIMESTAMPDIFF(SECOND,({0},{1})",
                    "millisecondDiff": "TIMESTAMPDIFF(MICROSECOND,({0},{1})",
                    "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600*1000), '%Y-%m-%dT%TZ')",
                    "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600*1000), '%Y-%m-%dT%TZ')",
                    "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*1000), '%Y-%m-%dT%TZ')",
                    "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                    "dateToString": "TO_CHAR({0},'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "metadata": {
                    "user": "USER",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "null": {
                    "nvl": "NVL({0},{1})",
                    "nvl2": "NVL2({0},{1},{2})",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "multiple": {
                    "concat": "{accumulated} || {value}"
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "reservedWords": [
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "support": {
                "sequences": true,
                "tablespaces": true,
                "partitions": true,
                "pkTablespaces": true,
                "ukTablespaces": true,
                "composite": false
            }
        },
        "PostgreSQL": {
            "dbTypes": {
                "dateTime": "TIMESTAMP",
                "boolean": "BOOLEAN",
                "integer": "INTEGER",
                "decimal": "DECIMAL(10,4)",
                "string": "VARCHAR({0})",
                "timestamp": "TIMESTAMP",
                "date": "DATE",
                "time": "TIME",
                "text": "TEXT",
                "buffer": "BLOB"
            },
            "types": {
                "timestamp without time zone": "dateTime",
                "timestamp with time zone": "dateTime",
                "time without time zone": "time",
                "time with time zone": "time",
                "boolean": "boolean",
                "tinyint": "integer",
                "int": "integer",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "date": "date",
                "time": "time",
                "blob": "buffer"
            },
            "support": {
                "pkTablespaces": false,
                "ukTablespaces": false,
                "sequences": true,
                "tablespaces": true,
                "partitions": true,
                "composite": false
            },
            "ddl": {
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createEntity": "CREATE TABLE IF NOT EXISTS {name} ({define})",
                "createIndex": "CREATE INDEX IF NOT EXISTS {name} ON {table} ({columns})",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropEntity": "DROP TABLE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE IF EXISTS {name}",
                "incrementalColumDefine": "{name} serial",
                "dropPk": "DROP CONSTRAINT IF EXISTS {name}",
                "dropUk": "DROP CONSTRAINT IF EXISTS {name}",
                "dropFk": "DROP CONSTRAINT IF EXISTS {name}",
                "dropIndex": "DROP INDEX IF EXISTS {name}",
                "alterProperty": "ALTER COLUMN {columnDefine}",
                "alterPropertyType": "{name} SET DATA TYPE {type}",
                "alterPropertyNullable": "{name} DROP NOT NULL",
                "alterPropertyNotNullable": "{name} SET NOT NULL",
                "objects": "SELECT CASE\n    WHEN t.table_type = 'BASE TABLE' THEN 'table'\n    WHEN t.table_type = 'VIEW' THEN 'view'\n    ELSE 'unknown'\n  END AS \"type\",\n  t.table_name AS \"name\",\n  ts.tablespace_name AS \"tablespace\"\nFROM information_schema.tables t\nJOIN (SELECT tablename AS table_name,\n  COALESCE(tablespace,'pg_default') AS tablespace_name\n  FROM pg_tables \n  WHERE schemaname = current_schema\n  ) as ts ON ts.table_name = t.table_name\nWHERE t.table_catalog = current_catalog\n  AND t.table_schema = current_schema\n  AND t.table_type IN ('BASE TABLE', 'VIEW')  \n",
                "tables": "SELECT\n  t.table_name AS \"tableName\",\n  ts.tablespace_name AS \"tablespace\",\n  c.column_name AS \"columnName\",\n  c.data_type AS \"dbType\",\n  c.is_nullable = 'NO' AS \"required\",\n  (pg_get_serial_sequence(quote_ident(t.table_name),quote_ident(c.column_name)) IS NOT NULL) AS \"autoIncrement\",\n  c.character_maximum_length AS \"length\",\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS \"scale\",\n  c.datetime_precision AS \"time\"    \nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nJOIN (SELECT tablename AS table_name,\n  COALESCE(tablespace,'pg_default') AS tablespace_name\n  FROM pg_tables \n  WHERE schemaname = current_schema\n  ) as ts ON ts.table_name = t.table_name\nWHERE t.table_catalog = current_catalog\n  AND t.table_schema = current_schema\n  AND c.table_catalog = current_catalog\n  AND c.table_schema = current_schema\n  AND t.table_type = 'BASE TABLE'\n  AND t.table_name IN ({names})\n",
                "views": "SELECT\n  t.table_name AS \"tableName\",\n  ts.tablespace_name AS \"tablespace\",\n  c.column_name AS \"columnName\",\n  c.data_type AS \"dbType\",\n  c.is_nullable = 'NO' AS \"required\",\n  false AS \"autoIncrement\",\n  c.character_maximum_length AS \"length\",\n  c.numeric_precision AS \"precision\",\n  c.numeric_scale AS \"scale\",\n  c.datetime_precision AS \"time\"    \nFROM information_schema.tables t\nJOIN information_schema.columns c ON t.table_name = c.table_name\nJOIN (SELECT tablename AS table_name,\n  COALESCE(tablespace,'pg_default') AS tablespace_name\n  FROM pg_tables \n  WHERE schemaname = current_schema\n  ) as ts ON ts.table_name = t.table_name\nWHERE t.table_catalog = current_catalog\n  AND t.table_schema = current_schema\n  AND c.table_catalog = current_catalog\n  AND c.table_schema = current_schema\n  AND t.table_type = 'VIEW'\n  AND t.table_name IN ({names})\n",
                "primaryKeys": "SELECT\n  tc.table_name AS \"tableName\",\n  kcu.column_name AS \"columnName\",\n  tc.constraint_name AS \"constraintName\"\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'PRIMARY KEY'\n  AND tc.table_catalog = current_catalog\n  AND tc.table_schema = current_schema\n  AND tc.table_name IN ({tableNames})\n",
                "uniqueKeys": "SELECT\n  tc.table_name AS \"tableName\",\n  kcu.column_name AS \"columnName\",\n  tc.constraint_name AS \"constraintName\"\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nWHERE tc.constraint_type = 'UNIQUE'\n  AND tc.table_catalog = current_catalog\n  AND tc.table_schema = current_schema\n  AND tc.table_name IN ({tableNames})\n",
                "foreignKeys": "SELECT\n  tc.table_name AS \"tableName\",\n  kcu.column_name AS \"columnName\",\n  ccu.table_name AS \"refTableName\",\n  ccu.column_name AS \"refColumnName\",\n  tc.constraint_name AS \"constraintName\"\nFROM information_schema.table_constraints tc\nJOIN information_schema.key_column_usage kcu ON tc.constraint_name = kcu.constraint_name\nJOIN information_schema.constraint_column_usage ccu ON tc.constraint_name = ccu.constraint_name\nWHERE tc.constraint_type = 'FOREIGN KEY'\n  AND tc.table_catalog = current_catalog\n  AND tc.table_schema = current_schema\n  AND tc.table_name IN ({tableNames})\n",
                "indexes": "SELECT\n  t.relname AS \"tableName\",\n  i.relname AS \"indexName\",\n  a.attname AS \"columnName\",\n  ix.indisunique AS \"isUnique\",\n  ix.indisprimary AS \"isPrimary\"\nFROM pg_class t\nJOIN pg_index ix ON t.oid = ix.indrelid\nJOIN pg_class i ON i.oid = ix.indexrelid\nJOIN pg_attribute a ON a.attrelid = t.oid\nWHERE t.relkind = 'r'\n  AND t.relname IN ({tableNames})\n  AND a.attnum = ANY(ix.indkey)\n  AND ix.indisunique = false\n\tAND ix.indisprimary = false\n",
                "sequences": "SELECT\n  sequence_name AS \"sequenceName\",\n  start_value AS \"startValue\",\n  increment AS \"increment\"\nFROM information_schema.sequences\nWHERE sequence_catalog = current_catalog\n  AND sequence_schema = current_schema\n",
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "columnDefine": "{name} {type} {required} ",
                "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "dropProperty": "DROP COLUMN {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "dml": {
                "page": "{sentence} OFFSET {offset} LIMIT {records}",
                "insert": "INSERT INTO {name}({fields}) VALUES({values}) RETURNING {autoIncrementField} AS id",
                "insertConditional": "INSERT INTO {name} ({fields}) \nSELECT {values} WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})\nRETURNING {autoIncrementField} AS id\n",
                "bulkInsert": "INSERT INTO {name}({fields}) VALUES",
                "upsert": "INSERT INTO {name}({fields}) VALUES({values})\nON CONFLICT ({pkFields}) DO UPDATE SET {assigns}\nRETURNING {autoIncrementField} AS id\n",
                "bulkMerge": "INSERT INTO {name}({fields}) \nSELECT {fields}\nFROM (VALUES {values}) AS source ({fields})\nON CONFLICT ({pkFields}) DO UPDATE SET {assigns}\n",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "update": "UPDATE {name} {alias} SET {assigns}",
                "remove": "DELETE FROM {name} {alias}",
                "delete": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}",
                "callStoredProcedure": "call {name}({parameters})"
            },
            "others": {
                "variable": "${number}",
                "delimiter": "\"{name}\"",
                "string": "'{name}'",
                "separatorSql": ";",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "false": "FALSE",
                "true": "TRUE",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "operators": {
                "binary": {
                    "^": "{0} # {1}",
                    "^=": "{0} = {0} # {1}",
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "&": "{0} & {1}",
                    "|": "{0} | {1}",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "&=": "{0} = {0} & {1} ",
                    "|=": "{0} = {0} | {1}",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            },
            "functions": {
                "numeric": {
                    "round": "ROUND(CAST({0} AS DECIMAL),{1})",
                    "remainder": "MOD({0},{1})",
                    "toNumber": "CAST({0} AS INTEGER)",
                    "log10": "LOG({0})",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "atan2": "ATAN2({0},{1})",
                    "ceil": "CEIL({0})",
                    "cos": "COS({0})",
                    "cosh": "COSH({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "ln": "LN({0})",
                    "log": "LOG({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "sinh": "SINH({0})",
                    "tan": "TAN({0})",
                    "tanh": "TANH({0})",
                    "trunc": "TRUNC({0},{1})"
                },
                "dateTime": {
                    "now": "to_char(now()::timestamp at time zone 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "today": "to_char(now()::timestamp at time zone 'UTC', 'YYYY-MM-DD')",
                    "curTime": "to_char(now()::timestamp at time zone 'UTC', 'HH24:MI:SS')",
                    "dateTime": "to_char({0}::timestamp at time zone 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "date": "to_char({0}::timestamp at time zone 'UTC', 'YYYY-MM-DD')",
                    "time": "to_char({0}::timestamp at time zone 'UTC', 'HH24:MI:SS')",
                    "year": "date_part('year', timestamp {0})",
                    "month": "date_part('month', timestamp {0})",
                    "day": "date_part('day', timestamp {0})",
                    "weekday": "extract(dow from timestamp {0})",
                    "hour": "date_part('hour', timestamp {0})",
                    "minute": "date_part('minute', timestamp {0})",
                    "second": "date_part('second', timestamp {0})",
                    "millisecond": "mod(extract('millisecond' from timestamp {0})::decimal/1000,1)*1000",
                    "addYear": "(timestamp {0} + ({1} * INTERVAL '1 year'))",
                    "addMonth": "(timestamp {0} + ({1}  * INTERVAL '1 month'))",
                    "addDay": "(timestamp {0} + ({1}  * INTERVAL '1 day'))",
                    "addHour": "(timestamp {0} + ({1}  * INTERVAL '1 hour'))",
                    "addMinute": "(timestamp {0} + ({1}  * INTERVAL '1 minute'))",
                    "addSecond": "(timestamp {0} + ({1}  * INTERVAL '1 second'))",
                    "addMillisecond": "(timestamp {0} + ({1}  * INTERVAL '1 millisecond'))",
                    "addTime": "(timestamp {0} + time {1})",
                    "subtractTime": "(timestamp {0} - time {1})",
                    "dayDiff": "(extract('epoch' from (timestamp {0} - timestamp {1} ))/ (24 * 3600))",
                    "hourDiff": "(extract('epoch' from (timestamp {0} - timestamp {1} ))/3600)",
                    "secondDiff": "extract('epoch' from (timestamp {0} - timestamp {1} ))",
                    "millisecondDiff": "(extract('epoch' from (timestamp {0} - timestamp {1} ))*1000)",
                    "dayToDate": "to_char(TO_TIMESTAMP({0}*24*3600*1000)::timestamp, 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "hourToDate": "to_char(TO_TIMESTAMP({0}*3600*1000)::timestamp, 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "secondToDate": "to_char(TO_TIMESTAMP({0}*1000)::timestamp, 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "millisecondToDate": "to_char(TO_TIMESTAMP({0})::timestamp, 'YYYY-MM-DD\"T\"HH24:MI:SS\".\"MS\"Z\"')",
                    "dateToString": "to_char ({0}::timestamp at time zone 'UTC', 'YYYY-MM-DD\"T\"HH24:MI:SS\"Z\"')"
                },
                "null": {
                    "nvl": "(CASE WHEN {0} IS NOT NULL THEN {0} ELSE {1} END)",
                    "nvl2": "(CASE WHEN {0} IS NOT NULL THEN {1} ELSE {2} END)",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "string": {
                    "chr": "CHR({0})",
                    "initcap": "INITCAP({0})",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "length": "LENGTH({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "parse": "json_value({0})",
                    "toString": "CAST({0} AS VARCHAR2)",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "metadata": {
                    "user": "USER",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "multiple": {
                    "concat": "{accumulated} || {value}"
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "reservedWords": [
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "format": {
                "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "date": "yyyy-MM-dd",
                "time": "HH:mm:ss"
            }
        },
        "SQLjs": {
            "support": {
                "sequences": false,
                "tablespaces": false,
                "partitions": false,
                "pkTablespaces": false,
                "ukTablespaces": false,
                "composite": false
            },
            "ddl": {
                "objects": null,
                "tables": null,
                "views": null,
                "primaryKeys": null,
                "uniqueKeys": null,
                "foreignKeys": null,
                "indexes": null,
                "sequences": null,
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createEntity": "CREATE TABLE IF NOT EXISTS {name} ({define})",
                "createIndex": "CREATE INDEX IF NOT EXISTS {name} ON {table} ({columns})",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropEntity": "DROP TABLE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE IF EXISTS {name}",
                "dropIndex": "DROP INDEX IF EXISTS {name} ON {table}",
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "incrementalColumDefine": "{name} {type} {required} AUTO_INCREMENT",
                "columnDefine": "{name} {type} {required} ",
                "createPk": "CONSTRAINT {name} PRIMARY KEY ({columns})",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "alterProperty": "MODIFY {columnDefine}",
                "alterPropertyType": "({name} {type})",
                "alterPropertyNullable": "({name} NULL)",
                "alterPropertyNotNullable": "({name} NOT NULL)",
                "dropProperty": "DROP COLUMN {name}",
                "dropPk": "DROP PRIMARY KEY {name}",
                "dropUk": "DROP UNIQUE {name}",
                "dropFk": "DROP FOREIGN KEY {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "reservedWords": [
                "long",
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "dbTypes": {
                "buffer": "LONGBLOB",
                "decimal": "DECIMAL(10,4)",
                "boolean": "BOOLEAN",
                "integer": "INTEGER",
                "string": "VARCHAR({0})",
                "dateTime": "DATETIME",
                "timestamp": "TIMESTAMP",
                "date": "DATE",
                "time": "TIME",
                "text": "TEXT"
            },
            "types": {
                "mediumtext": "text",
                "longblob": "buffer",
                "tinyint": "integer",
                "int": "integer",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "date": "date",
                "time": "time",
                "boolean": "boolean",
                "blob": "buffer"
            },
            "dml": {
                "delete": "DELETE {alias} FROM {name} AS {alias}",
                "bulkInsert": "INSERT INTO {name}({fields}) VALUES ?",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "page": "{sentence} LIMIT {offset},{records}",
                "insert": "INSERT INTO {name}({fields}) VALUES({values})",
                "insertConditional": "INSERT INTO {name}({fields}) SELECT {values} FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})",
                "update": "UPDATE {name} {alias} SET {assigns}",
                "upsert": "INSERT INTO {name}({fields}) VALUES({values}) ON DUPLICATE KEY UPDATE {assigns}",
                "remove": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}",
                "bulkMerge": "INSERT INTO {name} ({fields})\nVALUES {values}\nON DUPLICATE KEY UPDATE {assigns}\n",
                "callStoredProcedure": "call {name}({parameters})"
            },
            "others": {
                "delimiter": "`{name}`",
                "variable": "?",
                "string": "'{name}'",
                "separatorSql": ";",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "false": "FALSE",
                "true": "TRUE",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "functions": {
                "numeric": {
                    "atan2": "ATAN({0},{1})",
                    "cosh": "((EXP({0}) + EXP(-{0})) / 2)",
                    "remainder": "({0} - {1}*ROUND({0}/{1}))",
                    "sinh": "((EXP({0}) - EXP(-{0})) / 2)",
                    "tanh": "(EXP(2*{0}) - 1)/(EXP(2*{0}) + 1)",
                    "trunc": "TRUNCATE({0},{1})",
                    "toNumber": "CONVERT({0}, DECIMAL)",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "ceil": "CEIL({0})",
                    "cos": "COS({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "ln": "LN({0})",
                    "log10": "LOG10({0})",
                    "log": "LOG({0},{1})",
                    "round": "ROUND({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "tan": "TAN({0})"
                },
                "string": {
                    "chr": "CHAR({0} USING ASCII)",
                    "initcap": "INITCAP({0})",
                    "length": "CHAR_LENGTH({0})",
                    "toString": "CONVERT({0}, CHAR)",
                    "parse": "CONVERT({0}, JSON)",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "dateTime": {
                    "curTime": "CURTIME()",
                    "today": "CURDATE()",
                    "now": "NOW()",
                    "date": "CONVERT({0}, DATE)",
                    "dateTime": "CONVERT({0}, DATETIME)",
                    "time": "CONVERT({0}, TIME)",
                    "year": "EXTRACT(YEAR FROM {0})",
                    "month": "EXTRACT(MONTH FROM {0})",
                    "day": "DAYOFMONTH({0})",
                    "weekday": "DAYOFWEEK({0})",
                    "hours": "EXTRACT(HOUR FROM {0})",
                    "minutes": "EXTRACT(MINUTE FROM {0})",
                    "seconds": "EXTRACT(SECOND FROM {0})",
                    "millisecond": "ROUND(EXTRACT(MICROSECOND FROM {0})/1000,0)",
                    "addYear": "DATE_ADD({0}, INTERVAL {1} YEAR)",
                    "addMonth": "DATE_ADD({0}, INTERVAL {1} MONTH)",
                    "addDay": "DATE_ADD({0}, INTERVAL {1} DAY)",
                    "addHours": "DATE_ADD({0}, INTERVAL {1} HOUR)",
                    "addMinutes": "DATE_ADD({0}, INTERVAL {1} MINUTE)",
                    "addSeconds": "DATE_ADD({0}, INTERVAL {1} SECOND)",
                    "addMillisecond": "DATE_ADD({0}, INTERVAL ({1} * 1000) MICROSECOND)",
                    "addTime": "ADDTIME({0},{1})",
                    "subtractTime": "SUBTIME({0},{1})",
                    "dayDiff": "DATEDIFF({0},{1})",
                    "hourDiff": "TIMESTAMPDIFF(HOUR, {1},{0})",
                    "secondDiff": "TIMESTAMPDIFF(SECOND, {1},{0})",
                    "millisecondDiff": "ROUND(TIMESTAMPDIFF(MICROSECOND, {1},{0})/1000,0)",
                    "dateDiff": "DATEDIFF({0},{1})",
                    "timeDiff": "TIMEDIFF({0},{1})",
                    "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600), '%Y-%m-%dT%TZ')",
                    "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600), '%Y-%m-%dT%TZ')",
                    "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                    "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}/1000), '%Y-%m-%dT%TZ')",
                    "dateToString": "DATE_FORMAT({0}, '%Y-%m-%dT%TZ')",
                    "hour": "EXTRACT(HOUR FROM {0})",
                    "minute": "EXTRACT(MINUTE FROM {0})",
                    "second": "EXTRACT(SECOND FROM {0})",
                    "addHour": "{0} + interval '{1}' HOUR",
                    "addMinute": "{0} + interval '{1}' MINUTE",
                    "addSecond": "{0} + interval '{1}' SECOND"
                },
                "metadata": {
                    "user": "CURRENT_USER()",
                    "database": "DATABASE()",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "null": {
                    "nvl": "IFNULL({0},{1})",
                    "nvl2": "(CASE WHEN {0} IS NOT NULL THEN {1} ELSE {2} END)",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "multiple": {
                    "concat": "CONCAT({accumulated},{value})"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "format": {
                "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "date": "yyyy-MM-dd",
                "time": "HH:mm:ss"
            },
            "operators": {
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "binary": {
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "&": "{0} & {1}",
                    "|": "{0} | {1}",
                    "^": "{0} ^ {1}",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "&=": "{0} = {0} & {1} ",
                    "|=": "{0} = {0} | {1}",
                    "^=": "{0} = {0} ^ {1}",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            }
        },
        "SqlServer": {
            "dbTypes": {
                "boolean": "BIT",
                "date": "SMALLDATETIME",
                "integer": "INTEGER",
                "decimal": "DECIMAL(10,4)",
                "string": "VARCHAR({0})",
                "dateTime": "DATETIME",
                "timestamp": "TIMESTAMP",
                "time": "TIME",
                "text": "TEXT",
                "buffer": "BLOB"
            },
            "types": {
                "int": "integer",
                "tinyint": "integer",
                "nvarchar": "string",
                "ntext": "string",
                "binary": "buffer",
                "varbinary": "buffer",
                "image": "buffer",
                "datetime2": "dateTime",
                "datetimeoffset": "dateTime",
                "smalldatetime": "date",
                "bit": "boolean",
                "uniqueidentifier": "string",
                "sql_variant": "any",
                "xml": "string",
                "cursor": "any",
                "table": "any",
                "integer": "integer",
                "bigint": "integer",
                "smallint": "integer",
                "decimal": "decimal",
                "numeric": "decimal",
                "number": "decimal",
                "real": "decimal",
                "float": "decimal",
                "double": "decimal",
                "double precision": "decimal",
                "character varying": "string",
                "char": "string",
                "varchar": "string",
                "uuid": "string",
                "text": "text",
                "timestamp": "timestamp",
                "datetime": "dateTime",
                "date": "date",
                "time": "time",
                "boolean": "boolean",
                "blob": "buffer"
            },
            "support": {
                "pkTablespaces": false,
                "ukTablespaces": false,
                "sequences": true,
                "tablespaces": true,
                "partitions": true,
                "composite": false
            },
            "format": {
                "date": "yyyy-MM-dd 00:00:00",
                "timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
                "dateTime": "yyyy-MM-dd HH:mm:ss",
                "time": "HH:mm:ss"
            },
            "ddl": {
                "createPk": "PRIMARY KEY ({columns})",
                "incrementalColumDefine": "{name} {type} {required} IDENTITY (1, 1)",
                "dropPk": "DROP CONSTRAINT {name}",
                "dropUk": "DROP CONSTRAINT {name}",
                "dropFk": "DROP CONSTRAINT {name}",
                "dropIndex": "DROP INDEX {name} ON {table}",
                "alterProperty": "ALTER COLUMN {columnDefine}",
                "alterPropertyType": "{name} {type}",
                "alterPropertyNullable": "{name} NULL",
                "alterPropertyNotNullable": "{name} NOT NULL",
                "objects": "SELECT 'table' as [type], TABLE_NAME AS [name]\nFROM INFORMATION_SCHEMA.TABLES\nWHERE TABLE_TYPE = 'BASE TABLE'\nunion all\nSELECT 'view' as [type], TABLE_NAME AS [name]\nFROM INFORMATION_SCHEMA.VIEWS  \n",
                "tables": "SELECT \n    t.name AS tableName,\n    c.name AS columnName,\n    TYPE_NAME(c.user_type_id) AS dbType,\n    CASE WHEN c.is_nullable = 0 THEN 1 ELSE 0 END AS required,\n    c.is_identity as isAutoIncremental,\n    c.max_length AS [length],\n    c.precision AS [precision],\n    c.scale AS scale,\n    c.collation_name AS collation    \nFROM sys.tables t\nJOIN sys.columns c ON t.object_id = c.object_id\nWHERE SCHEMA_NAME(t.schema_id) = SCHEMA_NAME()\n  AND t.name IN ({names})\n",
                "views": "SELECT \n    v.name AS viewName,\n    c.name AS columnName,\n    TYPE_NAME(c.user_type_id) AS dbType,\n    CASE WHEN c.is_nullable = 0 THEN 1 ELSE 0 END AS required,\n    c.is_identity AS isAutoIncremental,\n    c.max_length AS [length],\n    c.precision AS [precision],\n    c.scale AS scale,\n    c.collation_name AS collation    \nFROM sys.views v\nJOIN sys.columns c ON v.object_id = c.object_id\nWHERE SCHEMA_NAME(v.schema_id) = SCHEMA_NAME()\n  AND v.name IN ({names})\n",
                "primaryKeys": "SELECT\n    tc.TABLE_NAME AS tableName,\n    kcu.COLUMN_NAME AS columnName,\n    tc.CONSTRAINT_NAME AS constraintName\nFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\nJOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\nWHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'\n    AND tc.TABLE_CATALOG = DB_NAME()\n    AND tc.TABLE_SCHEMA = SCHEMA_NAME()\n    AND tc.TABLE_NAME IN ({tableNames})\n",
                "uniqueKeys": "SELECT\n    tc.TABLE_NAME AS tableName,\n    kcu.COLUMN_NAME AS columnName,\n    tc.CONSTRAINT_NAME AS constraintName\nFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\nJOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\nWHERE tc.CONSTRAINT_TYPE = 'UNIQUE'\n    AND tc.TABLE_CATALOG = DB_NAME()\n    AND tc.TABLE_SCHEMA = SCHEMA_NAME()\n    AND tc.TABLE_NAME IN ({tableNames})\n",
                "foreignKeys": "SELECT\n    tc.TABLE_NAME AS tableName,\n    kcu.COLUMN_NAME AS columnName,\n    ccu.TABLE_NAME AS refTableName,\n    ccu.COLUMN_NAME AS refColumnName,\n    tc.CONSTRAINT_NAME AS constraintName\nFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc\nJOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME\nJOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME\nWHERE \n    tc.CONSTRAINT_TYPE = 'FOREIGN KEY'\n    AND tc.TABLE_CATALOG = DB_NAME()\n    AND tc.TABLE_SCHEMA = SCHEMA_NAME()\n    AND tc.TABLE_NAME IN ({tableNames})\n",
                "indexes": "SELECT\n     t.name AS tableName,\n     i.name AS indexName,\n     c.name AS columnName,\n     CASE WHEN i.is_unique = 1 THEN 'true' ELSE 'false' END AS isUnique,\n     CASE WHEN i.is_primary_key = 1 THEN 'true' ELSE 'false' END AS isPrimary\n FROM sys.tables t\n JOIN sys.indexes i ON t.object_id = i.object_id\n JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id\n JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id\n WHERE t.type = 'U'\n   AND t.name IN ({tableNames})\n   AND i.is_unique = 0\n   AND i.is_primary_key = 0\n",
                "sequences": "SELECT name AS sequenceName,\n    start_value AS startValue,\n    increment AS increment\nFROM sys.sequences\nWHERE object_id = OBJECT_ID('sequence_schema.sequence_name')\n",
                "createDatabase": "CREATE DATABASE IF NOT EXISTS {name}",
                "createEntity": "CREATE TABLE {name} ({define})",
                "createSequence": "CREATE SEQUENCE {name} START WITH 1 INCREMENT BY 1 MAXVALUE 999999999999 MINVALUE 1",
                "columnDefine": "{name} {type} {required} ",
                "createUk": "CONSTRAINT {name} UNIQUE ({columns})",
                "createFk": "CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "createIndex": "CREATE INDEX {name} ON {table} ({columns})",
                "alterTable": "ALTER TABLE {name}",
                "addProperty": "ADD {columnDefine}",
                "addPk": "ADD CONSTRAINT {name} PRIMARY KEY ({columns})",
                "addUk": "ADD CONSTRAINT {name} UNIQUE ({columns})",
                "addFk": "ADD CONSTRAINT {name} FOREIGN KEY ({column}) REFERENCES {fTable} ({fColumn})",
                "dropDatabase": "DROP DATABASE IF EXISTS {name}",
                "dropEntity": "DROP TABLE IF EXISTS {name}",
                "dropSequence": "DROP SEQUENCE {name}",
                "dropProperty": "DROP COLUMN {name}",
                "truncateEntity": "TRUNCATE TABLE {name}"
            },
            "dml": {
                "insert": "INSERT INTO {name}({fields}) OUTPUT INSERTED.{autoIncrementField} VALUES({values})",
                "insertConditional": "INSERT INTO {name} ({fields}) OUTPUT INSERTED.{autoIncrementField}\nSELECT {values}\nWHERE NOT EXISTS (SELECT 1 FROM {name} WHERE {condition})\n",
                "update": "UPDATE {alias} SET {assigns} FROM {name} {alias}",
                "upsert": "MERGE INTO {name} AS target\nUSING (VALUES {values}) AS source ({fields})\nON {condition}\nWHEN MATCHED THEN\n    UPDATE SET {assigns}\nWHEN NOT MATCHED THEN\n    INSERT ({fields}) VALUES ({values})\n    OUTPUT INSERTED.{autoIncrementField}\n",
                "bulkInsert": "INSERT INTO {name}({fields})",
                "page": "{sentence} OFFSET {offset} ROWS FETCH NEXT {records} ROWS ONLY",
                "callStoredProcedure": "EXEC {name} {parameters};",
                "map": "SELECT {0}",
                "select": "SELECT {0}",
                "distinct": "SELECT DISTINCT {0}",
                "filter": "WHERE {0}",
                "where": "WHERE {0}",
                "groupBy": "GROUP BY {0}",
                "having": "HAVING {0}",
                "sort": "ORDER BY {0}",
                "order": "ORDER BY {0}",
                "remove": "DELETE FROM {name} {alias}",
                "delete": "DELETE FROM {name} {alias}",
                "removeAll": "DELETE FROM {name}",
                "deleteAll": "DELETE FROM {name}",
                "from": "FROM {name} {alias}",
                "join": "INNER JOIN {name} {alias} ON {relation}",
                "bulkMerge": "INSERT INTO {name} ({fields})\nVALUES {values}\nON DUPLICATE KEY UPDATE {assigns}\n"
            },
            "others": {
                "delimiter": "[{name}]",
                "separatorSql": " \\nGO",
                "variable": "@{name}",
                "false": 0,
                "true": 1,
                "string": "'{name}'",
                "notNullable": "NOT NULL",
                "field": "{entityAlias}.{name}",
                "column": "{name}",
                "null": "NULL",
                "sequenceNextVal": "{name}.nextval",
                "sequenceName": "SQ_{name}"
            },
            "functions": {
                "numeric": {
                    "atan2": "ATN2({0},{1})",
                    "ceil": "CEILING({0})",
                    "trunc": "ROUND({0},{1},1)",
                    "ln": "LOG({0})",
                    "log": "LOG({1},{0})",
                    "abs": "ABS({0})",
                    "acos": "ACOS({0})",
                    "asin": "ASIN({0})",
                    "atan": "ATAN({0})",
                    "cos": "COS({0})",
                    "cosh": "COSH({0})",
                    "exp": "EXP({0})",
                    "floor": "FLOOR({0})",
                    "log10": "LOG10({0})",
                    "remainder": "REMAINDER({0},{1})",
                    "round": "ROUND({0},{1})",
                    "sign": "SIGN({0})",
                    "sin": "SIN({0})",
                    "sinh": "SINH({0})",
                    "tan": "TAN({0})",
                    "tanh": "TANH({0})",
                    "toNumber": "CAST({0} AS NUMBER)"
                },
                "general": {
                    "as": "{value} AS {alias}",
                    "desc": "{0} desc",
                    "asc": "{0} asc",
                    "between": "{0} BETWEEN {1} AND {2}",
                    "includes": " {1} IN ({0})",
                    "contains": " {1} IN ({0})",
                    "in": " {0} IN ({1})",
                    "distinct": "DISTINCT {0} "
                },
                "string": {
                    "chr": "CHR({0})",
                    "initcap": "INITCAP({0})",
                    "lower": "LOWER({0})",
                    "lpad": "LPAD({0},{1},{2})",
                    "ltrim": "LTRIM({0})",
                    "regExpReplace": "REGEXP_REPLACE({0},{1})",
                    "regExpSubstr": "REGEXP_SUBSTR({0},{1})",
                    "replace": "REPLACE({0},{1},{2})",
                    "rpad": "RPAD({0},{1},{2})",
                    "rtrim": "RTRIM({0})",
                    "substr": "SUBSTR({0},{1},{2})",
                    "substring": "SUBSTR({0},{1},{2})",
                    "strCount": "(LENGTH({0})-LENGTH(REPLACE({0},{1},'')))",
                    "trim": "TRIM({0})",
                    "upper": "UPPER({0})",
                    "length": "LENGTH({0})",
                    "mask": "Concat(LEFT({0},3),'***',RIGHT({0},3))",
                    "parse": "json_value({0})",
                    "toString": "CAST({0} AS VARCHAR2)",
                    "like": "{0} LIKE {1}",
                    "startsWith": "{0} LIKE '{1}%'",
                    "startWith": "{0} LIKE '{1}%'",
                    "includes": "{0} LIKE '%{1}%'"
                },
                "dateTime": {
                    "now": "SYSTIMESTAMP",
                    "curTime": "CAST(SYSTIMESTAMP AS TIME)",
                    "today": "TRUNC(SYSDATE)",
                    "dateTime": "CAST({0} AS TIMESTAMP)",
                    "date": "CAST({0} AS DATE)",
                    "time": "CAST({0} AS TIME)",
                    "year": "EXTRACT(YEAR FROM {0})",
                    "month": "EXTRACT(MONTH FROM {0})",
                    "day": "DAY(DAY FROM {0})",
                    "weekday": "TO_NUMBER(TO_CHAR({0}, 'D'))",
                    "hour": "EXTRACT(HOUR FROM {0})",
                    "minute": "EXTRACT(MINUTE FROM {0})",
                    "second": "EXTRACT(SECOND FROM {0})",
                    "millisecond": "EXTRACT(MILLISECOND FROM {0})",
                    "addYear": "{0} + interval '{1}' YEAR",
                    "addMonth": "ADD_MONTHS({0},{1})",
                    "addDay": "{0} + {1}",
                    "addHour": "{0} + interval '{1}' HOUR",
                    "addMinute": "{0} + interval '{1}' MINUTE",
                    "addSecond": "{0} + interval '{1}' SECOND",
                    "addMillisecond": "{0} + interval '{1}' MILLISECOND",
                    "addTime": "ADDTIME({0},{1})",
                    "subtractTime": "SUBTIME({0},{1})",
                    "dayDiff": "DATEDIFF({0},{1})",
                    "hourDiff": "TIMESTAMPDIFF(HOUR,({0},{1})",
                    "secondDiff": "TIMESTAMPDIFF(SECOND,({0},{1})",
                    "millisecondDiff": "TIMESTAMPDIFF(MICROSECOND,({0},{1})",
                    "dayToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*24*3600*1000), '%Y-%m-%dT%TZ')",
                    "hourToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*3600*1000), '%Y-%m-%dT%TZ')",
                    "secondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}*1000), '%Y-%m-%dT%TZ')",
                    "millisecondToDate": "DATE_FORMAT(FROM_UNIXTIME({0}), '%Y-%m-%dT%TZ')",
                    "dateToString": "TO_CHAR({0},'YYYY-MM-DD\"T\"HH24:MI:SSTZH:TZM')"
                },
                "metadata": {
                    "user": "USER",
                    "source": "SYS_CONTEXT('USERENV','DB_NAME')"
                },
                "null": {
                    "nvl": "NVL({0},{1})",
                    "nvl2": "NVL2({0},{1},{2})",
                    "isNull": "({0} IS NULL)",
                    "isNotNull": "({0} IS NOT NULL)"
                },
                "multiple": {
                    "concat": "{accumulated} || {value}"
                },
                "group": {
                    "avg": "AVG({0})",
                    "count": "COUNT({0})",
                    "first": "FIRST({0})",
                    "last": "LAST({0})",
                    "max": "MAX({0})",
                    "min": "MIN({0})",
                    "sum": "SUM({0})"
                }
            },
            "reservedWords": [
                "add",
                "all",
                "alter",
                "and",
                "as",
                "asc",
                "between",
                "by",
                "cascade",
                "case",
                "check",
                "collate",
                "column",
                "constraint",
                "create",
                "database",
                "default",
                "delete",
                "desc",
                "distinct",
                "drop",
                "else",
                "end",
                "escape",
                "exists",
                "false",
                "for",
                "foreign",
                "from",
                "full",
                "grant",
                "group",
                "having",
                "inner",
                "index",
                "insert",
                "into",
                "is",
                "join",
                "key",
                "left",
                "like",
                "limit",
                "not",
                "null",
                "on",
                "or",
                "order",
                "outer",
                "references",
                "right",
                "select",
                "set",
                "some",
                "table",
                "then",
                "to",
                "true",
                "union",
                "unique",
                "update",
                "using",
                "values",
                "when",
                "where",
                "with"
            ],
            "operators": {
                "unary": {
                    "-": "- {0}",
                    "~": "~ {0}",
                    "!": "NOT {0}"
                },
                "binary": {
                    "+": "({0} + {1})",
                    "-": "({0} - {1})",
                    "*": "({0} * {1})",
                    "/": "({0} / {1})",
                    "**": "POWER({0},{1})",
                    "//": "POWER({0},(1/{1}))",
                    "%": "MOD({0},{1})",
                    "&": "{0} & {1}",
                    "|": "{0} | {1}",
                    "^": "{0} ^ {1}",
                    "<<": "{0} << {1}",
                    ">>": "{0} >> {1}",
                    "==": "{0} = {1}",
                    "===": "{0} = {1}",
                    "!=": "{0} <> {1}",
                    "!==": "{0} <> {1}",
                    ">": "{0} > {1}",
                    "<": "{0} < {1}",
                    ">=": "{0} >= {1}",
                    "<=": "{0} <= {1}",
                    "&&": "({0} AND {1})",
                    "||": "({0} OR {1})",
                    "[]": "N/A",
                    "=": "{0} = {1}",
                    "+=": "{0} = ({0} + {1})",
                    "-=": "{0} = ({0} - {1})",
                    "*=": "{0} = ({0} * {1})",
                    "/=": "{0} = ({0} / {1})",
                    "**=": "{0} = POWER({0},{1})",
                    "//=": "{0} = POWER({0},(1/{1}))",
                    "%=": "{0} = MOD({0},{1})",
                    "&=": "{0} = {0} & {1} ",
                    "|=": "{0} = {0} | {1}",
                    "^=": "{0} = {0} ^ {1}",
                    "<<=": "{0} = {0} << {1}",
                    ">>=": "{0} = {0} >> {1}"
                },
                "ternary": {
                    "?": "IF {0} THEN {1} ELSE {2} END"
                }
            }
        }
    }
}
