**Describe the issue**

Improve feedback when trying to replace a partition with a different index

**Which ClickHouse server version to use**

21.9.5


**How to reproduce**

```
DROP DATABASE IF EXISTS test;

CREATE DATABASE test;

CREATE TABLE test.A (id UInt32, company UInt32, total UInt64) ENGINE=SummingMergeTree() PARTITION BY company PRIMARY KEY (id) ORDER BY (id, company);

INSERT INTO test.A SELECT number%10 as id, number%2 as company, count() as total FROM numbers(100) GROUP BY id,company;

CREATE TABLE test.B (id UInt32, company UInt32, total UInt64) ENGINE=SummingMergeTree() PARTITION BY company ORDER BY (id, company);

ALTER TABLE test.B REPLACE PARTITION '0' FROM test.A;

```

**Error message and/or stacktrace**

```
Received exception from server (version 21.9.5):
Code: 33. DB::Exception: Received from localhost:9000. DB::Exception: Cannot read all data. Bytes read: 0. Bytes expected: 4.. (CANNOT_READ_ALL_DATA)
(query: ALTER TABLE test.B REPLACE PARTITION '0' FROM test.A;)
````

**Expected behavior**

```
Code: 33. DB::Exception: Received from localhost:9000. DB::Exception: Cannot replace partition different index (CANNOT_REPLACE_PARTITION)
(query: ALTER TABLE test.B REPLACE PARTITION '0' FROM test.A;)
```

assert(!tmp_part_prefix.empty());
    String tmp_dst_part_name = tmp_part_prefix + dst_part_name;
    auto temporary_directory_lock = getTemporaryPartDirectoryHolder(tmp_dst_part_name);
    
    auto reservation = src_part->data_part_storage->reserve(src_part->getBytesOnDisk());
    auto src_part_storage = src_part->data_part_storage;
    
    if (auto src_part_in_memory = asInMemoryPart(src_part))
    {
        auto flushed_part_path = src_part_in_memory->getRelativePathForPrefix(tmp_part_prefix);
        src_part_storage = src_part_in_memory->flushToDisk(flushed_part_path, metadata_snapshot);
    }
    String with_copy;
    if (copy_instead_of_hardlink)
        with_copy = " (copying data)";
    LOG_DEBUG(log, "Cloning part {} to {}{}",
              src_part_storage->getFullPath(),
              std::string(fs::path(src_part_storage->getFullRootPath()) / tmp_dst_part_name),
              with_copy);
    auto dst_part_storage = src_part_storage->freeze(relative_data_path, tmp_dst_part_name,  false, {},  copy_instead_of_hardlink);
    auto dst_data_part = createPart(dst_part_name, dst_part_info, dst_part_storage);
    if (!copy_instead_of_hardlink && hardlinked_files)
    {
        hardlinked_files->source_part_name = src_part->name;
        hardlinked_files->source_table_shared_id = src_part->storage.getTableSharedID();
        for (auto it = src_part->data_part_storage->iterate(); it->isValid(); it->next())
        {
            if (it->name() != IMergeTreeDataPart::DELETE_ON_DESTROY_MARKER_FILE_NAME && it->name() != IMergeTreeDataPart::TXN_VERSION_METADATA_FILE_NAME)
                hardlinked_files->hardlinks_from_source_part.insert(it->name());
        }