code: func (d *ddl) ModifyColumn(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error {
  	specNewColumn := spec.NewColumns[0]
  	if len(specNewColumn.Name.Schema.O) != 0 && ident.Schema.L != specNewColumn.Name.Schema.L {
  		return ErrWrongDBName.GenWithStackByArgs(specNewColumn.Name.Schema.O)
  	}
  	if len(specNewColumn.Name.Table.O) != 0 && ident.Name.L != specNewColumn.Name.Table.L {
  		return ErrWrongTableName.GenWithStackByArgs(specNewColumn.Name.Table.O)
  	}
  
  	// If the modified column is generated, check whether it refers to any auto-increment columns.
  	for _, option := range specNewColumn.Options {
  		if option.Tp == ast.ColumnOptionGenerated {
  			_, t, err := d.getSchemaAndTableByIdent(ctx, ident)
  			if err != nil {
  				return errors.Trace(err)
  			}
  			_, dependColNames := findDependedColumnNames(specNewColumn)
  			if err := checkAutoIncrementRef(specNewColumn.Name.Name.L, dependColNames, t.Meta()); err != nil {
  				return errors.Trace(err)
  			}
  		}
  	}
  
  	originalColName := specNewColumn.Name.Name
  	job, err := d.getModifiableColumnJob(ctx, ident, originalColName, spec)
  	if err != nil {
  		return errors.Trace(err)
  	}
  
  	err = d.doDDLJob(ctx, job)
  	err = d.callHookOnChanged(err)
  	return errors.Trace(err)
  }
docs: // ModifyColumn does modification on an existing column, currently we only support limited kind of changes
  // that do not need to change or check data on the table.