@@ -189,6 +189,67 @@ def test_string_declaration_creates_column_and_catalog_variable(catalog) -> None
189189 )["valid" ] is True
190190
191191
192+ def test_delete_recanonicalizes_surviving_collision_columns (tmp_path ) -> None :
193+ path = tmp_path / "collision-delete.sqlite"
194+ url = f"sqlite:///{ path } "
195+ openstatspec .initialize_catalog (database_url = url )
196+ base = _variables ()[0 ]
197+ variables = [
198+ {
199+ ** base ,
200+ "ordinal" : ordinal ,
201+ "source_name" : source_name ,
202+ "physical_name" : physical ,
203+ }
204+ for ordinal , (source_name , physical ) in enumerate ((
205+ ("a-b" , "a_b" ), ("a_b" , "a_b_2" ), ("keep" , "keep" ),
206+ ), start = 1 )
207+ ]
208+ create_wide_dataset (
209+ database_url = url ,
210+ dataset_id = "collision_source" ,
211+ source_name = "collision.sav" ,
212+ source_format = "SAV" ,
213+ source_sha256 = "c" * 64 ,
214+ rows = [
215+ {"a_b" : 1.0 , "a_b_2" : 2.0 , "keep" : 3.0 },
216+ {"a_b" : 4.0 , "a_b_2" : 5.0 , "keep" : 6.0 },
217+ ],
218+ variables = variables ,
219+ )
220+ openstatspec .install_in_place_transformation_schema (database_url = url )
221+ connection = sqlite3 .connect (path )
222+ dataset_id = connection .execute (
223+ "select dataset_id from dataset where dataset_name = 'collision_source'"
224+ ).fetchone ()[0 ]
225+ connection .close ()
226+ plan = openstatspec .TransformationPlan (
227+ (openstatspec .DeleteVariableOperation ("a-b" ),),
228+ contract = "openstatspec-transformation-plan-v0.3" ,
229+ )
230+
231+ openstatspec .apply_transformation_plan_in_place (
232+ database_url = url ,
233+ dataset_id = dataset_id ,
234+ plan = plan ,
235+ actor = "test-agent" ,
236+ )
237+
238+ connection = sqlite3 .connect (path )
239+ assert connection .execute (
240+ "select source_name, physical_name, source_ordinal from variable "
241+ "where dataset_id = ? order by source_ordinal" ,
242+ (dataset_id ,),
243+ ).fetchall () == [("a_b" , "a_b" , 1 ), ("keep" , "keep" , 2 )]
244+ assert connection .execute (
245+ "select a_b, keep from data_collision_source order by __case_ordinal"
246+ ).fetchall () == [(2.0 , 3.0 ), (5.0 , 6.0 )]
247+ connection .close ()
248+ assert validate_wide_dataset (
249+ database_url = url , dataset_id = dataset_id ,
250+ )["valid" ] is True
251+
252+
192253def test_delete_prunes_an_empty_multiple_response_set (catalog ) -> None :
193254 url , path , dataset_id , _table_name = catalog
194255 connection = sqlite3 .connect (path )
@@ -335,9 +396,10 @@ def test_generic_string_width_is_rejected_before_ddl(
335396 {"server_version" : "3.35.0" },
336397 ),
337398 )
338- plan = openstatspec .TransformationPlan ((
339- openstatspec .CreateVariableOperation ("note" , "string" , 4 ),
340- ))
399+ plan = openstatspec .TransformationPlan (
400+ (openstatspec .CreateVariableOperation ("note" , "string" , 4 ),),
401+ contract = "openstatspec-transformation-plan-v0.3" ,
402+ )
341403
342404 with pytest .raises (TargetCapabilityExceededError , match = "permits 3" ):
343405 openstatspec .apply_transformation_plan_in_place (
0 commit comments