risingwave_frontend/handler/
use_db.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::StatementType;
16use risingwave_common::acl::AclMode;
17use risingwave_sqlparser::ast::ObjectName;
18
19use crate::Binder;
20use crate::error::Result;
21use crate::handler::privilege::ObjectCheckItem;
22use crate::handler::{HandlerArgs, RwPgResponse};
23
24pub fn handle_use_db(handler_args: HandlerArgs, database_name: ObjectName) -> Result<RwPgResponse> {
25    let session = handler_args.session;
26    let database_name = Binder::resolve_database_name(database_name)?;
27
28    let (database_id, owner_id) = {
29        let catalog_reader = session.env().catalog_reader();
30        let reader = catalog_reader.read_guard();
31        let db = reader.get_database_by_name(&database_name)?;
32        (db.id(), db.owner)
33    };
34    session.check_privileges(&[ObjectCheckItem::new(
35        owner_id,
36        AclMode::Connect,
37        database_name.clone(),
38        database_id,
39    )])?;
40
41    let mut builder = RwPgResponse::builder(StatementType::USE);
42    builder = builder.notice(format!(
43        "You are now connected to database \"{}\" as user \"{}\".",
44        database_name,
45        session.user_name()
46    ));
47
48    // reset search_path
49    session.reset_config("search_path")?;
50
51    session.update_database(database_name);
52
53    Ok(builder.into())
54}