diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java index b866c1b5b19d..574ec675d0a5 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/BaseJdbcClient.java @@ -31,6 +31,7 @@ import io.trino.spi.TrinoException; 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -1208,10 +1209,15 @@ protected String postProcessInsertTableNameClause(ConnectorSession session, Stri } @Override - public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) { verify(handle.getAuthorization().isEmpty(), "Unexpected authorization is required for table: %s".formatted(handle)); - addColumn(session, handle.asPlainTable().getRemoteTableName(), column); + + switch (position) { + case ColumnPosition.First _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with FIRST clause"); + case ColumnPosition.After _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with AFTER clause"); + case ColumnPosition.Last _ -> addColumn(session, handle.asPlainTable().getRemoteTableName(), column); + } } private void addColumn(ConnectorSession session, RemoteTableName table, ColumnMetadata column) diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java index 25b6dcc177aa..48298c0d0f9c 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/CachingJdbcClient.java @@ -31,6 +31,7 @@ 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -518,6 +519,13 @@ public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMe invalidateTableCaches(handle.asPlainTable().getSchemaTableName()); } + @Override + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) + { + delegate.addColumn(session, handle, column, position); + invalidateTableCaches(handle.asPlainTable().getSchemaTableName()); + } + @Override public void dropColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java index 9fd33112b2e1..aa80fc60ec6d 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java @@ -31,6 +31,7 @@ import io.trino.spi.connector.Assignment; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; +import io.trino.spi.connector.ColumnPosition; import io.trino.spi.connector.ConnectorInsertTableHandle; import io.trino.spi.connector.ConnectorMergeTableHandle; import io.trino.spi.connector.ConnectorOutputMetadata; @@ -1398,11 +1399,11 @@ public void setColumnComment(ConnectorSession session, ConnectorTableHandle tabl } @Override - public void addColumn(ConnectorSession session, ConnectorTableHandle table, ColumnMetadata columnMetadata) + public void addColumn(ConnectorSession session, ConnectorTableHandle table, ColumnMetadata columnMetadata, ColumnPosition position) { JdbcTableHandle tableHandle = (JdbcTableHandle) table; verify(!tableHandle.isSynthetic(), "Not a table reference: %s", tableHandle); - jdbcClient.addColumn(session, tableHandle, columnMetadata); + jdbcClient.addColumn(session, tableHandle, columnMetadata, position); } @Override diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java index 2a8f75b3e506..fe0f8c4701db 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/ForwardingJdbcClient.java @@ -18,6 +18,7 @@ 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -384,6 +385,12 @@ public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMe delegate().addColumn(session, handle, column); } + @Override + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) + { + delegate().addColumn(session, handle, column, position); + } + @Override public void dropColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java index 001dec0827ee..4cc47832aa14 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcClient.java @@ -19,6 +19,7 @@ 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -184,7 +185,16 @@ default void setColumnComment(ConnectorSession session, JdbcTableHandle handle, throw new TrinoException(NOT_SUPPORTED, "This connector does not support setting column comments"); } - void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column); + /** + * @deprecated use {@link #addColumn(ConnectorSession, JdbcTableHandle, ColumnMetadata, ColumnPosition)} which add column with position + */ + @Deprecated + default void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + { + addColumn(session, handle, column, new ColumnPosition.Last()); + } + + void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position); void dropColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column); diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/RetryingJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/RetryingJdbcClient.java index 0c59706f254b..f8835f192989 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/RetryingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/RetryingJdbcClient.java @@ -20,6 +20,7 @@ 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -307,6 +308,13 @@ public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMe delegate.addColumn(session, handle, column); } + @Override + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) + { + // no retrying as it could be not idempotent operation + delegate.addColumn(session, handle, column, position); + } + @Override public void dropColumn(ConnectorSession session, JdbcTableHandle handle, JdbcColumnHandle column) { diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java index 24690d0519cd..caafabcbc498 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/jmx/StatisticsAwareJdbcClient.java @@ -33,6 +33,7 @@ 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.ConnectorSplitSource; import io.trino.spi.connector.ConnectorTableMetadata; @@ -294,9 +295,9 @@ public void setColumnComment(ConnectorSession session, JdbcTableHandle handle, J } @Override - public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) { - stats.getAddColumn().wrap(() -> delegate().addColumn(session, handle, column)); + stats.getAddColumn().wrap(() -> delegate().addColumn(session, handle, column, position)); } @Override diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestCachingJdbcClient.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestCachingJdbcClient.java index e719f6aab341..3fc54edb2d6c 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestCachingJdbcClient.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestCachingJdbcClient.java @@ -24,6 +24,7 @@ import io.trino.plugin.jdbc.JdbcProcedureHandle.ProcedureQuery; import io.trino.plugin.jdbc.credential.ExtraCredentialConfig; 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.SchemaTableName; @@ -1090,7 +1091,7 @@ private JdbcColumnHandle addColumn(JdbcTableHandle tableHandle, String columnNam private JdbcColumnHandle addColumn(JdbcClient client, JdbcTableHandle tableHandle, String columnName) { ColumnMetadata columnMetadata = new ColumnMetadata(columnName, INTEGER); - client.addColumn(SESSION, tableHandle, columnMetadata); + client.addColumn(SESSION, tableHandle, columnMetadata, new ColumnPosition.Last()); return getColumns(SESSION, client, tableHandle) .stream() .filter(jdbcColumnHandle -> jdbcColumnHandle.getColumnMetadata().equals(columnMetadata)) diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcMetadata.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcMetadata.java index 858a5685767f..26720d7bf377 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcMetadata.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestDefaultJdbcMetadata.java @@ -23,6 +23,7 @@ import io.trino.spi.connector.CatalogSchemaTableName; 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.ConnectorTableHandle; import io.trino.spi.connector.ConnectorTableMetadata; @@ -256,7 +257,7 @@ public void testCreateAndAlterTable() assertThat(layout.getColumns()) .containsExactly(new ColumnMetadata("text", VARCHAR)); - metadata.addColumn(SESSION, handle, new ColumnMetadata("x", VARCHAR)); + metadata.addColumn(SESSION, handle, new ColumnMetadata("x", VARCHAR), new ColumnPosition.Last()); layout = metadata.getTableMetadata(SESSION, handle); assertThat(layout.getColumns()) .containsExactly( diff --git a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java index c414d5f6deee..e3bf999c3043 100644 --- a/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java +++ b/plugin/trino-clickhouse/src/main/java/io/trino/plugin/clickhouse/ClickHouseClient.java @@ -65,6 +65,7 @@ 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.expression.ConnectorExpression; @@ -520,13 +521,22 @@ protected void renameSchema(ConnectorSession session, Connection connection, Str } @Override - public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) + { + switch (position) { + case ColumnPosition.First _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with FIRST clause"); + case ColumnPosition.After _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with AFTER clause"); + case ColumnPosition.Last _ -> addColumn(session, handle.asPlainTable().getRemoteTableName(), column); + } + } + + private void addColumn(ConnectorSession session, RemoteTableName table, ColumnMetadata column) { try (Connection connection = connectionFactory.openConnection(session)) { String remoteColumnName = getIdentifierMapping().toRemoteColumnName(getRemoteIdentifiers(connection), column.getName()); String sql = format( "ALTER TABLE %s ADD COLUMN %s", - quoted(handle.asPlainTable().getRemoteTableName()), + quoted(table), getColumnDefinitionSql(session, column, remoteColumnName)); execute(session, connection, sql); } diff --git a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java index c8e6cbab91bc..6eb525cb2524 100644 --- a/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java +++ b/plugin/trino-druid/src/main/java/io/trino/plugin/druid/DruidJdbcClient.java @@ -38,6 +38,7 @@ import io.trino.plugin.jdbc.logging.RemoteQueryModifier; import io.trino.spi.TrinoException; 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.SchemaTableName; @@ -493,7 +494,7 @@ public void commitCreateTable(ConnectorSession session, JdbcOutputTableHandle ha } @Override - public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) { throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns"); } diff --git a/plugin/trino-exasol/src/main/java/io/trino/plugin/exasol/ExasolClient.java b/plugin/trino-exasol/src/main/java/io/trino/plugin/exasol/ExasolClient.java index 93202b4a89a9..434c3454e5f2 100644 --- a/plugin/trino-exasol/src/main/java/io/trino/plugin/exasol/ExasolClient.java +++ b/plugin/trino-exasol/src/main/java/io/trino/plugin/exasol/ExasolClient.java @@ -36,6 +36,7 @@ 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.type.Type; @@ -119,7 +120,7 @@ public void commitCreateTable(ConnectorSession session, JdbcOutputTableHandle ha } @Override - public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column) + public void addColumn(ConnectorSession session, JdbcTableHandle handle, ColumnMetadata column, ColumnPosition position) { throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns"); } diff --git a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteMetadata.java b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteMetadata.java index 283226d8506a..f728c575b1fe 100644 --- a/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteMetadata.java +++ b/plugin/trino-ignite/src/main/java/io/trino/plugin/ignite/IgniteMetadata.java @@ -28,6 +28,7 @@ import io.trino.spi.TrinoException; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; +import io.trino.spi.connector.ColumnPosition; import io.trino.spi.connector.ConnectorInsertTableHandle; import io.trino.spi.connector.ConnectorMergeTableHandle; import io.trino.spi.connector.ConnectorOutputMetadata; @@ -244,14 +245,21 @@ public void dropNotNullConstraint(ConnectorSession session, ConnectorTableHandle } @Override - public void addColumn(ConnectorSession session, ConnectorTableHandle table, ColumnMetadata columnMetadata) + public void addColumn(ConnectorSession session, ConnectorTableHandle table, ColumnMetadata columnMetadata, ColumnPosition position) { if (!columnMetadata.isNullable()) { // https://issues.apache.org/jira/browse/IGNITE-18829 // Add not null column to non-empty table Ignite doesn't give the default value throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding not null columns"); } - JdbcTableHandle handle = (JdbcTableHandle) table; - igniteClient.addColumn(session, handle, columnMetadata); + + switch (position) { + case ColumnPosition.First _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with FIRST clause"); + case ColumnPosition.After _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with AFTER clause"); + case ColumnPosition.Last _ -> { + JdbcTableHandle handle = (JdbcTableHandle) table; + igniteClient.addColumn(session, handle, columnMetadata, position); + } + } } } diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixMetadata.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixMetadata.java index 7a5ddd01ec55..3ab664c4b0da 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixMetadata.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixMetadata.java @@ -31,6 +31,7 @@ import io.trino.spi.connector.AggregationApplicationResult; import io.trino.spi.connector.ColumnHandle; import io.trino.spi.connector.ColumnMetadata; +import io.trino.spi.connector.ColumnPosition; import io.trino.spi.connector.ConnectorInsertTableHandle; import io.trino.spi.connector.ConnectorMergeTableHandle; import io.trino.spi.connector.ConnectorOutputMetadata; @@ -269,19 +270,25 @@ public Optional finishInsert( } @Override - public void addColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnMetadata column) + public void addColumn(ConnectorSession session, ConnectorTableHandle tableHandle, ColumnMetadata column, ColumnPosition position) { if (column.getComment() != null) { throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with comments"); } - JdbcTableHandle handle = (JdbcTableHandle) tableHandle; - RemoteTableName remoteTableName = handle.asPlainTable().getRemoteTableName(); - phoenixClient.execute(session, format( - "ALTER TABLE %s ADD %s %s", - getEscapedTableName(remoteTableName.getSchemaName().orElse(null), remoteTableName.getTableName()), - phoenixClient.quoted(column.getName()), - phoenixClient.toWriteMapping(session, column.getType()).getDataType())); + switch (position) { + case ColumnPosition.First _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with FIRST clause"); + case ColumnPosition.After _ -> throw new TrinoException(NOT_SUPPORTED, "This connector does not support adding columns with AFTER clause"); + case ColumnPosition.Last _ -> { + JdbcTableHandle handle = (JdbcTableHandle) tableHandle; + RemoteTableName remoteTableName = handle.asPlainTable().getRemoteTableName(); + phoenixClient.execute(session, format( + "ALTER TABLE %s ADD %s %s", + getEscapedTableName(remoteTableName.getSchemaName().orElse(null), remoteTableName.getTableName()), + phoenixClient.quoted(column.getName()), + phoenixClient.toWriteMapping(session, column.getType()).getDataType())); + } + } } @Override