Skip to content

Commit c6b26cc

Browse files
committed
Add when stale behavior in ConnectorMaterializedViewDefinition
This is a preparatory change that allows connectors to store information about the WHEN STALE behavior. The option cannot yet be used in practice, as execution will still fail with a NOT_SUPPORTED error.
1 parent 3079ae6 commit c6b26cc

File tree

28 files changed

+97
-4
lines changed

28 files changed

+97
-4
lines changed

core/trino-main/src/main/java/io/trino/execution/CreateMaterializedViewTask.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import io.trino.metadata.ViewColumn;
2828
import io.trino.security.AccessControl;
2929
import io.trino.spi.TrinoException;
30+
import io.trino.spi.connector.ConnectorMaterializedViewDefinition.WhenStaleBehavior;
3031
import io.trino.spi.type.Type;
3132
import io.trino.sql.PlannerContext;
3233
import io.trino.sql.analyzer.Analysis;
@@ -55,6 +56,7 @@
5556
import static io.trino.spi.StandardErrorCode.NOT_SUPPORTED;
5657
import static io.trino.spi.StandardErrorCode.TYPE_MISMATCH;
5758
import static io.trino.spi.connector.ConnectorCapabilities.MATERIALIZED_VIEW_GRACE_PERIOD;
59+
import static io.trino.spi.connector.ConnectorCapabilities.MATERIALIZED_VIEW_WHEN_STALE_BEHAVIOR;
5860
import static io.trino.sql.SqlFormatterUtil.getFormattedSql;
5961
import static io.trino.sql.analyzer.ConstantEvaluator.evaluateConstant;
6062
import static io.trino.sql.analyzer.SemanticExceptions.semanticException;
@@ -156,12 +158,21 @@ Analysis executeInternal(
156158
return Duration.ofMillis(milliseconds);
157159
});
158160

161+
Optional<WhenStaleBehavior> whenStale = statement.getWhenStaleBehavior()
162+
.map(_ -> {
163+
if (!plannerContext.getMetadata().getConnectorCapabilities(session, catalogHandle).contains(MATERIALIZED_VIEW_WHEN_STALE_BEHAVIOR)) {
164+
throw semanticException(NOT_SUPPORTED, statement, "Catalog '%s' does not support WHEN STALE", catalogName);
165+
}
166+
throw semanticException(NOT_SUPPORTED, statement, "WHEN STALE is not supported yet");
167+
});
168+
159169
MaterializedViewDefinition definition = new MaterializedViewDefinition(
160170
sql,
161171
session.getCatalog(),
162172
session.getSchema(),
163173
columns,
164174
gracePeriod,
175+
whenStale,
165176
statement.getComment(),
166177
session.getIdentity(),
167178
session.getPath().getPath().stream()

core/trino-main/src/main/java/io/trino/metadata/MaterializedViewDefinition.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.trino.spi.connector.CatalogSchemaName;
1717
import io.trino.spi.connector.CatalogSchemaTableName;
1818
import io.trino.spi.connector.ConnectorMaterializedViewDefinition;
19+
import io.trino.spi.connector.ConnectorMaterializedViewDefinition.WhenStaleBehavior;
1920
import io.trino.spi.security.Identity;
2021

2122
import java.time.Duration;
@@ -31,6 +32,7 @@ public class MaterializedViewDefinition
3132
extends ViewDefinition
3233
{
3334
private final Optional<Duration> gracePeriod;
35+
private final Optional<WhenStaleBehavior> whenStaleBehavior;
3436
private final Optional<CatalogSchemaTableName> storageTable;
3537

3638
public MaterializedViewDefinition(
@@ -39,6 +41,7 @@ public MaterializedViewDefinition(
3941
Optional<String> schema,
4042
List<ViewColumn> columns,
4143
Optional<Duration> gracePeriod,
44+
Optional<WhenStaleBehavior> whenStaleBehavior,
4245
Optional<String> comment,
4346
Identity owner,
4447
List<CatalogSchemaName> path,
@@ -47,6 +50,7 @@ public MaterializedViewDefinition(
4750
super(originalSql, catalog, schema, columns, comment, Optional.of(owner), path);
4851
this.gracePeriod = requireNonNull(gracePeriod, "gracePeriod is null");
4952
checkArgument(gracePeriod.isEmpty() || !gracePeriod.get().isNegative(), "gracePeriod cannot be negative: %s", gracePeriod);
53+
this.whenStaleBehavior = requireNonNull(whenStaleBehavior, "whenStaleBehavior is null");
5054
this.storageTable = requireNonNull(storageTable, "storageTable is null");
5155
}
5256

@@ -55,6 +59,11 @@ public Optional<Duration> getGracePeriod()
5559
return gracePeriod;
5660
}
5761

62+
public Optional<WhenStaleBehavior> getWhenStaleBehavior()
63+
{
64+
return whenStaleBehavior;
65+
}
66+
5867
public Optional<CatalogSchemaTableName> getStorageTable()
5968
{
6069
return storageTable;
@@ -71,6 +80,7 @@ public ConnectorMaterializedViewDefinition toConnectorMaterializedViewDefinition
7180
.map(column -> new ConnectorMaterializedViewDefinition.Column(column.name(), column.type(), column.comment()))
7281
.collect(toImmutableList()),
7382
getGracePeriod(),
83+
whenStaleBehavior,
7484
getComment(),
7585
getRunAsIdentity().map(Identity::getUser),
7686
getPath());
@@ -85,6 +95,7 @@ public String toString()
8595
.add("schema", getSchema().orElse(null))
8696
.add("columns", getColumns())
8797
.add("gracePeriod", gracePeriod.orElse(null))
98+
.add("whenStaleBehavior", whenStaleBehavior.orElse(null))
8899
.add("comment", getComment().orElse(null))
89100
.add("runAsIdentity", getRunAsIdentity())
90101
.add("path", getPath())

core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1827,6 +1827,7 @@ private static MaterializedViewDefinition createMaterializedViewDefinition(Conne
18271827
.map(column -> new ViewColumn(column.getName(), column.getType(), Optional.empty()))
18281828
.collect(toImmutableList()),
18291829
view.getGracePeriod(),
1830+
view.getWhenStaleBehavior(),
18301831
view.getComment(),
18311832
runAsIdentity,
18321833
view.getPath(),

core/trino-main/src/main/java/io/trino/sql/analyzer/StatementAnalyzer.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1486,9 +1486,6 @@ protected Scope visitCreateMaterializedView(CreateMaterializedView node, Optiona
14861486
}
14871487
analyzeExpression(gracePeriod, Scope.create());
14881488
});
1489-
if (node.getWhenStaleBehavior().isPresent()) {
1490-
throw new TrinoException(NOT_SUPPORTED, "WHEN STALE is not supported yet");
1491-
}
14921489

14931490
// analyze the query that creates the view
14941491
StatementAnalyzer analyzer = statementAnalyzerFactory.createStatementAnalyzer(analysis, session, warningCollector, CorrelationSupport.ALLOWED);

core/trino-main/src/test/java/io/trino/execution/BaseDataDefinitionTaskTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ protected MaterializedViewDefinition someMaterializedView(String sql, List<ViewC
205205
columns,
206206
Optional.empty(),
207207
Optional.empty(),
208+
Optional.empty(),
208209
Identity.ofUser("owner"),
209210
ImmutableList.of(),
210211
Optional.empty());
@@ -591,6 +592,7 @@ public void setMaterializedViewColumnComment(Session session, QualifiedObjectNam
591592
.map(currentViewColumn -> columnName.equals(currentViewColumn.name()) ? new ViewColumn(currentViewColumn.name(), currentViewColumn.type(), comment) : currentViewColumn)
592593
.collect(toImmutableList()),
593594
view.getGracePeriod(),
595+
view.getWhenStaleBehavior(),
594596
view.getComment(),
595597
view.getRunAsIdentity().get(),
596598
view.getPath(),

core/trino-main/src/test/java/io/trino/sql/analyzer/TestAnalyzer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7899,6 +7899,7 @@ public void setup()
78997899
Optional.of("s1"),
79007900
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty())),
79017901
Optional.of(Duration.ZERO),
7902+
Optional.empty(),
79027903
Optional.of("comment"),
79037904
Identity.ofUser("user"),
79047905
ImmutableList.of(),
@@ -8029,6 +8030,7 @@ public void setup()
80298030
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty())),
80308031
Optional.of(Duration.ZERO),
80318032
Optional.empty(),
8033+
Optional.empty(),
80328034
Identity.ofUser("some user"),
80338035
ImmutableList.of(),
80348036
Optional.of(new CatalogSchemaTableName(TPCH_CATALOG, "s1", "t1"))),
@@ -8083,6 +8085,7 @@ public void setup()
80838085
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("b", BIGINT.getTypeId(), Optional.empty())),
80848086
Optional.empty(),
80858087
Optional.empty(),
8088+
Optional.empty(),
80868089
Identity.ofUser("some user"),
80878090
ImmutableList.of(),
80888091
// t3 has a, b column and hidden column x
@@ -8103,6 +8106,7 @@ public void setup()
81038106
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty())),
81048107
Optional.empty(),
81058108
Optional.empty(),
8109+
Optional.empty(),
81068110
Identity.ofUser("some user"),
81078111
ImmutableList.of(),
81088112
Optional.of(new CatalogSchemaTableName(TPCH_CATALOG, "s1", "t2"))),
@@ -8122,6 +8126,7 @@ public void setup()
81228126
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("c", BIGINT.getTypeId(), Optional.empty())),
81238127
Optional.empty(),
81248128
Optional.empty(),
8129+
Optional.empty(),
81258130
Identity.ofUser("some user"),
81268131
ImmutableList.of(),
81278132
Optional.of(new CatalogSchemaTableName(TPCH_CATALOG, "s1", "t2"))),
@@ -8141,6 +8146,7 @@ public void setup()
81418146
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("b", RowType.anonymousRow(TINYINT).getTypeId(), Optional.empty())),
81428147
Optional.empty(),
81438148
Optional.empty(),
8149+
Optional.empty(),
81448150
Identity.ofUser("some user"),
81458151
ImmutableList.of(),
81468152
Optional.of(new CatalogSchemaTableName(TPCH_CATALOG, "s1", "t2"))),

core/trino-main/src/test/java/io/trino/sql/planner/TestMaterializedViews.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ protected PlanTester createPlanTester()
186186
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("b", BIGINT.getTypeId(), Optional.empty())),
187187
Optional.of(STALE_MV_STALENESS.plusHours(1)),
188188
Optional.empty(),
189+
Optional.empty(),
189190
Identity.ofUser("some user"),
190191
ImmutableList.of(),
191192
Optional.of(new CatalogSchemaTableName(TEST_CATALOG_NAME, SCHEMA, "storage_table")));
@@ -220,6 +221,7 @@ protected PlanTester createPlanTester()
220221
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("b", BIGINT.getTypeId(), Optional.empty())),
221222
Optional.empty(),
222223
Optional.empty(),
224+
Optional.empty(),
223225
Identity.ofUser("some user"),
224226
ImmutableList.of(),
225227
Optional.of(new CatalogSchemaTableName(TEST_CATALOG_NAME, SCHEMA, "storage_table_with_casts")));
@@ -254,6 +256,7 @@ protected PlanTester createPlanTester()
254256
ImmutableList.of(new ViewColumn("id", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("ts", timestampWithTimezone3.getTypeId(), Optional.empty())),
255257
Optional.empty(),
256258
Optional.empty(),
259+
Optional.empty(),
257260
Identity.ofUser("some user"),
258261
ImmutableList.of(),
259262
Optional.of(new CatalogSchemaTableName(TEST_CATALOG_NAME, SCHEMA, "timestamp_test_storage")));
@@ -285,6 +288,7 @@ private void createMaterializedView(String materializedViewName, String query)
285288
ImmutableList.of(new ViewColumn("a", BIGINT.getTypeId(), Optional.empty()), new ViewColumn("b", BIGINT.getTypeId(), Optional.empty())),
286289
Optional.of(STALE_MV_STALENESS.plusHours(1)),
287290
Optional.empty(),
291+
Optional.empty(),
288292
Identity.ofUser("some user"),
289293
ImmutableList.of(),
290294
Optional.of(new CatalogSchemaTableName(TEST_CATALOG_NAME, SCHEMA, "storage_table")));

core/trino-main/src/test/java/io/trino/sql/query/TestColumnMask.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ public TestColumnMask()
133133
new ConnectorMaterializedViewDefinition.Column("comment", VarcharType.createVarcharType(152).getTypeId(), Optional.empty())),
134134
Optional.of(Duration.ZERO),
135135
Optional.empty(),
136+
Optional.empty(),
136137
Optional.of(VIEW_OWNER),
137138
ImmutableList.of());
138139

@@ -148,6 +149,7 @@ public TestColumnMask()
148149
new ConnectorMaterializedViewDefinition.Column("comment", VarcharType.createVarcharType(152).getTypeId(), Optional.empty())),
149150
Optional.of(Duration.ZERO),
150151
Optional.empty(),
152+
Optional.empty(),
151153
Optional.of(VIEW_OWNER),
152154
ImmutableList.of());
153155

@@ -163,6 +165,7 @@ public TestColumnMask()
163165
new ConnectorMaterializedViewDefinition.Column("comment", VarcharType.createVarcharType(152).getTypeId(), Optional.empty())),
164166
Optional.of(Duration.ZERO),
165167
Optional.empty(),
168+
Optional.empty(),
166169
Optional.of(VIEW_OWNER),
167170
ImmutableList.of());
168171

core/trino-main/src/test/java/io/trino/testing/TestTestingMetadata.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ private static ConnectorMaterializedViewDefinition someMaterializedView()
6161
ImmutableList.of(new Column("test", BIGINT.getTypeId(), Optional.empty())),
6262
Optional.of(Duration.ZERO),
6363
Optional.empty(),
64+
Optional.empty(),
6465
Optional.of("owner"),
6566
ImmutableList.of());
6667
}

core/trino-spi/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,11 @@
297297
<old>method void io.trino.spi.block.PageBuilderStatus::&lt;init&gt;()</old>
298298
<justification>Method is unnecessary</justification>
299299
</item>
300+
<item>
301+
<code>java.method.numberOfParametersChanged</code>
302+
<old>method void io.trino.spi.connector.ConnectorMaterializedViewDefinition::&lt;init&gt;(java.lang.String, java.util.Optional&lt;io.trino.spi.connector.CatalogSchemaTableName&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.List&lt;io.trino.spi.connector.ConnectorMaterializedViewDefinition.Column&gt;, java.util.Optional&lt;java.time.Duration&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.List&lt;io.trino.spi.connector.CatalogSchemaName&gt;)</old>
303+
<new>method void io.trino.spi.connector.ConnectorMaterializedViewDefinition::&lt;init&gt;(java.lang.String, java.util.Optional&lt;io.trino.spi.connector.CatalogSchemaTableName&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.List&lt;io.trino.spi.connector.ConnectorMaterializedViewDefinition.Column&gt;, java.util.Optional&lt;java.time.Duration&gt;, java.util.Optional&lt;io.trino.spi.connector.ConnectorMaterializedViewDefinition.WhenStaleBehavior&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.Optional&lt;java.lang.String&gt;, java.util.List&lt;io.trino.spi.connector.CatalogSchemaName&gt;)</new>
304+
</item>
300305
</differences>
301306
</revapi.differences>
302307
</analysisConfiguration>

0 commit comments

Comments
 (0)