Iceberg dereference pushdown broken for TIMESTAMP WITH TIME ZONE
Author: aanejaCreated Sep 18, 2026Updated Sep 18, 2026
Labelsbug
Your Environment
Presto master at 42492bc9
Current Behavior
presto:temp> show create table t;
Create Table
-----------------------------------------------------------------
CREATE TABLE rustberg.temp.t (
"identifiers" row("a" varchar, "b" timestamp with time zone)
)
WITH (
"format-version" = '2',
location = 'file:///sam/warehouse/iceberg//temp/t',
"read.split.target-size" = 134217728,
"write.delete.mode" = 'merge-on-read',
"write.format.default" = 'PARQUET',
"write.metadata.delete-after-commit.enabled" = false,
"write.metadata.metrics.max-inferred-column-defaults" = 100,
"write.metadata.previous-versions-max" = 100,
"write.update.mode" = 'merge-on-read'
)
(1 row)
Query 20260918_061046_00077_8efj5, FINISHED, 1 node
Splits: 1 total, 1 done (100.00%)
[Latency: client-side: 22ms, server-side: 12ms] [0 rows, 0B] [0 rows/s, 0B/s]
presto:temp> show session like 'pushdown_%';
Name | Value | Default | Type | Description
----------------------------------------+-------+---------+---------+----------------------------------------------------------------------------------------
pushdown_dereference_enabled | false | false | boolean | Experimental: enable dereference pushdown
pushdown_subfields_enabled | false | false | boolean | Experimental: enable subfield pruning
pushdown_subfields_for_cardinality | false | false | boolean | Enable subfield pruning for cardinality() function to skip reading keys and values
pushdown_subfields_for_map_functions | true | true | boolean | Enable subfield pruning for map functions, currently include map_subset and map_filter
pushdown_subfields_from_lambda_enabled | false | false | boolean | Enable subfield pruning from lambdas
pushdown_through_unnest | false | false | boolean | Allow pushing projections and filters below unnest
(6 rows)
Query 20260918_060722_00073_8efj5, FINISHED, 1 node
Splits: 17 total, 17 done (100.00%)
[Latency: client-side: 182ms, server-side: 166ms] [0 rows, 0B] [0 rows/s, 0B/s]
presto:temp> select 1 from t where identifiers.a='20';
_col0
-------
1
(1 row)
Query 20260918_060737_00074_8efj5, FINISHED, 1 node
Splits: 18 total, 18 done (100.00%)
[Latency: client-side: 100ms, server-side: 92ms] [101 rows, 1.84KB] [1.1K rows/s, 20KB/s]
presto:temp> set session pushdown_dereference_enabled=true;
SET SESSION
Query 20260918_060758_00075_8efj5, FINISHED, 0 nodes
Splits: 0 total, 0 done (0.00%)
[Latency: client-side: 13ms, server-side: 1ms] [0 rows, 0B] [0 rows/s, 0B/s]
presto:temp> select 1 from t where identifiers.a='20';
Query 20260918_060803_00076_8efj5, FAILED, 0 nodes
Splits: 0 total, 0 done (0.00%)
[Latency: client-side: 34ms, server-side: 31ms] [0 rows, 0B] [0 rows/s, 0B/s]
Query 20260918_060803_00076_8efj5 failed: Unsupported Hive type: timestamp with time zoneCall stack
com.facebook.presto.spi.PrestoException: Unsupported Hive type: timestamp with time zone
at com.facebook.presto.iceberg.TypeConverter.toHiveTypeInfo(TypeConverter.java:397)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.facebook.presto.iceberg.TypeConverter.toHiveTypeInfo(TypeConverter.java:395)
at com.facebook.presto.iceberg.TypeConverter.toHiveType(TypeConverter.java:236)
at com.facebook.presto.iceberg.optimizer.IcebergParquetDereferencePushDown.createSubfieldColumnHandle(IcebergParquetDereferencePushDown.java:104)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:353)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:297)
at com.facebook.presto.spi.plan.ProjectNode.accept(ProjectNode.java:107)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.rewrite(ConnectorPlanRewriter.java:101)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.lambda$defaultRewrite$0(ConnectorPlanRewriter.java:84)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Collections$2.tryAdvance(Collections.java:4853)
at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4861)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.defaultRewrite(ConnectorPlanRewriter.java:85)
at com.facebook.presto.spi.ConnectorPlanRewriter.visitPlan(ConnectorPlanRewriter.java:49)
at com.facebook.presto.spi.ConnectorPlanRewriter.visitPlan(ConnectorPlanRewriter.java:22)
at com.facebook.presto.spi.plan.PlanVisitor.visitFilter(PlanVisitor.java:40)
at com.facebook.presto.spi.plan.FilterNode.accept(FilterNode.java:94)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.rewrite(ConnectorPlanRewriter.java:101)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.lambda$defaultRewrite$0(ConnectorPlanRewriter.java:84)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Collections$2.tryAdvance(Collections.java:4853)
at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4861)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.defaultRewrite(ConnectorPlanRewriter.java:85)
at com.facebook.presto.spi.ConnectorPlanRewriter.visitPlan(ConnectorPlanRewriter.java:49)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:315)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:297)
at com.facebook.presto.spi.plan.ProjectNode.accept(ProjectNode.java:107)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.rewrite(ConnectorPlanRewriter.java:101)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.lambda$defaultRewrite$0(ConnectorPlanRewriter.java:84)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.Collections$2.tryAdvance(Collections.java:4853)
at java.base/java.util.Collections$2.forEachRemaining(Collections.java:4861)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
at com.facebook.presto.spi.ConnectorPlanRewriter$RewriteContext.defaultRewrite(ConnectorPlanRewriter.java:85)
at com.facebook.presto.spi.ConnectorPlanRewriter.visitPlan(ConnectorPlanRewriter.java:49)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:315)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown$Rewriter.visitProject(ParquetDereferencePushDown.java:297)
at com.facebook.presto.spi.plan.ProjectNode.accept(ProjectNode.java:107)
at com.facebook.presto.spi.ConnectorPlanRewriter.rewriteWith(ConnectorPlanRewriter.java:39)
at com.facebook.presto.spi.ConnectorPlanRewriter.rewriteWith(ConnectorPlanRewriter.java:27)
at com.facebook.presto.parquet.rule.ParquetDereferencePushDown.optimize(ParquetDereferencePushDown.java:71)
at com.facebook.presto.sql.planner.optimizations.ApplyConnectorOptimization.optimize(ApplyConnectorOptimization.java:214)
at com.facebook.presto.sql.Optimizer.validateAndOptimizePlan(Optimizer.java:114)
at com.facebook.presto.execution.SqlQueryExecution.lambda$doCreateLogicalPlanAndOptimize$6(SqlQueryExecution.java:613)
at com.facebook.presto.common.RuntimeStats.recordWallAndCpuTime(RuntimeStats.java:252)
at com.facebook.presto.execution.SqlQueryExecution.doCreateLogicalPlanAndOptimize(SqlQueryExecution.java:611)
at com.facebook.presto.common.RuntimeStats.recordWallAndCpuTime(RuntimeStats.java:252)
at com.facebook.presto.execution.SqlQueryExecution.createLogicalPlanAndOptimize(SqlQueryExecution.java:582)
at com.facebook.presto.execution.SqlQueryExecution.start(SqlQueryExecution.java:510)
at com.facebook.presto.$gen.Presto_null__oss_presto_etc____20260918_040216_1.run(Unknown Source)
at com.facebook.presto.execution.SqlQueryManager.createQuery(SqlQueryManager.java:326)
at com.facebook.presto.dispatcher.LocalDispatchQuery.lambda$startExecution$8(LocalDispatchQuery.java:217)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:840)Expected Behavior
No failure
Possible Solution
Context
Dereference pushdown improves performance substantially while doing pointed reads in wide nested type columns
Source: prestodb/presto