java-topology/defects/django/patch/django-0003-check-column-clashes-set.patch

49 lines
2.2 KiB
Diff

# UNDF: UNDF-2026-000000049
Fixes django-0003/0004: Model._check_column_name_clashes() list dedup + RawQuerySet.resolve_model_init_order() columns list scans.
--- a/django/db/models/base.py
+++ b/django/db/models/base.py
@@ DEFECT django-0003: Model._check_column_name_clashes() lines 2071-2094
@classmethod
def _check_column_name_clashes(cls):
- used_column_names = [] # list — O(F) scan per field — CWE-407
+ used_column_names = set() # FIX django-0003: O(1) lookup
errors = []
for f in cls._meta.local_fields:
column_name = f.column
- if column_name and column_name in used_column_names: # O(F) scan → O(F²) total
+ if column_name and column_name in used_column_names: # O(1) set → O(F) total — fixed
errors.append(
checks.Error(
"Field '%s' has column name '%s' that is used by another field."
% (f.name, column_name),
)
)
else:
- used_column_names.append(column_name) # preserves duplicates (defeats purpose)
+ used_column_names.add(column_name) # set.add is O(1)
return errors
--- a/django/db/models/query.py
+++ b/django/db/models/query.py
@@ DEFECT django-0004: RawQuerySet.resolve_model_init_order() lines 2375-2395
def resolve_model_init_order(self):
converter = connections[self.db].introspection.identifier_converter
+ columns_set = set(self.columns) # FIX django-0004: O(C) once
+ columns_index = {col: idx for idx, col in enumerate(self.columns)} # O(C) once
model_init_fields = [
field
for column_name, field in self.model_fields.items()
- if column_name in self.columns # O(C) list scan per field — CWE-407
+ if column_name in columns_set # O(1) — fixed
]
...
model_init_order = [
- self.columns.index(converter(f.column)) # O(C) list scan per field — CWE-407
+ columns_index[converter(f.column)] # O(1) dict lookup — fixed
for f in model_init_fields
]