Skip to content

Commit 0ad1b00

Browse files
committed
feat: implement collision-safe temporary aliases for join column renaming in DataFrame
1 parent f246224 commit 0ad1b00

File tree

1 file changed

+22
-1
lines changed

1 file changed

+22
-1
lines changed

python/datafusion/dataframe.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
from __future__ import annotations
2323

24+
import uuid
2425
import warnings
2526
from dataclasses import dataclass
2627
from 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

Comments
 (0)