From 633414a556f9444356f2b63a35cb4adcc6025b25 Mon Sep 17 00:00:00 2001 From: guzenkopavel Date: Mon, 4 May 2026 12:18:23 +0700 Subject: [PATCH] Guard transform when --detect-types CSV has only a header row (closes #702) --- sqlite_utils/cli.py | 2 +- tests/test_cli.py | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py index 9b9ee20e..9c7022a5 100644 --- a/sqlite_utils/cli.py +++ b/sqlite_utils/cli.py @@ -1176,7 +1176,7 @@ def insert_upsert_implementation( ) else: raise - if tracker is not None: + if tracker is not None and db.table(table).exists(): db.table(table).transform(types=tracker.types) # Clean up open file-like objects diff --git a/tests/test_cli.py b/tests/test_cli.py index 40c3595c..1bcd53e1 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -2305,6 +2305,21 @@ def test_insert_detect_types(tmpdir, option): ] +def test_insert_detect_types_header_only_csv(tmpdir): + """Test that --detect-types does not crash for CSV with only a header row""" + db_path = str(tmpdir / "test.db") + data = "name,age,weight\n" + result = CliRunner().invoke( + cli.cli, + ["insert", db_path, "creatures", "-", "--csv", "--detect-types"], + catch_exceptions=False, + input=data, + ) + assert result.exit_code == 0 + db = Database(db_path) + assert "creatures" not in db.table_names() + + @pytest.mark.parametrize("option", (None, "-d", "--detect-types")) def test_upsert_detect_types(tmpdir, option): """Test that type detection is now the default behavior for upsert"""