@dbml/core
Version:
> TODO: description
1,153 lines (1,094 loc) • 57.1 kB
JavaScript
"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 _MySqlParserVisitor = _interopRequireDefault(require("../../parsers/mysql/MySqlParserVisitor"));
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 class-methods-use-this */
var TABLE_OPTIONS_KIND = {
NOTE: 'note'
};
var ALTER_KIND = {
ADD_PK: 'add_pk',
ADD_FK: 'add_fk'
};
var INDEX_OPTION_KIND = {
TYPE: 'type'
};
var getTableNames = function getTableNames(names) {
var tableName = (0, _lodash.last)(names);
var schemaName = names.length > 1 ? names[names.length - 2] : undefined;
return {
tableName: tableName,
schemaName: schemaName
};
};
var getFieldNames = function getFieldNames(names) {
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;
return {
fieldName: fieldName,
tableName: tableName,
schemaName: schemaName
};
};
var MySQLASTGen = /*#__PURE__*/function (_MySQLParserVisitor) {
_inherits(MySQLASTGen, _MySQLParserVisitor);
var _super = _createSuper(MySQLASTGen);
function MySQLASTGen() {
var _this;
_classCallCheck(this, MySQLASTGen);
_this = _super.call(this);
_this.data = {
schemas: [],
tables: [],
refs: [],
enums: [],
tableGroups: [],
aliases: [],
project: {},
records: []
};
return _this;
}
// TODO: support configurable default schema name other than 'public'
_createClass(MySQLASTGen, [{
key: "findTable",
value: function findTable(schemaName, tableName) {
var realSchemaName = schemaName || 'public';
var table = this.data.tables.find(function (t) {
var targetSchemaName = t.schemaName || 'public';
return targetSchemaName === realSchemaName && t.name === tableName;
});
return table;
}
// sqlStatements? (MINUS MINUS)? EOF
}, {
key: "visitRoot",
value: function visitRoot(ctx) {
var _ctx$sqlStatements;
(_ctx$sqlStatements = ctx.sqlStatements()) === null || _ctx$sqlStatements === void 0 ? void 0 : _ctx$sqlStatements.accept(this);
return this.data;
}
// (sqlStatement (MINUS MINUS)? SEMI? | emptyStatement_)* (sqlStatement ((MINUS MINUS)? SEMI)? | emptyStatement_)
}, {
key: "visitSqlStatements",
value: function visitSqlStatements(ctx) {
var _this2 = this;
ctx.sqlStatement().forEach(function (statement) {
statement.accept(_this2);
});
}
// ddlStatement | dmlStatement | transactionStatement | replicationStatement | preparedStatement | administrationStatement | utilityStatement
}, {
key: "visitSqlStatement",
value: function visitSqlStatement(ctx) {
if (ctx.ddlStatement()) {
ctx.ddlStatement().accept(this);
return;
}
if (ctx.dmlStatement()) {
ctx.dmlStatement().accept(this);
}
}
// createDatabase | createEvent | createIndex | createLogfileGroup | createProcedure | createFunction | createServer | createTable | createTablespaceInnodb | createTablespaceNdb | createTrigger | createView | createRole
// | alterDatabase | alterEvent | alterFunction | alterInstance | alterLogfileGroup | alterProcedure | alterServer | alterTable | alterTablespace | alterView
// | dropDatabase | dropEvent | dropIndex | dropLogfileGroup | dropProcedure | dropFunction | dropServer | dropTable | dropTablespace | dropTrigger | dropView | dropRole
// | setRole| renameTable | truncateTable
}, {
key: "visitDdlStatement",
value: function visitDdlStatement(ctx) {
var _this3 = this;
if (ctx.createTable()) {
var _this$data$refs, _this$data$refs2;
var createTableResult = ctx.createTable().accept(this);
if (!createTableResult) return;
var tableName = createTableResult.tableName,
schemaName = createTableResult.schemaName,
definitions = createTableResult.definitions,
options = createTableResult.options;
var _definitions$reduce = definitions.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.UNIQUE) 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.PK) {
/** @type {Index} */
var index = ele.value;
if (index.columns.length > 1) acc[1].push(ele.value);else acc[3] = index;
}
return acc;
}, [[], [], [], null]),
_definitions$reduce2 = _slicedToArray(_definitions$reduce, 4),
fieldsData = _definitions$reduce2[0],
indexes = _definitions$reduce2[1],
tableRefs = _definitions$reduce2[2],
singlePkIndex = _definitions$reduce2[3];
var inlineRefsOfFields = fieldsData.map(function (fieldData) {
var _field$type$type_name;
var field = fieldData.field,
inlineRefs = fieldData.inlineRefs;
if (((_field$type$type_name = field.type.type_name) === null || _field$type$type_name === void 0 ? void 0 : _field$type$type_name.toLowerCase()) === 'enum') {
var values = field.type.args.map(function (arg) {
var newValue = arg.replace(/'|"|`/g, '').trim();
return {
name: newValue
};
});
var _enum = new _AST.Enum({
name: "".concat(tableName, "_").concat(field.name, "_enum"),
schemaName: schemaName,
values: values
});
field.type.type_name = _enum.name;
field.type.schemaName = _enum.schemaName;
_this3.data.enums.push(_enum);
}
inlineRefs.forEach(function (inlineRef) {
inlineRef.endpoints[0].tableName = tableName;
inlineRef.endpoints[0].schemaName = schemaName;
inlineRef.endpoints[0].fieldNames = [field.name];
});
return inlineRefs;
});
(_this$data$refs = this.data.refs).push.apply(_this$data$refs, _toConsumableArray((0, _lodash.flatten)(inlineRefsOfFields)));
(_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;
})));
var tableOptions = options.reduce(function (acc, option) {
acc[option.kind] = option.value;
return acc;
}, {});
var table = new _AST.Table(_objectSpread({
name: tableName,
schemaName: schemaName,
fields: fieldsData.map(function (fd) {
return fd.field;
}),
indexes: indexes
}, tableOptions));
if (singlePkIndex) {
var field = table.fields.find(function (f) {
return f.name === singlePkIndex.columns[0].value;
});
if (field) field.pk = true;
}
this.data.tables.push(table.toJSON());
} else if (ctx.alterTable()) {
ctx.alterTable().accept(this);
} else if (ctx.createIndex()) {
ctx.createIndex().accept(this);
}
}
// createTable:
// CREATE TEMPORARY? TABLE ifNotExists? tableName (LIKE tableName | '(' LIKE parenthesisTable = tableName ')') # copyCreateTable
// | CREATE TEMPORARY? TABLE ifNotExists? tableName createDefinitions? (tableOption (','? tableOption)*)? partitionDefinitions? keyViolate = (IGNORE | REPLACE)? AS? selectStatement # queryCreateTable
// | CREATE TEMPORARY? TABLE ifNotExists? tableName createDefinitions (tableOption (','? tableOption)*)? partitionDefinitions? # columnCreateTable
}, {
key: "visitCopyCreateTable",
value: function visitCopyCreateTable() {
// not supported
}
}, {
key: "visitQueryCreateTable",
value: function visitQueryCreateTable(ctx) {
var _ctx$tableOption,
_this4 = this;
var names = ctx.tableName().accept(this);
var _getTableNames = getTableNames(names),
tableName = _getTableNames.tableName,
schemaName = _getTableNames.schemaName;
if (!ctx.createDefinitions()) return null;
var definitions = ctx.createDefinitions().accept(this).filter(function (d) {
return d === null || d === void 0 ? void 0 : d.kind;
});
var options = ((_ctx$tableOption = ctx.tableOption()) === null || _ctx$tableOption === void 0 ? void 0 : _ctx$tableOption.map(function (to) {
return to.accept(_this4);
}).filter(function (o) {
return o === null || o === void 0 ? void 0 : o.kind;
})) || [];
return {
tableName: tableName,
schemaName: schemaName,
definitions: definitions,
options: options
};
}
}, {
key: "visitColumnCreateTable",
value: function visitColumnCreateTable(ctx) {
var _this5 = this;
var names = ctx.tableName().accept(this);
var _getTableNames2 = getTableNames(names),
tableName = _getTableNames2.tableName,
schemaName = _getTableNames2.schemaName;
var definitions = ctx.createDefinitions().accept(this).filter(function (d) {
return d === null || d === void 0 ? void 0 : d.kind;
});
var options = ctx.tableOption().map(function (to) {
return to.accept(_this5);
}).filter(function (o) {
return o === null || o === void 0 ? void 0 : o.kind;
});
return {
tableName: tableName,
schemaName: schemaName,
definitions: definitions,
options: options
};
}
// tableOption visits: check MySqlParser.g4 line 491.
// Out of all these rules, We only care about tableOptionComment
// COMMENT '='? STRING_LITERAL
}, {
key: "visitTableOptionComment",
value: function visitTableOptionComment(ctx) {
var quotedString = ctx.STRING_LITERAL().getText();
return {
kind: TABLE_OPTIONS_KIND.NOTE,
value: {
value: quotedString.slice(1, quotedString.length - 1)
}
};
}
// fullId
}, {
key: "visitTableName",
value: function visitTableName(ctx) {
return ctx.fullId().accept(this);
}
// uid (DOT_ID | '.' uid)?
}, {
key: "visitFullId",
value: function visitFullId(ctx) {
var _this6 = this;
var names = ctx.uid().map(function (u) {
return u.accept(_this6);
});
if (ctx.DOT_ID()) {
// DOT_ID: '.' ID_LITERAL
var text = ctx.DOT_ID().getText();
names.push(text.slice(1));
}
return names;
}
// simpleId | CHARSET_REVERSE_QOUTE_STRING | STRING_LITERAL
}, {
key: "visitUid",
value: function visitUid(ctx) {
if (ctx.simpleId()) return ctx.simpleId().accept(this);
// both CHARSET_REVERSE_QOUTE_STRING and STRING_LITERAL contain outside quotes like '...', "..." or `...`
var quotedString = ctx.getChild(0).getText();
return quotedString.slice(1, quotedString.length - 1);
}
// ID | charsetNameBase | transactionLevelBase | engineNameBase | privilegesBase
// | intervalTypeBase | dataTypeBase | keywordsCanBeId | scalarFunctionName
}, {
key: "visitSimpleId",
value: function visitSimpleId(ctx) {
return ctx.getChild(0).getText();
}
// '(' createDefinition (',' createDefinition)* ')'
}, {
key: "visitCreateDefinitions",
value: function visitCreateDefinitions(ctx) {
var _this7 = this;
return ctx.createDefinition().map(function (cd) {
return cd.accept(_this7);
});
}
// createDefinition:
// fullColumnName columnDefinition # columnDeclaration
// | tableConstraint NOT? ENFORCED? # constraintDeclaration
// | indexColumnDefinition # indexDeclaration
}, {
key: "visitColumnDeclaration",
value: function visitColumnDeclaration(ctx) {
var names = ctx.fullColumnName().accept(this);
var _getFieldNames = getFieldNames(names),
fieldName = _getFieldNames.fieldName;
var _ctx$columnDefinition = ctx.columnDefinition().accept(this),
type = _ctx$columnDefinition.type,
constraints = _ctx$columnDefinition.constraints;
var field = new _AST.Field(_objectSpread({
name: fieldName,
type: type
}, constraints));
return {
kind: _constants.TABLE_CONSTRAINT_KIND.FIELD,
value: {
field: field,
inlineRefs: constraints.inlineRefs
}
};
}
}, {
key: "visitConstraintDeclaration",
value: function visitConstraintDeclaration(ctx) {
return ctx.tableConstraint().accept(this);
}
}, {
key: "visitIndexDeclaration",
value: function visitIndexDeclaration(ctx) {
return ctx.indexColumnDefinition().accept(this);
}
// uid (dottedId dottedId?)? | .? dottedId dottedId?
}, {
key: "visitFullColumnName",
value: function visitFullColumnName(ctx) {
var _this8 = this;
var names = [];
if (ctx.uid()) names.push(ctx.uid().accept(this));
names.push.apply(names, _toConsumableArray(ctx.dottedId().map(function (dId) {
return dId.accept(_this8);
})));
return names;
}
// DOT_ID | '.' uid
}, {
key: "visitDottedId",
value: function visitDottedId(ctx) {
if (ctx.DOT_ID()) {
// DOT_ID: '.' ID_LITERAL
var text = ctx.DOT_ID().getText();
return text.slice(1);
}
return ctx.uid().accept(this);
}
// dataType columnConstraint* NOT? ENFORCED?
}, {
key: "visitColumnDefinition",
value: function visitColumnDefinition(ctx) {
var _this9 = this;
var type = ctx.dataType().accept(this);
var constraints = {
inlineRefs: []
};
ctx.columnConstraint().forEach(function (c) {
var constraint = c.accept(_this9);
if (!constraint) return;
if (constraint.kind === _constants.COLUMN_CONSTRAINT_KIND.INLINE_REF) {
constraints.inlineRefs.push(constraint.value);
return;
}
constraints[constraint.kind] = constraint.value;
});
return {
type: type,
constraints: constraints
};
}
// dataType visits:
// stringDataType | nationalVaryingStringDataType | nationalStringDataType | dimensionDataType | simpleDataType
// | collectionDataType | spatialDataType | longVarcharDataType | longVarbinaryDataType
// typeName = ( CHAR | CHARACTER | VARCHAR | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | NCHAR | NVARCHAR | LONG )
// VARYING? lengthOneDimension? BINARY? (charSet charsetName)? (COLLATE collationName | BINARY)? # stringDataType
}, {
key: "visitStringDataType",
value: function visitStringDataType(ctx) {
var typeName = ctx.typeName.text;
if (ctx.lengthOneDimension()) typeName += ctx.lengthOneDimension().getText();
return {
type_name: typeName,
schemaName: null
};
}
// NATIONAL typeName = (CHAR | CHARACTER) VARYING lengthOneDimension? BINARY?
}, {
key: "visitNationalVaryingStringDataType",
value: function visitNationalVaryingStringDataType(ctx) {
var typeName = ctx.typeName.text;
if (ctx.lengthOneDimension()) typeName += ctx.lengthOneDimension().getText();
return {
type_name: typeName,
schemaName: null
};
}
// NATIONAL typeName = (VARCHAR | CHARACTER | CHAR) lengthOneDimension? BINARY?
// | NCHAR typeName = VARCHAR lengthOneDimension? BINARY?
}, {
key: "visitNationalStringDataType",
value: function visitNationalStringDataType(ctx) {
var typeName = ctx.typeName.text;
if (ctx.lengthOneDimension()) typeName += ctx.lengthOneDimension().getText();
return {
type_name: typeName,
schemaName: null
};
}
// typeName = (TINYINT | SMALLINT | MEDIUMINT | INT | INTEGER | BIGINT | MIDDLEINT | INT1 | INT2 | INT3 | INT4 | INT8) lengthOneDimension? (SIGNED | UNSIGNED | ZEROFILL)*
// | typeName = REAL lengthTwoDimension? (SIGNED | UNSIGNED | ZEROFILL)*
// | typeName = DOUBLE PRECISION? lengthTwoDimension? (SIGNED | UNSIGNED | ZEROFILL)*
// | typeName = (DECIMAL | DEC | FIXED | NUMERIC | FLOAT | FLOAT4 | FLOAT8) lengthTwoOptionalDimension? (SIGNED | UNSIGNED | ZEROFILL)*
// | typeName = (BIT | TIME | TIMESTAMP | DATETIME | BINARY | VARBINARY | BLOB | YEAR) lengthOneDimension?
}, {
key: "visitDimensionDataType",
value: function visitDimensionDataType(ctx) {
var typeName = ctx.typeName.text;
if (ctx.lengthOneDimension()) typeName += ctx.lengthOneDimension().getText();
if (ctx.lengthTwoDimension()) typeName += ctx.lengthTwoDimension().getText();
if (ctx.lengthTwoOptionalDimension()) typeName += ctx.lengthTwoOptionalDimension().getText();
return {
type_name: typeName,
schemaName: null
};
}
// typeName = (DATE | TINYBLOB | MEDIUMBLOB | LONGBLOB | BOOL | BOOLEAN | SERIAL)
}, {
key: "visitSimpleDataType",
value: function visitSimpleDataType(ctx) {
var typeName = ctx.typeName.text;
return {
type_name: typeName,
schemaName: null
};
}
// typeName = (ENUM | SET) collectionOptions BINARY? (charSet charsetName)?
}, {
key: "visitCollectionDataType",
value: function visitCollectionDataType(ctx) {
if (ctx.SET()) {
var _typeName = ctx.typeName.text + ctx.collectionOptions().getText();
return {
type_name: _typeName,
schemaName: null
};
}
var typeName = ctx.typeName.text;
var args = ctx.collectionOptions().accept(this);
return {
type_name: typeName,
args: args,
schemaName: null
};
}
// '(' STRING_LITERAL (',' STRING_LITERAL)* ')'
}, {
key: "visitCollectionOptions",
value: function visitCollectionOptions(ctx) {
return ctx.STRING_LITERAL().map(function (s) {
return s.getText();
});
}
// typeName = (GEOMETRYCOLLECTION | GEOMCOLLECTION | LINESTRING | MULTILINESTRING | MULTIPOINT | MULTIPOLYGON | POINT | POLYGON | JSON | GEOMETRY) (SRID decimalLiteral)?
}, {
key: "visitSpatialDataType",
value: function visitSpatialDataType(ctx) {
var typeName = ctx.typeName.text;
return {
type_name: typeName,
schemaName: null
};
}
// typeName = LONG VARCHAR? BINARY? (charSet charsetName)? (COLLATE collationName)?
}, {
key: "visitLongVarcharDataType",
value: function visitLongVarcharDataType(ctx) {
var typeName = ctx.typeName.text;
return {
type_name: typeName,
schemaName: null
};
}
// LONG VARBINARY
}, {
key: "visitLongVarbinaryDataType",
value: function visitLongVarbinaryDataType(ctx) {
var typeName = "".concat(ctx.LONG().getText(), " ").concat(ctx.VARBINARY().getText());
return {
type_name: typeName,
schemaName: null
};
}
// columnConstraint visits:
// : nullNotnull # nullColumnConstraint
// | DEFAULT defaultValue # defaultColumnConstraint
// | VISIBLE # visibilityColumnConstraint
// | INVISIBLE # invisibilityColumnConstraint
// | (AUTO_INCREMENT | ON UPDATE currentTimestamp) # autoIncrementColumnConstraint
// | PRIMARY? KEY # primaryKeyColumnConstraint
// | UNIQUE KEY? # uniqueKeyColumnConstraint
// | COMMENT STRING_LITERAL # commentColumnConstraint
// | COLUMN_FORMAT colformat = (FIXED | DYNAMIC | DEFAULT) # formatColumnConstraint
// | STORAGE storageval = (DISK | MEMORY | DEFAULT) # storageColumnConstraint
// | referenceDefinition # referenceColumnConstraint
// | COLLATE collationName # collateColumnConstraint
// | (GENERATED ALWAYS)? AS '(' expression ')' (VIRTUAL | STORED)? # generatedColumnConstraint
// | SERIAL DEFAULT VALUE # serialDefaultColumnConstraint
// | (CONSTRAINT name = uid?)? CHECK '(' expression ')' # checkColumnConstraint
// nullColumnConstraint: nullNotnull
}, {
key: "visitNullColumnConstraint",
value: function visitNullColumnConstraint(ctx) {
return ctx.nullNotnull().accept(this);
}
// NOT? (NULL_LITERAL | NULL_SPEC_LITERAL)
}, {
key: "visitNullNotnull",
value: function visitNullNotnull(ctx) {
var notNull = false;
if (ctx.NOT()) notNull = true;
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.NOT_NULL,
value: notNull
};
}
// defaultColumnConstraint: DEFAULT defaultValue
}, {
key: "visitDefaultColumnConstraint",
value: function visitDefaultColumnConstraint(ctx) {
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.DEFAULT,
value: ctx.defaultValue().accept(this)
};
}
// autoIncrementColumnConstraint: (AUTO_INCREMENT | ON UPDATE currentTimestamp)
}, {
key: "visitAutoIncrementColumnConstraint",
value: function visitAutoIncrementColumnConstraint(ctx) {
if (ctx.AUTO_INCREMENT()) {
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.INCREMENT,
value: true
};
}
return null;
}
// primaryKeyColumnConstraint: PRIMARY? KEY
}, {
key: "visitPrimaryKeyColumnConstraint",
value: function visitPrimaryKeyColumnConstraint(ctx) {
if (ctx.PRIMARY()) {
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.PK,
value: true
};
}
return null;
}
// uniqueKeyColumnConstraint: UNIQUE KEY?
}, {
key: "visitUniqueKeyColumnConstraint",
value: function visitUniqueKeyColumnConstraint() {
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.UNIQUE,
value: true
};
}
// commentColumnConstraint: COMMENT STRING_LITERAL
}, {
key: "visitCommentColumnConstraint",
value: function visitCommentColumnConstraint(ctx) {
var quotedString = ctx.STRING_LITERAL().getText();
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.NOTE,
value: {
value: quotedString.slice(1, quotedString.length - 1)
}
};
}
// referenceColumnConstraint: referenceDefinition
}, {
key: "visitReferenceColumnConstraint",
value: function visitReferenceColumnConstraint(ctx) {
var value = ctx.referenceDefinition().accept(this);
return {
kind: _constants.COLUMN_CONSTRAINT_KIND.INLINE_REF,
value: value
};
}
// NULL_LITERAL | CAST '(' expression AS convertedDataType ')' | unaryOperator? constant
// | currentTimestamp (ON UPDATE currentTimestamp)? | '(' expression ')' | '(' fullId ')'
}, {
key: "visitDefaultValue",
value: function visitDefaultValue(ctx) {
var _ctx$currentTimestamp;
if (ctx.NULL_LITERAL()) {
return {
value: ctx.NULL_LITERAL().getText(),
type: _constants.DATA_TYPE.BOOLEAN // same behavior as the legacy parser
};
}
if (ctx.expression()) {
return {
value: ctx.expression().getText(),
type: _constants.DATA_TYPE.EXPRESSION
};
}
if (ctx.constant()) {
if (ctx.unaryOperator()) {
return {
value: ctx.getText(),
type: _constants.DATA_TYPE.EXPRESSION
};
}
var _ctx$constant$accept = ctx.constant().accept(this),
value = _ctx$constant$accept.value,
type = _ctx$constant$accept.type;
return {
value: value,
type: type
};
}
if ((_ctx$currentTimestamp = ctx.currentTimestamp()) !== null && _ctx$currentTimestamp !== void 0 && _ctx$currentTimestamp.length) {
return {
value: ctx.currentTimestamp()[0].getText(),
type: _constants.DATA_TYPE.EXPRESSION
};
}
return {
value: ctx.getText(),
type: _constants.DATA_TYPE.EXPRESSION
};
}
// stringLiteral | decimalLiteral | '-' decimalLiteral | hexadecimalLiteral | booleanLiteral
// | REAL_LITERAL | BIT_STRING | NOT? nullLiteral = (NULL_LITERAL | NULL_SPEC_LITERAL)
}, {
key: "visitConstant",
value: function visitConstant(ctx) {
if (ctx.stringLiteral()) {
var quotedString = ctx.stringLiteral().getText();
return {
value: quotedString.slice(1, quotedString.length - 1),
type: _constants.DATA_TYPE.STRING
};
}
if (ctx.decimalLiteral()) {
if (ctx.getChildCount() > 1) {
return {
value: ctx.getText(),
type: _constants.DATA_TYPE.EXPRESSION
};
}
return {
value: ctx.decimalLiteral().getText(),
type: _constants.DATA_TYPE.NUMBER
};
}
if (ctx.hexadecimalLiteral()) {
return {
value: ctx.hexadecimalLiteral().getText(),
type: _constants.DATA_TYPE.NUMBER
};
}
if (ctx.booleanLiteral()) {
return {
value: ctx.booleanLiteral().getText(),
type: _constants.DATA_TYPE.BOOLEAN
};
}
if (ctx.REAL_LITERAL()) {
return {
value: ctx.REAL_LITERAL().getText(),
type: _constants.DATA_TYPE.NUMBER
};
}
if (ctx.BIT_STRING()) {
return {
value: ctx.BIT_STRING().getText(),
type: _constants.DATA_TYPE.STRING
};
}
return {
value: ctx.getText(),
type: _constants.DATA_TYPE.STRING
};
}
// REFERENCES tableName indexColumnNames? (MATCH matchType = (FULL | PARTIAL | SIMPLE))? referenceAction?
}, {
key: "visitReferenceDefinition",
value: function visitReferenceDefinition(ctx) {
var _ctx$referenceAction;
var names = ctx.tableName().accept(this);
var _getTableNames3 = getTableNames(names),
tableName = _getTableNames3.tableName,
schemaName = _getTableNames3.schemaName;
if (!ctx.indexColumnNames()) return null;
var actions = ((_ctx$referenceAction = ctx.referenceAction()) === null || _ctx$referenceAction === void 0 ? void 0 : _ctx$referenceAction.accept(this)) || {};
var fieldNames = ctx.indexColumnNames().accept(this).map(function (icn) {
return icn.value;
});
var endpoint0 = new _AST.Endpoint({
tableName: null,
schemaName: null,
fieldNames: null,
relation: '*'
});
var endpoint1 = new _AST.Endpoint({
tableName: tableName,
schemaName: schemaName,
fieldNames: fieldNames,
relation: '1'
});
return new _AST.Ref({
endpoints: [endpoint0, endpoint1],
onUpdate: actions.onUpdate,
onDelete: actions.onDelete
});
}
// '(' indexColumnName (',' indexColumnName)* ')'
}, {
key: "visitIndexColumnNames",
value: function visitIndexColumnNames(ctx) {
var _this10 = this;
return ctx.indexColumnName().map(function (indexColumnName) {
return indexColumnName.accept(_this10);
});
}
// ((uid | STRING_LITERAL) ('(' decimalLiteral ')')? | expression) sortType = (ASC | DESC)?
}, {
key: "visitIndexColumnName",
value: function visitIndexColumnName(ctx) {
if (ctx.uid()) {
return {
type: _constants.CONSTRAINT_TYPE.COLUMN,
value: ctx.uid().accept(this)
};
}
if (ctx.STRING_LITERAL()) {
var quotedString = ctx.STRING_LITERAL().getText();
return {
type: _constants.CONSTRAINT_TYPE.STRING,
value: quotedString.slice(1, quotedString.length - 1)
};
}
return {
type: _constants.CONSTRAINT_TYPE.EXPRESSION,
value: ctx.expression().getText()
};
}
// ON DELETE onDelete = referenceControlType (ON UPDATE onUpdate = referenceControlType)?
// | ON UPDATE onUpdate = referenceControlType (ON DELETE onDelete = referenceControlType)?
}, {
key: "visitReferenceAction",
value: function visitReferenceAction(ctx) {
var _ctx$onDelete, _ctx$onUpdate;
var r = {};
r.onDelete = (_ctx$onDelete = ctx.onDelete) === null || _ctx$onDelete === void 0 ? void 0 : _ctx$onDelete.accept(this);
r.onUpdate = (_ctx$onUpdate = ctx.onUpdate) === null || _ctx$onUpdate === void 0 ? void 0 : _ctx$onUpdate.accept(this);
return r;
}
// RESTRICT | CASCADE | SET NULL_LITERAL | NO ACTION | SET DEFAULT
}, {
key: "visitReferenceControlType",
value: function visitReferenceControlType(ctx) {
var childIndices = _toConsumableArray(Array(ctx.getChildCount()).keys());
var text = childIndices.reduce(function (acc, i) {
return "".concat(acc).concat(ctx.getChild(i).getText(), " ");
}, '');
return text.slice(0, text.length - 1); // remove the last whitespace
}
// tableConstraint:
// (CONSTRAINT name = uid?)? PRIMARY KEY index = uid? indexType? indexColumnNames indexOption* # primaryKeyTableConstraint
// | (CONSTRAINT name = uid?)? UNIQUE indexFormat = (INDEX | KEY)? index = uid? indexType? indexColumnNames indexOption* # uniqueKeyTableConstraint
// | (CONSTRAINT name = uid?)? FOREIGN KEY index = uid? indexColumnNames referenceDefinition # foreignKeyTableConstraint
// | (CONSTRAINT name = uid?)? CHECK '(' expression ')' # checkTableConstraint
// Note: In MySQL 8.0.16 and higher, 'index' is ignored. For maximum compability, we use both 'name' and 'index' for naming index
// https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
}, {
key: "visitPrimaryKeyTableConstraint",
value: function visitPrimaryKeyTableConstraint(ctx) {
var _ctx$name,
_ctx$index,
_ctx$indexType,
_ctx$indexOption,
_this11 = this;
var name = ((_ctx$name = ctx.name) === null || _ctx$name === void 0 ? void 0 : _ctx$name.accept(this)) || ((_ctx$index = ctx.index) === null || _ctx$index === void 0 ? void 0 : _ctx$index.accept(this));
var type = (_ctx$indexType = ctx.indexType()) === null || _ctx$indexType === void 0 ? void 0 : _ctx$indexType.accept(this);
if ((_ctx$indexOption = ctx.indexOption()) !== null && _ctx$indexOption !== void 0 && _ctx$indexOption.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this11);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
return {
kind: _constants.TABLE_CONSTRAINT_KIND.PK,
value: new _AST.Index({
name: name,
pk: true,
columns: columns,
type: type
})
};
}
}, {
key: "visitUniqueKeyTableConstraint",
value: function visitUniqueKeyTableConstraint(ctx) {
var _ctx$name2,
_ctx$index2,
_ctx$indexType2,
_ctx$indexOption2,
_this12 = this;
var name = ((_ctx$name2 = ctx.name) === null || _ctx$name2 === void 0 ? void 0 : _ctx$name2.accept(this)) || ((_ctx$index2 = ctx.index) === null || _ctx$index2 === void 0 ? void 0 : _ctx$index2.accept(this));
var type = (_ctx$indexType2 = ctx.indexType()) === null || _ctx$indexType2 === void 0 ? void 0 : _ctx$indexType2.accept(this);
if ((_ctx$indexOption2 = ctx.indexOption()) !== null && _ctx$indexOption2 !== void 0 && _ctx$indexOption2.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this12);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
return {
kind: _constants.TABLE_CONSTRAINT_KIND.UNIQUE,
value: new _AST.Index({
name: name,
unique: true,
columns: columns,
type: type
})
};
}
}, {
key: "visitForeignKeyTableConstraint",
value: function visitForeignKeyTableConstraint(ctx) {
var _ctx$name3, _ctx$index3;
var ref = ctx.referenceDefinition().accept(this);
ref.name = ((_ctx$name3 = ctx.name) === null || _ctx$name3 === void 0 ? void 0 : _ctx$name3.accept(this)) || ((_ctx$index3 = ctx.index) === null || _ctx$index3 === void 0 ? void 0 : _ctx$index3.accept(this));
ref.endpoints[0].fieldNames = ctx.indexColumnNames().accept(this).map(function (icn) {
return icn.value;
});
return {
kind: _constants.TABLE_CONSTRAINT_KIND.FK,
value: ref
};
}
}, {
key: "visitCheckTableConstraint",
value: function visitCheckTableConstraint() {
// ignored
}
// USING (BTREE | HASH)
}, {
key: "visitIndexType",
value: function visitIndexType(ctx) {
return ctx.getChild(1).getText();
}
// KEY_BLOCK_SIZE EQUAL_SYMBOL? fileSizeLiteral | indexType | WITH PARSER uid | COMMENT STRING_LITERAL | (VISIBLE | INVISIBLE)
// | ENGINE_ATTRIBUTE EQUAL_SYMBOL? STRING_LITERAL | SECONDARY_ENGINE_ATTRIBUTE EQUAL_SYMBOL? STRING_LITERAL
}, {
key: "visitIndexOption",
value: function visitIndexOption(ctx) {
if (ctx.indexType()) {
return {
kind: INDEX_OPTION_KIND.TYPE,
value: ctx.indexType().accept(this)
};
}
return null;
}
// indexColumnDefinition:
// indexFormat = (INDEX | KEY) uid? indexType? indexColumnNames indexOption* # simpleIndexDeclaration
// | (FULLTEXT | SPATIAL) indexFormat = (INDEX | KEY)? uid? indexColumnNames indexOption* # specialIndexDeclaration
}, {
key: "visitSimpleIndexDeclaration",
value: function visitSimpleIndexDeclaration(ctx) {
var _ctx$uid,
_ctx$indexType3,
_ctx$indexOption3,
_this13 = this;
var name = (_ctx$uid = ctx.uid()) === null || _ctx$uid === void 0 ? void 0 : _ctx$uid.accept(this);
var type = (_ctx$indexType3 = ctx.indexType()) === null || _ctx$indexType3 === void 0 ? void 0 : _ctx$indexType3.accept(this);
if ((_ctx$indexOption3 = ctx.indexOption()) !== null && _ctx$indexOption3 !== void 0 && _ctx$indexOption3.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this13);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
return {
kind: _constants.TABLE_CONSTRAINT_KIND.INDEX,
value: new _AST.Index({
name: name,
columns: columns,
type: type
})
};
}
}, {
key: "visitSpecialIndexDeclaration",
value: function visitSpecialIndexDeclaration(ctx) {
var _ctx$uid2,
_ctx$indexOption4,
_this14 = this;
var name = (_ctx$uid2 = ctx.uid()) === null || _ctx$uid2 === void 0 ? void 0 : _ctx$uid2.accept(this);
var type = null;
if ((_ctx$indexOption4 = ctx.indexOption()) !== null && _ctx$indexOption4 !== void 0 && _ctx$indexOption4.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this14);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
return {
kind: _constants.TABLE_CONSTRAINT_KIND.INDEX,
value: new _AST.Index({
name: name,
columns: columns,
type: type
})
};
}
// ALTER intimeAction = (ONLINE | OFFLINE)? IGNORE? TABLE tableName waitNowaitClause? (alterSpecification (',' alterSpecification)*)? partitionDefinitions?
}, {
key: "visitAlterTable",
value: function visitAlterTable(ctx) {
var _ctx$alterSpecificati,
_this15 = this;
var names = ctx.tableName().accept(this);
var _getTableNames4 = getTableNames(names),
tableName = _getTableNames4.tableName,
schemaName = _getTableNames4.schemaName;
/** @type {Table} */
var table = this.findTable(schemaName, tableName);
if (!table) return;
var alterSpecs = ((_ctx$alterSpecificati = ctx.alterSpecification()) === null || _ctx$alterSpecificati === void 0 ? void 0 : _ctx$alterSpecificati.map(function (spec) {
return spec.accept(_this15);
}).filter(function (spec) {
return spec === null || spec === void 0 ? void 0 : spec.kind;
})) || [];
alterSpecs.forEach(function (alter) {
if (alter.kind === ALTER_KIND.ADD_PK) {
/** @type {Index} */
var index = alter.value;
if (index.columns.length > 1) return table.indexes.push(index);
var field = table.fields.find(function (f) {
return f.name === index.columns[0].value;
});
field.pk = true;
} else if (alter.kind === ALTER_KIND.ADD_FK) {
/** @type {Ref} */
var ref = alter.value;
ref.endpoints[0].schemaName = schemaName;
ref.endpoints[0].tableName = tableName;
_this15.data.refs.push(ref);
}
return null;
});
}
// alterSpecification: for full rules breakdown check MySqlParser.g4 line 660.
// The list below only containt alterSpecification rules that we will supported (should have same behaviors as the legacy parser):
// alterByAddPrimaryKey | alterByAddForeignKey
// ADD (CONSTRAINT name = uid?)? PRIMARY KEY index = uid? indexType? indexColumnNames indexOption*
}, {
key: "visitAlterByAddPrimaryKey",
value: function visitAlterByAddPrimaryKey(ctx) {
var _ctx$name4,
_ctx$index4,
_ctx$indexType4,
_ctx$indexOption5,
_this16 = this;
var name = ((_ctx$name4 = ctx.name) === null || _ctx$name4 === void 0 ? void 0 : _ctx$name4.accept(this)) || ((_ctx$index4 = ctx.index) === null || _ctx$index4 === void 0 ? void 0 : _ctx$index4.accept(this));
var type = (_ctx$indexType4 = ctx.indexType()) === null || _ctx$indexType4 === void 0 ? void 0 : _ctx$indexType4.accept(this);
if ((_ctx$indexOption5 = ctx.indexOption()) !== null && _ctx$indexOption5 !== void 0 && _ctx$indexOption5.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this16);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
return {
kind: ALTER_KIND.ADD_PK,
value: new _AST.Index({
name: name,
pk: true,
columns: columns,
type: type
})
};
}
// ADD (CONSTRAINT name = uid?)? FOREIGN KEY indexName = uid? indexColumnNames referenceDefinition
}, {
key: "visitAlterByAddForeignKey",
value: function visitAlterByAddForeignKey(ctx) {
var _ctx$name5, _ctx$index5;
var ref = ctx.referenceDefinition().accept(this);
ref.name = ((_ctx$name5 = ctx.name) === null || _ctx$name5 === void 0 ? void 0 : _ctx$name5.accept(this)) || ((_ctx$index5 = ctx.index) === null || _ctx$index5 === void 0 ? void 0 : _ctx$index5.accept(this));
ref.endpoints[0].fieldNames = ctx.indexColumnNames().accept(this).map(function (icn) {
return icn.value;
});
return {
kind: ALTER_KIND.ADD_FK,
value: ref
};
}
// CREATE intimeAction = (ONLINE | OFFLINE)? indexCategory = (UNIQUE | FULLTEXT | SPATIAL)? INDEX uid indexType? ON tableName indexColumnNames
// indexOption* (ALGORITHM EQUAL_SYMBOL? algType = (DEFAULT | INPLACE | COPY) | LOCK EQUAL_SYMBOL? lockType = (DEFAULT | NONE | SHARED | EXCLUSIVE))*
}, {
key: "visitCreateIndex",
value: function visitCreateIndex(ctx) {
var _ctx$indexType5,
_ctx$indexOption6,
_this17 = this;
var tableNames = ctx.tableName().accept(this);
var _getTableNames5 = getTableNames(tableNames),
tableName = _getTableNames5.tableName,
schemaName = _getTableNames5.schemaName;
var table = this.findTable(schemaName, tableName);
if (!table) return;
var name = ctx.uid().accept(this);
var type = (_ctx$indexType5 = ctx.indexType()) === null || _ctx$indexType5 === void 0 ? void 0 : _ctx$indexType5.accept(this);
if ((_ctx$indexOption6 = ctx.indexOption()) !== null && _ctx$indexOption6 !== void 0 && _ctx$indexOption6.length) {
var indexOptions = ctx.indexOption().map(function (io) {
return io.accept(_this17);
});
var typeOption = indexOptions.find(function (io) {
return (io === null || io === void 0 ? void 0 : io.kind) === INDEX_OPTION_KIND.TYPE;
});
if (typeOption) type = typeOption.value;
}
var columns = ctx.indexColumnNames().accept(this);
var index = new _AST.Index({
name: name,
columns: columns,
unique: !!ctx.UNIQUE(),
type: type
});
table.indexes.push(index);
}
// dmlStatement
// : selectStatement | insertStatement | updateStatement | deleteStatement | replaceStatement |
// callStatement | loadDataStatement | loadX