4470 CHECK(payload.HasMember(
"tableName"));
4471 auto tableName =
json_str(payload[
"tableName"]);
4473 CHECK(payload.HasMember(
"alterType"));
4476 if (type ==
"RENAME_TABLE") {
4477 CHECK(payload.HasMember(
"newTableName"));
4478 auto newTableName =
json_str(payload[
"newTableName"]);
4480 new std::string(tableName),
new std::string(newTableName)));
4482 }
else if (type ==
"RENAME_COLUMN") {
4483 CHECK(payload.HasMember(
"columnName"));
4484 auto columnName =
json_str(payload[
"columnName"]);
4485 CHECK(payload.HasMember(
"newColumnName"));
4486 auto newColumnName =
json_str(payload[
"newColumnName"]);
4487 return std::unique_ptr<DDLStmt>(
4489 new std::string(columnName),
4490 new std::string(newColumnName)));
4492 }
else if (type ==
"ADD_COLUMN") {
4493 CHECK(payload.HasMember(
"columnData"));
4494 CHECK(payload[
"columnData"].IsArray());
4497 std::list<ColumnDef*>* table_element_list_ =
new std::list<ColumnDef*>;
4499 const auto elements = payload[
"columnData"].GetArray();
4500 for (
const auto& element : elements) {
4501 CHECK(element.IsObject());
4502 CHECK(element.HasMember(
"type"));
4503 if (
json_str(element[
"type"]) ==
"SQL_COLUMN_DECLARATION") {
4505 table_element_list_->emplace_back(col_def.release());
4507 LOG(
FATAL) <<
"Unsupported element type for ALTER TABLE: "
4508 << element[
"type"].GetString();
4512 return std::unique_ptr<DDLStmt>(
4515 }
else if (type ==
"DROP_COLUMN") {
4516 CHECK(payload.HasMember(
"columnData"));
4517 auto columnData =
json_str(payload[
"columnData"]);
4520 std::list<std::string*>* cols =
new std::list<std::string*>;
4521 std::vector<std::string> cols1;
4522 boost::split(cols1, columnData, boost::is_any_of(
","));
4523 for (
auto s : cols1) {
4525 boost::algorithm::trim_if(s, boost::is_any_of(
" \"'`"));
4526 std::string* str =
new std::string(s);
4527 cols->emplace_back(str);
4530 return std::unique_ptr<DDLStmt>(
4533 }
else if (type ==
"ALTER_OPTIONS") {
4534 CHECK(payload.HasMember(
"options"));
4535 const auto& options = payload[
"options"];
4536 if (options.IsObject()) {
4537 for (
auto itr = options.MemberBegin(); itr != options.MemberEnd(); ++itr) {
4538 std::string* option_name =
new std::string(
json_str(itr->name));
4539 Literal* literal_value;
4540 if (itr->value.IsString()) {
4541 std::string literal_string =
json_str(itr->value);
4546 int iVal = std::stoi(literal_string, &sz);
4547 if (sz == literal_string.size()) {
4548 literal_value =
new IntLiteral(iVal);
4550 literal_value =
new StringLiteral(&literal_string);
4552 }
else if (itr->value.IsInt() || itr->value.IsInt64()) {
4553 literal_value =
new IntLiteral(
json_i64(itr->value));
4554 }
else if (itr->value.IsNull()) {
4555 literal_value =
new NullLiteral();
4557 throw std::runtime_error(
"Unable to handle literal for " + *option_name);
4559 CHECK(literal_value);
4561 NameValueAssign* nv =
new NameValueAssign(option_name, literal_value);
4562 return std::unique_ptr<DDLStmt>(
4566 CHECK(options.IsNull());
const std::string json_str(const rapidjson::Value &obj) noexcept
const int64_t json_i64(const rapidjson::Value &obj) noexcept
std::unique_ptr< ColumnDef > column_from_json(const rapidjson::Value &element)