UNPKG

@dbml/core

Version:
1,341 lines (1,262 loc) 51.8 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _lodash = require("lodash"); var _PostgreSQLParserVisitor = _interopRequireDefault(require("../../parsers/postgresql/PostgreSQLParserVisitor")); var _AST = require("../AST"); var _constants = require("../constants"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i["return"] && (_r = _i["return"](), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } /* eslint-disable no-param-reassign */ /* eslint-disable consistent-return */ /* eslint-disable class-methods-use-this */ var COMMAND_KIND = { REF: 'ref' }; var COMMENT_OBJECT_TYPE = { TABLE: 'table' }; var findTable = function findTable(tables, schemaName, tableName) { var realSchemaName = schemaName || 'public'; var table = tables.find(function (table) { var targetSchemaName = table.schemaName || 'public'; return targetSchemaName === realSchemaName && table.name === tableName; }); return table; }; var escapeStr = function escapeStr(str) { if (str) { return str.replaceAll("''", "'"); } return str; }; var PostgresASTGen = /*#__PURE__*/function (_PostgreSQLParserVisi) { _inherits(PostgresASTGen, _PostgreSQLParserVisi); var _super = _createSuper(PostgresASTGen); function PostgresASTGen() { var _this; _classCallCheck(this, PostgresASTGen); _this = _super.call(this); _this.data = { schemas: [], tables: [], refs: [], enums: [], tableGroups: [], aliases: [], project: {}, records: [] }; return _this; } // stmtblock EOF _createClass(PostgresASTGen, [{ key: "visitRoot", value: function visitRoot(ctx) { ctx.stmtblock().accept(this); return this.data; } // stmtmulti }, { key: "visitStmtblock", value: function visitStmtblock(ctx) { ctx.stmtmulti().accept(this); } // (stmt SEMI?)* }, { key: "visitStmtmulti", value: function visitStmtmulti(ctx) { var _this2 = this; ctx.stmt().map(function (stmt) { return stmt.accept(_this2); }); } // check PostgresSQLParser.g4 line 31 }, { key: "visitStmt", value: function visitStmt(ctx) { if (ctx.createstmt()) { var table = ctx.createstmt().accept(this); // filter out null table that can cause error in model_structure stage if (table) this.data.tables.push(table); return; } if (ctx.indexstmt()) { /** @type {Index} */ var indexStmt = ctx.indexstmt().accept(this); var _indexStmt$pathName = indexStmt.pathName, tableName = _indexStmt$pathName.tableName, schemaName = _indexStmt$pathName.schemaName; var _table = findTable(this.data.tables, schemaName, tableName); if (_table) _table.indexes.push(indexStmt.index); return; } if (ctx.altertablestmt()) { ctx.altertablestmt().accept(this); return; } if (ctx.commentstmt()) { ctx.commentstmt().accept(this); return; } if (ctx.definestmt()) { ctx.definestmt().accept(this); return; } if (ctx.insertstmt()) { ctx.insertstmt().accept(this); } } /* CREATE opttemp TABLE (IF_P NOT EXISTS)? qualified_name ( OPEN_PAREN opttableelementlist CLOSE_PAREN optinherit optpartitionspec table_access_method_clause optwith oncommitoption opttablespace | OF any_name opttypedtableelementlist optpartitionspec table_access_method_clause optwith oncommitoption opttablespace | PARTITION OF qualified_name opttypedtableelementlist partitionboundspec optpartitionspec table_access_method_clause optwith oncommitoption opttablespace) */ }, { key: "visitCreatestmt", value: function visitCreatestmt(ctx) { var _this$data$refs, _this$data$refs2; var names = ctx.qualified_name(0).accept(this); var tableName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; if (!ctx.opttableelementlist()) return; var tableElements = ctx.opttableelementlist().accept(this).filter(function (e) { return e; }); var _tableElements$reduce = tableElements.reduce(function (acc, ele) { if (ele.kind === _constants.TABLE_CONSTRAINT_KIND.FIELD) acc[0].push(ele.value);else if (ele.kind === _constants.TABLE_CONSTRAINT_KIND.INDEX) acc[1].push(ele.value);else if (ele.kind === _constants.TABLE_CONSTRAINT_KIND.FK) acc[2].push(ele.value);else if (ele.kind === _constants.TABLE_CONSTRAINT_KIND.UNIQUE) acc[1].push(ele.value); return acc; }, [[], [], []]), _tableElements$reduce2 = _slicedToArray(_tableElements$reduce, 3), fieldsData = _tableElements$reduce2[0], indexes = _tableElements$reduce2[1], tableRefs = _tableElements$reduce2[2]; (_this$data$refs = this.data.refs).push.apply(_this$data$refs, _toConsumableArray((0, _lodash.flatten)(fieldsData.map(function (fieldData) { return fieldData.inline_refs.map(function (inlineRef) { inlineRef.endpoints[0].tableName = tableName; inlineRef.endpoints[0].schemaName = schemaName; inlineRef.endpoints[0].fieldNames = [fieldData.field.name]; return inlineRef; }); })))); (_this$data$refs2 = this.data.refs).push.apply(_this$data$refs2, _toConsumableArray(tableRefs.map(function (tableRef) { tableRef.endpoints[0].tableName = tableName; tableRef.endpoints[0].schemaName = schemaName; return tableRef; }))); return new _AST.Table({ name: tableName, schemaName: schemaName, fields: fieldsData.map(function (fd) { return fd.field; }), indexes: indexes }); } // tableelementlist }, { key: "visitOpttableelementlist", value: function visitOpttableelementlist(ctx) { if (!ctx.tableelementlist()) return []; return ctx.tableelementlist().accept(this); } // tableelement (COMMA tableelement)* }, { key: "visitTableelementlist", value: function visitTableelementlist(ctx) { var _this3 = this; return ctx.tableelement().map(function (element) { return element.accept(_this3); }); } // tableconstraint | tablelikeclause | columnDef }, { key: "visitTableelement", value: function visitTableelement(ctx) { if (ctx.columnDef()) return ctx.columnDef().accept(this); if (ctx.tableconstraint()) return ctx.tableconstraint().accept(this); } // CONSTRAINT name constraintelem | constraintelem }, { key: "visitTableconstraint", value: function visitTableconstraint(ctx) { var _ctx$name; var constraintName = (_ctx$name = ctx.name()) === null || _ctx$name === void 0 ? void 0 : _ctx$name.accept(this); var constraint = ctx.constraintelem().accept(this); if (!constraint) return; constraint.value.name = constraintName; return constraint; } /* CHECK OPEN_PAREN a_expr CLOSE_PAREN constraintattributespec | UNIQUE (OPEN_PAREN columnlist CLOSE_PAREN opt_c_include opt_definition optconstablespace constraintattributespec | existingindex constraintattributespec) | PRIMARY KEY (OPEN_PAREN columnlist CLOSE_PAREN opt_c_include opt_definition optconstablespace constraintattributespec | existingindex constraintattributespec) | EXCLUDE access_method_clause OPEN_PAREN exclusionconstraintlist CLOSE_PAREN opt_c_include opt_definition optconstablespace exclusionwhereclause constraintattributespec | FOREIGN KEY OPEN_PAREN columnlist CLOSE_PAREN REFERENCES qualified_name opt_column_list key_match key_actions constraintattributespec */ }, { key: "visitConstraintelem", value: function visitConstraintelem(ctx) { if (ctx.PRIMARY()) { return { kind: _constants.TABLE_CONSTRAINT_KIND.INDEX, value: new _AST.Index({ pk: true, columns: ctx.columnlist().accept(this) }) // value: { // type: 'PrimaryKey', // columns: // }, }; } if (ctx.FOREIGN()) { var _ctx$opt_column_list$; var names = ctx.qualified_name().accept(this); var refTableName = (0, _lodash.last)(names); var refSchemaName = names.length > 1 ? names[names.length - 2] : undefined; var firstFieldNames = ctx.columnlist().accept(this).map(function (c) { return c.value; }); var secondFieldNames = (_ctx$opt_column_list$ = ctx.opt_column_list().accept(this)) === null || _ctx$opt_column_list$ === void 0 ? void 0 : _ctx$opt_column_list$.map(function (c) { return c.value; }); var actions = ctx.key_actions().accept(this); return { kind: _constants.TABLE_CONSTRAINT_KIND.FK, value: { endpoints: [{ tableName: null, schemaName: null, fieldNames: firstFieldNames, relation: '*' }, { tableName: refTableName, schemaName: refSchemaName, fieldNames: secondFieldNames, relation: '1' }], onDelete: actions.onDelete, onUpdate: actions.onUpdate } }; } if (ctx.UNIQUE()) { return { kind: _constants.TABLE_CONSTRAINT_KIND.UNIQUE, value: new _AST.Index({ unique: true, columns: ctx.columnlist().accept(this) }) }; } } // OPEN_PAREN columnlist CLOSE_PAREN | }, { key: "visitOpt_column_list", value: function visitOpt_column_list(ctx) { var _ctx$columnlist; return (_ctx$columnlist = ctx.columnlist()) === null || _ctx$columnlist === void 0 ? void 0 : _ctx$columnlist.accept(this); } // columnElem (COMMA columnElem)* }, { key: "visitColumnlist", value: function visitColumnlist(ctx) { var _this4 = this; return ctx.columnElem().map(function (c) { return c.accept(_this4); }); } // colid }, { key: "visitColumnElem", value: function visitColumnElem(ctx) { return { value: ctx.colid().accept(this), type: _constants.CONSTRAINT_TYPE.COLUMN }; } // colid typename create_generic_options colquallist }, { key: "visitColumnDef", value: function visitColumnDef(ctx) { var name = ctx.colid().accept(this); var type = ctx.typename().accept(this); var contraints = ctx.colquallist().accept(this); var serialIncrementType = new Set(['serial', 'smallserial', 'bigserial']); var columnTypeName = type.type_name.toLowerCase(); if (serialIncrementType.has(columnTypeName)) contraints.increment = true; return { kind: _constants.TABLE_CONSTRAINT_KIND.FIELD, value: { field: new _AST.Field(_objectSpread({ name: name, type: type }, contraints)), inline_refs: contraints.inline_refs } }; } // colconstraint* }, { key: "visitColquallist", value: function visitColquallist(ctx) { var _this5 = this; var r = { inline_refs: [] }; ctx.colconstraint().forEach(function (c) { var constraint = c.accept(_this5); if (!constraint) return; if (constraint.kind === _constants.COLUMN_CONSTRAINT_KIND.INLINE_REF) { r.inline_refs.push(constraint.value); return; } r[constraint.kind] = constraint.value; }); return r; } /* CONSTRAINT name colconstraintelem | colconstraintelem | constraintattr | COLLATE any_name */ }, { key: "visitColconstraint", value: function visitColconstraint(ctx) { if (ctx.colconstraintelem()) { return ctx.colconstraintelem().accept(this); } } /* NOT NULL_P | NULL_P | UNIQUE opt_definition optconstablespace | PRIMARY KEY opt_definition optconstablespace | CHECK OPEN_PAREN a_expr CLOSE_PAREN opt_no_inherit | DEFAULT b_expr | GENERATED generated_when AS (IDENTITY_P optparenthesizedseqoptlist | OPEN_PAREN a_expr CLOSE_PAREN STORED) | REFERENCES qualified_name opt_column_list key_match key_actions */ }, { key: "visitColconstraintelem", value: function visitColconstraintelem(ctx) { if (ctx.NULL_P()) { var notNull = false; if (ctx.NOT()) notNull = true; return { kind: _constants.COLUMN_CONSTRAINT_KIND.NOT_NULL, value: notNull }; } if (ctx.UNIQUE()) { return { kind: _constants.COLUMN_CONSTRAINT_KIND.UNIQUE, value: true }; } if (ctx.PRIMARY()) { return { kind: _constants.COLUMN_CONSTRAINT_KIND.PK, value: true }; } if (ctx.DEFAULT()) { return { kind: _constants.COLUMN_CONSTRAINT_KIND.DEFAULT, value: ctx.b_expr().accept(this) }; } if (ctx.IDENTITY_P()) { return { kind: _constants.COLUMN_CONSTRAINT_KIND.INCREMENT, value: true }; } if (ctx.REFERENCES()) { var _ctx$opt_column_list$2; var names = ctx.qualified_name().accept(this); var refTableName = (0, _lodash.last)(names); var refSchemaName = names.length > 1 ? names[names.length - 2] : undefined; var secondFieldNames = (_ctx$opt_column_list$2 = ctx.opt_column_list().accept(this)) === null || _ctx$opt_column_list$2 === void 0 ? void 0 : _ctx$opt_column_list$2.map(function (c) { return c.value; }); var actions = ctx.key_actions().accept(this); return { kind: _constants.COLUMN_CONSTRAINT_KIND.INLINE_REF, value: { endpoints: [{ tableName: null, schemaName: null, fieldNames: null, relation: '*' }, { tableName: refTableName, schemaName: refSchemaName, fieldNames: secondFieldNames, relation: '1' }], onDelete: actions.onDelete, onUpdate: actions.onUpdate } }; } } // check PostgresSQLParser.g4 line 3619 }, { key: "visitB_expr", value: function visitB_expr(ctx) { if (ctx.c_expr()) return ctx.c_expr().accept(this); return { value: ctx.getText(), type: _constants.DATA_TYPE.EXPRESSION }; } // check PostgresSQLParser.g4 line 3640 }, { key: "visitC_expr_expr", value: function visitC_expr_expr(ctx) { if (ctx.aexprconst()) return ctx.aexprconst().accept(this); if (ctx.a_expr()) { return { value: ctx.a_expr().getText(), type: _constants.DATA_TYPE.EXPRESSION }; } return { value: ctx.getText(), type: _constants.DATA_TYPE.EXPRESSION }; } }, { key: "visitC_expr_exists", value: function visitC_expr_exists(ctx) { return { value: ctx.getText(), type: _constants.DATA_TYPE.EXPRESSION }; } }, { key: "visitC_expr_case", value: function visitC_expr_case(ctx) { return { value: ctx.getText(), type: _constants.DATA_TYPE.EXPRESSION }; } // iconst | fconst | sconst | bconst | xconst | func_name (sconst | OPEN_PAREN func_arg_list opt_sort_clause CLOSE_PAREN sconst) | consttypename sconst | constinterval (sconst opt_interval | OPEN_PAREN iconst CLOSE_PAREN sconst) | TRUE_P | FALSE_P | NULL_P }, { key: "visitAexprconst", value: function visitAexprconst(ctx) { if (ctx.sconst() && ctx.getChildCount() === 1) { return { value: ctx.sconst().accept(this), type: _constants.DATA_TYPE.STRING }; } if (ctx.TRUE_P() || ctx.FALSE_P() || ctx.NULL_P()) { return { value: ctx.getText(), type: _constants.DATA_TYPE.BOOLEAN }; } if (ctx.iconst() || ctx.fconst) { return { value: ctx.getText(), type: _constants.DATA_TYPE.NUMBER }; } return { value: ctx.getText(), type: _constants.DATA_TYPE.EXPRESSION }; } // key_update | key_delete | key_update key_delete | key_delete key_update | }, { key: "visitKey_actions", value: function visitKey_actions(ctx) { var onDelete = null, onUpdate = null; if (ctx.key_update()) onUpdate = ctx.key_update().accept(this); if (ctx.key_delete()) onDelete = ctx.key_delete().accept(this); return { onDelete: onDelete, onUpdate: onUpdate }; } // ON UPDATE key_action }, { key: "visitKey_update", value: function visitKey_update(ctx) { return ctx.key_action().accept(this); } // ON DELETE_P key_action }, { key: "visitKey_delete", value: function visitKey_delete(ctx) { return ctx.key_action().accept(this); } // NO ACTION | RESTRICT | CASCADE | SET (NULL_P | DEFAULT) }, { key: "visitKey_action", value: function visitKey_action(ctx) { // Generate n element integer array [0, 1, ..., n-1] var childIndices = _toConsumableArray(Array(ctx.getChildCount()).keys()); var text = childIndices.reduce(function (acc, i) { acc += "".concat(ctx.getChild(i).getText(), " "); return acc; }, ''); return text.slice(0, text.length - 1); // remove the last whitespace } // colid indirection? }, { key: "visitQualified_name", value: function visitQualified_name(ctx) { var r = [ctx.colid().accept(this)]; if (ctx.indirection()) { r.push.apply(r, _toConsumableArray(ctx.indirection().accept(this))); } return r; } /* identifier | unreserved_keyword | col_name_keyword | plsql_unreserved_keyword | LEFT | RIGHT */ }, { key: "visitColid", value: function visitColid(ctx) { return ctx.getChild(0).accept(this); } // check PostgresSQLParser.g4 line 4187 }, { key: "visitUnreserved_keyword", value: function visitUnreserved_keyword(ctx) { return ctx.getText(); } /* Identifier opt_uescape | QuotedIdentifier | UnicodeQuotedIdentifier | plsqlvariablename | plsqlidentifier | plsql_unreserved_keyword */ }, { key: "visitIdentifier", value: function visitIdentifier(ctx) { if (ctx.Identifier()) { return ctx.Identifier().getText(); } if (ctx.QuotedIdentifier()) { var qId = ctx.QuotedIdentifier().getText(); return qId.slice(1, qId.length - 1); } if (ctx.UnicodeQuotedIdentifier()) { var _qId = ctx.UnicodeQuotedIdentifier().getText(); return _qId.slice(1, _qId.length - 1); } if (ctx.plsql_unreserved_keyword()) { return ctx.plsql_unreserved_keyword().accept(this); } return ctx.getChild(0).getText(); } }, { key: "visitCol_name_keyword", value: function visitCol_name_keyword(ctx) { return ctx.getChild(0).getText(); } }, { key: "visitPlsql_unreserved_keyword", value: function visitPlsql_unreserved_keyword(ctx) { return ctx.getChild(0).getText(); } // indirection_el+ }, { key: "visitIndirection", value: function visitIndirection(ctx) { var _this6 = this; return ctx.indirection_el().map(function (i) { return i.accept(_this6); }); } // DOT (attr_name | STAR) // | OPEN_BRACKET (a_expr | opt_slice_bound COLON opt_slice_bound) CLOSE_BRACKET }, { key: "visitIndirection_el", value: function visitIndirection_el(ctx) { if (ctx.attr_name()) return ctx.attr_name().accept(this); } // collabel }, { key: "visitAttr_name", value: function visitAttr_name(ctx) { return ctx.collabel().accept(this); } /* identifier | plsql_unreserved_keyword | unreserved_keyword | col_name_keyword | type_func_name_keyword | reserved_keyword */ }, { key: "visitCollabel", value: function visitCollabel(ctx) { return ctx.getChild(0).accept(this); } // check PostgresSQLParser.g4 line 4567 }, { key: "visitReserved_keyword", value: function visitReserved_keyword(ctx) { return ctx.getText(); } // SETOF? simpletypename (opt_array_bounds | ARRAY (OPEN_BRACKET iconst CLOSE_BRACKET)?) // | qualified_name PERCENT (ROWTYPE | TYPE_P) }, { key: "visitTypename", value: function visitTypename(ctx) { if (ctx.simpletypename()) { var arrayExtension = ''; var type = ctx.simpletypename().accept(this); if (ctx.opt_array_bounds()) arrayExtension = ctx.opt_array_bounds().accept(this); if (ctx.ARRAY()) arrayExtension = "[".concat(ctx.iconst() ? ctx.iconst().accept(this) : '', "]"); return { type_name: type.type + arrayExtension, schemaName: type.schemaName }; } } /* generictype | numeric | bit | character | constdatetime | constinterval (opt_interval | OPEN_PAREN iconst CLOSE_PAREN) */ }, { key: "visitSimpletypename", value: function visitSimpletypename(ctx) { if (ctx.generictype()) return ctx.generictype().accept(this); if (ctx.character()) { return { type: ctx.character().accept(this), schemaName: null }; } if (ctx.numeric()) { return { type: ctx.numeric().accept(this), schemaName: null }; } if (ctx.constdatetime()) { return { type: ctx.constdatetime().accept(this), schemaName: null }; } return { type: ctx.getText(), schemaName: null }; } // (TIMESTAMP | TIME) (OPEN_PAREN iconst CLOSE_PAREN)? opt_timezone }, { key: "visitConstdatetime", value: function visitConstdatetime(ctx) { return "".concat(ctx.getChild(0).getText()).concat(ctx.iconst() ? "(".concat(ctx.iconst().accept(this), ")") : ''); } // INT_P | INTEGER | SMALLINT | BIGINT | REAL | FLOAT_P opt_float | DOUBLE_P PRECISION | DECIMAL_P opt_type_modifiers | DEC opt_type_modifiers | NUMERIC opt_type_modifiers | BOOLEAN_P }, { key: "visitNumeric", value: function visitNumeric(ctx) { return ctx.getText(); } // (builtin_function_name | type_function_name | LEFT | RIGHT) attrs? opt_type_modifiers }, { key: "visitGenerictype", value: function visitGenerictype(ctx) { if (ctx.attrs()) { var names = [ctx.getChild(0).getText()].concat(_toConsumableArray(ctx.attrs().accept(this))); var enumName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; return { type: enumName, schemaName: schemaName }; } var type = ''; if (ctx.type_function_name()) type = ctx.type_function_name().accept(this);else type = ctx.getText(); return { type: type + ctx.opt_type_modifiers().getText(), schemaName: null }; } // character_c (OPEN_PAREN iconst CLOSE_PAREN)? }, { key: "visitCharacter", value: function visitCharacter(ctx) { var r = ctx.character_c().accept(this); if (ctx.getChildCount() > 1) { r += "(".concat(ctx.iconst().accept(this), ")"); } return r; } // (CHARACTER | CHAR_P | NCHAR) opt_varying // | VARCHAR // | NATIONAL (CHARACTER | CHAR_P) opt_varying }, { key: "visitCharacter_c", value: function visitCharacter_c(ctx) { // Generate n element integer array [0, 1, ..., n-1] var childIndices = _toConsumableArray(Array(ctx.getChildCount()).keys()); var text = childIndices.reduce(function (acc, i) { acc += "".concat(ctx.getChild(i).getText(), " "); return acc; }, ''); return text.slice(0, text.length - 1); // remove the last whitespace } // identifier | unreserved_keyword | plsql_unreserved_keyword | type_func_name_keyword }, { key: "visitType_function_name", value: function visitType_function_name(ctx) { return ctx.getChild(0).accept(this); } }, { key: "visitType_func_name_keyword", value: function visitType_func_name_keyword(ctx) { return ctx.getText(); } // (OPEN_BRACKET iconst? CLOSE_BRACKET)* }, { key: "visitOpt_array_bounds", value: function visitOpt_array_bounds(ctx) { return ctx.getText(); } // Integral }, { key: "visitIconst", value: function visitIconst(ctx) { return ctx.Integral().getText(); } // CREATE opt_unique INDEX opt_concurrently opt_index_name ON relation_expr access_method_clause OPEN_PAREN index_params CLOSE_PAREN opt_include opt_reloptions opttablespace where_clause // | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name ON relation_expr access_method_clause OPEN_PAREN index_params CLOSE_PAREN opt_include opt_reloptions opttablespace where_clause }, { key: "visitIndexstmt", value: function visitIndexstmt(ctx) { var names = ctx.relation_expr().accept(this); var tableName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; if (ctx.opt_index_name()) { var r = { pathName: { tableName: tableName, schemaName: schemaName }, index: new _AST.Index({ name: ctx.opt_index_name().accept(this), unique: ctx.opt_unique().accept(this), type: ctx.access_method_clause().accept(this), columns: ctx.index_params().accept(this) }) }; return r; } } // name | }, { key: "visitOpt_index_name", value: function visitOpt_index_name(ctx) { var _ctx$name2; return (_ctx$name2 = ctx.name()) === null || _ctx$name2 === void 0 ? void 0 : _ctx$name2.accept(this); } // colid }, { key: "visitName", value: function visitName(ctx) { return ctx.colid().accept(this); } // USING name | }, { key: "visitAccess_method_clause", value: function visitAccess_method_clause(ctx) { if (ctx.name()) return ctx.name().accept(this); } // qualified_name STAR? // | ONLY (qualified_name | OPEN_PAREN qualified_name CLOSE_PAREN) }, { key: "visitRelation_expr", value: function visitRelation_expr(ctx) { return ctx.qualified_name().accept(this); } // index_elem (COMMA index_elem)* }, { key: "visitIndex_params", value: function visitIndex_params(ctx) { var _this7 = this; return ctx.index_elem().map(function (i) { return i.accept(_this7); }).filter(function (col) { return !!col; }); } /* colid index_elem_options | func_expr_windowless index_elem_options | OPEN_PAREN a_expr CLOSE_PAREN index_elem_options */ }, { key: "visitIndex_elem", value: function visitIndex_elem(ctx) { if (ctx.colid()) { return { value: ctx.colid().accept(this), type: _constants.CONSTRAINT_TYPE.STRING }; } return { value: ctx.getText(), type: _constants.CONSTRAINT_TYPE.EXPRESSION }; } // UNIQUE | }, { key: "visitOpt_unique", value: function visitOpt_unique(ctx) { return !!ctx.UNIQUE(); } /* ALTER TABLE (IF_P EXISTS)? relation_expr (alter_table_cmds | partition_cmd) | ALTER TABLE ALL IN_P TABLESPACE name (OWNED BY role_list)? SET TABLESPACE name opt_nowait | ALTER INDEX (IF_P EXISTS)? qualified_name (alter_table_cmds | index_partition_cmd) | ALTER INDEX ALL IN_P TABLESPACE name (OWNED BY role_list)? SET TABLESPACE name opt_nowait | ALTER SEQUENCE (IF_P EXISTS)? qualified_name alter_table_cmds | ALTER VIEW (IF_P EXISTS)? qualified_name alter_table_cmds | ALTER MATERIALIZED VIEW (IF_P EXISTS)? qualified_name alter_table_cmds | ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name (OWNED BY role_list)? SET TABLESPACE name opt_nowait | ALTER FOREIGN TABLE (IF_P EXISTS)? relation_expr alter_table_cmds */ }, { key: "visitAltertablestmt", value: function visitAltertablestmt(ctx) { var _this8 = this; if (ctx.TABLE() && ctx.relation_expr() && ctx.alter_table_cmds()) { var names = ctx.relation_expr().accept(this); var tableName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; var cmds = ctx.alter_table_cmds().accept(this); return cmds.map(function (cmd) { if (!cmd) return null; var kind = null; switch (cmd.kind) { case _constants.TABLE_CONSTRAINT_KIND.FK: kind = COMMAND_KIND.REF; cmd.value.endpoints[0].tableName = tableName; cmd.value.endpoints[0].schemaName = schemaName; _this8.data.refs.push(cmd.value); break; case _constants.TABLE_CONSTRAINT_KIND.UNIQUE: case _constants.TABLE_CONSTRAINT_KIND.PK: case _constants.TABLE_CONSTRAINT_KIND.INDEX: { if (cmd.value.columns.length === 0) break; if (!(cmd.value.pk || cmd.value.unique)) break; // eslint-disable-next-line prefer-destructuring kind = cmd.kind; var table = findTable(_this8.data.tables, schemaName, tableName); if (!table) break; if (cmd.value.columns.length === 1 && (cmd.value.unique || cmd.value.pk)) { var key = cmd.value.columns[0].value; var fieldToUpdate = table.fields.find(function (f) { return f.name === key; }); if (fieldToUpdate) { // If we have an exact match, this is a column, if not, might be an expression fieldToUpdate[cmd.value.unique ? 'unique' : 'pk'] = true; break; } } // multi column constraint -> need to create new index var index = new _AST.Index({ name: cmd.value.name, columns: cmd.value.columns, note: cmd.value.note, pk: cmd.value.pk, type: cmd.value.type, unique: cmd.value.unique }); table.indexes.push(index); break; } default: break; } return { kind: kind, value: cmd.value }; }).filter(function (c) { return c; }); } } // alter_table_cmd (COMMA alter_table_cmd)* }, { key: "visitAlter_table_cmds", value: function visitAlter_table_cmds(ctx) { var _this9 = this; return ctx.alter_table_cmd().map(function (a) { return a.accept(_this9); }); } // check PostgresSQLParser.g4 line 410 }, { key: "visitAlter_table_cmd", value: function visitAlter_table_cmd(ctx) { if (ctx.tableconstraint()) { var constraint = ctx.tableconstraint().accept(this); return constraint; } } /* COMMENT ON object_type_any_name any_name IS comment_text | COMMENT ON COLUMN any_name IS comment_text | COMMENT ON object_type_name name IS comment_text | COMMENT ON TYPE_P typename IS comment_text | COMMENT ON DOMAIN_P typename IS comment_text | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text | COMMENT ON FUNCTION function_with_argtypes IS comment_text | COMMENT ON OPERATOR operator_with_argtypes IS comment_text | COMMENT ON CONSTRAINT name ON any_name IS comment_text | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text | COMMENT ON PROCEDURE function_with_argtypes IS comment_text | COMMENT ON ROUTINE function_with_argtypes IS comment_text | COMMENT ON TRANSFORM FOR typename LANGUAGE name IS comment_text | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text | COMMENT ON LARGE_P OBJECT_P numericonly IS comment_text | COMMENT ON CAST OPEN_PAREN typename AS typename CLOSE_PAREN IS comment_text */ }, { key: "visitCommentstmt", value: function visitCommentstmt(ctx) { if (ctx.object_type_any_name()) { var objectType = ctx.object_type_any_name().accept(this); if (!objectType) return; if (objectType === COMMENT_OBJECT_TYPE.TABLE) { var names = ctx.any_name().accept(this); var tableName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; var table = findTable(this.data.tables, schemaName, tableName); if (!table) return; var note = ctx.comment_text().accept(this); table.note = { value: escapeStr(note) }; } } if (ctx.COLUMN()) { var _names = ctx.any_name().accept(this); var fieldName = (0, _lodash.last)(_names); var _tableName = _names.length > 1 ? _names[_names.length - 2] : undefined; var _schemaName = _names.length > 2 ? _names[_names.length - 3] : undefined; var _table2 = findTable(this.data.tables, _schemaName, _tableName); var field = _table2.fields.find(function (field) { return field.name === fieldName; }); if (!field) return; var _note = ctx.comment_text().accept(this); field.note = { value: escapeStr(_note) }; } } // sconst | NULL_P }, { key: "visitComment_text", value: function visitComment_text(ctx) { if (ctx.NULL_P()) return null; return ctx.sconst().accept(this); } // anysconst opt_uescape }, { key: "visitSconst", value: function visitSconst(ctx) { return ctx.anysconst().accept(this); } // StringConstant | UnicodeEscapeStringConstant | BeginDollarStringConstant DollarText* EndDollarStringConstant | EscapeStringConstant }, { key: "visitAnysconst", value: function visitAnysconst(ctx) { var value = ctx.getChild(0).getText(); return value.slice(1, value.length - 1); } // TABLE | SEQUENCE | VIEW | MATERIALIZED VIEW | INDEX | FOREIGN TABLE | COLLATION | CONVERSION_P | STATISTICS | TEXT_P SEARCH PARSER | TEXT_P SEARCH DICTIONARY | TEXT_P SEARCH TEMPLATE | TEXT_P SEARCH CONFIGURATION }, { key: "visitObject_type_any_name", value: function visitObject_type_any_name(ctx) { if (ctx.TABLE()) return COMMENT_OBJECT_TYPE.TABLE; } // colid attrs? }, { key: "visitAny_name", value: function visitAny_name(ctx) { var r = [ctx.colid().accept(this)]; if (ctx.attrs()) { r.push.apply(r, _toConsumableArray(ctx.attrs().accept(this))); } return r; } // (DOT attr_name)+ }, { key: "visitAttrs", value: function visitAttrs(ctx) { var _this10 = this; return ctx.attr_name().map(function (a) { return a.accept(_this10); }); } /* CREATE opt_or_replace AGGREGATE func_name aggr_args definition | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition | CREATE OPERATOR any_operator definition | CREATE TYPE_P any_name definition | CREATE TYPE_P any_name | CREATE TYPE_P any_name AS OPEN_PAREN opttablefuncelementlist CLOSE_PAREN | CREATE TYPE_P any_name AS ENUM_P OPEN_PAREN opt_enum_val_list CLOSE_PAREN | CREATE TYPE_P any_name AS RANGE definition | CREATE TEXT_P SEARCH PARSER any_name definition | CREATE TEXT_P SEARCH DICTIONARY any_name definition | CREATE TEXT_P SEARCH TEMPLATE any_name definition | CREATE TEXT_P SEARCH CONFIGURATION any_name definition | CREATE COLLATION any_name definition | CREATE COLLATION IF_P NOT EXISTS any_name definition | CREATE COLLATION any_name FROM any_name | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name */ }, { key: "visitDefinestmt", value: function visitDefinestmt(ctx) { if (ctx.TYPE_P() && ctx.opt_enum_val_list()) { var names = ctx.any_name(0).accept(this); var enumName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; var values = ctx.opt_enum_val_list().accept(this).map(function (e) { return { name: e }; }); if (!values) return; // enum is a keyworkd var _enum = new _AST.Enum({ name: enumName, schemaName: schemaName, values: values }); this.data.enums.push(_enum.toJSON()); } } // enum_val_list | }, { key: "visitOpt_enum_val_list", value: function visitOpt_enum_val_list(ctx) { var _ctx$enum_val_list; return (_ctx$enum_val_list = ctx.enum_val_list()) === null || _ctx$enum_val_list === void 0 ? void 0 : _ctx$enum_val_list.accept(this); } // sconst (COMMA sconst)* }, { key: "visitEnum_val_list", value: function visitEnum_val_list(ctx) { var _this11 = this; return ctx.sconst().map(function (s) { return s.accept(_this11); }); } // insertstmt // : opt_with_clause INSERT INTO insert_target insert_rest opt_on_conflict returning_clause // ; }, { key: "visitInsertstmt", value: function visitInsertstmt(ctx) { var names = ctx.insert_target().accept(this); var tableName = (0, _lodash.last)(names); var schemaName = names.length > 1 ? names[names.length - 2] : undefined; var _ctx$insert_rest$acce = ctx.insert_rest().accept(this), columns = _ctx$insert_rest$acce.columns, values = _ctx$insert_rest$acce.values; var record = new _AST.TableRecord({ schemaName: schemaName, tableName: tableName, columns: columns, values: values }); this.data.records.push(record); } }, { key: "visitInsert_target", value: function visitInsert_target(ctx) { return ctx.qualified_name().accept(this); } // insert_rest // : selectstmt // | OVERRIDING override_kind VALUE_P selectstmt // | OPEN_PAREN insert_column_list CLOSE_PAREN (OVERRIDING override_kind VALUE_P)? selectstmt // | DEFAULT VALUES // ; }, { key: "visitInsert_rest", value: function visitInsert_rest(ctx) { var columns = ctx.insert_column_list() ? ctx.insert_column_list().accept(this) : []; var rowsValue = ctx.selectstmt().accept(this) || []; // each sub array represents a set of value of a row // [ // [ // { value: '1', type: 'number' }, // undefined, // { // value: '{"theme": "dark", "notifications": true}', // type: 'string', // type_name: 'JSONB', // schemaName: null // }, // undefined, // ] // ] var sanitizeRowValue = function sanitizeRowValue(rowValue) { return rowValue.filter(function (row) { return row; }).map(function (_ref) { var value = _ref.value, type = _ref.type; return { value: value, type: type }; }); }; var sanitizedRowsValue = rowsValue.filter(function (rowValue) { return Array.isArray(rowValue); }).map(sanitizeRowValue); return { columns: columns, values: sanitizedRowsValue }; } // insert_column_list // : insert_column_item (COMMA insert_column_item)* // ; }, { key: "visitInsert_column_list", value: function visitInsert_column_list(ctx) { var _this12 = this; return ctx.insert_column_item().map(function (colItem) { return colItem.accept(_this12); }); } // insert_column_item // : colid opt_indirection // ; }, { key: "visitInsert_column_item", value: function visitInsert_column_item(ctx) { return ctx.colid().accept(this); } // selectstmt // : select_no_parens // | select_with_parens // ; }, { key: "visitSelectstmt", value: function visitSelectstmt(ctx) { if (!ctx.select_no_parens()) { return null; } return ctx.select_no_parens().accept(this); } // select_no_parens // : select_clause opt_sort_clause (for_locking_clause opt_select_limit | select_limit opt_for_locking_clause)? // | with_clause select_clause opt_sort_clause (for_locking_clause opt_select_limit | select_limit opt_for_locking_clause)? // ; }, { key: "visitSelect_no_parens", value: function visitSelect_no_parens(ctx) { return ctx.select_clause().accept(this); } // select_clause // : simple_select // | select_with_parens // ; }, { key: "visitSelect_clause", value: function visitSelect_clause(ctx) { return ctx.simple_select().accept(this); } // simple_select // : ( SELECT (opt_all_clause into_clause opt_target_list | distinct_clause target_list) // into_clause // from_clause // where_clause // group_clause // having_clause // window_clause // | values_clause // | TABLE relation_expr // | select_with_parens set_operator_with_all_or_distinct (simple_select | select_with_parens) // ) // (set_operator_with_all_or_distinct (simple_select | select_with_parens))* // ; }, { key: "visitSimple_select", value: function visitSimple_select(ctx) { if (!ctx.values_clause()) { return null; } return ctx.values_clause().accept(this); } // values_clause // : VALUES OPEN_PAREN expr_list CLOSE_PAREN (COMMA OPEN_PAREN expr_list CLOSE_PAREN)* // ; }, { key: "visitValues_clause", value: function visitValues_clause(ctx) { var _this13 = this; return ctx.expr_list().map(function (expr) { var rawValues = expr.accept(_this13); // We get the value of the c_expr through: // a_expr->a_expr_qual->a_expr_lessless->a_expr_or->a_expr_and-> // a_expr_between->a_expr_i