Skip to content

Commit d69bfb0

Browse files
committed
Preflight physical table name collisions
1 parent 42cc928 commit d69bfb0

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

‎src/openstatspec/sql/wide.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ def create_wide_dataset(
117117
metadata.create_all(connection, tables=[datasets, variable_catalog, multiple_response_catalog])
118118
if connection.execute(select(datasets.c.dataset_id).where(datasets.c.dataset_id == dataset_id)).first():
119119
raise ValueError(f"Dataset {dataset_id!r} already exists; imports never overwrite a dataset.")
120+
if connection.execute(select(datasets.c.dataset_id).where(datasets.c.data_table == data_table.name)).first():
121+
raise ValueError(f"Dataset ID {dataset_id!r} collides with an existing physical data-table name; import was not started.")
120122
data_table.create(connection)
121123
materialized = [{"__case_ordinal": ordinal, **row} for ordinal, row in enumerate(rows, start=1)]
122124
connection.execute(insert(datasets).values(

‎tests/test_sav_sqlite.py‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,17 @@ def test_validation_rejects_catalog_type_mismatch(tmp_path) -> None:
7171
connection.commit()
7272
with pytest.raises(ValueError, match="String variable"):
7373
openstatspec.validate(database_url=database, dataset_id="fixture")
74+
75+
76+
def test_import_rejects_physical_table_name_collision_without_partial_catalog(tmp_path) -> None:
77+
source = tmp_path / "fixture.sav"
78+
database_path = tmp_path / "dataset.sqlite"
79+
database = f"sqlite:///{database_path}"
80+
pyreadstat.write_sav(pd.DataFrame({"answer": [1.0]}), source)
81+
openstatspec.import_sav(source, database_url=database, dataset_id="wave-1")
82+
83+
with pytest.raises(ValueError, match="collides"):
84+
openstatspec.import_sav(source, database_url=database, dataset_id="wave 1")
85+
86+
connection = sqlite3.connect(database_path)
87+
assert connection.execute("select dataset_id from dataset_catalog").fetchall() == [("wave-1",)]

0 commit comments

Comments
 (0)