Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ ALTER MATERIALIZED VIEW lo_mv1 RENAME lo_mv1_new_name;
Example 2: Alter the refresh interval of the materialized view.

```SQL
ALTER MATERIALIZED VIEW lo_mv2 REFRESH ASYNC EVERY(INTERVAL 1 DAY);
ALTER MATERIALIZED VIEW lo_mv2 REFRESH SCHEDULE EVERY(INTERVAL 1 DAY);
```

Example 3: Alter the timeout duration for the materialized view refresh tasks to 1 hour (default).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
-- refresh_moment
[IMMEDIATE | DEFERRED]
-- refresh_scheme
[ASYNC | ASYNC [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
[ASYNC | SCHEDULE [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
]
-- partition_expression
[PARTITION BY
Expand Down Expand Up @@ -250,7 +250,7 @@ The refresh moment of the materialized view. Default value: `IMMEDIATE`. Valid v
The refresh strategy of the asynchronous materialized view. Valid values:

- `ASYNC`: Automatic refresh mode. Each time the base table data changes, the materialized view is automatically refreshed.
- `ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>)`: Regular refresh mode. The materialized view is refreshed regularly at the interval defined. You can specify the interval as `EVERY (interval n day/hour/minute/second)` using the following units: `DAY`, `HOUR`, `MINUTE`, and `SECOND`. The default value is `10 MINUTE`. You can further specify the refresh start time as `START('yyyy-MM-dd hh:mm:ss')`. If the start time is not specified, the current time is used. Example: `ASYNC START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`.
- `SCHEDULE [START (<start_time>)] EVERY(INTERVAL <interval>)`: Regular refresh mode. The materialized view is refreshed regularly at the interval defined. You can specify the interval as `EVERY (interval n day/hour/minute/second)` using the following units: `DAY`, `HOUR`, `MINUTE`, and `SECOND`. The default value is `10 MINUTE`. You can further specify the refresh start time as `START('yyyy-MM-dd hh:mm:ss')`. If the start time is not specified, the current time is used. Example: `SCHEDULE START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`. The legacy form `ASYNC [START (...)] EVERY (...)` is still accepted for backward compatibility but `SHOW CREATE MATERIALIZED VIEW` always renders the scheduled form with `SCHEDULE`.
- `MANUAL`: Manual refresh mode. The materialized view will not be refreshed unless you trigger a refresh task manually.

If this parameter is not specified, the default value `MANUAL` is used.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ ALTER MATERIALIZED VIEW lo_mv1 RENAME lo_mv1_new_name;
例2: マテリアライズドビューのリフレッシュ間隔を変更します。

```SQL
ALTER MATERIALIZED VIEW lo_mv2 REFRESH ASYNC EVERY(INTERVAL 1 DAY);
ALTER MATERIALIZED VIEW lo_mv2 REFRESH SCHEDULE EVERY(INTERVAL 1 DAY);
```

例3: マテリアライズドビューのリフレッシュタスクのタイムアウト期間を1時間(デフォルト)に変更します。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
-- refresh_moment
[IMMEDIATE | DEFERRED]
-- refresh_scheme
[ASYNC | ASYNC [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
[ASYNC | SCHEDULE [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
]
-- partition_expression
[PARTITION BY
Expand Down Expand Up @@ -252,7 +252,7 @@ AS
非同期マテリアライズドビューのリフレッシュ戦略。有効な値:

- `ASYNC`: 自動リフレッシュモード。ベーステーブルデータが変更されるたびに、マテリアライズドビューが自動的にリフレッシュされます。
- `ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>)`: 定期リフレッシュモード。定義された間隔でマテリアライズドビューが定期的にリフレッシュされます。間隔は`EVERY (interval n day/hour/minute/second)`として指定できます。使用可能な単位は`DAY`、`HOUR`、`MINUTE`、`SECOND`です。デフォルト値は`10 MINUTE`です。リフレッシュ開始時間を`START('yyyy-MM-dd hh:mm:ss')`としてさらに指定できます。開始時間が指定されていない場合、現在の時間が使用されます。例: `ASYNC START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`。
- `SCHEDULE [START (<start_time>)] EVERY(INTERVAL <interval>)`: 定期リフレッシュモード。定義された間隔でマテリアライズドビューが定期的にリフレッシュされます。間隔は`EVERY (interval n day/hour/minute/second)`として指定できます。使用可能な単位は`DAY`、`HOUR`、`MINUTE`、`SECOND`です。デフォルト値は`10 MINUTE`です。リフレッシュ開始時間を`START('yyyy-MM-dd hh:mm:ss')`としてさらに指定できます。開始時間が指定されていない場合、現在の時間が使用されます。例: `SCHEDULE START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`。互換性のため `ASYNC [START (...)] EVERY (...)` も引き続き受け付けますが、`SHOW CREATE MATERIALIZED VIEW` の出力は常に `SCHEDULE` で表示されます
- `MANUAL`: 手動リフレッシュモード。リフレッシュタスクを手動でトリガーしない限り、マテリアライズドビューはリフレッシュされません。

このパラメータが指定されていない場合、デフォルト値`MANUAL`が使用されます。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ ALTER MATERIALIZED VIEW lo_mv1 RENAME lo_mv1_new_name;
示例二:修改物化视图刷新间隔

```SQL
ALTER MATERIALIZED VIEW lo_mv2 REFRESH ASYNC EVERY(INTERVAL 1 DAY);
ALTER MATERIALIZED VIEW lo_mv2 REFRESH SCHEDULE EVERY(INTERVAL 1 DAY);
```

示例三:修改物化视图属性,调整物化视图刷新 Timeout 为一小时(默认)。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ CREATE MATERIALIZED VIEW [IF NOT EXISTS] [database.]<mv_name>
-- refresh_moment
[IMMEDIATE | DEFERRED]
-- refresh_scheme
[ASYNC | ASYNC [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
[ASYNC | SCHEDULE [START (<start_time>)] EVERY (INTERVAL <refresh_interval>) | MANUAL]
]
-- partition_expression
[PARTITION BY
Expand Down Expand Up @@ -248,7 +248,7 @@ AS
物化视图的刷新方式。该参数支持如下值:

- `ASYNC`: 自动刷新模式。每当基表数据发生变化时,物化视图会自动刷新。
- `ASYNC [START (<start_time>)] EVERY(INTERVAL <interval>)`: 定时刷新模式。物化视图将按照定义的间隔定时刷新。您可以使用 `DAY`(天)、`HOUR`(小时)、`MINUTE`(分钟)和 `SECOND`(秒)作为单位指定间隔,格式为 `EVERY (interval n day/hour/minute/second)`。默认值为 `10 MINUTE`(10 分钟)。您还可以进一步指定刷新起始时间,格式为 `START('yyyy-MM-dd hh:mm:ss')`。如未指定起始时间,默认使用当前时间。示例:`ASYNC START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`。
- `SCHEDULE [START (<start_time>)] EVERY(INTERVAL <interval>)`: 定时刷新模式。物化视图将按照定义的间隔定时刷新。您可以使用 `DAY`(天)、`HOUR`(小时)、`MINUTE`(分钟)和 `SECOND`(秒)作为单位指定间隔,格式为 `EVERY (interval n day/hour/minute/second)`。默认值为 `10 MINUTE`(10 分钟)。您还可以进一步指定刷新起始时间,格式为 `START('yyyy-MM-dd hh:mm:ss')`。如未指定起始时间,默认使用当前时间。示例:`SCHEDULE START ('2023-09-12 16:30:25') EVERY (INTERVAL 5 MINUTE)`。为兼容旧版本,`ASYNC [START (...)] EVERY (...)` 仍然被接受,但 `SHOW CREATE MATERIALIZED VIEW` 输出的定时刷新部分始终使用 `SCHEDULE`。
- `MANUAL`: 手动刷新模式。除非手动触发刷新任务,否则物化视图不会刷新。

如果不指定该参数,则默认使用 MANUAL 方式。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1906,10 +1906,18 @@ public String getMaterializedViewDdlStmt(boolean simple, boolean isReplay) {
if (refreshScheme == null) {
sb.append("\nREFRESH ").append("UNKNOWN");
} else {
// Prefer the SCHEDULE keyword for scheduled refresh (ASYNC + EVERY). ASYNC is kept
// as the legacy synonym in the parser; for bare ASYNC (no EVERY) we still emit
// ASYNC because bare SCHEDULE is not a valid form.
String typeName = refreshScheme.getType().name();
if (refreshScheme.getType() == MaterializedViewRefreshType.ASYNC
&& refreshScheme.getAsyncRefreshContext().getTimeUnit() != null) {
typeName = "SCHEDULE";
}
if (refreshScheme.getMoment().equals(RefreshMoment.DEFERRED)) {
sb.append(String.format("\nREFRESH %s %s", refreshScheme.getMoment(), refreshScheme.getType()));
sb.append(String.format("\nREFRESH %s %s", refreshScheme.getMoment(), typeName));
} else {
sb.append("\nREFRESH ").append(refreshScheme.getType());
sb.append("\nREFRESH ").append(typeName);
}
}
if (refreshScheme != null && refreshScheme.getType() == MaterializedViewRefreshType.ASYNC) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9155,7 +9155,8 @@ public ParseNode visitRefreshSchemeDesc(com.starrocks.sql.parser.StarRocksParser
} else if (context.IMMEDIATE() != null) {
refreshMoment = RefreshSchemeClause.RefreshMoment.IMMEDIATE;
}
if (context.ASYNC() != null) {
// SCHEDULE is the preferred keyword; ASYNC is kept as a synonym for compatibility.
if (context.ASYNC() != null || context.SCHEDULE() != null) {
boolean defineStartTime = false;
if (context.START() != null) {
NodePosition timePos = createPos(context.string());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,19 @@ public void testAlterRefreshScheme() throws Exception {
MaterializedView mv = starRocksAssert.getMv("test", mvName);
String taskDefinition = mv.getTaskDefinition();
for (String refresh : refreshSchemes) {
// alter
// alter — ASYNC is kept as a legacy synonym; SCHEDULE is the preferred keyword
// for the EVERY form and is what SHOW CREATE displays.
String sql = String.format("alter materialized view %s refresh %s", mvName, refresh);
starRocksAssert.ddl(sql);

// verify
mv = starRocksAssert.getMv("test", mvName);
String showCreateStmt = mv.getMaterializedViewDdlStmt(false);
Assertions.assertTrue(showCreateStmt.contains(refresh),
// SHOW CREATE rewrites "ASYNC ... EVERY ..." to "SCHEDULE ... EVERY ..." but leaves
// bare ASYNC (no EVERY) unchanged.
String expected = refresh.contains("EVERY")
? refresh.replaceFirst("^ASYNC", "SCHEDULE")
: refresh;
Assertions.assertTrue(showCreateStmt.contains(expected),
String.format("alter to %s \nbut got \n%s", refresh, showCreateStmt));
Assertions.assertEquals(taskDefinition, mv.getTaskDefinition());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -237,13 +237,46 @@ public void testMvUniqueConstraintsTableNotExist() throws Exception {
Assertions.assertThrows(SemanticException.class, () -> table.getUniqueConstraints().get(0).getUniqueColumnNames(table));
}

@Test
public void testAsyncIsSynonymForScheduleAndShowCreatePrefersSchedule() throws Exception {
final String mvName = "test_mv_async_synonym";
starRocksAssert.ddl("drop materialized view if exists " + mvName);
// ASYNC must remain accepted as a synonym.
starRocksAssert.withMaterializedView("CREATE MATERIALIZED VIEW " + mvName +
" DISTRIBUTED BY HASH(`k1`) BUCKETS 3" +
" REFRESH ASYNC EVERY(INTERVAL 1 HOUR)" +
" AS SELECT k1, k2 FROM test.tbl1");
MaterializedView mv = starRocksAssert.getMv(starRocksAssert.getCtx().getDatabase(), mvName);
List<String> ddl = Lists.newArrayList();
AstToStringBuilder.getDdlStmt(mv, ddl, null, null, false, true);
Assertions.assertTrue(ddl.get(0).contains("REFRESH SCHEDULE EVERY(INTERVAL 1 HOUR)"),
"SHOW CREATE should display SCHEDULE, got: " + ddl.get(0));
Assertions.assertFalse(ddl.get(0).contains("REFRESH ASYNC"),
"SHOW CREATE should not display ASYNC, got: " + ddl.get(0));
starRocksAssert.dropMaterializedView(mvName);

// SCHEDULE should also parse and produce the same display.
starRocksAssert.withMaterializedView("CREATE MATERIALIZED VIEW " + mvName +
" DISTRIBUTED BY HASH(`k1`) BUCKETS 3" +
" REFRESH SCHEDULE EVERY(INTERVAL 1 HOUR)" +
" AS SELECT k1, k2 FROM test.tbl1");
mv = starRocksAssert.getMv(starRocksAssert.getCtx().getDatabase(), mvName);
ddl.clear();
AstToStringBuilder.getDdlStmt(mv, ddl, null, null, false, true);
Assertions.assertTrue(ddl.get(0).contains("REFRESH SCHEDULE EVERY(INTERVAL 1 HOUR)"),
"SHOW CREATE should display SCHEDULE, got: " + ddl.get(0));
starRocksAssert.dropMaterializedView(mvName);
}

public static Stream<Arguments> genTestArguments() {
// Bare ASYNC (without EVERY) is the legacy form retained for backward compatibility;
// SCHEDULE is the preferred keyword for scheduled refresh and requires EVERY.
List<String> refreshArgumentsList = Lists.newArrayList(
"REFRESH MANUAL",
"REFRESH DEFERRED MANUAL",
"REFRESH ASYNC",
"REFRESH ASYNC EVERY(INTERVAL 1 HOUR)",
"REFRESH ASYNC START(\"1998-01-01 00:00:00\") EVERY(INTERVAL 1 HOUR)"
"REFRESH SCHEDULE EVERY(INTERVAL 1 HOUR)",
"REFRESH SCHEDULE START(\"1998-01-01 00:00:00\") EVERY(INTERVAL 1 HOUR)"
);
List<String> orderByList = Lists.newArrayList("", "ORDER BY (k3)");
List<String> propertiesList = Lists.newArrayList(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3024,7 +3024,7 @@ alterModifyDefaultBuckets

refreshSchemeDesc
: REFRESH (IMMEDIATE | DEFERRED)? (ASYNC
| ASYNC (START '(' string ')')? EVERY '(' interval ')'
| (ASYNC | SCHEDULE) (START '(' string ')')? EVERY '(' interval ')'
| INCREMENTAL
| MANUAL)
;
Expand Down
Loading