#28510·presto

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

sql

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 zone

Call 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