Fix ValueTracker skipping type evaluation for empty strings

`ValueTracker.evaluate()` used `if not value` to skip NULL values, but
this also skipped empty strings (`""`), `0`, and other falsy values.
A CSV column containing only empty strings was incorrectly inferred as
INTEGER (the initial default) instead of TEXT.

Replace the falsy check with an explicit `if value is None` so that only
NULL is skipped and all other values — including `""` — are evaluated
against the type tests.
This commit is contained in:
Claude 2026-07-20 14:57:53 +00:00
commit cffe30fd2f
No known key found for this signature in database
2 changed files with 19 additions and 1 deletions

View file

@ -490,7 +490,7 @@ class ValueTracker:
return "text"
def evaluate(self, value: object) -> None:
if not value or not self.couldbe:
if value is None or not self.couldbe:
return
not_these: List[str] = []
for name, test in self.couldbe.items():

View file

@ -1,4 +1,5 @@
from sqlite_utils import utils
from sqlite_utils.utils import TypeTracker
import csv
import io
import pytest
@ -73,6 +74,23 @@ def test_maximize_csv_field_size_limit():
assert rows_list2[0]["text"] == long_value
@pytest.mark.parametrize(
"rows,expected_types",
[
([{"a": ""}], {"a": "text"}),
([{"a": ""}, {"a": ""}], {"a": "text"}),
([{"a": "1"}, {"a": ""}], {"a": "text"}),
([{"a": "0"}], {"a": "integer"}),
([{"a": "1"}], {"a": "integer"}),
([{"a": None}], {"a": "integer"}),
],
)
def test_type_tracker_empty_strings(rows, expected_types):
tracker = TypeTracker()
list(tracker.wrap(iter(rows)))
assert tracker.types == expected_types
@pytest.mark.parametrize(
"input,expected",
(