How to debug types¶
Tools and techniques for debugging data types in ClickHouse and Tinybird.
Using toTypeName()¶
Check column types¶
Use case: See what type ClickHouse assigned to a column
Example:
-- Check type of specific column
SELECT toTypeName(user_id) as user_id_type FROM events LIMIT 1
-- Check types of all columns
SELECT
toTypeName(id) as id_type,
toTypeName(user_id) as user_id_type,
toTypeName(value) as value_type,
toTypeName(timestamp) as timestamp_type
FROM events
LIMIT 1
Check expression types¶
Use case: See what type an expression evaluates to
Example:
-- Check type of computed expression
SELECT toTypeName(user_id + 1) as computed_type FROM events LIMIT 1
Using toTypeName() with sample data¶
Examine data and types together¶
Use case: See both the data and its inferred type
Example:
-- See data and its type
SELECT
user_id,
toTypeName(user_id) as type,
length(toString(user_id)) as length
FROM events
LIMIT 10
Debug type conversion issues¶
Use case: Understand why type conversions fail
Example:
-- Check what types are being converted
SELECT
original_column,
toTypeName(original_column) as original_type,
toUInt32OrNull(original_column) as converted_value,
toTypeName(toUInt32OrNull(original_column)) as converted_type
FROM events
LIMIT 10
Schema debugging¶
Check table schema¶
Use case: See the actual schema of a table
Example:
-- Get table schema
DESCRIBE TABLE events
-- Or use system.columns
SELECT
name,
type,
default_expression
FROM system.columns
WHERE table = 'events'
Compare expected vs actual types¶
Use case: Verify if schema matches expectations
Example:
-- Check if types match expectations
SELECT
name,
type,
CASE
WHEN type = 'UInt32' THEN 'Expected'
WHEN type = 'String' THEN 'Unexpected - should be UInt32'
ELSE 'Check this type'
END as status
FROM system.columns
WHERE table = 'events'
Data validation¶
Check for type inconsistencies¶
Use case: Find data that doesn't match expected type
Example:
-- Find non-numeric values in numeric column
SELECT
user_id,
toTypeName(user_id) as type
FROM events
WHERE toUInt32OrNull(user_id) IS NULL
LIMIT 10
Validate date formats¶
Use case: Check if date strings can be parsed
Example:
-- Check date parsing
SELECT
date_string,
toDateOrNull(date_string) as parsed_date,
CASE
WHEN toDateOrNull(date_string) IS NULL THEN 'Invalid date'
ELSE 'Valid date'
END as status
FROM events
LIMIT 10
Best practices¶
- Use toTypeName() frequently - Check types during development
- Sample data - Always check sample data with types
- Validate assumptions - Don't assume types, verify them
- Document types - Keep track of expected vs actual types
- Test conversions - Test type conversions with sample data