diff --git a/presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedSmokeTestBase.java b/presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedSmokeTestBase.java index 08f5ba8353640..c497520e70d2e 100644 --- a/presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedSmokeTestBase.java +++ b/presto-iceberg/src/test/java/com/facebook/presto/iceberg/IcebergDistributedSmokeTestBase.java @@ -2544,4 +2544,27 @@ public void testIOExplainWithTimestampWithTimeZone() assertUpdate("DROP TABLE test_tstz_io"); } } + + @Test + public void testPushdownSubfieldsWithDml() + { + QueryRunner queryRunner = getQueryRunner(); + Session session = Session.builder(getSession()) + .setSystemProperty("pushdown_subfields_enabled", "true") + .build(); + try { + queryRunner.execute("CREATE TABLE test_pushdown_subfields_dml(a INTEGER, b VARCHAR, c VARCHAR)"); + queryRunner.execute("INSERT INTO test_pushdown_subfields_dml VALUES (1, 'x', 'p'), (2, 'y', 'q'), (3, 'z', 'r')"); + + assertUpdate(session, "UPDATE test_pushdown_subfields_dml SET a = 10 WHERE c = 'q'", 1); + assertQuery("SELECT a, b, c FROM test_pushdown_subfields_dml WHERE c = 'q'", "VALUES (10, 'y', 'q')"); + + assertUpdate(session, "UPDATE test_pushdown_subfields_dml SET a = 20 WHERE c = 'nonexistent'", 0); + assertUpdate("DELETE FROM test_pushdown_subfields_dml WHERE c = 'r'", 1); + assertQuery("SELECT a, b, c FROM test_pushdown_subfields_dml ORDER BY a", "VALUES (1, 'x', 'p'), (10, 'y', 'q')"); + } + finally { + queryRunner.execute("DROP TABLE IF EXISTS test_pushdown_subfields_dml"); + } + } } diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java index 73fbebf9b457f..17c89d32754d2 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/PushdownSubfields.java @@ -75,6 +75,7 @@ import com.facebook.presto.sql.planner.plan.GroupIdNode; import com.facebook.presto.sql.planner.plan.RowNumberNode; import com.facebook.presto.sql.planner.plan.SimplePlanRewriter; +import com.facebook.presto.sql.planner.plan.UpdateNode; import com.facebook.presto.sql.relational.FunctionResolution; import com.facebook.presto.sql.tree.QualifiedName; import com.google.common.collect.ImmutableList; @@ -494,6 +495,13 @@ public PlanNode visitDelete(DeleteNode node, RewriteContext context) return context.defaultRewrite(node, context.get()); } + @Override + public PlanNode visitUpdate(UpdateNode node, RewriteContext context) + { + context.get().variables.addAll(node.getSource().getOutputVariables()); + return context.defaultRewrite(node, context.get()); + } + @Override public PlanNode visitTopN(TopNNode node, RewriteContext context) {