risingwave_frontend/handler/
use_db.rs1use 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 session.reset_config("search_path")?;
50
51 session.update_database(database_name);
52
53 Ok(builder.into())
54}