21 #include <boost/algorithm/string/predicate.hpp>
23 #include "rapidjson/document.h"
42 template <
class LockType>
44 std::unique_ptr<lockmgr::TableSchemaLockContainer<LockType>>>
46 const std::string& table_name,
47 const bool populate_fragmenter) {
48 const TableDescriptor* td{
nullptr};
49 std::unique_ptr<lockmgr::TableSchemaLockContainer<LockType>> td_with_lock =
50 std::make_unique<lockmgr::TableSchemaLockContainer<LockType>>(
52 cat, table_name, populate_fragmenter));
54 td = (*td_with_lock)();
56 return std::make_tuple(td, std::move(td_with_lock));
66 : File_Namespace::StorageStats(storage_stats)
67 , min_epoch(storage_stats.epoch)
68 , max_epoch(storage_stats.epoch)
69 , min_epoch_floor(storage_stats.epoch_floor)
70 , max_epoch_floor(storage_stats.epoch_floor) {}
77 if (total_free_metadata_page_count) {
78 total_free_metadata_page_count.value() +=
88 if (total_free_data_page_count) {
89 total_free_data_page_count.value() +=
95 min_epoch = std::min(min_epoch, storage_stats.
epoch);
96 max_epoch = std::max(max_epoch, storage_stats.
epoch);
97 min_epoch_floor = std::min(min_epoch_floor, storage_stats.
epoch_floor);
98 max_epoch_floor = std::max(max_epoch_floor, storage_stats.
epoch_floor);
105 std::optional<AggregratedStorageStats> agg_storage_stats;
110 for (
const auto physical_table : physical_tables) {
111 auto storage_stats = global_file_mgr->getStorageStats(catalog->
getDatabaseId(),
112 physical_table->tableId);
113 if (agg_storage_stats) {
114 agg_storage_stats.value().aggregate(storage_stats);
116 agg_storage_stats = storage_stats;
123 CHECK(agg_storage_stats.has_value());
124 return agg_storage_stats.value();
128 return std::unique_ptr<RexLiteral>(
133 return std::unique_ptr<RexLiteral>(
new RexLiteral(
138 return std::unique_ptr<RexLiteral>(
143 return std::unique_ptr<RexLiteral>(
150 std::vector<TargetMetaInfo>& label_infos,
151 const std::vector<std::tuple<std::string, SQLTypes, bool>>& headers) {
152 for (
const auto& header : headers) {
153 auto [_val, _type, _notnull] = header;
155 label_infos.emplace_back(_val,
SQLTypeInfo(_type, _notnull));
157 UNREACHABLE() <<
"Unsupported type provided for header. SQL type: "
164 const TableDescriptor* logical_table,
166 bool is_sharded_table = (logical_table->
nShards > 0);
180 logical_values.back().emplace_back(
182 logical_values.back().emplace_back(
184 logical_values.back().emplace_back(
188 logical_values.back().emplace_back(
195 logical_values.back().emplace_back(
197 logical_values.back().emplace_back(
201 logical_values.back().emplace_back(
217 : ddl_utils::SqlType(getSqlType(data_type),
218 getParam1(data_type),
219 getParam2(data_type),
221 getArraySize(data_type)) {}
224 static SQLTypes getSqlType(
const rapidjson::Value& data_type);
226 static int getParam1(
const rapidjson::Value& data_type);
227 static int getParam2(
const rapidjson::Value& data_type);
228 static bool isArray(
const rapidjson::Value& data_type);
229 static int getArraySize(
const rapidjson::Value& data_type);
235 : ddl_utils::Encoding(getEncodingName(data_type), getEncodingParam(data_type)) {}
238 static std::string* getEncodingName(
const rapidjson::Value& data_type);
239 static int getEncodingParam(
const rapidjson::Value& data_type);
255 const rapidjson::Value& query()
const;
258 const rapidjson::Value& payload()
const;
261 std::string commandStr()
override;
266 DdlCommandDataImpl::DdlCommandDataImpl(
const std::string& ddl_statement)
287 if (
payload.HasMember(
"command") &&
payload[
"command"].IsString()) {
288 return payload[
"command"].GetString();
301 const rapidjson::Value* filters =
nullptr;
302 if (payload.HasMember(
"filters") && payload[
"filters"].IsArray()) {
303 filters = &payload[
"filters"];
311 const std::string& ddl_statement,
312 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
313 : session_ptr_(session_ptr) {
314 CHECK(!ddl_statement.empty());
320 DdlCommandDataImpl* ddl_query_data =
new DdlCommandDataImpl(ddl_statement);
321 ddl_data_ = std::unique_ptr<DdlCommandData>(ddl_query_data);
323 VLOG(2) <<
"Parsing JSON DDL from Calcite: " << ddl_statement;
324 auto& ddl_query = ddl_query_data->query();
325 CHECK(ddl_query.IsObject()) << ddl_statement;
326 CHECK(ddl_query.HasMember(
"payload"));
327 CHECK(ddl_query[
"payload"].IsObject());
328 const auto& payload = ddl_query[
"payload"].GetObject();
329 CHECK(payload.HasMember(
"command"));
330 CHECK(payload[
"command"].IsString());
340 create_table_stmt.execute(*
session_ptr_, read_only_mode);
344 create_view_stmt.execute(*
session_ptr_, read_only_mode);
356 rename_table_stmt.execute(*
session_ptr_, read_only_mode);
360 if (stmt !=
nullptr) {
366 truncate_table_stmt.execute(*
session_ptr_, read_only_mode);
374 restore_table_stmt.execute(*
session_ptr_, read_only_mode);
378 optimize_table_stmt.execute(*
session_ptr_, read_only_mode);
386 export_query_stmt.execute(*
session_ptr_, read_only_mode);
398 create_user_stmt.execute(*
session_ptr_, read_only_mode);
410 rename_user_stmt.execute(*
session_ptr_, read_only_mode);
414 create_role_stmt.execute(*
session_ptr_, read_only_mode);
426 revoke_role_stmt.execute(*
session_ptr_, read_only_mode);
430 grant_privilege_stmt.execute(*
session_ptr_, read_only_mode);
433 auto revoke_privileges_stmt =
435 revoke_privileges_stmt.execute(*
session_ptr_, read_only_mode);
439 create_dataframe_stmt.execute(*
session_ptr_, read_only_mode);
452 auto execute_write_lock =
485 }
else if (
ddl_command_ ==
"SHOW_RUNTIME_TABLE_FUNCTIONS") {
503 throw std::runtime_error(
"Unsupported DDL command");
530 enum SetParameterType { String_t, Numeric_t };
531 static const std::unordered_map<std::string, SetParameterType>
532 session_set_parameters_map = {{
"EXECUTOR_DEVICE", SetParameterType::String_t},
533 {
"CURRENT_DATABASE", SetParameterType::String_t}};
536 CHECK(ddl_payload.HasMember(
"sessionParameter"));
537 CHECK(ddl_payload[
"sessionParameter"].IsString());
538 CHECK(ddl_payload.HasMember(
"parameterValue"));
539 CHECK(ddl_payload[
"parameterValue"].IsString());
540 std::string parameter_name =
to_upper(ddl_payload[
"sessionParameter"].GetString());
541 std::string parameter_value = ddl_payload[
"parameterValue"].GetString();
543 const auto param_it = session_set_parameters_map.find(parameter_name);
544 if (param_it == session_set_parameters_map.end()) {
545 throw std::runtime_error(parameter_name +
" is not a settable session parameter.");
547 if (param_it->second == SetParameterType::Numeric_t) {
548 if (!std::regex_match(parameter_value, std::regex(
"[(-|+)|][0-9]+"))) {
549 throw std::runtime_error(
"The value of session parameter " + param_it->first +
550 " should be a numeric.");
553 return {parameter_name, parameter_value};
559 CHECK(ddl_payload.HasMember(
"cacheType"));
560 CHECK(ddl_payload[
"cacheType"].IsString());
561 return ddl_payload[
"cacheType"].GetString();
589 CHECK(ddl_payload.HasMember(
"type"));
590 const std::string& targetType = ddl_payload[
"type"].GetString();
591 if (targetType ==
"DASHBOARD") {
609 return execution_details;
617 CHECK(ddl_payload.HasMember(
"querySession"));
618 const std::string& query_session = ddl_payload[
"querySession"].GetString();
620 boost::regex session_id_regex{R
"([0-9]{3}-[a-zA-Z0-9]{4})",
621 boost::regex::extended | boost::regex::icase};
622 if (!boost::regex_match(query_session, session_id_regex)) {
623 throw std::runtime_error(
624 "Please provide the correct session ID of the query that you want to interrupt.");
626 return query_session;
639 [&server_name](
const std::string& reserved_prefix) {
640 return boost::istarts_with(server_name, reserved_prefix);
645 std::string error_message{
"Foreign server names cannot start with "};
648 error_message +=
", ";
651 error_message +=
"or ";
655 error_message +=
".";
656 throw std::runtime_error{error_message};
662 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
665 throw std::runtime_error(
"Unsupported command: CREATE FOREIGN SERVER");
668 CHECK(ddl_payload.HasMember(
"serverName"));
669 CHECK(ddl_payload[
"serverName"].IsString());
670 CHECK(ddl_payload.HasMember(
"dataWrapper"));
671 CHECK(ddl_payload[
"dataWrapper"].IsString());
672 if (ddl_payload.HasMember(
"options")) {
673 CHECK(ddl_payload[
"options"].IsObject());
675 CHECK(ddl_payload.HasMember(
"ifNotExists"));
676 CHECK(ddl_payload[
"ifNotExists"].IsBool());
682 if (read_only_mode) {
683 throw std::runtime_error(
"CREATE FOREIGN SERVER invalid in read only mode.");
686 std::string server_name = ddl_payload[
"serverName"].GetString();
690 bool if_not_exists = ddl_payload[
"ifNotExists"].GetBool();
691 if (
session_ptr_->getCatalog().getForeignServer(server_name)) {
695 throw std::runtime_error{
"A foreign server with name \"" + server_name +
696 "\" already exists."};
702 throw std::runtime_error(
"Server " + std::string(server_name) +
703 " will not be created. User has no create privileges.");
707 auto foreign_server = std::make_unique<foreign_storage::ForeignServer>();
708 foreign_server->data_wrapper_type =
to_upper(ddl_payload[
"dataWrapper"].GetString());
709 foreign_server->name = server_name;
710 foreign_server->user_id = current_user.userId;
711 if (ddl_payload.HasMember(
"options")) {
712 foreign_server->populateOptionsMap(ddl_payload[
"options"]);
714 foreign_server->validate();
717 catalog.createForeignServer(std::move(foreign_server),
718 ddl_payload[
"ifNotExists"].GetBool());
727 std::shared_ptr<const Catalog_Namespace::SessionInfo> session_ptr)
730 CHECK(ddl_payload.HasMember(
"databaseName"));
731 CHECK(ddl_payload[
"databaseName"].IsString());
732 CHECK(ddl_payload.HasMember(
"alterType"));
733 CHECK(ddl_payload[
"alterType"].IsString());
734 if (ddl_payload[
"alterType"] ==
"RENAME_DATABASE") {
735 CHECK(ddl_payload.HasMember(
"newDatabaseName"));
736 CHECK(ddl_payload[
"newDatabaseName"].IsString());
737 }
else if (ddl_payload[
"alterType"] ==
"CHANGE_OWNER") {
738 CHECK(ddl_payload.HasMember(
"newOwner"));
739 CHECK(ddl_payload[
"newOwner"].IsString());
746 if (read_only_mode) {
747 throw std::runtime_error(
"ALTER DATABASE invalid in read only mode.");
750 std::string databaseName = ddl_payload[
"databaseName"].GetString();
754 if (!sys_cat.getMetadataForDB(databaseName, db)) {
755 throw std::runtime_error(
"Database " + databaseName +
" does not exists.");
758 std::string alter_type = ddl_payload[
"alterType"].GetString();
759 if (alter_type ==
"CHANGE_OWNER") {
761 }
else if (alter_type ==
"RENAME_DATABASE") {
770 std::string database_name = ddl_payload[
"databaseName"].GetString();
771 std::string new_database_name = ddl_payload[
"newDatabaseName"].GetString();
778 throw std::runtime_error(
"Only a super user or the owner can rename the database.");
787 std::string database_name = ddl_payload[
"databaseName"].GetString();
788 std::string new_owner = ddl_payload[
"newOwner"].GetString();
791 throw std::runtime_error(
792 "Only a super user can change a database's owner. "
793 "Current user is not a super-user. "
794 "Database with name \"" +
795 database_name +
"\" will not have owner changed.");
798 sys_cat.changeDatabaseOwner(database_name, new_owner);
803 std::shared_ptr<const Catalog_Namespace::SessionInfo> session_ptr)
806 throw std::runtime_error(
"Unsupported command: ALTER FOREIGN SERVER");
809 CHECK(ddl_payload.HasMember(
"serverName"));
810 CHECK(ddl_payload[
"serverName"].IsString());
811 CHECK(ddl_payload.HasMember(
"alterType"));
812 CHECK(ddl_payload[
"alterType"].IsString());
813 if (ddl_payload[
"alterType"] ==
"SET_OPTIONS") {
814 CHECK(ddl_payload.HasMember(
"options"));
815 CHECK(ddl_payload[
"options"].IsObject());
816 }
else if (ddl_payload[
"alterType"] ==
"SET_DATA_WRAPPER") {
817 CHECK(ddl_payload.HasMember(
"dataWrapper"));
818 CHECK(ddl_payload[
"dataWrapper"].IsString());
819 }
else if (ddl_payload[
"alterType"] ==
"RENAME_SERVER") {
820 CHECK(ddl_payload.HasMember(
"newServerName"));
821 CHECK(ddl_payload[
"newServerName"].IsString());
822 }
else if (ddl_payload[
"alterType"] ==
"CHANGE_OWNER") {
823 CHECK(ddl_payload.HasMember(
"newOwner"));
824 CHECK(ddl_payload[
"newOwner"].IsString());
831 if (read_only_mode) {
832 throw std::runtime_error(
"ALTER FOREIGN SERVER invalid in read only mode.");
835 std::string server_name = ddl_payload[
"serverName"].GetString();
837 throw std::runtime_error{
"Default servers cannot be altered."};
839 if (!
session_ptr_->getCatalog().getForeignServer(server_name)) {
840 throw std::runtime_error{
"Foreign server with name \"" + server_name +
841 "\" does not exist and can not be altered."};
844 throw std::runtime_error(
"Server " + server_name +
845 " can not be altered. User has no ALTER SERVER privileges.");
847 std::string alter_type = ddl_payload[
"alterType"].GetString();
848 if (alter_type ==
"CHANGE_OWNER") {
850 }
else if (alter_type ==
"SET_DATA_WRAPPER") {
852 }
else if (alter_type ==
"SET_OPTIONS") {
854 }
else if (alter_type ==
"RENAME_SERVER") {
863 std::string server_name = ddl_payload[
"serverName"].GetString();
864 std::string new_owner = ddl_payload[
"newOwner"].GetString();
867 throw std::runtime_error(
868 "Only a super user can change a foreign server's owner. "
869 "Current user is not a super-user. "
870 "Foreign server with name \"" +
871 server_name +
"\" will not have owner changed.");
874 if (!sys_cat.getMetadataForUser(new_owner, user)) {
875 throw std::runtime_error(
"User with username \"" + new_owner +
"\" does not exist. " +
876 "Foreign server with name \"" + server_name +
877 "\" can not have owner changed.");
881 bool original_owner_exists = sys_cat.getMetadataForUserById(
882 cat.getForeignServer(server_name)->user_id, original_owner);
884 cat.changeForeignServerOwner(server_name, user.
userId);
888 sys_cat.changeDBObjectOwnership(
889 user, original_owner, db_object,
cat, original_owner_exists);
890 }
catch (
const std::runtime_error& e) {
892 cat.changeForeignServerOwner(server_name, original_owner.
userId);
899 std::string server_name = ddl_payload[
"serverName"].GetString();
900 std::string new_server_name = ddl_payload[
"newServerName"].GetString();
906 if (
cat.getForeignServer(new_server_name)) {
907 throw std::runtime_error(
"Foreign server with name \"" + server_name +
908 "\" can not be renamed to \"" + new_server_name +
"\"." +
909 "Foreign server with name \"" + new_server_name +
913 cat.renameForeignServer(server_name, new_server_name);
917 sys_cat.renameDBObject(server_name,
920 cat.getForeignServer(new_server_name)->id,
922 }
catch (
const std::runtime_error& e) {
924 cat.renameForeignServer(new_server_name, server_name);
931 std::string server_name = ddl_payload[
"serverName"].GetString();
934 const auto foreign_server =
cat.getForeignServer(server_name);
943 std::string server_name = ddl_payload[
"serverName"].GetString();
944 std::string data_wrapper = ddl_payload[
"dataWrapper"].GetString();
947 cat.setForeignServerDataWrapper(server_name, data_wrapper);
953 std::string server_name = ddl_payload[
"serverName"].GetString();
960 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
963 throw std::runtime_error(
"Unsupported command: DROP FOREIGN SERVER");
966 CHECK(ddl_payload.HasMember(
"serverName"));
967 CHECK(ddl_payload[
"serverName"].IsString());
968 CHECK(ddl_payload.HasMember(
"ifExists"));
969 CHECK(ddl_payload[
"ifExists"].IsBool());
973 if (read_only_mode) {
974 throw std::runtime_error(
"DROP FOREIGN SERVER invalid in read only mode.");
977 std::string server_name = ddl_payload[
"serverName"].GetString();
979 throw std::runtime_error{
"Default servers cannot be dropped."};
981 bool if_exists = ddl_payload[
"ifExists"].GetBool();
982 if (!
session_ptr_->getCatalog().getForeignServer(server_name)) {
986 throw std::runtime_error{
"Foreign server with name \"" + server_name +
987 "\" can not be dropped. Server does not exist."};
993 throw std::runtime_error(
"Server " + server_name +
994 " will not be dropped. User has no DROP SERVER privileges.");
998 session_ptr_->getCatalog().dropForeignServer(ddl_payload[
"serverName"].GetString());
1003 SQLTypes JsonColumnSqlType::getSqlType(
const rapidjson::Value& data_type) {
1004 CHECK(data_type.IsObject());
1005 CHECK(data_type.HasMember(
"type"));
1006 CHECK(data_type[
"type"].IsString());
1008 std::string
type = data_type[
"type"].GetString();
1009 if (boost::iequals(type,
"ARRAY")) {
1010 CHECK(data_type.HasMember(
"array"));
1011 CHECK(data_type[
"array"].IsObject());
1013 const auto& array = data_type[
"array"].GetObject();
1014 CHECK(array.HasMember(
"elementType"));
1015 CHECK(array[
"elementType"].IsString());
1016 type = array[
"elementType"].GetString();
1018 return getSqlType(type);
1022 if (boost::iequals(type,
"BIGINT")) {
1025 if (boost::iequals(type,
"BOOLEAN")) {
1028 if (boost::iequals(type,
"DATE")) {
1031 if (boost::iequals(type,
"DECIMAL")) {
1034 if (boost::iequals(type,
"DOUBLE")) {
1037 if (boost::iequals(type,
"FLOAT")) {
1040 if (boost::iequals(type,
"INTEGER")) {
1043 if (boost::iequals(type,
"LINESTRING")) {
1046 if (boost::iequals(type,
"MULTILINESTRING")) {
1049 if (boost::iequals(type,
"MULTIPOLYGON")) {
1052 if (boost::iequals(type,
"POINT")) {
1055 if (boost::iequals(type,
"MULTIPOINT")) {
1058 if (boost::iequals(type,
"POLYGON")) {
1061 if (boost::iequals(type,
"SMALLINT")) {
1064 if (boost::iequals(type,
"TEXT")) {
1067 if (boost::iequals(type,
"TIME")) {
1070 if (boost::iequals(type,
"TIMESTAMP")) {
1073 if (boost::iequals(type,
"TINYINT")) {
1077 throw std::runtime_error{
"Unsupported type \"" + type +
"\" specified."};
1080 int JsonColumnSqlType::getParam1(
const rapidjson::Value& data_type) {
1082 CHECK(data_type.IsObject());
1083 if (data_type.HasMember(
"precision") && !data_type[
"precision"].IsNull()) {
1084 CHECK(data_type[
"precision"].IsInt());
1085 param1 = data_type[
"precision"].GetInt();
1092 int JsonColumnSqlType::getParam2(
const rapidjson::Value& data_type) {
1094 CHECK(data_type.IsObject());
1095 if (data_type.HasMember(
"scale") && !data_type[
"scale"].IsNull()) {
1096 CHECK(data_type[
"scale"].IsInt());
1097 param2 = data_type[
"scale"].GetInt();
1099 data_type.HasMember(
"coordinateSystem") &&
1100 !data_type[
"coordinateSystem"].IsNull()) {
1101 CHECK(data_type[
"coordinateSystem"].IsInt());
1102 param2 = data_type[
"coordinateSystem"].GetInt();
1107 bool JsonColumnSqlType::isArray(
const rapidjson::Value& data_type) {
1108 CHECK(data_type.IsObject());
1109 CHECK(data_type.HasMember(
"type"));
1110 CHECK(data_type[
"type"].IsString());
1111 return boost::iequals(data_type[
"type"].GetString(),
"ARRAY");
1114 int JsonColumnSqlType::getArraySize(
const rapidjson::Value& data_type) {
1116 if (isArray(data_type)) {
1117 CHECK(data_type.HasMember(
"array"));
1118 CHECK(data_type[
"array"].IsObject());
1120 const auto& array = data_type[
"array"].GetObject();
1121 if (array.HasMember(
"size") && !array[
"size"].IsNull()) {
1122 CHECK(array[
"size"].IsInt());
1123 size = array[
"size"].GetInt();
1129 std::string* JsonColumnEncoding::getEncodingName(
const rapidjson::Value& data_type) {
1130 CHECK(data_type.IsObject());
1131 CHECK(data_type.HasMember(
"encoding"));
1132 CHECK(data_type[
"encoding"].IsObject());
1134 const auto& encoding = data_type[
"encoding"].GetObject();
1135 CHECK(encoding.HasMember(
"type"));
1136 CHECK(encoding[
"type"].IsString());
1137 return new std::string(encoding[
"type"].GetString());
1140 int JsonColumnEncoding::getEncodingParam(
const rapidjson::Value& data_type) {
1141 CHECK(data_type.IsObject());
1142 CHECK(data_type.HasMember(
"encoding"));
1143 CHECK(data_type[
"encoding"].IsObject());
1145 int encoding_size = 0;
1146 const auto& encoding = data_type[
"encoding"].GetObject();
1147 if (encoding.HasMember(
"size") && !encoding[
"size"].IsNull()) {
1148 CHECK(encoding[
"size"].IsInt());
1149 encoding_size = encoding[
"size"].GetInt();
1151 return encoding_size;
1156 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1159 throw std::runtime_error(
"Unsupported command: CREATE FOREIGN TABLE");
1162 CHECK(ddl_payload.HasMember(
"serverName"));
1163 CHECK(ddl_payload[
"serverName"].IsString());
1164 CHECK(ddl_payload.HasMember(
"tableName"));
1165 CHECK(ddl_payload[
"tableName"].IsString());
1166 CHECK(ddl_payload.HasMember(
"ifNotExists"));
1167 CHECK(ddl_payload[
"ifNotExists"].IsBool());
1168 CHECK(ddl_payload.HasMember(
"columns"));
1169 CHECK(ddl_payload[
"columns"].IsArray());
1176 if (read_only_mode) {
1177 throw std::runtime_error(
"CREATE FOREIGN TABLE invalid in read only mode.");
1179 const std::string& table_name = ddl_payload[
"tableName"].GetString();
1182 throw std::runtime_error(
1183 "Foreign table \"" + table_name +
1184 "\" will not be created. User has no CREATE TABLE privileges.");
1187 bool if_not_exists = ddl_payload[
"ifNotExists"].GetBool();
1188 if (!catalog.validateNonExistentTableOrView(table_name, if_not_exists)) {
1193 std::list<ColumnDescriptor> columns{};
1196 catalog.createTable(foreign_table, columns, {},
true);
1202 foreign_table.tableName,
1210 const std::string& table_name,
1212 const std::list<ColumnDescriptor>& columns) {
1223 const std::string server_name = ddl_payload[
"serverName"].GetString();
1225 if (!foreign_table.foreign_server) {
1226 throw std::runtime_error{
1227 "Foreign Table with name \"" + table_name +
1228 "\" can not be created. Associated foreign server with name \"" + server_name +
1229 "\" does not exist."};
1237 throw std::runtime_error(
1238 "Current user does not have USAGE privilege on foreign server: " + server_name);
1241 if (ddl_payload.HasMember(
"options") && !ddl_payload[
"options"].IsNull()) {
1242 CHECK(ddl_payload[
"options"].IsObject());
1243 foreign_table.initializeOptions(ddl_payload[
"options"]);
1248 foreign_table.initializeOptions();
1250 foreign_table.validateSchema(columns);
1252 if (
const auto it = foreign_table.options.find(
"FRAGMENT_SIZE");
1253 it != foreign_table.options.end()) {
1254 foreign_table.maxFragRows = std::stoi(it->second);
1257 if (
const auto it = foreign_table.options.find(
"MAX_CHUNK_SIZE");
1258 it != foreign_table.options.end()) {
1259 foreign_table.maxChunkSize = std::stol(it->second);
1262 if (
const auto it = foreign_table.options.find(
"PARTITIONS");
1263 it != foreign_table.options.end()) {
1264 foreign_table.partitions = it->second;
1270 std::unordered_set<std::string> column_names{};
1271 for (
auto& column_def : ddl_payload[
"columns"].GetArray()) {
1272 CHECK(column_def.IsObject());
1273 CHECK(column_def.HasMember(
"name"));
1274 CHECK(column_def[
"name"].IsString());
1275 const std::string& column_name = column_def[
"name"].GetString();
1277 CHECK(column_def.HasMember(
"dataType"));
1278 CHECK(column_def[
"dataType"].IsObject());
1280 JsonColumnSqlType sql_type{column_def[
"dataType"]};
1281 const auto& data_type = column_def[
"dataType"].GetObject();
1282 CHECK(data_type.HasMember(
"notNull"));
1283 CHECK(data_type[
"notNull"].IsBool());
1285 std::unique_ptr<JsonColumnEncoding> encoding;
1286 if (data_type.HasMember(
"encoding") && !data_type[
"encoding"].IsNull()) {
1287 CHECK(data_type[
"encoding"].IsObject());
1288 encoding = std::make_unique<JsonColumnEncoding>(column_def[
"dataType"]);
1297 data_type[
"notNull"].GetBool(),
1300 columns.emplace_back(cd);
1306 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1309 throw std::runtime_error(
"Unsupported command: DROP FOREIGN TABLE");
1312 CHECK(ddl_payload.HasMember(
"tableName"));
1313 CHECK(ddl_payload[
"tableName"].IsString());
1314 CHECK(ddl_payload.HasMember(
"ifExists"));
1315 CHECK(ddl_payload[
"ifExists"].IsBool());
1322 if (read_only_mode) {
1323 throw std::runtime_error(
"DROP FOREIGN TABLE invalid in read only mode.");
1325 const std::string& table_name = ddl_payload[
"tableName"].GetString();
1327 std::unique_ptr<lockmgr::TableSchemaLockContainer<lockmgr::WriteLock>> td_with_lock;
1331 std::make_unique<lockmgr::TableSchemaLockContainer<lockmgr::WriteLock>>(
1333 catalog, table_name,
false));
1334 CHECK(td_with_lock);
1335 td = (*td_with_lock)();
1336 }
catch (
const std::runtime_error& e) {
1339 if (ddl_payload[
"ifExists"].GetBool()) {
1350 throw std::runtime_error(
1351 "Foreign table \"" + table_name +
1352 "\" will not be dropped. User has no DROP TABLE privileges.");
1356 auto table_data_write_lock =
1358 catalog.dropTable(td);
1368 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1377 std::vector<std::string> labels{
"table_name"};
1378 std::vector<TargetMetaInfo> label_infos;
1379 for (
const auto&
label : labels) {
1389 std::vector<RelLogicalValues::RowValues> logical_values;
1390 for (
auto table_name : table_names) {
1392 logical_values.back().emplace_back(
genLiteralStr(table_name));
1396 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1404 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1407 if (ddl_payload.HasMember(
"tableNames")) {
1408 CHECK(ddl_payload[
"tableNames"].IsArray());
1409 for (
const auto& table_name : ddl_payload[
"tableNames"].GetArray()) {
1410 CHECK(table_name.IsString());
1421 std::vector<TargetMetaInfo> label_infos;
1425 {
"table_name",
kTEXT,
true},
1426 {
"column_count",
kBIGINT,
true},
1427 {
"is_sharded_table",
kBOOLEAN,
true},
1428 {
"shard_count",
kBIGINT,
true},
1430 {
"fragment_size",
kBIGINT,
true},
1431 {
"max_rollback_epochs",
kBIGINT,
true},
1434 {
"min_epoch_floor",
kBIGINT,
true},
1435 {
"max_epoch_floor",
kBIGINT,
true},
1436 {
"metadata_file_count",
kBIGINT,
true},
1437 {
"total_metadata_file_size",
kBIGINT,
true},
1438 {
"total_metadata_page_count",
kBIGINT,
true},
1439 {
"total_free_metadata_page_count",
kBIGINT,
false},
1440 {
"data_file_count",
kBIGINT,
true},
1441 {
"total_data_file_size",
kBIGINT,
true},
1442 {
"total_data_page_count",
kBIGINT,
true},
1443 {
"total_free_data_page_count",
kBIGINT,
false}});
1445 std::vector<RelLogicalValues::RowValues> logical_values;
1446 for (
const auto& table_name : filtered_table_names) {
1447 auto [td, td_with_lock] =
1448 get_table_descriptor_with_lock<lockmgr::ReadLock>(*catalog, table_name,
false);
1454 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1463 auto all_table_names =
1466 all_table_names.end(),
1467 all_table_names.begin(),
1468 [](
const std::string& s) {
return to_upper(s); });
1469 std::vector<std::string> filtered_table_names;
1470 if (ddl_payload.HasMember(
"tableNames")) {
1471 std::set<std::string> all_table_names_set(all_table_names.begin(),
1472 all_table_names.end());
1473 for (
const auto& table_name_json : ddl_payload[
"tableNames"].GetArray()) {
1474 std::string table_name = table_name_json.GetString();
1475 if (all_table_names_set.find(
to_upper(table_name)) == all_table_names_set.end()) {
1476 throw std::runtime_error{
"Unable to show table details for table: " + table_name +
1477 ". Table does not exist."};
1479 auto [td, td_with_lock] =
1480 get_table_descriptor_with_lock<lockmgr::ReadLock>(*catalog, table_name,
false);
1481 if (td->isForeignTable()) {
1482 throw std::runtime_error{
1483 "SHOW TABLE DETAILS is not supported for foreign tables. Table name: " +
1486 if (td->isTemporaryTable()) {
1487 throw std::runtime_error{
1488 "SHOW TABLE DETAILS is not supported for temporary tables. Table name: " +
1491 filtered_table_names.emplace_back(table_name);
1494 for (
const auto& table_name : all_table_names) {
1495 auto [td, td_with_lock] =
1496 get_table_descriptor_with_lock<lockmgr::ReadLock>(*catalog, table_name,
false);
1497 if (td->isForeignTable() || td->isTemporaryTable()) {
1500 filtered_table_names.emplace_back(table_name);
1503 return filtered_table_names;
1508 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1515 CHECK(ddl_payload.HasMember(
"tableName"));
1516 CHECK(ddl_payload[
"tableName"].IsString());
1517 const std::string& table_name = ddl_payload[
"tableName"].GetString();
1520 auto table_read_lock =
1523 const TableDescriptor* td = catalog.getMetadataForTable(table_name,
false);
1525 throw std::runtime_error(
"Table/View " + table_name +
" does not exist.");
1530 std::vector<DBObject> privObjects = {dbObject};
1534 throw std::runtime_error(
"Table/View " + table_name +
" does not exist.");
1538 auto query_state_proxy = query_state->createQueryStateProxy();
1539 auto calcite_mgr = catalog.getCalciteMgr();
1540 const auto calciteQueryParsingOption =
1541 calcite_mgr->getCalciteQueryParsingOption(
true,
false,
false);
1542 const auto calciteOptimizationOption = calcite_mgr->getCalciteOptimizationOption(
1547 auto result = calcite_mgr->process(query_state_proxy,
1549 calciteQueryParsingOption,
1550 calciteOptimizationOption);
1552 calcite_mgr->checkAccessedObjectsPrivileges(query_state_proxy,
result);
1553 }
catch (
const std::runtime_error&) {
1554 throw std::runtime_error(
"Not enough privileges to show the view SQL");
1566 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1573 std::vector<std::string> labels{
"Database",
"Owner"};
1574 std::vector<TargetMetaInfo> label_infos;
1575 for (
const auto&
label : labels) {
1585 std::vector<RelLogicalValues::RowValues> logical_values;
1586 for (
const auto& db_summary : db_summaries) {
1588 logical_values.back().emplace_back(
genLiteralStr(db_summary.dbName));
1589 logical_values.back().emplace_back(
genLiteralStr(db_summary.dbOwnerName));
1593 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1601 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1607 std::vector<TargetMetaInfo> label_infos;
1608 std::vector<RelLogicalValues::RowValues> logical_values;
1610 if (ddl_payload.HasMember(
"ScalarFnNames")) {
1617 for (
const auto& udf_name_json : ddl_payload[
"ScalarFnNames"].GetArray()) {
1618 std::string udf_name = udf_name_json.GetString();
1619 std::vector<ExtensionFunction> ext_funcs =
1625 logical_values.back().emplace_back(
genLiteralStr(udf_name));
1627 logical_values.back().emplace_back(
genLiteralStr(fn.toSignature()));
1639 for (
const auto&
label : {
"Scalar UDF"}) {
1651 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1659 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1664 std::vector<TargetMetaInfo> label_infos;
1665 std::vector<RelLogicalValues::RowValues> logical_values;
1668 for (
const auto&
label : {
"Runtime Scalar UDF"}) {
1679 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1687 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1695 std::vector<TargetMetaInfo> label_infos;
1696 std::vector<RelLogicalValues::RowValues> logical_values;
1698 if (ddl_payload.HasMember(
"tfNames")) {
1711 for (
const auto& tf_name_json : ddl_payload[
"tfNames"].GetArray()) {
1712 std::string tf_name = tf_name_json.GetString();
1717 logical_values.back().emplace_back(
genLiteralStr(tf.getName(
true,
false)));
1720 tf.getSignature(
false,
true)));
1722 logical_values.back().emplace_back(
1725 logical_values.back().emplace_back(
1728 logical_values.back().emplace_back(
1731 logical_values.back().emplace_back(
1741 !tf.getFunctionAnnotation(
"filter_table_function_transpose",
"").empty()));
1746 for (
const auto&
label : {
"Table UDF"}) {
1751 std::unordered_set<std::string> unique_names;
1754 std::string
name = tf.getName(
true,
true);
1755 if (unique_names.find(name) == unique_names.end()) {
1756 unique_names.emplace(name);
1764 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1772 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1779 std::vector<TargetMetaInfo> label_infos;
1780 std::vector<RelLogicalValues::RowValues> logical_values;
1783 for (
const auto&
label : {
"Runtime Table UDF"}) {
1788 std::unordered_set<std::string> unique_names;
1791 std::string
name = tf.getName(
true,
true);
1792 if (unique_names.find(name) == unique_names.end()) {
1793 unique_names.emplace(name);
1800 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1808 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1811 throw std::runtime_error(
"Unsupported command: SHOW FOREIGN SERVERS");
1815 CHECK(ddl_payload.HasMember(
"command"));
1816 if (ddl_payload.HasMember(
"filters")) {
1817 CHECK(ddl_payload[
"filters"].IsArray());
1818 int num_filters = 0;
1819 for (
auto const& filter_def : ddl_payload[
"filters"].GetArray()) {
1820 CHECK(filter_def.IsObject());
1821 CHECK(filter_def.HasMember(
"attribute"));
1822 CHECK(filter_def[
"attribute"].IsString());
1823 CHECK(filter_def.HasMember(
"value"));
1824 CHECK(filter_def[
"value"].IsString());
1825 CHECK(filter_def.HasMember(
"operation"));
1826 CHECK(filter_def[
"operation"].IsString());
1827 if (num_filters > 0) {
1828 CHECK(filter_def.HasMember(
"chain"));
1829 CHECK(filter_def[
"chain"].IsString());
1831 CHECK(!filter_def.HasMember(
"chain"));
1841 std::vector<TargetMetaInfo> label_infos;
1845 std::vector<std::string> labels{
"server_name",
"data_wrapper",
"created_at",
"options"};
1854 std::vector<const foreign_storage::ForeignServer*> results;
1860 std::vector<RelLogicalValues::RowValues> logical_values;
1861 for (
auto const& server_ptr : results) {
1863 logical_values.back().emplace_back(
genLiteralStr(server_ptr->name));
1864 logical_values.back().emplace_back(
genLiteralStr(server_ptr->data_wrapper_type));
1866 logical_values.back().emplace_back(
1870 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1878 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1881 throw std::runtime_error(
"Unsupported command: SHOW CREATE SERVER");
1885 CHECK(payload.HasMember(
"serverName"));
1886 CHECK(payload[
"serverName"].IsString());
1887 server_ = (payload[
"serverName"].GetString());
1893 using namespace Catalog_Namespace;
1895 const auto server = catalog.getForeignServer(
server_);
1897 throw std::runtime_error(
"Foreign server " +
server_ +
" does not exist.");
1901 std::vector<DBObject> privObjects = {dbObject};
1902 if (!SysCatalog::instance().hasAnyPrivileges(
session_ptr_->get_currentUser(),
1904 throw std::runtime_error(
"Foreign server " +
server_ +
" does not exist.");
1906 auto create_stmt = catalog.dumpCreateServer(
server_);
1908 std::vector<std::string> labels{
"create_server_sql"};
1909 std::vector<TargetMetaInfo> label_infos;
1912 std::vector<RelLogicalValues::RowValues> logical_values;
1914 logical_values.back().emplace_back(
genLiteralStr(create_stmt));
1916 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
1924 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
1927 throw std::runtime_error(
"Unsupported command: REFRESH FOREIGN TABLE");
1930 CHECK(ddl_payload.HasMember(
"tableNames"));
1931 CHECK(ddl_payload[
"tableNames"].IsArray());
1932 for (
auto const& tablename_def : ddl_payload[
"tableNames"].GetArray()) {
1933 CHECK(tablename_def.IsString());
1938 if (read_only_mode) {
1939 throw std::runtime_error(
"REFRESH FOREIGN TABLE invalid in read only mode.");
1942 const auto execute_read_lock =
1947 bool evict_cached_entries{
false};
1950 if (ddl_payload.HasMember(
"options") && !ddl_payload[
"options"].IsNull()) {
1952 for (
const auto& entry : opt.
options) {
1953 if (entry.first !=
"EVICT") {
1954 throw std::runtime_error{
1955 "Invalid option \"" + entry.first +
1956 "\" provided for refresh command. Only \"EVICT\" option is supported."};
1961 if (boost::iequals(opt.
options[
"EVICT"],
"true") ||
1962 boost::iequals(opt.
options[
"EVICT"],
"false")) {
1963 if (boost::iequals(opt.
options[
"EVICT"],
"true")) {
1964 evict_cached_entries =
true;
1967 throw std::runtime_error{
1968 "Invalid value \"" + opt.
options[
"EVICT"] +
1969 "\" provided for EVICT option. Value must be either \"true\" or \"false\"."};
1974 const auto& current_user =
session_ptr_->get_currentUser();
1976 if (!current_user.isSuper) {
1977 for (
const auto& table_name_json : ddl_payload[
"tableNames"].GetArray()) {
1978 std::string table_name = table_name_json.GetString();
1981 throw std::runtime_error(
1982 std::string(
"REFRESH FOREIGN TABLES failed on table \"") + table_name +
1983 "\". It can only be executed by super user or "
1990 for (
const auto& table_name_json : ddl_payload[
"tableNames"].GetArray()) {
1991 std::string table_name = table_name_json.GetString();
1992 static const std::array<std::string, 4> log_system_tables{
1998 throw std::runtime_error(
1999 "REFRESH FOREIGN TABLE can only be executed for the following tables: " +
2000 join(log_system_tables,
","));
2013 std::shared_ptr<const Catalog_Namespace::SessionInfo> session_ptr)
2016 throw std::runtime_error(
"Unsupported command: ALTER FOREIGN TABLE");
2019 CHECK(ddl_payload.HasMember(
"tableName"));
2020 CHECK(ddl_payload[
"tableName"].IsString());
2021 CHECK(ddl_payload.HasMember(
"alterType"));
2022 CHECK(ddl_payload[
"alterType"].IsString());
2023 if (ddl_payload[
"alterType"] ==
"RENAME_TABLE") {
2024 CHECK(ddl_payload.HasMember(
"newTableName"));
2025 CHECK(ddl_payload[
"newTableName"].IsString());
2026 }
else if (ddl_payload[
"alterType"] ==
"RENAME_COLUMN") {
2027 CHECK(ddl_payload.HasMember(
"oldColumnName"));
2028 CHECK(ddl_payload[
"oldColumnName"].IsString());
2029 CHECK(ddl_payload.HasMember(
"newColumnName"));
2030 CHECK(ddl_payload[
"newColumnName"].IsString());
2031 }
else if (ddl_payload[
"alterType"] ==
"ALTER_OPTIONS") {
2032 CHECK(ddl_payload.HasMember(
"options"));
2033 CHECK(ddl_payload[
"options"].IsObject());
2035 UNREACHABLE() <<
"Not a valid alter foreign table command: "
2036 << ddl_payload[
"alterType"].GetString();
2041 if (read_only_mode) {
2042 throw std::runtime_error(
"ALTER FOREIGN TABLE invalid in read only mode.");
2047 const std::string& table_name = ddl_payload[
"tableName"].GetString();
2048 auto [td, td_with_lock] =
2049 get_table_descriptor_with_lock<lockmgr::WriteLock>(catalog, table_name,
false);
2055 throw std::runtime_error(
2056 "Current user does not have the privilege to alter foreign table: " + table_name);
2059 auto table_data_write_lock =
2062 CHECK(foreign_table);
2064 std::string alter_type = ddl_payload[
"alterType"].GetString();
2065 if (alter_type ==
"RENAME_TABLE") {
2067 }
else if (alter_type ==
"RENAME_COLUMN") {
2069 }
else if (alter_type ==
"ALTER_OPTIONS") {
2080 const std::string& table_name = ddl_payload[
"tableName"].GetString();
2081 const std::string& new_table_name = ddl_payload[
"newTableName"].GetString();
2082 if (
cat.getForeignTable(new_table_name)) {
2083 throw std::runtime_error(
"Foreign table with name \"" + table_name +
2084 "\" can not be renamed to \"" + new_table_name +
"\". " +
2085 "A different table with name \"" + new_table_name +
2086 "\" already exists.");
2088 cat.renameTable(foreign_table, new_table_name);
2095 const std::string& old_column_name = ddl_payload[
"oldColumnName"].GetString();
2096 const std::string& new_column_name = ddl_payload[
"newColumnName"].GetString();
2097 auto column =
cat.getMetadataForColumn(foreign_table->
tableId, old_column_name);
2099 throw std::runtime_error(
"Column with name \"" + old_column_name +
2100 "\" can not be renamed to \"" + new_column_name +
"\". " +
2101 "Column with name \"" + old_column_name +
2102 "\" does not exist.");
2104 if (
cat.getMetadataForColumn(foreign_table->
tableId, new_column_name)) {
2105 throw std::runtime_error(
"Column with name \"" + old_column_name +
2106 "\" can not be renamed to \"" + new_column_name +
"\". " +
2107 "A column with name \"" + new_column_name +
2108 "\" already exists.");
2110 cat.renameColumn(foreign_table, column, new_column_name);
2116 const std::string& table_name = ddl_payload[
"tableName"].GetString();
2118 auto new_options_map =
2122 cat.setForeignTableOptions(table_name, new_options_map,
false);
2127 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
2130 if (ddl_payload.HasMember(
"tableNames")) {
2131 CHECK(ddl_payload[
"tableNames"].IsArray());
2132 for (
auto const& tablename_def : ddl_payload[
"tableNames"].GetArray()) {
2133 CHECK(tablename_def.IsString());
2139 auto table_names =
session_ptr_->get_catalog_ptr()->getTableNamesForUser(
2143 if (ddl_payload.HasMember(
"tableNames")) {
2144 std::vector<std::string> filtered_names;
2145 for (
const auto& tablename_def : ddl_payload[
"tableNames"].GetArray()) {
2146 std::string filter_name = tablename_def.GetString();
2147 if (std::find(table_names.begin(), table_names.end(), filter_name) !=
2148 table_names.end()) {
2149 filtered_names.emplace_back(filter_name);
2151 throw std::runtime_error(
"Can not show disk cache usage for table: " +
2152 filter_name +
". Table does not exist.");
2155 return filtered_names;
2167 const auto disk_cache = cat_ptr->getDataMgr().getPersistentStorageMgr()->getDiskCache();
2169 throw std::runtime_error{
"Disk cache not enabled. Cannot show disk cache usage."};
2173 std::vector<std::string> labels{
"table name",
"current cache size"};
2174 std::vector<TargetMetaInfo> label_infos;
2178 std::vector<RelLogicalValues::RowValues> logical_values;
2180 for (
auto& table_name : table_names) {
2181 auto [td, td_with_lock] =
2182 get_table_descriptor_with_lock<lockmgr::ReadLock>(*cat_ptr, table_name,
false);
2184 auto table_cache_size =
2185 disk_cache->getSpaceReservedByTable(cat_ptr->getDatabaseId(), td->tableId);
2189 logical_values.back().emplace_back(
genLiteralStr(table_name));
2193 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
2201 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
2204 if (ddl_payload.HasMember(
"userNames")) {
2205 CHECK(ddl_payload[
"userNames"].IsArray());
2206 for (
const auto& user_name : ddl_payload[
"userNames"].GetArray()) {
2207 CHECK(user_name.IsString());
2210 CHECK(ddl_payload.HasMember(
"all"));
2211 CHECK(ddl_payload[
"all"].IsBool());
2221 bool all = ddl_payload.HasMember(
"all") ? ddl_payload[
"all"].GetBool() :
false;
2222 if (all && !
self.isSuper) {
2223 throw std::runtime_error(
2224 "SHOW ALL USER DETAILS is only available to superusers. (Try SHOW USER "
2225 "DETAILS instead?)");
2229 std::vector<TargetMetaInfo> label_infos;
2239 std::vector<RelLogicalValues::RowValues> logical_values;
2246 std::map<std::string, Catalog_Namespace::UserMetadata> user_map;
2247 auto user_list = !all ? sys_cat.getAllUserMetadata(
cat->getDatabaseId())
2248 : sys_cat.getAllUserMetadata();
2249 for (
auto& user : user_list) {
2250 if (user.can_login ||
self.isSuper) {
2251 user_map[user.userName] = user;
2255 if (ddl_payload.HasMember(
"userNames")) {
2256 std::map<std::string, Catalog_Namespace::UserMetadata> user_map2;
2257 for (
const auto& user_name_json : ddl_payload[
"userNames"].GetArray()) {
2258 std::string user_name = user_name_json.GetString();
2259 auto uit = user_map.find(user_name);
2260 if (uit == user_map.end()) {
2261 throw std::runtime_error(
"User \"" + user_name +
"\" not found. ");
2263 user_map2[uit->first] = uit->second;
2265 user_map = user_map2;
2269 std::unordered_set<std::string> visible_databases;
2270 if (!
self.isSuper) {
2271 for (
const auto& dbsum : dbsums) {
2272 visible_databases.insert(dbsum.dbName);
2276 for (
const auto& [user_name, user] : user_map) {
2280 if (sys_cat.getMetadataForDBById(user.defaultDbId, db)) {
2281 if (
self.isSuper || visible_databases.count(db.
dbName)) {
2291 logical_values.back().emplace_back(
genLiteralStr(user.userName));
2303 CHECK_EQ(logical_values.size(), user_map.size());
2304 if (logical_values.size() >= 1U) {
2305 CHECK_EQ(logical_values[0].size(), label_infos.size());
2307 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
2315 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
2318 CHECK(ddl_payload[
"userName"].IsString());
2319 CHECK(ddl_payload[
"effective"].IsBool());
2329 std::vector<TargetMetaInfo> label_infos;
2330 std::vector<std::string> labels{
"ROLES"};
2334 std::vector<RelLogicalValues::RowValues> logical_values;
2335 std::vector<std::string> roles_list;
2337 std::string user_name = ddl_payload[
"userName"].GetString();
2338 bool effective = ddl_payload[
"effective"].GetBool();
2339 if (user_name.empty()) {
2340 user_name =
self.userName;
2343 bool is_user = sys_cat.getMetadataForUser(user_name, user);
2344 if (!
self.isSuper) {
2346 if (
self.userId != user.
userId) {
2347 throw std::runtime_error(
2348 "Only a superuser is authorized to request list of roles granted to another "
2352 if (!sys_cat.isRoleGrantedToGrantee(
2353 self.userName, user_name,
false)) {
2354 throw std::runtime_error(
2355 "Only a superuser is authorized to request list of roles granted to a role "
2356 "they don't have.");
2361 auto s = sys_cat.getCreatedRoles();
2362 roles_list.insert(roles_list.end(), s.begin(), s.end());
2364 roles_list = sys_cat.getRoles(user_name, effective);
2366 for (
const std::string& role_name : roles_list) {
2368 logical_values.back().emplace_back(
genLiteralStr(role_name));
2372 std::shared_ptr<ResultSet> rSet = std::shared_ptr<ResultSet>(
2380 std::shared_ptr<Catalog_Namespace::SessionInfo const> session_ptr)
2383 CHECK(ddl_payload.HasMember(
"oldOwners"));
2384 CHECK(ddl_payload[
"oldOwners"].IsArray());
2385 for (
const auto& old_owner : ddl_payload[
"oldOwners"].GetArray()) {
2386 CHECK(old_owner.IsString());
2389 CHECK(ddl_payload.HasMember(
"newOwner"));
2390 CHECK(ddl_payload[
"newOwner"].IsString());
2391 new_owner_ = ddl_payload[
"newOwner"].GetString();
2395 if (read_only_mode) {
2396 throw std::runtime_error(
"REASSIGN OWNER invalid in read only mode.");
2399 throw std::runtime_error{
2400 "Only super users can reassign ownership of database objects."};
static std::shared_ptr< WrapperType< MutexType > > getMutex(const LockType lockType, const KeyType &key)
bool contains(const T &container, const U &element)
int32_t maxRollbackEpochs
ShowForeignServersCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
static constexpr const char * WS_SERVER_ACCESS_LOGS_SYS_TABLE_NAME
ExecutionResult execute(bool read_only_mode) override
ShowRolesCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
static constexpr const char * SERVER_LOGS_SYS_TABLE_NAME
ExecutionResult execute(bool read_only_mode) override
AlterForeignServerCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
static std::vector< TableFunction > get_table_funcs()
void alterOptions(const foreign_storage::ForeignTable &foreign_table)
uint64_t total_data_page_count
const std::string getTargetQuerySessionToKill() const
declare this class scoped local to avoid exposing rapidjson in the header file
ShowCreateTableCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
JsonColumnSqlType(const rapidjson::Value &data_type)
static const AccessPrivileges DROP_SERVER
ShowCreateServerCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
std::unique_ptr< DdlCommandData > ddl_data_
std::string getOptionsAsJsonString() const
static std::vector< ExtensionFunction > get_ext_funcs(const std::string &name)
class for a per-database catalog. also includes metadata for the current database and the current use...
const std::string commandStr() const
uint32_t metadata_file_count
ExecutionResult execute(bool read_only_mode) override
static const AccessPrivileges ALTER_TABLE
ExecutionResult execute(bool read_only_mode) override
CreateForeignServerCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
Data_Namespace::DataMgr & getDataMgr() const
void validateAlterOptions(const OptionsMap &options_map) const
Verifies that the given options map only contains options that can be legally altered.
ExecutionResult execute(bool read_only_mode) override
void renameForeignServer()
static WriteLock getWriteLockForTable(const Catalog_Namespace::Catalog &cat, const std::string &table_name)
ShowDatabasesCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ExecutionResult execute(bool read_only_mode) override
ExecutionResult execute(bool read_only_mode) override
void revokeDBObjectPrivilegesFromAll(DBObject object, Catalog *catalog)
static const AccessPrivileges SERVER_USAGE
static std::shared_ptr< QueryState > create(ARGS &&...args)
DropForeignTableCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
void throw_reserved_server_prefix_exception()
CreateForeignTableCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
void validateSupportedOptionKeys(const OptionsMap &options_map) const
Verifies that the options_map contains the keys required by a foreign table; including those specifie...
void add_table_details(std::vector< RelLogicalValues::RowValues > &logical_values, const TableDescriptor *logical_table, const AggregratedStorageStats &agg_storage_stats)
void aggregate(const File_Namespace::StorageStats &storage_stats)
std::optional< uint64_t > total_free_data_page_count
void refresh_foreign_table(Catalog_Namespace::Catalog &catalog, const std::string &table_name, const bool evict_cached_entries)
static void invalidateCaches()
ShowTablesCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ShowDiskCacheUsageCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ExecutionResult execute(bool read_only_mode) override
void createDBObject(const UserMetadata &user, const std::string &objectName, DBObjectType type, const Catalog_Namespace::Catalog &catalog, int32_t objectId=-1)
void set_headers_with_type(std::vector< TargetMetaInfo > &label_infos, const std::vector< std::tuple< std::string, SQLTypes, bool >> &headers)
DistributedExecutionDetails getDistributedExecutionDetails() const
std::pair< std::string, std::string > getSessionParameter() const
ExecutionResult execute(bool read_only_mode) override
void validate_non_duplicate_column(const std::string &column_name, std::unordered_set< std::string > &upper_column_names)
ExecutionResult execute(bool read_only_mode) override
std::set< std::string > old_owners_
bool isShowQueries() const
static constexpr const char * REQUEST_LOGS_SYS_TABLE_NAME
std::shared_lock< T > shared_lock
void set_column_descriptor(const std::string &column_name, ColumnDescriptor &cd, SqlType *column_type, const bool not_null, const Encoding *encoding, const std::string *default_value)
static OptionsMap createOptionsMap(const rapidjson::Value &json_options)
Creates an options map from given options. Converts options that must be upper case appropriately...
static const AccessPrivileges ALTER_SERVER
std::unique_ptr< RexLiteral > genLiteralBigInt(int64_t val)
This file contains the class specification and related data structures for Catalog.
ExecutionResult execute(bool read_only_mode) override
void setTableDetails(const std::string &table_name, TableDescriptor &td, const std::list< ColumnDescriptor > &columns)
bool isAlterSystemClear() const
ExecutionResult execute(bool read_only_mode) override
const DdlCommandData & ddl_data_
bool is_default_server(const std::string &server_name)
static SysCatalog & instance()
This file contains the class specification and related data structures for SysCatalog.
Classes representing a parse tree.
ExecutionResult execute(bool read_only_mode) override
ShowTableDetailsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
void setColumnDetails(std::list< ColumnDescriptor > &columns)
const rapidjson::Value & query() const
DropForeignServerCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
static const AccessPrivileges DROP_TABLE
std::string ddl_statement_
std::optional< uint64_t > total_free_metadata_page_count
ExecutionResult execute(bool read_only_mode) override
void populateOptionsMap(OptionsMap &&options_map, bool clear=false)
bool hasAlterServerPrivileges()
const rapidjson::Value & extractPayload(const DdlCommandData &ddl_data)
static std::unordered_set< std::string > get_udfs_name(const bool is_runtime)
std::unique_ptr< RexLiteral > genLiteralTimestamp(time_t val)
AlterDatabaseCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
bool isShowUserSessions() const
std::unique_lock< T > unique_lock
ExecutionResult execute(bool read_only_mode) override
DBSummaryList getDatabaseListForUser(const UserMetadata &user)
void setForeignServerOptions()
int getDatabaseId() const
uint64_t total_metadata_page_count
static const AccessPrivileges CREATE_SERVER
void updateResultSet(const std::string &query_ra, RType type, bool success=true)
std::unique_ptr< RexLiteral > genLiteralBoolean(bool val)
void validate_non_reserved_keyword(const std::string &column_name)
specifies the content in-memory of a row in the column metadata table
OUTPUT transform(INPUT const &input, FUNC const &func)
AggregationType aggregation_type
static const AccessPrivileges CREATE_TABLE
std::vector< const TableDescriptor * > getPhysicalTablesDescriptors(const TableDescriptor *logical_table_desc, bool populate_fragmenter=true) const
ExecutionResult execute(bool read_only_mode) override
void set_default_table_attributes(const std::string &table_name, TableDescriptor &td, const int32_t column_count)
File_Namespace::GlobalFileMgr * getGlobalFileMgr() const
static ResultSet * create(std::vector< TargetMetaInfo > &label_infos, std::vector< RelLogicalValues::RowValues > &logical_values)
JsonColumnEncoding(const rapidjson::Value &data_type)
bool isAlterSessionSet() const
const rapidjson::Value & payload() const
std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr_
std::vector< std::string > getFilteredTableNames()
DdlCommandExecutor(const std::string &ddl_statement, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ExecutionResult execute(bool read_only_mode)
AggregratedStorageStats get_agg_storage_stats(const TableDescriptor *td, const Catalog_Namespace::Catalog *catalog)
ExecutionResult execute(bool read_only_mode) override
rapidjson::Document ddl_query
uint64_t total_metadata_file_size
void changeForeignServerOwner()
static ReadLock getReadLockForTable(Catalog_Namespace::Catalog &cat, const std::string &table_name)
ExecutionResult execute(bool read_only_mode) override
Basic constructors and methods of the row set interface.
std::tuple< const TableDescriptor *, std::unique_ptr< lockmgr::TableSchemaLockContainer< LockType > > > get_table_descriptor_with_lock(Catalog_Namespace::Catalog &cat, const std::string &table_name, const bool populate_fragmenter)
void renameDatabase(std::string const &old_name, std::string const &new_name)
uint64_t total_data_file_size
~DdlCommandDataImpl() override
static const AccessPrivileges ACCESS
ReassignOwnedCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
std::vector< std::string > getFilteredTableNames()
static std::unique_ptr< RexLiteral > genLiteralStr(std::string val)
std::string returnCacheType() const
void validate_table_type(const TableDescriptor *td, const TableType expected_table_type, const std::string &command)
const ForeignServer * foreign_server
void renameTable(const foreign_storage::ForeignTable *foreign_table)
ShowFunctionsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ExecutionResult execute(bool read_only_mode) override
ExecutionResult execute(bool read_only_mode) override
std::list< DBSummary > DBSummaryList
AggregratedStorageStats(const File_Namespace::StorageStats &storage_stats)
bool any_of(std::vector< Analyzer::Expr * > const &target_exprs)
std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr_
std::vector< std::unique_ptr< const RexScalar >> RowValues
ExecutionResult execute(bool read_only_mode) override
ExecutionLocation execution_location
const rapidjson::Value * extractFilters(const rapidjson::Value &payload)
AlterForeignTableCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
bool isAggregator() const
void renameColumn(const foreign_storage::ForeignTable *foreign_table)
const std::array< std::string, 3 > kReservedServerPrefixes
std::string commandStr() override
static constexpr char const * FOREIGN_TABLE
ShowRuntimeFunctionsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
static constexpr const char * WS_SERVER_LOGS_SYS_TABLE_NAME
ShowUserDetailsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
void setForeignServerDataWrapper()
static std::unique_ptr< Parser::DDLStmt > delegate(const rapidjson::Value &payload)
ShowRuntimeTableFunctionsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
RefreshForeignTablesCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)
ExecutionResult execute(bool read_only_mode) override
ShowTableFunctionsCommand(const DdlCommandData &ddl_data, std::shared_ptr< Catalog_Namespace::SessionInfo const > session_ptr)