@Override public void enterUniqueKeyTableConstraint(MySqlParser.UniqueKeyTableConstraintContext ctx) { parser.runIfNotNull(() -> { if (!tableEditor.hasPrimaryKey()) { parser.parsePrimaryIndexColumnNames(ctx.indexColumnNames(), tableEditor); } }, tableEditor); super.enterUniqueKeyTableConstraint(ctx); }
@Override public void enterAlterByAddUniqueKey(MySqlParser.AlterByAddUniqueKeyContext ctx) { parser.runIfNotNull(() -> { if (!tableEditor.hasPrimaryKey()) { // this may eventually get overwritten by a real PK parser.parsePrimaryIndexColumnNames(ctx.indexColumnNames(), tableEditor); } }, tableEditor); super.enterAlterByAddUniqueKey(ctx); }
@Override public void enterUniqueKeyColumnConstraint(MySqlParser.UniqueKeyColumnConstraintContext ctx) { if (!tableEditor.hasPrimaryKey()) { // take the first unique constrain if no primary key is set tableEditor.addColumn(columnEditor.create()); tableEditor.setPrimaryKeyNames(columnEditor.name()); } super.enterUniqueKeyColumnConstraint(ctx); }
protected void parseCreateIndex(Marker start) { boolean unique = tokens.canConsume("UNIQUE"); tokens.canConsumeAnyOf("FULLTEXT", "SPATIAL"); tokens.consume("INDEX"); String indexName = tokens.consume(); // index name if (tokens.matches("USING")) { parseIndexType(start); } TableId tableId = null; if (tokens.canConsume("ON")) { // Usually this is required, but in some cases ON is not required tableId = parseQualifiedTableName(start); } if (unique && tableId != null) { // This is a unique index, and we can mark the index's columns as the primary key iff there is not already // a primary key on the table. (Should a PK be created later via an alter, then it will overwrite this.) TableEditor table = databaseTables.editTable(tableId); if (table != null && !table.hasPrimaryKey()) { List<String> names = parseIndexColumnNames(start); if (table.columns().stream().allMatch(Column::isRequired)) { databaseTables.overwriteTable(table.setPrimaryKeyNames(names).create()); } } } // We don't care about any other statements or the rest of this statement ... consumeRemainingStatement(start); // TODO fix: signal should be send only when some changes on table are made signalCreateIndex(indexName, tableId, start); debugParsed(start); }
@Override public void enterCreateIndex(MySqlParser.CreateIndexContext ctx) { if (ctx.UNIQUE() != null) { TableId tableId = parser.parseQualifiedTableId(ctx.tableName().fullId()); TableEditor tableEditor = parser.databaseTables().editTable(tableId); if (tableEditor != null) { if (!tableEditor.hasPrimaryKey()) { parser.parsePrimaryIndexColumnNames(ctx.indexColumnNames(), tableEditor); parser.signalCreateIndex(parser.parseName(ctx.uid()), null, ctx); } } else { throw new ParsingException(null, "Trying to create index on non existing table " + tableId.toString() + "." + "Query: " + getText(ctx)); } } super.enterCreateIndex(ctx); } }