refactor: avoid routing tables returning errors due to incorrect metadata (#225)

diff --git a/server/cluster/metadata/cluster_metadata.go b/server/cluster/metadata/cluster_metadata.go
index 112f98a..dbd7290 100644
--- a/server/cluster/metadata/cluster_metadata.go
+++ b/server/cluster/metadata/cluster_metadata.go
@@ -456,22 +456,24 @@
 		if err != nil {
 			return RouteTablesResult{}, errors.WithMessage(err, "table manager get table")
 		}
-		if exists {
-			// TODO: Adapt to the current implementation of the partition table, which may need to be reconstructed later.
-			if !table.IsPartitioned() {
-				tables[table.ID] = table
-				tableIDs = append(tableIDs, table.ID)
-			} else {
-				routeEntries[table.Name] = RouteEntry{
-					Table: TableInfo{
-						ID:            table.ID,
-						Name:          table.Name,
-						SchemaID:      table.SchemaID,
-						SchemaName:    schemaName,
-						PartitionInfo: table.PartitionInfo,
-					},
-					NodeShards: nil,
-				}
+		if !exists {
+			continue
+		}
+
+		// TODO: Adapt to the current implementation of the partition table, which may need to be reconstructed later.
+		if !table.IsPartitioned() {
+			tables[table.ID] = table
+			tableIDs = append(tableIDs, table.ID)
+		} else {
+			routeEntries[table.Name] = RouteEntry{
+				Table: TableInfo{
+					ID:            table.ID,
+					Name:          table.Name,
+					SchemaID:      table.SchemaID,
+					SchemaName:    schemaName,
+					PartitionInfo: table.PartitionInfo,
+				},
+				NodeShards: nil,
 			}
 		}
 	}
@@ -495,9 +497,9 @@
 		// If nodeShards length bigger than 1, randomly select a nodeShard.
 		nodeShardsResult := nodeShards
 		if len(nodeShards) > 1 {
-			selectIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(nodeShards))))
-			if err != nil {
-				return RouteTablesResult{}, errors.WithMessage(err, "generate random node index")
+			selectIndex, err2 := rand.Int(rand.Reader, big.NewInt(int64(len(nodeShards))))
+			if err2 != nil {
+				return RouteTablesResult{}, errors.WithMessage(err2, "generate random node index")
 			}
 			nodeShardsResult = []ShardNodeWithVersion{nodeShards[selectIndex.Uint64()]}
 		}
diff --git a/server/cluster/metadata/cluster_metadata_test.go b/server/cluster/metadata/cluster_metadata_test.go
index cd078ce..2c0ad9c 100644
--- a/server/cluster/metadata/cluster_metadata_test.go
+++ b/server/cluster/metadata/cluster_metadata_test.go
@@ -116,9 +116,10 @@
 	re.True(exists)
 	re.Equal(testTableName, t.Name)
 
-	// Route table should return error when table metadata is not exists in any shard.
-	_, err = m.RouteTables(ctx, testSchema, []string{testTableName})
-	re.Error(err)
+	// Route table return empty when table not assign to any node.
+	routeTable, err := m.RouteTables(ctx, testSchema, []string{testTableName})
+	re.NoError(err)
+	re.Equal(0, len(routeTable.RouteEntries[testTableName].NodeShards))
 
 	// Test drop table metadata.
 	dropMetadataResult, err := m.DropTableMetadata(ctx, testSchema, testTableName)
diff --git a/server/cluster/metadata/topology_manager.go b/server/cluster/metadata/topology_manager.go
index f303ccf..92986dd 100644
--- a/server/cluster/metadata/topology_manager.go
+++ b/server/cluster/metadata/topology_manager.go
@@ -365,14 +365,18 @@
 	shardViewVersions := make(map[storage.ShardID]uint64, 0)
 	for _, tableID := range tableIDs {
 		shardIDs, ok := m.tableShardMapping[tableID]
+		// If the table is not assigned to any shard, return an empty slice.
 		if !ok {
-			return GetShardNodesByTableIDsResult{}, ErrShardNotFound.WithCausef("table id:%d, not shard is assigned", tableID)
+			tableShardNodes[tableID] = []storage.ShardNode{}
+			continue
 		}
 
 		for _, shardID := range shardIDs {
 			shardNodes, ok := m.shardNodesMapping[shardID]
 			if !ok {
-				return GetShardNodesByTableIDsResult{}, ErrNodeNotFound.WithCausef("shard id:%d, no node is assigned", shardID)
+				// If the shard is not assigned to any node, return an empty slice.
+				tableShardNodes[tableID] = []storage.ShardNode{}
+				continue
 			}
 
 			if _, exists := tableShardNodes[tableID]; !exists {