4493 CHECK(payload.HasMember(
"tableName"));
4494 auto tableName =
json_str(payload[
"tableName"]);
4496 CHECK(payload.HasMember(
"alterType"));
4499 if (type ==
"RENAME_TABLE") {
4500 CHECK(payload.HasMember(
"newTableName"));
4501 auto newTableName =
json_str(payload[
"newTableName"]);
4503 new std::string(tableName),
new std::string(newTableName)));
4505 }
else if (type ==
"RENAME_COLUMN") {
4506 CHECK(payload.HasMember(
"columnName"));
4507 auto columnName =
json_str(payload[
"columnName"]);
4508 CHECK(payload.HasMember(
"newColumnName"));
4509 auto newColumnName =
json_str(payload[
"newColumnName"]);
4510 return std::unique_ptr<DDLStmt>(
4512 new std::string(columnName),
4513 new std::string(newColumnName)));
4515 }
else if (type ==
"ALTER_COLUMN") {
4516 CHECK(payload.HasMember(
"alterData"));
4517 CHECK(payload[
"alterData"].IsArray());
4518 throw std::runtime_error(
"ALTER TABLE ALTER COLUMN is not implemented.");
4519 }
else if (type ==
"ADD_COLUMN") {
4520 CHECK(payload.HasMember(
"columnData"));
4521 CHECK(payload[
"columnData"].IsArray());
4524 std::list<ColumnDef*>* table_element_list_ =
new std::list<ColumnDef*>;
4526 const auto elements = payload[
"columnData"].GetArray();
4527 for (
const auto& element : elements) {
4528 CHECK(element.IsObject());
4529 CHECK(element.HasMember(
"type"));
4530 if (
json_str(element[
"type"]) ==
"SQL_COLUMN_DECLARATION") {
4532 table_element_list_->emplace_back(col_def.release());
4534 LOG(
FATAL) <<
"Unsupported element type for ALTER TABLE: "
4535 << element[
"type"].GetString();
4539 return std::unique_ptr<DDLStmt>(
4542 }
else if (type ==
"DROP_COLUMN") {
4543 CHECK(payload.HasMember(
"columnData"));
4544 auto columnData =
json_str(payload[
"columnData"]);
4547 std::list<std::string*>* cols =
new std::list<std::string*>;
4548 std::vector<std::string> cols1;
4549 boost::split(cols1, columnData, boost::is_any_of(
","));
4550 for (
auto s : cols1) {
4552 boost::algorithm::trim_if(s, boost::is_any_of(
" \"'`"));
4553 std::string* str =
new std::string(s);
4554 cols->emplace_back(str);
4557 return std::unique_ptr<DDLStmt>(
4560 }
else if (type ==
"ALTER_OPTIONS") {
4561 CHECK(payload.HasMember(
"options"));
4562 const auto& options = payload[
"options"];
4563 if (options.IsObject()) {
4564 for (
auto itr = options.MemberBegin(); itr != options.MemberEnd(); ++itr) {
4565 std::string* option_name =
new std::string(
json_str(itr->name));
4566 Literal* literal_value;
4567 if (itr->value.IsString()) {
4568 std::string literal_string =
json_str(itr->value);
4573 int iVal = std::stoi(literal_string, &sz);
4574 if (sz == literal_string.size()) {
4575 literal_value =
new IntLiteral(iVal);
4577 literal_value =
new StringLiteral(&literal_string);
4579 }
else if (itr->value.IsInt() || itr->value.IsInt64()) {
4580 literal_value =
new IntLiteral(
json_i64(itr->value));
4581 }
else if (itr->value.IsNull()) {
4582 literal_value =
new NullLiteral();
4584 throw std::runtime_error(
"Unable to handle literal for " + *option_name);
4586 CHECK(literal_value);
4588 NameValueAssign* nv =
new NameValueAssign(option_name, literal_value);
4589 return std::unique_ptr<DDLStmt>(
4593 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)