Skip to content
This repository was archived by the owner on Sep 27, 2019. It is now read-only.

Commit 72c35ac

Browse files
committed
added alter varchar length support, changed the plan to use schema
addressed bug
1 parent 32a260f commit 72c35ac

File tree

4 files changed

+42
-38
lines changed

4 files changed

+42
-38
lines changed

src/executor/alter_executor.cpp

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,25 +116,22 @@ bool AlterExecutor::AlterTable(const peloton::planner::AlterPlan &node,
116116
catalog::Schema::CopySchema(old_schema, column_ids));
117117
auto columns = temp_schema->GetColumns();
118118
// Step 2: change column type if exists
119-
for (auto change_pair : node.GetChangedTypeColumns()) {
119+
for (auto &change_col : node.GetChangedTypeColumns().get()->GetColumns()) {
120120
bool is_found = false;
121121
oid_t i = 0;
122122
for (; i < columns.size(); ++i) {
123-
if (columns[i].GetName() == change_pair.first) {
123+
if (columns[i].GetName() == change_col.GetName()) {
124124
is_found = true;
125125
break;
126126
}
127127
}
128128
if (!is_found) {
129129
LOG_TRACE("Change column type failed: Column %s does not exists",
130-
change_pair.first.c_str());
130+
change_col.GetName().c_str());
131131
txn->SetResult(ResultType::FAILURE);
132132
return false;
133133
} else {
134-
columns[i].SetType(change_pair.second);
135-
columns[i].SetInlined();
136-
columns[i].SetLength(type::VarlenType::GetTypeSize(change_pair.second));
137-
134+
columns[i] = std::move(change_col);
138135
// TODO: decide VARCHAR's size when change type
139136
// if (change_pair.second == type::TypeId::VARCHAR) {}
140137
}
@@ -143,10 +140,8 @@ bool AlterExecutor::AlterTable(const peloton::planner::AlterPlan &node,
143140
// Step 3: append add column to new schema
144141
// construct add column schema
145142
std::vector<catalog::Column> add_columns;
146-
for (size_t i = 0; i < node.GetAddedColumns().size(); ++i) {
147-
for (auto column : node.GetAddedColumns()[i]->GetColumns()) {
148-
add_columns.push_back(column);
149-
}
143+
for (auto column : node.GetAddedColumns()->GetColumns()) {
144+
add_columns.push_back(column);
150145
}
151146
// Check if added column exists
152147
for (auto new_column : add_columns) {

src/include/planner/alter_plan.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ class AlterPlan : public AbstractPlan {
3636
explicit AlterPlan(
3737
const std::string &database_name, const std::string &table_name,
3838
const std::vector<std::string> &dropped_columns,
39-
const std::vector<std::unique_ptr<catalog::Schema>> &added_columns,
39+
const std::unique_ptr<catalog::Schema> &added_columns,
40+
const std::unique_ptr<catalog::Schema> &changed_type_columns,
4041
AlterType a_type);
4142
explicit AlterPlan(const std::string &database_name,
4243
const std::string &table_name,
@@ -61,7 +62,7 @@ class AlterPlan : public AbstractPlan {
6162
switch (this->type) {
6263
case AlterType::ALTER:
6364
return std::unique_ptr<AbstractPlan>(new AlterPlan(
64-
database_name, table_name, dropped_columns, added_columns, type));
65+
database_name, table_name, dropped_columns, added_columns, changed_type_columns, type));
6566
case AlterType::RENAME:
6667
return std::unique_ptr<AbstractPlan>(new AlterPlan(
6768
database_name, table_name, old_names_, new_names_, type));
@@ -75,15 +76,15 @@ class AlterPlan : public AbstractPlan {
7576

7677
std::string GetDatabaseName() const { return database_name; }
7778

78-
const std::vector<std::unique_ptr<catalog::Schema>> &GetAddedColumns() const {
79+
const std::unique_ptr<catalog::Schema> &GetAddedColumns() const {
7980
return added_columns;
8081
}
8182

8283
const std::vector<std::string> &GetDroppedColumns() const {
8384
return dropped_columns;
8485
}
8586

86-
const std::vector<std::pair<std::string, type::TypeId>> &
87+
const std::unique_ptr<catalog::Schema> &
8788
GetChangedTypeColumns() const {
8889
return changed_type_columns;
8990
};
@@ -110,11 +111,11 @@ class AlterPlan : public AbstractPlan {
110111
std::string database_name;
111112

112113
// Schema delta, define the column txn want to add
113-
std::vector<std::unique_ptr<catalog::Schema>> added_columns;
114+
std::unique_ptr<catalog::Schema> added_columns;
114115
// dropped_column, define the column you want to drop
115116
std::vector<std::string> dropped_columns;
116117
// changed-type columns, define the column you want to change type
117-
std::vector<std::pair<std::string, type::TypeId>> changed_type_columns;
118+
std::unique_ptr<catalog::Schema> changed_type_columns;
118119
// used for store rename function data
119120
std::vector<std::string> old_names_;
120121
std::vector<std::string> new_names_;

src/parser/postgresparser.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,15 +1802,16 @@ parser::AlterTableStatement *PostgresParser::AlterTransform(Node *root) {
18021802
}
18031803
case AT_AlterColumnType: {
18041804
ColumnDef *def = (ColumnDef *)cmd->def;
1805-
TypeName *type_name = def->typeName;
1806-
char *name = (reinterpret_cast<value *>(
1807-
type_name->names->tail->data.ptr_value)
1808-
->val.str);
1809-
LOG_TRACE("DATA Type is :%s", name);
1810-
auto type_id = ColumnDefinition::StrToDataType(name);
1811-
std::unique_ptr<ColumnDefinition> col_def(
1812-
new ColumnDefinition(cmd->name, type_id));
1813-
result->changed_type_columns->push_back(std::move(col_def));
1805+
def->colname = cmd->name;
1806+
parser::CreateStatement tmp_statement(
1807+
parser::CreateStatement::CreateType::kTable);
1808+
LOG_TRACE("Adding change type column");
1809+
ColumnDefTransform(reinterpret_cast<ColumnDef *>(def),
1810+
&tmp_statement);
1811+
for (size_t i = 0; i < tmp_statement.columns.size();i++){
1812+
result->changed_type_columns->emplace_back(std::move(tmp_statement.columns[i]));
1813+
}
1814+
LOG_TRACE("adding end");
18141815
break;
18151816
}
18161817
default: {

src/planner/alter_plan.cpp

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,15 @@ namespace planner {
2323
AlterPlan::AlterPlan(
2424
const std::string &database_name, const std::string &table_name,
2525
const std::vector<std::string> &dropped_columns,
26-
UNUSED_ATTRIBUTE const std::vector<std::unique_ptr<catalog::Schema>>
27-
&added_columns_,
26+
const std::unique_ptr<catalog::Schema> &added_columns,
27+
const std::unique_ptr<catalog::Schema> &changed_type_columns,
2828
AlterType a_type)
2929
: table_name(table_name),
3030
database_name(database_name),
3131
dropped_columns(dropped_columns),
3232
type(a_type) {
33-
// for (size_t i=0;i<added_columns.size();i++){
34-
// this->added_columns.push_back(std::move(added_columns_[i]));
35-
// }
33+
this->added_columns = std::unique_ptr<catalog::Schema>(new catalog::Schema(*added_columns));
34+
this->changed_type_columns = std::unique_ptr<catalog::Schema>(new catalog::Schema(*changed_type_columns));
3635
}
3736

3837
AlterPlan::AlterPlan(const std::string &database_name,
@@ -85,17 +84,25 @@ AlterPlan::AlterPlan(parser::AlterTableStatement *parse_tree) {
8584
}
8685
columns.emplace_back(column);
8786
}
88-
added_columns.emplace_back(
89-
std::unique_ptr<catalog::Schema>(new catalog::Schema(columns)));
90-
87+
added_columns = std::unique_ptr<catalog::Schema>(new catalog::Schema(columns));
88+
columns.clear();
9189
// deal with change column types
9290
for (size_t i = 0; i < (*parse_tree->changed_type_columns).size(); i++) {
9391
auto &tmp = (*parse_tree->changed_type_columns)[i];
94-
type::TypeId val =
95-
parser::ColumnDefinition::GetValueType(tmp.get()->type);
96-
std::string name = tmp.get()->name;
97-
changed_type_columns.emplace_back(std::make_pair(name, val));
92+
type::TypeId val = parser::ColumnDefinition::GetValueType(tmp.get()->type);
93+
bool is_inline = (val == type::TypeId::VARCHAR) ? false : true;
94+
auto column = catalog::Column(
95+
val, type::Type::GetTypeSize(val),
96+
std::string((*parse_tree->changed_type_columns)[i].get()->name),
97+
is_inline);
98+
if ((*parse_tree->changed_type_columns)[i].get()->not_null) {
99+
catalog::Constraint constraint(ConstraintType::NOTNULL,
100+
"con_not_null");
101+
column.AddConstraint(constraint);
102+
}
103+
columns.emplace_back(column);
98104
}
105+
changed_type_columns = std::unique_ptr<catalog::Schema>(new catalog::Schema(columns));
99106
break;
100107
}
101108
default:

0 commit comments

Comments
 (0)