diff --git a/dbms/src/Storages/Transaction/RegionBlockReader.cpp b/dbms/src/Storages/Transaction/RegionBlockReader.cpp index 17eab313087..2d8d2d63683 100644 --- a/dbms/src/Storages/Transaction/RegionBlockReader.cpp +++ b/dbms/src/Storages/Transaction/RegionBlockReader.cpp @@ -186,8 +186,7 @@ std::tuple readRegionBlock(const TiDB::TableInfo & table_info, row.emplace_back(Field(column.id)); // Fill `zero` value if NOT NULL specified or else NULL. - // TODO: Need to consider default value. - row.push_back(column.hasNotNullFlag() ? GenDecodeRow(column.getCodecFlag()) : Field()); + row.push_back(column.defaultValueToField()); } // Remove values of non-existing columns, which could be data inserted (but not flushed) before DDLs that drop some columns. diff --git a/dbms/src/Storages/Transaction/SchemaBuilder.cpp b/dbms/src/Storages/Transaction/SchemaBuilder.cpp index 92243b48323..aadf20eb734 100644 --- a/dbms/src/Storages/Transaction/SchemaBuilder.cpp +++ b/dbms/src/Storages/Transaction/SchemaBuilder.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -15,10 +16,7 @@ namespace DB { -using TableInfo = TiDB::TableInfo; -using DBInfo = TiDB::DBInfo; -using TableInfoPtr = TiDB::TableInfoPtr; -using DBInfoPtr = TiDB::DBInfoPtr; +using namespace TiDB; inline AlterCommands detectSchemaChanges(Logger * log, const TiDB::TableInfo & table_info, const TiDB::TableInfo & orig_table_info) { @@ -39,6 +37,10 @@ inline AlterCommands detectSchemaChanges(Logger * log, const TiDB::TableInfo & t command.type = AlterCommand::ADD_COLUMN; command.column_name = column_info.name; command.data_type = getDataTypeByColumnInfo(column_info); + if (!column_info.origin_default_value.isEmpty()) { + LOG_DEBUG(log, "add default value for column: " + column_info.name); + command.default_expression = ASTPtr(new ASTLiteral(column_info.defaultValueToField())); + } // TODO: support after column. LOG_DEBUG(log, "detect add column."); } diff --git a/dbms/src/Storages/Transaction/TiDB.cpp b/dbms/src/Storages/Transaction/TiDB.cpp index f8328b26b24..4e3371223ee 100644 --- a/dbms/src/Storages/Transaction/TiDB.cpp +++ b/dbms/src/Storages/Transaction/TiDB.cpp @@ -124,9 +124,51 @@ namespace TiDB using DB::ReadBufferFromString; using DB::WriteBuffer; using DB::WriteBufferFromOwnString; +using DB::Field; ColumnInfo::ColumnInfo(Poco::JSON::Object::Ptr json) { deserialize(json); } +// TODO:: Refine Decimal Default Value !! +// TODO:: Refine Enum Default Value !! +// TODO:: Refine Date/Datatime/TimeStamp Defalut Value !! +Field ColumnInfo::defaultValueToField() const { + auto & value = origin_default_value; + switch (tp) { + // Integer Type. + case TypeTiny: + case TypeShort: + case TypeLong: + case TypeLongLong: + case TypeInt24: + return value.convert(); + // Floating type. + case TypeFloat: + case TypeDouble: + return value.convert(); + case TypeTimestamp: + // FIXME: may be string + return value.convert(); + case TypeDate: + case TypeDatetime: + case TypeVarchar: + case TypeTinyBlob: + case TypeMediumBlob: + case TypeLongBlob: + case TypeBlob: + case TypeVarString: + case TypeString: + return value.convert(); + case TypeEnum: + // FIXME: may be int or string + return value.convert(); + case TypeNull: + return Field(); + default: + throw Exception("Have not proccessed type: " + std::to_string(tp)); + } + return Field(); +} + Poco::JSON::Object::Ptr ColumnInfo::getJSONObject() const try { Poco::JSON::Object::Ptr json = new Poco::JSON::Object(); diff --git a/dbms/src/Storages/Transaction/TiDB.h b/dbms/src/Storages/Transaction/TiDB.h index d0357c60d09..c74ff2cac3c 100644 --- a/dbms/src/Storages/Transaction/TiDB.h +++ b/dbms/src/Storages/Transaction/TiDB.h @@ -170,6 +170,7 @@ struct ColumnInfo #undef M CodecFlag getCodecFlag() const; + DB::Field defaultValueToField() const; }; enum PartitionType