Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 1 addition & 34 deletions mssql_python/cursor.py
Original file line number Diff line number Diff line change
Expand Up @@ -1474,35 +1474,6 @@ def columns(self, table=None, catalog=None, schema=None, column=None):
# Use the helper method to prepare the result set
return self._prepare_metadata_result_set(fallback_description=fallback_description)

@staticmethod
def _select_best_sample_value(column):
"""
Selects the most representative non-null value from a column for type inference.

This is used during executemany() to infer SQL/C types based on actual data,
preferring a non-null value that is not the first row to avoid bias from placeholder defaults.

Args:
column: List of values in the column.
"""
non_nulls = [v for v in column if v is not None]
if not non_nulls:
return None
if all(isinstance(v, int) for v in non_nulls):
# Pick the value with the widest range (min/max)
return max(non_nulls, key=lambda v: abs(v))
if all(isinstance(v, float) for v in non_nulls):
return 0.0
if all(isinstance(v, decimal.Decimal) for v in non_nulls):
return max(non_nulls, key=lambda d: len(d.as_tuple().digits))
if all(isinstance(v, str) for v in non_nulls):
return max(non_nulls, key=lambda s: len(str(s)))
if all(isinstance(v, datetime.datetime) for v in non_nulls):
return datetime.datetime.now()
if all(isinstance(v, datetime.date) for v in non_nulls):
return datetime.date.today()
return non_nulls[0] # fallback

def _transpose_rowwise_to_columnwise(self, seq_of_parameters: list) -> tuple[list, int]:
"""
Convert sequence of rows (row-wise) into list of columns (column-wise),
Expand Down Expand Up @@ -1675,11 +1646,7 @@ def executemany(self, operation: str, seq_of_parameters: list) -> None:
else:
# Use auto-detection for columns without explicit types
column = [row[col_index] for row in seq_of_parameters] if hasattr(seq_of_parameters, '__getitem__') else []
if not column:
# For generators, use the sample row for inference
sample_value = sample_row[col_index]
else:
sample_value = self._select_best_sample_value(column)
sample_value, min_val, max_val = self._compute_column_type(column)

dummy_row = list(sample_row)
paraminfo = self._create_parameter_types_list(
Expand Down
Loading