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 b7ff37e51f92..5ae080b51726 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 @@ -532,7 +532,7 @@ protected JdbcOutputTableHandle createTable(ConnectorSession session, ConnectorT columnNames.build(), columnTypes.build(), Optional.empty(), - remoteTargetTableName); + Optional.of(remoteTargetTableName)); } } @@ -582,7 +582,7 @@ public JdbcOutputTableHandle beginInsertTable(ConnectorSession session, JdbcTabl columnNames.build(), columnTypes.build(), Optional.of(jdbcColumnTypes.build()), - remoteTable); + Optional.empty()); } String remoteTemporaryTableName = identifierMapping.toRemoteTableName(identity, connection, remoteSchema, generateTemporaryTableName()); @@ -595,7 +595,7 @@ public JdbcOutputTableHandle beginInsertTable(ConnectorSession session, JdbcTabl columnNames.build(), columnTypes.build(), Optional.of(jdbcColumnTypes.build()), - remoteTemporaryTableName); + Optional.of(remoteTemporaryTableName)); } catch (SQLException e) { throw new TrinoException(JDBC_ERROR, e); @@ -626,7 +626,7 @@ public void commitCreateTable(ConnectorSession session, JdbcOutputTableHandle ha session, handle.getCatalogName(), handle.getSchemaName(), - handle.getTemporaryTableName(), + handle.getTemporaryTableName().orElseThrow(() -> new IllegalStateException("Temporary table name missing")), new SchemaTableName(handle.getSchemaName(), handle.getTableName())); } @@ -659,14 +659,14 @@ protected void renameTable(ConnectorSession session, String catalogName, String public void finishInsertTable(ConnectorSession session, JdbcOutputTableHandle handle) { if (isNonTransactionalInsert(session)) { - checkState(handle.getTemporaryTableName().equals(handle.getTableName()), "Unexpected use of temporary table when non transactional inserts are enabled"); + checkState(handle.getTemporaryTableName().isEmpty(), "Unexpected use of temporary table when non transactional inserts are enabled"); return; } RemoteTableName temporaryTable = new RemoteTableName( Optional.ofNullable(handle.getCatalogName()), Optional.ofNullable(handle.getSchemaName()), - handle.getTemporaryTableName()); + handle.getTemporaryTableName().orElseThrow()); RemoteTableName targetTable = new RemoteTableName( Optional.ofNullable(handle.getCatalogName()), Optional.ofNullable(handle.getSchemaName()), @@ -755,11 +755,13 @@ private void dropTable(ConnectorSession session, RemoteTableName remoteTableName @Override public void rollbackCreateTable(ConnectorSession session, JdbcOutputTableHandle handle) { - dropTable(session, new JdbcTableHandle( - new SchemaTableName(handle.getSchemaName(), handle.getTemporaryTableName()), - handle.getCatalogName(), - handle.getSchemaName(), - handle.getTemporaryTableName())); + if (handle.getTemporaryTableName().isPresent()) { + dropTable(session, new JdbcTableHandle( + new SchemaTableName(handle.getSchemaName(), handle.getTemporaryTableName().get()), + handle.getCatalogName(), + handle.getSchemaName(), + handle.getTemporaryTableName().get())); + } } @Override @@ -768,7 +770,7 @@ public String buildInsertSql(JdbcOutputTableHandle handle, List c checkArgument(handle.getColumnNames().size() == columnWriters.size(), "handle and columnWriters mismatch: %s, %s", handle, columnWriters); return format( "INSERT INTO %s (%s) VALUES (%s)", - quoted(handle.getCatalogName(), handle.getSchemaName(), handle.getTemporaryTableName()), + quoted(handle.getCatalogName(), handle.getSchemaName(), handle.getTemporaryTableName().orElseGet(handle::getTableName)), handle.getColumnNames().stream() .map(this::quoted) .collect(joining(", ")), diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcOutputTableHandle.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcOutputTableHandle.java index ed0286134aa0..eccc7fa5674d 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcOutputTableHandle.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/JdbcOutputTableHandle.java @@ -39,7 +39,7 @@ public class JdbcOutputTableHandle private final List columnNames; private final List columnTypes; private final Optional> jdbcColumnTypes; - private final String temporaryTableName; + private final Optional temporaryTableName; @JsonCreator public JdbcOutputTableHandle( @@ -49,7 +49,7 @@ public JdbcOutputTableHandle( @JsonProperty("columnNames") List columnNames, @JsonProperty("columnTypes") List columnTypes, @JsonProperty("jdbcColumnTypes") Optional> jdbcColumnTypes, - @JsonProperty("temporaryTableName") String temporaryTableName) + @JsonProperty("temporaryTableName") Optional temporaryTableName) { this.catalogName = catalogName; this.schemaName = schemaName; @@ -105,7 +105,7 @@ public Optional> getJdbcColumnTypes() } @JsonProperty - public String getTemporaryTableName() + public Optional getTemporaryTableName() { return temporaryTableName; } diff --git a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcOutputTableHandle.java b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcOutputTableHandle.java index 83c6b379234a..9739e3817a95 100644 --- a/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcOutputTableHandle.java +++ b/plugin/trino-base-jdbc/src/test/java/io/trino/plugin/jdbc/TestJdbcOutputTableHandle.java @@ -35,7 +35,7 @@ public void testJsonRoundTrip() ImmutableList.of("abc", "xyz"), ImmutableList.of(VARCHAR, VARCHAR), Optional.empty(), - "tmp_table"); + Optional.of("tmp_table")); assertJsonRoundTrip(OUTPUT_TABLE_CODEC, handleForCreate); @@ -46,7 +46,7 @@ public void testJsonRoundTrip() ImmutableList.of("abc", "xyz"), ImmutableList.of(VARCHAR, VARCHAR), Optional.of(ImmutableList.of(JDBC_VARCHAR, JDBC_VARCHAR)), - "tmp_table"); + Optional.of("tmp_table")); assertJsonRoundTrip(OUTPUT_TABLE_CODEC, handleForInsert); } diff --git a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixOutputTableHandle.java b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixOutputTableHandle.java index 3dae87b0dd50..3545f40ed3ac 100644 --- a/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixOutputTableHandle.java +++ b/plugin/trino-phoenix/src/main/java/io/trino/plugin/phoenix/PhoenixOutputTableHandle.java @@ -40,7 +40,7 @@ public PhoenixOutputTableHandle( @JsonProperty("jdbcColumnTypes") Optional> jdbcColumnTypes, @JsonProperty("rowkeyColumn") Optional rowkeyColumn) { - super("", schemaName, tableName, columnNames, columnTypes, jdbcColumnTypes, ""); + super("", schemaName, tableName, columnNames, columnTypes, jdbcColumnTypes, Optional.empty()); this.rowkeyColumn = requireNonNull(rowkeyColumn, "rowkeyColumn is null"); } diff --git a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixOutputTableHandle.java b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixOutputTableHandle.java index 082fbf9af97e..1f07a0a83c28 100644 --- a/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixOutputTableHandle.java +++ b/plugin/trino-phoenix5/src/main/java/io/trino/plugin/phoenix5/PhoenixOutputTableHandle.java @@ -40,7 +40,7 @@ public PhoenixOutputTableHandle( @JsonProperty("jdbcColumnTypes") Optional> jdbcColumnTypes, @JsonProperty("rowkeyColumn") Optional rowkeyColumn) { - super("", schemaName, tableName, columnNames, columnTypes, jdbcColumnTypes, ""); + super("", schemaName, tableName, columnNames, columnTypes, jdbcColumnTypes, Optional.empty()); this.rowkeyColumn = requireNonNull(rowkeyColumn, "rowkeyColumn is null"); } diff --git a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java index cae377cbb433..b61f2bcfa551 100644 --- a/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java +++ b/plugin/trino-postgresql/src/test/java/io/trino/plugin/postgresql/TestPostgreSqlConnectorTest.java @@ -191,6 +191,20 @@ public void testForeignTable() onRemoteDatabase().execute("DROP SERVER devnull"); } + @Test + public void testErrorDuringInsert() + { + onRemoteDatabase().execute("CREATE TABLE test_with_constraint (x bigint primary key)"); + assertTrue(getQueryRunner().tableExists(getSession(), "test_with_constraint")); + Session nonTransactional = Session.builder(getSession()) + .setCatalogSessionProperty("postgresql", "non_transactional_insert", "true") + .build(); + assertUpdate(nonTransactional, "INSERT INTO test_with_constraint VALUES (1)", 1); + assertQueryFails(nonTransactional, "INSERT INTO test_with_constraint VALUES (1)", "[\\s\\S]*ERROR: duplicate key value[\\s\\S]*"); + assertTrue(getQueryRunner().tableExists(getSession(), "test_with_constraint")); + onRemoteDatabase().execute("DROP TABLE test_with_constraint"); + } + @Test public void testSystemTable() { diff --git a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java index 59698b022885..c410353108c2 100644 --- a/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java +++ b/plugin/trino-sqlserver/src/main/java/io/trino/plugin/sqlserver/SqlServerClient.java @@ -260,7 +260,7 @@ protected void enableTableLockOnBulkLoadTableOption(ConnectorSession session, Jd // 'table lock on bulk load' table option causes the bulk load processes on user-defined tables to obtain a bulk update lock // note: this is not a request to lock a table immediately String sql = format("EXEC sp_tableoption '%s', 'table lock on bulk load', '1'", - quoted(table.getCatalogName(), table.getSchemaName(), table.getTemporaryTableName())); + quoted(table.getCatalogName(), table.getSchemaName(), table.getTemporaryTableName().orElseGet(table::getTableName))); execute(connection, sql); } catch (SQLException e) {