You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three follow-ups from the residual audit.
Routes decided 400-vs-500 by matching substrings of the error message, a list
that had to grow with every new message and silently mis-classified anything it
missed. The metadata-ownership error ("Cannot set precision on column …")
matched nothing and returned a 500, telling the caller the server broke when
their request was invalid. The service now raises `TableColumnError` carrying
its own status; all 38 throws in the column service and the shared
"Table not found" are migrated, and both routes replace the lists with one
typed check. An untyped throw now correctly means a genuine internal error.
CSV import never inferred Email or Phone, so a contacts file arrived as text.
Email is inferred through the type's OWN coerce, so inference and the write
path cannot disagree. Phone is deliberately inferred only on strong evidence —
every value carrying a `+` or a parenthesised area code — because ISBNs, SKUs
and part numbers are dash-separated digit runs too, and a phone column keeps
only the digits, so a wrong guess drops their punctuation silently. A column of
bare digits still infers Number, which is right for an ID column.
`Number()` accepts far more than a decimal number: `0x10` read as 16, `0b11` as
3, `Infinity` as infinity. Someone typing `0x10` means the text, so Number and
Percent now parse through a shared decimal parser. Exponent notation stays
accepted — spreadsheets export it — while the alternate bases are refused.
0 commit comments