risingwave_frontend/expr/function_impl/
pg_table_is_visible.rsuse risingwave_common::acl::AclMode;
use risingwave_common::session_config::SearchPath;
use risingwave_expr::{capture_context, function, Result};
use risingwave_pb::user::grant_privilege::Object as GrantObject;
use super::context::{AUTH_CONTEXT, CATALOG_READER, DB_NAME, SEARCH_PATH, USER_INFO_READER};
use crate::catalog::system_catalog::is_system_catalog;
use crate::catalog::CatalogReader;
use crate::expr::function_impl::has_privilege::user_not_found_err;
use crate::session::AuthContext;
use crate::user::user_service::UserInfoReader;
#[function("pg_table_is_visible(int4) -> boolean")]
fn pg_table_is_visible(oid: i32) -> Result<Option<bool>> {
pg_table_is_visible_impl_captured(oid)
}
#[capture_context(CATALOG_READER, USER_INFO_READER, AUTH_CONTEXT, SEARCH_PATH, DB_NAME)]
fn pg_table_is_visible_impl(
catalog: &CatalogReader,
user_info: &UserInfoReader,
auth_context: &AuthContext,
search_path: &SearchPath,
db_name: &str,
oid: i32,
) -> Result<Option<bool>> {
if is_system_catalog(oid as u32) {
return Ok(Some(true));
}
let catalog_reader = catalog.read_guard();
let user_reader = user_info.read_guard();
let user_info = user_reader
.get_user_by_name(&auth_context.user_name)
.ok_or(user_not_found_err(
format!("User {} not found", auth_context.user_name).as_str(),
))?;
for schema in search_path.path() {
if let Ok(schema) = catalog_reader.get_schema_by_name(db_name, schema) {
if schema.contains_object(oid as u32) {
return if user_info.is_super
|| user_info
.check_privilege(&GrantObject::SchemaId(schema.id()), AclMode::Usage)
{
Ok(Some(true))
} else {
Ok(Some(false))
};
}
}
}
Ok(None)
}