49 lines
2.2 KiB
Diff
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
|
|
]
|