in metastore/validator.go [186:255]
func (v tableSchemaValidatorImpl) validateSchemaUpdate(newTable, oldTable *common.Table) (err error) {
if err := v.validateIndividualSchema(newTable, false); err != nil {
return err
}
if newTable.Name != oldTable.Name {
return common.ErrSchemaUpdateNotAllowed
}
if newTable.IsFactTable != oldTable.IsFactTable {
return common.ErrSchemaUpdateNotAllowed
}
// validate columns
if len(newTable.Columns) < len(oldTable.Columns) {
// even with column deletion, or recreation, column id are not reused
return common.ErrInsufficientColumnCount
}
if oldTable.IsFactTable && oldTable.Config.AllowMissingEventTime && !newTable.Config.AllowMissingEventTime {
return common.ErrDisallowMissingEventTime
}
var i int
for i = 0; i < len(oldTable.Columns); i++ {
oldCol := oldTable.Columns[i]
newCol := newTable.Columns[i]
if oldCol.Deleted {
if !newCol.Deleted {
return common.ErrReusingColumnIDNotAllowed
}
}
// check that no column configs are modified, even for deleted columns
if oldCol.Name != newCol.Name ||
oldCol.Type != newCol.Type ||
!reflect.DeepEqual(oldCol.DefaultValue, newCol.DefaultValue) ||
oldCol.CaseInsensitive != newCol.CaseInsensitive ||
oldCol.DisableAutoExpand != newCol.DisableAutoExpand ||
oldCol.HLLConfig != newCol.HLLConfig {
return common.ErrSchemaUpdateNotAllowed
}
}
// end validate columns
// primary key columns
if !reflect.DeepEqual(newTable.PrimaryKeyColumns, oldTable.PrimaryKeyColumns) {
return common.ErrChangePrimaryKeyColumn
}
// sort columns
if len(newTable.ArchivingSortColumns) < len(oldTable.ArchivingSortColumns) {
return common.ErrIllegalChangeSortColumn
}
for i, sortColumnId := range newTable.ArchivingSortColumns {
if i < len(oldTable.ArchivingSortColumns) {
if oldTable.ArchivingSortColumns[i] != sortColumnId {
return common.ErrIllegalChangeSortColumn
}
}
if sortColumnId >= len(newTable.Columns) {
return common.ErrColumnNonExist
}
if newTable.Columns[sortColumnId].Deleted {
return common.ErrColumnDeleted
}
}
return
}