datalint: sample shop data

Contract checks plus zero-config semantic checks: does each column mean what its name says?

Health40.7%
Checks passed11/27
Errors12
Warnings4
Tables · rows2 · 1,200

Issues

SeverityWhereRuleRowsProblemExamples
errorcustomers.countryallowed
contract
2must be one of ['US', 'CA', 'GB', 'DE', 'IN', 'AU']XX; UK
errorcustomers.emailregex
contract
6must match /^[^@\s]+@[^@\s]+\.[^@\s]+$/priya111@example; emma54@@example.com; n/a
errororderstotal_matches_items
contract
5total = quantity × unit_price × (1 − discount), within 1 centorder_id=O00100, quantity=5, unit_price=70.31, discount_pct=10.0, total=632.8; order_id=O00318, quantity=2, unit_price=62.14, discount_pct=15.0, total=95.08; order_id=O00467, quantity=5, unit_price=50.07, discount_pct=15.0, total=191.52
errororders.customer_idnot_null
contract
5must not be nullnull
errororders.customer_idreferences
contract
4must exist in customers.customer_idC0939; C0978; C0942
errororders.discount_pctsemantic:mixed_scale
semantic
60name implies a percentage, but 60 values look like fractions (0–1) and 528 like percents (1–100)0.1; 0.15; 0.2
errororders.order_datetype:date
contract
6must parse as an ISO date (YYYY-MM-DD)07/10/2026; 05/26/2026; 08/22/2026
errororders.order_datemax
contract
2no dates after today2031-02-14; 2030-11-30
errororders.order_datesemantic:unparseable_dates
semantic
6name implies a date, but 6 values aren't ISO dates (mixed formats force the whole column to text)01/21/2026; 04/29/2026; 07/10/2026
errororders.order_idunique
contract
6values must be uniqueO00184; O00402; O00437
errororders.quantitymin
contract
2min 1-2; -5
errororders.statusallowed
contract
3must be one of ['placed', 'shipped', 'delivered', 'returned', 'cancelled']shiped
warncustomers.emailsemantic:invalid_email
semantic
6name implies an email address, but some values aren't validava149@@example.com; priya111@example; mia74@@example.com
warnorders.order_idsemantic:id_not_unique
semantic
6looks like this table's identifier, but values repeatO00184; O00437; O00402
warnorders.quantitysemantic:count_not_whole
semantic
2name implies a count, but values are negative or fractional-5; -2
warnorders.totalsemantic:negative_money
semantic
2name implies money, but some values are negative (refunds should be explicit)-112.9; -311.9

Notes

Profiles

customers 200 rows

ColumnTypeNullDistinctMinMaxMeanMost common
customer_idVARCHAR0.0%200C0001C0200C0001, C0002, C0003
emailVARCHAR0.0%200arjun127@example.comzoe88@example.comarjun127@example.com, arjun136@example.com, arjun137@example.com
countryVARCHAR0.0%8AUXXUS, AU, GB
signup_dateDATE0.0%1602025-01-042026-02-052025-02-05, 2025-05-16, 2025-05-23

orders 1,000 rows

ColumnTypeNullDistinctMinMaxMeanMost common
order_idVARCHAR0.0%997O00001O01000O00184, O00402, O00437
customer_idVARCHAR0.5%203C0001C0978C0016, C0098, C0100
order_dateVARCHAR0.0%27401/21/20262031-02-142026-04-24, 2026-07-03, 2026-07-23
statusVARCHAR0.0%6cancelledshippedcancelled, returned, shipped
quantityBIGINT0.0%7-553.1124, 5, 3
unit_priceDOUBLE0.0%9305.0579.8141.9528.2, 55.79, 57.78
discount_pctDOUBLE0.0%90206.9680, 15, 20
totalDOUBLE0.0%977-311.9632.8119.87.18, 18.61, 20.76
region_avg_priceDOUBLE0.0%329.141.236.3541.2, 29.1, 38.75