diff --git a/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClient.java b/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClient.java index efb2f44982bc..f395bffe1b06 100644 --- a/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClient.java +++ b/plugin/trino-mariadb/src/main/java/io/trino/plugin/mariadb/MariaDbClient.java @@ -55,6 +55,8 @@ import io.trino.spi.TrinoException; import io.trino.spi.connector.AggregateFunction; import io.trino.spi.connector.ColumnHandle; +import io.trino.spi.connector.ColumnMetadata; +import io.trino.spi.connector.ColumnPosition; import io.trino.spi.connector.ConnectorSession; import io.trino.spi.connector.ConnectorTableMetadata; import io.trino.spi.connector.JoinCondition; @@ -518,6 +520,43 @@ else if (varcharType.getBoundedLength() <= 16777215) { throw new TrinoException(NOT_SUPPORTED, "Unsupported column type: " + type.getDisplayName()); } + @Override + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) + { + verify(handle.getAuthorization().isEmpty(), "Unexpected authorization is required for table: %s".formatted(handle)); + + RemoteTableName table = handle.asPlainTable().getRemoteTableName(); + + switch (position) { + case ColumnPosition.First _ -> addColumn(session, table, column, "FIRST"); + case ColumnPosition.After after -> addColumn(session, table, column, "AFTER " + quoted(after.columnName())); + case ColumnPosition.Last _ -> addColumn(session, table, column, ""); + } + } + + private void addColumn(ConnectorSession session, RemoteTableName table, ColumnMetadata column, String position) + { + if (column.getComment() != null) { + throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with comments"); + } + + try (Connection connection = connectionFactory.openConnection(session)) { + verify(connection.getAutoCommit()); + String columnName = column.getName(); + verifyColumnName(connection.getMetaData(), columnName); + String remoteColumnName = getIdentifierMapping().toRemoteColumnName(getRemoteIdentifiers(connection), columnName); + String sql = format( + "ALTER TABLE %s ADD %s %s", + quoted(table), + getColumnDefinitionSql(session, column, remoteColumnName), + position); + execute(session, connection, sql); + } + catch (SQLException e) { + throw new TrinoException(JDBC_ERROR, e); + } + } + @Override protected void renameColumn(ConnectorSession session, Connection connection, RemoteTableName remoteTableName, String remoteColumnName, String newRemoteColumnName) throws SQLException diff --git a/plugin/trino-mariadb/src/test/java/io/trino/plugin/mariadb/BaseMariaDbConnectorTest.java b/plugin/trino-mariadb/src/test/java/io/trino/plugin/mariadb/BaseMariaDbConnectorTest.java index c299e9c9a510..607ccb667b71 100644 --- a/plugin/trino-mariadb/src/test/java/io/trino/plugin/mariadb/BaseMariaDbConnectorTest.java +++ b/plugin/trino-mariadb/src/test/java/io/trino/plugin/mariadb/BaseMariaDbConnectorTest.java @@ -40,7 +40,8 @@ public abstract class BaseMariaDbConnectorTest protected boolean hasBehavior(TestingConnectorBehavior connectorBehavior) { return switch (connectorBehavior) { - case SUPPORTS_JOIN_PUSHDOWN -> true; + case SUPPORTS_ADD_COLUMN_WITH_POSITION, + SUPPORTS_JOIN_PUSHDOWN -> true; case SUPPORTS_ADD_COLUMN_WITH_COMMENT, SUPPORTS_AGGREGATION_PUSHDOWN_CORRELATION, SUPPORTS_AGGREGATION_PUSHDOWN_COUNT_DISTINCT,