risingwave_frontend/handler/
alter_database_param.rs

1// Copyright 2025 RisingWave Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use pgwire::pg_response::{PgResponse, StatementType};
16use risingwave_common::catalog::AlterDatabaseParam;
17use risingwave_sqlparser::ast::ObjectName;
18
19use super::{HandlerArgs, RwPgResponse};
20use crate::Binder;
21use crate::error::Result;
22
23pub async fn handle_alter_database_param(
24    handler_args: HandlerArgs,
25    database_name: ObjectName,
26    param: AlterDatabaseParam,
27) -> Result<RwPgResponse> {
28    let session = handler_args.session;
29
30    let database_name = Binder::resolve_database_name(database_name)?;
31    let database_id = {
32        let catalog_reader = session.env().catalog_reader().read_guard();
33        let database = catalog_reader.get_database_by_name(&database_name)?;
34
35        // The user should be super user or owner to alter the database.
36        session.check_privilege_for_drop_alter_db_schema(database)?;
37
38        database.id()
39    };
40
41    let catalog_writer = session.catalog_writer()?;
42    catalog_writer
43        .alter_database_param(database_id, param)
44        .await?;
45
46    Ok(PgResponse::empty_result(StatementType::ALTER_DATABASE))
47}
48
49#[cfg(test)]
50mod tests {
51    use crate::test_utils::LocalFrontend;
52
53    #[tokio::test]
54    async fn test_alter_barrier() {
55        let frontend = LocalFrontend::new(Default::default()).await;
56        let session = frontend.session_ref();
57        let catalog_reader = session.env().catalog_reader();
58
59        frontend.run_sql("CREATE DATABASE test_db").await.unwrap();
60        {
61            let reader = catalog_reader.read_guard();
62            let db = reader.get_database_by_name("test_db").unwrap();
63            assert!(db.barrier_interval_ms.is_none());
64            assert!(db.checkpoint_frequency.is_none());
65        }
66
67        frontend
68            .run_sql("ALTER DATABASE test_db SET BARRIER_INTERVAL_MS = 1000")
69            .await
70            .unwrap();
71        {
72            let reader = catalog_reader.read_guard();
73            let db = reader.get_database_by_name("test_db").unwrap();
74            assert_eq!(db.barrier_interval_ms, Some(1000));
75            assert!(db.checkpoint_frequency.is_none());
76        }
77
78        frontend
79            .run_sql("ALTER DATABASE test_db SET CHECKPOINT_FREQUENCY = 10")
80            .await
81            .unwrap();
82        {
83            let reader = catalog_reader.read_guard();
84            let db = reader.get_database_by_name("test_db").unwrap();
85            assert_eq!(db.barrier_interval_ms, Some(1000));
86            assert_eq!(db.checkpoint_frequency, Some(10));
87        }
88
89        frontend
90            .run_sql("ALTER DATABASE test_db SET BARRIER_INTERVAL_MS = DEFAULT")
91            .await
92            .unwrap();
93        {
94            let reader = catalog_reader.read_guard();
95            let db = reader.get_database_by_name("test_db").unwrap();
96            assert!(db.barrier_interval_ms.is_none());
97            assert_eq!(db.checkpoint_frequency, Some(10));
98        }
99
100        frontend
101            .run_sql("ALTER DATABASE test_db SET CHECKPOINT_FREQUENCY = DEFAULT")
102            .await
103            .unwrap();
104        {
105            let reader = catalog_reader.read_guard();
106            let db = reader.get_database_by_name("test_db").unwrap();
107            assert!(db.barrier_interval_ms.is_none());
108            assert!(db.checkpoint_frequency.is_none());
109        }
110    }
111}