in metastore/validator.go [80:177]
func (v tableSchemaValidatorImpl) validateIndividualSchema(table *common.Table, creation bool) (err error) {
var colIdDedup []bool
nonDeletedColumnsCount := 0
colNameDedup := make(map[string]bool)
for columnID, column := range table.Columns {
if !column.Deleted {
nonDeletedColumnsCount++
}
if colNameDedup[column.Name] {
return common.ErrDuplicatedColumnName
}
colNameDedup[column.Name] = true
// validate data type
if dataType := memCom.DataTypeFromString(column.Type); dataType == memCom.Unknown {
return common.ErrInvalidDataType
} else if table.IsFactTable && columnID == 0 && dataType != memCom.Uint32 {
return common.ErrMissingTimeColumn
}
// validate hll config
if err := validateColumnHLLConfig(column); err != nil {
return err
}
// time column does not allow hll config
if table.IsFactTable && columnID == 0 && column.HLLConfig.IsHLLColumn {
return common.ErrTimeColumnDoesNotAllowHLLConfig
}
if column.DefaultValue != nil {
if table.IsFactTable && columnID == 0 {
return common.ErrTimeColumnDoesNotAllowDefault
}
if column.HLLConfig.IsHLLColumn {
return common.ErrHLLColumnDoesNotAllowDefaultValue
}
err = ValidateDefaultValue(*column.DefaultValue, column.Type)
if err != nil {
return err
}
}
}
if nonDeletedColumnsCount == 0 {
return common.ErrAllColumnsInvalid
}
if len(table.PrimaryKeyColumns) == 0 {
return common.ErrMissingPrimaryKey
}
colIdDedup = make([]bool, len(table.Columns))
for _, colId := range table.PrimaryKeyColumns {
if colId >= len(table.Columns) {
return common.ErrColumnNonExist
}
if table.Columns[colId].Deleted {
return common.ErrColumnDeleted
}
if colIdDedup[colId] {
return common.ErrDuplicatedColumn
}
colDataType := memCom.DataTypeFromString(table.Columns[colId].Type)
if memCom.IsArrayType(colDataType) {
return common.ErrInvalidPrimaryKeyDataType
}
colIdDedup[colId] = true
}
if err := validator.Validate(table.Config); err != nil {
return utils.StackError(err, "invalid table config")
}
if table.IsFactTable {
colIdDedup = make([]bool, len(table.Columns))
for _, sortColumnId := range table.ArchivingSortColumns {
if sortColumnId >= len(table.Columns) {
return common.ErrColumnNonExist
}
if table.Columns[sortColumnId].Deleted {
return common.ErrColumnDeleted
}
if colIdDedup[sortColumnId] {
return common.ErrDuplicatedColumn
}
colDataType := memCom.DataTypeFromString(table.Columns[sortColumnId].Type)
if colDataType >= memCom.ArrayBool && colDataType <= memCom.ArrayInt64 {
return common.ErrInvalidSortColumnDataType
}
colIdDedup[sortColumnId] = true
}
}
return
}