2121
2222from __future__ import annotations
2323
24+ import uuid
2425import warnings
2526from dataclasses import dataclass
2627from typing import (
@@ -783,6 +784,8 @@ def _prepare_deduplicate(
783784 ) -> tuple [DataFrame , list [str ], list [str ], list [str ]]:
784785 """Rename join columns to drop them after joining.
785786
787+ Uses collision-safe temporary aliases to avoid conflicts with existing column names.
788+
786789 Args:
787790 right: The right DataFrame to modify.
788791 on: The join column name(s).
@@ -798,12 +801,30 @@ def _prepare_deduplicate(
798801 right_aliases : list [str ] = []
799802 on_cols = [on ] if isinstance (on , str ) else list (on )
800803
804+ # Get existing column names to avoid collisions
805+ existing_columns = set (right .schema ().names )
806+
801807 modified_right = right
802808 for col_name in on_cols :
803- alias = f"__right_{ col_name } "
809+ # Generate a collision-safe temporary alias
810+ base_alias = f"__right_{ col_name } "
811+ alias = base_alias
812+ counter = 0
813+
814+ # Keep trying until we find a unique name
815+ while alias in existing_columns :
816+ counter += 1
817+ alias = f"{ base_alias } _{ counter } "
818+
819+ # If even that fails (very unlikely), use UUID
820+ if alias in existing_columns :
821+ alias = f"__temp_{ uuid .uuid4 ().hex [:8 ]} _{ col_name } "
822+
804823 modified_right = modified_right .with_column_renamed (col_name , alias )
805824 right_aliases .append (alias )
806825 drop_cols .append (alias )
826+ # Add the new alias to existing columns to avoid future collisions
827+ existing_columns .add (alias )
807828
808829 return modified_right , drop_cols , on_cols , right_aliases
809830
0 commit comments