This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 5bbc149285d [feat](nereids) support Iceberg time travel syntax (#34681)
5bbc149285d is described below
commit 5bbc149285df310b0e9d110958fa44fd087e9e16
Author: Butao Zhang <[email protected]>
AuthorDate: Thu May 23 12:28:01 2024 +0800
[feat](nereids) support Iceberg time travel syntax (#34681)
https://github.com/apache/doris/pull/15418
added Iceberg time travel in legacy parser but not added this syntax
Neredis.
If we enable nereids and disable fallback to original palnner, time travel
won't be available.
This PR added time travel syntas in Neredis.
BTW, we already have nereids time travel regression-test in
https://github.com/apache/doris/blob/master/regression-test/suites/external_table_p2/iceberg/test_external_catalog_icebergv2_nereids.groovy
this regression-test will always fail without this PR.
https://github.com/apache/doris/blob/88530bf9437e60190f198252ab82f53fa53d4c10/regression-test/suites/external_table_p2/iceberg/test_external_catalog_icebergv2_nereids.groovy#L70-L75
---
.../antlr4/org/apache/doris/nereids/DorisParser.g4 | 7 ++++-
.../apache/doris/datasource/FileQueryScanNode.java | 4 +++
.../datasource/iceberg/source/IcebergScanNode.java | 7 +++++
.../doris/nereids/analyzer/UnboundRelation.java | 35 +++++++++++++++-------
.../glue/translator/PhysicalPlanTranslator.java | 4 +++
.../doris/nereids/parser/LogicalPlanBuilder.java | 23 ++++++++++++--
.../doris/nereids/rules/analysis/BindRelation.java | 6 ++--
.../LogicalFileScanToPhysicalFileScan.java | 3 +-
.../trees/plans/logical/LogicalFileScan.java | 24 ++++++++++-----
.../trees/plans/physical/PhysicalFileScan.java | 19 ++++++++----
10 files changed, 102 insertions(+), 30 deletions(-)
diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
index 58e755f7f45..2848736f172 100644
--- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
+++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4
@@ -529,7 +529,7 @@ optScanParams
relationPrimary
: multipartIdentifier optScanParams? materializedViewName?
specifiedPartition?
- tabletList? tableAlias sample? relationHint? lateralView*
#tableName
+ tabletList? tableAlias sample? tableSnapshot? relationHint?
lateralView* #tableName
| LEFT_PAREN query RIGHT_PAREN tableAlias lateralView*
#aliasedQuery
| tvfName=identifier LEFT_PAREN
(properties=propertyItemList)?
@@ -971,6 +971,11 @@ sampleMethod
| INTEGER_VALUE ROWS
#sampleByRows
;
+tableSnapshot
+ : FOR VERSION AS OF version=INTEGER_VALUE
+ | FOR TIME AS OF time=STRING_LITERAL
+ ;
+
// this rule is used for explicitly capturing wrong identifiers such as
test-table, which should actually be `test-table`
// replace identifier with errorCapturingIdentifier where the immediate follow
symbol is not an expression, otherwise
// valid expressions such as "a-b" can be recognized as an identifier
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java
index 90c24989275..174e93b21d5 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/FileQueryScanNode.java
@@ -21,6 +21,7 @@ import org.apache.doris.analysis.Analyzer;
import org.apache.doris.analysis.SlotDescriptor;
import org.apache.doris.analysis.SlotId;
import org.apache.doris.analysis.TableSample;
+import org.apache.doris.analysis.TableSnapshot;
import org.apache.doris.analysis.TupleDescriptor;
import org.apache.doris.catalog.Column;
import org.apache.doris.catalog.Env;
@@ -96,6 +97,9 @@ public abstract class FileQueryScanNode extends FileScanNode {
protected String brokerName;
+ @Getter
+ protected TableSnapshot tableSnapshot;
+
/**
* External file scan node for Query hms table
* needCheckColumnPriv: Some of ExternalFileScanNode do not need to check
column priv
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java
index aee9f0e0531..45d8d506f5d 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/source/IcebergScanNode.java
@@ -283,6 +283,9 @@ public class IcebergScanNode extends FileQueryScanNode {
public Long getSpecifiedSnapshot() throws UserException {
TableSnapshot tableSnapshot =
source.getDesc().getRef().getTableSnapshot();
+ if (tableSnapshot == null) {
+ tableSnapshot = this.tableSnapshot;
+ }
if (tableSnapshot != null) {
TableSnapshot.VersionType type = tableSnapshot.getType();
try {
@@ -461,4 +464,8 @@ public class IcebergScanNode extends FileQueryScanNode {
return super.getNodeExplainString(prefix, detailLevel)
+ String.format("%sicebergPredicatePushdown=\n%s\n", prefix,
sb);
}
+
+ public void setTableSnapshot(TableSnapshot tableSnapshot) {
+ this.tableSnapshot = tableSnapshot;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
index 2dc81e01440..8180fd8518e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/analyzer/UnboundRelation.java
@@ -18,6 +18,7 @@
package org.apache.doris.nereids.analyzer;
import org.apache.doris.analysis.TableScanParams;
+import org.apache.doris.analysis.TableSnapshot;
import org.apache.doris.common.Pair;
import org.apache.doris.nereids.exceptions.UnboundException;
import org.apache.doris.nereids.memo.GroupExpression;
@@ -59,41 +60,47 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
// the start and end position of the sql substring(e.g. "t1", "db1.t1",
"ctl1.db1.t1")
private final Optional<Pair<Integer, Integer>> indexInSqlString;
+ private final Optional<TableSnapshot> tableSnapshot;
+
public UnboundRelation(RelationId id, List<String> nameParts) {
this(id, nameParts, Optional.empty(), Optional.empty(),
ImmutableList.of(), false, ImmutableList.of(),
- ImmutableList.of(), Optional.empty(), Optional.empty(), null,
Optional.empty());
+ ImmutableList.of(), Optional.empty(), Optional.empty(), null,
Optional.empty(), Optional.empty());
}
public UnboundRelation(RelationId id, List<String> nameParts, List<String>
partNames, boolean isTempPart) {
this(id, nameParts, Optional.empty(), Optional.empty(), partNames,
isTempPart, ImmutableList.of(),
- ImmutableList.of(), Optional.empty(), Optional.empty(), null,
Optional.empty());
+ ImmutableList.of(), Optional.empty(), Optional.empty(), null,
Optional.empty(), Optional.empty());
}
public UnboundRelation(RelationId id, List<String> nameParts, List<String>
partNames, boolean isTempPart,
List<Long> tabletIds, List<String> hints, Optional<TableSample>
tableSample, Optional<String> indexName) {
this(id, nameParts, Optional.empty(), Optional.empty(),
- partNames, isTempPart, tabletIds, hints, tableSample,
indexName, null, Optional.empty());
+ partNames, isTempPart, tabletIds, hints, tableSample,
indexName, null, Optional.empty(),
+ Optional.empty());
}
public UnboundRelation(RelationId id, List<String> nameParts, List<String>
partNames, boolean isTempPart,
List<Long> tabletIds, List<String> hints, Optional<TableSample>
tableSample, Optional<String> indexName,
- TableScanParams scanParams) {
+ TableScanParams scanParams, Optional<TableSnapshot> tableSnapshot)
{
this(id, nameParts, Optional.empty(), Optional.empty(),
- partNames, isTempPart, tabletIds, hints, tableSample,
indexName, scanParams, Optional.empty());
+ partNames, isTempPart, tabletIds, hints, tableSample,
indexName, scanParams, Optional.empty(),
+ tableSnapshot);
}
public UnboundRelation(RelationId id, List<String> nameParts,
Optional<GroupExpression> groupExpression,
Optional<LogicalProperties> logicalProperties, List<String>
partNames, boolean isTempPart,
List<Long> tabletIds, List<String> hints, Optional<TableSample>
tableSample, Optional<String> indexName) {
this(id, nameParts, groupExpression, logicalProperties, partNames,
- isTempPart, tabletIds, hints, tableSample, indexName, null,
Optional.empty());
+ isTempPart, tabletIds, hints, tableSample, indexName, null,
Optional.empty(), Optional.empty());
}
public UnboundRelation(RelationId id, List<String> nameParts, List<String>
partNames, boolean isTempPart,
List<Long> tabletIds, List<String> hints, Optional<TableSample>
tableSample, Optional<String> indexName,
- TableScanParams scanParams, Optional<Pair<Integer, Integer>>
indexInSqlString) {
+ TableScanParams scanParams, Optional<Pair<Integer, Integer>>
indexInSqlString,
+ Optional<TableSnapshot> tableSnapshot) {
this(id, nameParts, Optional.empty(), Optional.empty(),
- partNames, isTempPart, tabletIds, hints, tableSample,
indexName, scanParams, indexInSqlString);
+ partNames, isTempPart, tabletIds, hints, tableSample,
indexName, scanParams, indexInSqlString,
+ tableSnapshot);
}
/**
@@ -102,7 +109,8 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
public UnboundRelation(RelationId id, List<String> nameParts,
Optional<GroupExpression> groupExpression,
Optional<LogicalProperties> logicalProperties, List<String>
partNames, boolean isTempPart,
List<Long> tabletIds, List<String> hints, Optional<TableSample>
tableSample, Optional<String> indexName,
- TableScanParams scanParams, Optional<Pair<Integer, Integer>>
indexInSqlString) {
+ TableScanParams scanParams, Optional<Pair<Integer, Integer>>
indexInSqlString,
+ Optional<TableSnapshot> tableSnapshot) {
super(id, PlanType.LOGICAL_UNBOUND_RELATION, groupExpression,
logicalProperties);
this.nameParts =
ImmutableList.copyOf(Objects.requireNonNull(nameParts, "nameParts should not
null"));
this.partNames =
ImmutableList.copyOf(Objects.requireNonNull(partNames, "partNames should not
null"));
@@ -113,6 +121,7 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
this.indexName = indexName;
this.scanParams = scanParams;
this.indexInSqlString = indexInSqlString;
+ this.tableSnapshot = tableSnapshot;
}
public List<String> getNameParts() {
@@ -133,14 +142,14 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
public Plan withGroupExpression(Optional<GroupExpression> groupExpression)
{
return new UnboundRelation(relationId, nameParts,
groupExpression, Optional.of(getLogicalProperties()),
- partNames, isTempPart, tabletIds, hints, tableSample,
indexName, null, indexInSqlString);
+ partNames, isTempPart, tabletIds, hints, tableSample,
indexName, null, indexInSqlString, tableSnapshot);
}
@Override
public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression>
groupExpression,
Optional<LogicalProperties> logicalProperties, List<Plan>
children) {
return new UnboundRelation(relationId, nameParts, groupExpression,
logicalProperties, partNames,
- isTempPart, tabletIds, hints, tableSample, indexName, null,
indexInSqlString);
+ isTempPart, tabletIds, hints, tableSample, indexName, null,
indexInSqlString, tableSnapshot);
}
@Override
@@ -207,4 +216,8 @@ public class UnboundRelation extends LogicalRelation
implements Unbound, BlockFu
public Optional<Pair<Integer, Integer>> getIndexInSqlString() {
return indexInSqlString;
}
+
+ public Optional<TableSnapshot> getTableSnapshot() {
+ return tableSnapshot;
+ }
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
index 8a951f49a89..e40eead5340 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java
@@ -573,6 +573,10 @@ public class PhysicalPlanTranslator extends
DefaultPlanVisitor<PlanFragment, Pla
break;
case ICEBERG:
scanNode = new IcebergScanNode(context.nextPlanNodeId(),
tupleDescriptor, false);
+ IcebergScanNode icebergScanNode = (IcebergScanNode)
scanNode;
+ if (fileScan.getTableSnapshot().isPresent()) {
+
icebergScanNode.setTableSnapshot(fileScan.getTableSnapshot().get());
+ }
break;
case HIVE:
scanNode = new HiveScanNode(context.nextPlanNodeId(),
tupleDescriptor, false);
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
index 0089a25adba..0e244d794b0 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java
@@ -22,6 +22,7 @@ import org.apache.doris.analysis.BrokerDesc;
import org.apache.doris.analysis.StorageBackend;
import org.apache.doris.analysis.TableName;
import org.apache.doris.analysis.TableScanParams;
+import org.apache.doris.analysis.TableSnapshot;
import org.apache.doris.analysis.UserIdentity;
import org.apache.doris.catalog.AggregateType;
import org.apache.doris.catalog.BuiltinAggregateFunctions;
@@ -1370,15 +1371,25 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
scanParams = new
TableScanParams(ctx.optScanParams().funcName.getText(), map);
}
+ TableSnapshot tableSnapshot = null;
+ if (ctx.tableSnapshot() != null) {
+ if (ctx.tableSnapshot().TIME() != null) {
+ tableSnapshot = new
TableSnapshot(stripQuotes(ctx.tableSnapshot().time.getText()));
+ } else {
+ tableSnapshot = new
TableSnapshot(Long.parseLong(ctx.tableSnapshot().version.getText()));
+ }
+ }
+
MultipartIdentifierContext identifier = ctx.multipartIdentifier();
TableSample tableSample = ctx.sample() == null ? null : (TableSample)
visit(ctx.sample());
UnboundRelation relation = forCreateView ? new
UnboundRelation(StatementScopeIdGenerator.newRelationId(),
tableId, partitionNames, isTempPart, tabletIdLists,
relationHints,
Optional.ofNullable(tableSample), indexName, scanParams,
- Optional.of(Pair.of(identifier.start.getStartIndex(),
identifier.stop.getStopIndex()))) :
+ Optional.of(Pair.of(identifier.start.getStartIndex(),
identifier.stop.getStopIndex())),
+ Optional.ofNullable(tableSnapshot)) :
new UnboundRelation(StatementScopeIdGenerator.newRelationId(),
tableId, partitionNames, isTempPart, tabletIdLists,
relationHints,
- Optional.ofNullable(tableSample), indexName,
scanParams);
+ Optional.ofNullable(tableSample), indexName,
scanParams, Optional.ofNullable(tableSnapshot));
LogicalPlan checkedRelation =
LogicalPlanBuilderAssistant.withCheckPolicy(relation);
LogicalPlan plan = withTableAlias(checkedRelation, ctx.tableAlias());
for (LateralViewContext lateralViewContext : ctx.lateralView()) {
@@ -1387,6 +1398,14 @@ public class LogicalPlanBuilder extends
DorisParserBaseVisitor<Object> {
return plan;
}
+ public static String stripQuotes(String str) {
+ if ((str.charAt(0) == '\'' && str.charAt(str.length() - 1) == '\'')
+ || (str.charAt(0) == '\"' && str.charAt(str.length() - 1) ==
'\"')) {
+ str = str.substring(1, str.length() - 1);
+ }
+ return str;
+ }
+
@Override
public LogicalPlan visitAliasedQuery(AliasedQueryContext ctx) {
if (ctx.tableAlias().getText().equals("")) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
index df3743928a9..cf12e80ff22 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
@@ -274,13 +274,15 @@ public class BindRelation extends OneAnalysisRuleFactory {
}
hmsTable.setScanParams(unboundRelation.getScanParams());
return new
LogicalFileScan(unboundRelation.getRelationId(), (HMSExternalTable) table,
- qualifierWithoutTableName,
unboundRelation.getTableSample());
+ qualifierWithoutTableName,
unboundRelation.getTableSample(),
+ unboundRelation.getTableSnapshot());
case ICEBERG_EXTERNAL_TABLE:
case PAIMON_EXTERNAL_TABLE:
case MAX_COMPUTE_EXTERNAL_TABLE:
case TRINO_CONNECTOR_EXTERNAL_TABLE:
return new
LogicalFileScan(unboundRelation.getRelationId(), (ExternalTable) table,
- qualifierWithoutTableName,
unboundRelation.getTableSample());
+ qualifierWithoutTableName,
unboundRelation.getTableSample(),
+ unboundRelation.getTableSnapshot());
case SCHEMA:
return new
LogicalSchemaScan(unboundRelation.getRelationId(), table,
qualifierWithoutTableName);
case JDBC_EXTERNAL_TABLE:
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
index d86e1d1667e..8edb683151e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/LogicalFileScanToPhysicalFileScan.java
@@ -40,7 +40,8 @@ public class LogicalFileScanToPhysicalFileScan extends
OneImplementationRuleFact
fileScan.getLogicalProperties(),
fileScan.getConjuncts(),
fileScan.getSelectedPartitions(),
- fileScan.getTableSample())
+ fileScan.getTableSample(),
+ fileScan.getTableSnapshot())
).toRule(RuleType.LOGICAL_FILE_SCAN_TO_PHYSICAL_FILE_SCAN_RULE);
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
index f7bdae5c2f3..06d349fe2a6 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalFileScan.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.plans.logical;
+import org.apache.doris.analysis.TableSnapshot;
import org.apache.doris.catalog.PartitionItem;
import org.apache.doris.datasource.ExternalTable;
import org.apache.doris.nereids.memo.GroupExpression;
@@ -46,22 +47,25 @@ public class LogicalFileScan extends
LogicalExternalRelation {
private final SelectedPartitions selectedPartitions;
private final Optional<TableSample> tableSample;
+ private final Optional<TableSnapshot> tableSnapshot;
/**
* Constructor for LogicalFileScan.
*/
public LogicalFileScan(RelationId id, ExternalTable table, List<String>
qualifier,
Optional<GroupExpression> groupExpression,
Optional<LogicalProperties> logicalProperties,
- Set<Expression> conjuncts, SelectedPartitions selectedPartitions,
Optional<TableSample> tableSample) {
+ Set<Expression> conjuncts, SelectedPartitions selectedPartitions,
Optional<TableSample> tableSample,
+ Optional<TableSnapshot> tableSnapshot) {
super(id, PlanType.LOGICAL_FILE_SCAN, table, qualifier, conjuncts,
groupExpression, logicalProperties);
this.selectedPartitions = selectedPartitions;
this.tableSample = tableSample;
+ this.tableSnapshot = tableSnapshot;
}
public LogicalFileScan(RelationId id, ExternalTable table, List<String>
qualifier,
- Optional<TableSample> tableSample) {
+ Optional<TableSample> tableSample,
Optional<TableSnapshot> tableSnapshot) {
this(id, table, qualifier, Optional.empty(), Optional.empty(),
- Sets.newHashSet(), SelectedPartitions.NOT_PRUNED, tableSample);
+ Sets.newHashSet(), SelectedPartitions.NOT_PRUNED, tableSample,
tableSnapshot);
}
public SelectedPartitions getSelectedPartitions() {
@@ -72,6 +76,10 @@ public class LogicalFileScan extends LogicalExternalRelation
{
return tableSample;
}
+ public Optional<TableSnapshot> getTableSnapshot() {
+ return tableSnapshot;
+ }
+
@Override
public ExternalTable getTable() {
Preconditions.checkArgument(table instanceof ExternalTable,
@@ -90,31 +98,31 @@ public class LogicalFileScan extends
LogicalExternalRelation {
@Override
public LogicalFileScan withGroupExpression(Optional<GroupExpression>
groupExpression) {
return new LogicalFileScan(relationId, (ExternalTable) table,
qualifier, groupExpression,
- Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample);
+ Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
@Override
public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression>
groupExpression,
Optional<LogicalProperties> logicalProperties, List<Plan>
children) {
return new LogicalFileScan(relationId, (ExternalTable) table,
qualifier,
- groupExpression, logicalProperties, conjuncts,
selectedPartitions, tableSample);
+ groupExpression, logicalProperties, conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
@Override
public LogicalFileScan withConjuncts(Set<Expression> conjuncts) {
return new LogicalFileScan(relationId, (ExternalTable) table,
qualifier, Optional.empty(),
- Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample);
+ Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
public LogicalFileScan withSelectedPartitions(SelectedPartitions
selectedPartitions) {
return new LogicalFileScan(relationId, (ExternalTable) table,
qualifier, Optional.empty(),
- Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample);
+ Optional.of(getLogicalProperties()), conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
@Override
public LogicalFileScan withRelationId(RelationId relationId) {
return new LogicalFileScan(relationId, (ExternalTable) table,
qualifier, Optional.empty(),
- Optional.empty(), conjuncts, selectedPartitions, tableSample);
+ Optional.empty(), conjuncts, selectedPartitions, tableSample,
tableSnapshot);
}
@Override
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
index 843a03f69f9..8706db65f1e 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/physical/PhysicalFileScan.java
@@ -17,6 +17,7 @@
package org.apache.doris.nereids.trees.plans.physical;
+import org.apache.doris.analysis.TableSnapshot;
import org.apache.doris.datasource.ExternalTable;
import org.apache.doris.nereids.memo.GroupExpression;
import org.apache.doris.nereids.properties.DistributionSpec;
@@ -45,6 +46,7 @@ public class PhysicalFileScan extends PhysicalCatalogRelation
{
private final Set<Expression> conjuncts;
private final SelectedPartitions selectedPartitions;
private final Optional<TableSample> tableSample;
+ private final Optional<TableSnapshot> tableSnapshot;
/**
* Constructor for PhysicalFileScan.
@@ -52,12 +54,14 @@ public class PhysicalFileScan extends
PhysicalCatalogRelation {
public PhysicalFileScan(RelationId id, ExternalTable table, List<String>
qualifier,
DistributionSpec distributionSpec, Optional<GroupExpression>
groupExpression,
LogicalProperties logicalProperties, Set<Expression> conjuncts,
- SelectedPartitions selectedPartitions, Optional<TableSample>
tableSample) {
+ SelectedPartitions selectedPartitions, Optional<TableSample>
tableSample,
+ Optional<TableSnapshot> tableSnapshot) {
super(id, PlanType.PHYSICAL_FILE_SCAN, table, qualifier,
groupExpression, logicalProperties);
this.distributionSpec = distributionSpec;
this.conjuncts = conjuncts;
this.selectedPartitions = selectedPartitions;
this.tableSample = tableSample;
+ this.tableSnapshot = tableSnapshot;
}
/**
@@ -67,13 +71,14 @@ public class PhysicalFileScan extends
PhysicalCatalogRelation {
DistributionSpec distributionSpec, Optional<GroupExpression>
groupExpression,
LogicalProperties logicalProperties, PhysicalProperties
physicalProperties,
Statistics statistics, Set<Expression> conjuncts,
SelectedPartitions selectedPartitions,
- Optional<TableSample> tableSample) {
+ Optional<TableSample> tableSample, Optional<TableSnapshot>
tableSnapshot) {
super(id, PlanType.PHYSICAL_FILE_SCAN, table, qualifier,
groupExpression, logicalProperties,
physicalProperties, statistics);
this.distributionSpec = distributionSpec;
this.conjuncts = conjuncts;
this.selectedPartitions = selectedPartitions;
this.tableSample = tableSample;
+ this.tableSnapshot = tableSnapshot;
}
public DistributionSpec getDistributionSpec() {
@@ -92,6 +97,10 @@ public class PhysicalFileScan extends
PhysicalCatalogRelation {
return tableSample;
}
+ public Optional<TableSnapshot> getTableSnapshot() {
+ return tableSnapshot;
+ }
+
@Override
public String toString() {
return Utils.toSqlString("PhysicalFileScan",
@@ -112,14 +121,14 @@ public class PhysicalFileScan extends
PhysicalCatalogRelation {
@Override
public PhysicalFileScan withGroupExpression(Optional<GroupExpression>
groupExpression) {
return new PhysicalFileScan(relationId, getTable(), qualifier,
distributionSpec,
- groupExpression, getLogicalProperties(), conjuncts,
selectedPartitions, tableSample);
+ groupExpression, getLogicalProperties(), conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
@Override
public Plan withGroupExprLogicalPropChildren(Optional<GroupExpression>
groupExpression,
Optional<LogicalProperties> logicalProperties, List<Plan>
children) {
return new PhysicalFileScan(relationId, getTable(), qualifier,
distributionSpec,
- groupExpression, logicalProperties.get(), conjuncts,
selectedPartitions, tableSample);
+ groupExpression, logicalProperties.get(), conjuncts,
selectedPartitions, tableSample, tableSnapshot);
}
@Override
@@ -132,6 +141,6 @@ public class PhysicalFileScan extends
PhysicalCatalogRelation {
Statistics statistics) {
return new PhysicalFileScan(relationId, getTable(), qualifier,
distributionSpec,
groupExpression, getLogicalProperties(), physicalProperties,
statistics, conjuncts,
- selectedPartitions, tableSample);
+ selectedPartitions, tableSample, tableSnapshot);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]