SIZES_OF_ARRAYS_DONT_MATCH ClickHouse error¶
Common cause: You're trying to perform operations on arrays that have different lengths or sizes.
The SIZES_OF_ARRAYS_DONT_MATCH
error occurs when you try to perform operations on arrays that have different sizes or lengths. This commonly happens when using array functions that require arrays of the same size, such as element-wise operations, array comparisons, or array concatenation.
What causes this error¶
This error typically happens when:
- Different array lengths: Arrays have different numbers of elements
- Element-wise operations: Using functions that require same-sized arrays
- Array comparisons: Comparing arrays of different sizes
- Array concatenation: Issues with array joining operations
- Nested array operations: Working with nested arrays of different sizes
- Array function parameters: Passing arrays of different sizes to functions
Example errors¶
-- Error: Arrays of different sizes SELECT [1, 2, 3] + [1, 2]; -- Error: Array comparison with different sizes SELECT [1, 2, 3] = [1, 2]; -- Error: Array concatenation with size mismatch SELECT arrayConcat([1, 2], [3, 4, 5]); -- Error: Element-wise operation on different sized arrays SELECT arrayZip([1, 2, 3], [1, 2]); -- Error: Array function with mismatched sizes SELECT arrayJoin([1, 2, 3], [1, 2]);
How to fix it¶
1. Ensure arrays have the same size¶
Make sure arrays have matching lengths before operations:
-- ❌ Wrong: Arrays of different sizes SELECT arrayMap(x, y -> x + y, [1, 2, 3], [1, 2]); -- ✅ Correct: Arrays of same size SELECT arrayMap(x, y -> x + y, [1, 2, 3], [1, 2, 3]); -- ❌ Wrong: Different sized arrays SELECT [1, 2, 3] = [1, 2]; -- ✅ Correct: Same sized arrays SELECT [1, 2, 3] = [1, 2, 3];
2. Use array functions that handle size differences¶
Use functions that can handle arrays of different sizes:
-- Use arrayZip to handle different sizes SELECT arrayZip([1, 2, 3], [1, 2]) AS zipped_array; -- Use arrayConcat for joining arrays SELECT arrayConcat([1, 2], [3, 4, 5]) AS combined_array; -- Use arrayJoin for flattening SELECT arrayJoin([1, 2, 3]) AS flattened_array; -- Use arrayMap for element-wise operations SELECT arrayMap(x, y -> x + y, [1, 2, 3], [1, 2, 3]) AS mapped_array;
3. Pad arrays to match sizes¶
Extend shorter arrays to match longer ones:
-- Pad shorter array with default values SELECT arrayMap(x, y -> x + y, [1, 2, 3], arrayResize([1, 2], 3, 0) ) AS padded_result; -- Use array functions to handle size differences SELECT arrayZip( [1, 2, 3], arrayResize([1, 2], 3, NULL) ) AS zipped_with_padding;
4. Truncate arrays to match sizes¶
Cut longer arrays to match shorter ones:
-- Use arrayResize to truncate longer arrays SELECT arrayResize([1, 2, 3, 4], 2) AS truncated_array; -- Use arrayPushBack to extend shorter arrays SELECT arrayPushBack([1, 2], 0) AS extended_array;
-- Truncate longer array to match shorter one SELECT arrayMap(x, y -> x + y, arraySlice([1, 2, 3], 1, 2), [1, 2] ) AS truncated_result; -- Use arraySlice to get matching sizes SELECT arrayZip( arraySlice([1, 2, 3, 4], 1, 2), [1, 2] ) AS zipped_truncated;
Common patterns and solutions¶
Array element-wise operations¶
-- ❌ Wrong: Different sized arrays SELECT arrayMap(x, y -> x + y, [1, 2, 3], [1, 2]); -- ✅ Correct: Same sized arrays SELECT arrayMap(x, y -> x + y, [1, 2, 3], [1, 2, 3]); -- ✅ Correct: Handle size differences SELECT arrayMap(x, y -> x + y, [1, 2, 3], arrayResize([1, 2], 3, 0) );
Array comparisons¶
-- ❌ Wrong: Different sized arrays SELECT [1, 2, 3] = [1, 2]; -- ✅ Correct: Same sized arrays SELECT [1, 2, 3] = [1, 2, 3]; -- ✅ Correct: Compare truncated arrays SELECT arraySlice([1, 2, 3], 1, 2) = [1, 2];
Array concatenation¶
-- ❌ Wrong: Size mismatch in concatenation SELECT arrayConcat([1, 2], [3, 4, 5]); -- ✅ Correct: Valid concatenation SELECT arrayConcat([1, 2], [3, 4]) AS combined; -- ✅ Correct: Handle different sizes SELECT arrayConcat( [1, 2], arraySlice([3, 4, 5], 1, 2) ) AS controlled_concat;
Advanced solutions¶
Dynamic array size handling¶
-- Handle arrays of different sizes dynamically SELECT CASE WHEN length(array1) = length(array2) THEN arrayMap(x, y -> x + y, array1, array2) WHEN length(array1) > length(array2) THEN arrayMap(x, y -> x + y, array1, arrayResize(array2, length(array1), 0)) ELSE arrayMap(x, y -> x + y, arrayResize(array1, length(array2), 0), array2) END AS result FROM ( SELECT [1, 2, 3] AS array1, [1, 2] AS array2 );
Safe array operations¶
-- Safe array operations with size validation SELECT CASE WHEN length(array1) = length(array2) THEN arrayMap(x, y -> x + y, array1, array2) ELSE NULL END AS safe_result FROM ( SELECT [1, 2, 3] AS array1, [1, 2] AS array2 );
Array size normalization¶
-- Normalize array sizes for operations SELECT arrayMap(x, y -> x + y, array1, arrayResize(array2, length(array1), 0) ) AS normalized_result FROM ( SELECT [1, 2, 3, 4] AS array1, [1, 2] AS array2 );
Tinybird-specific notes¶
In Tinybird, this error commonly occurs when:
- Data source processing: Working with array columns of different sizes
- Pipe transformations: Array operations in pipe SQL
- JSON data processing: Extracting arrays from JSON with different sizes
- String processing: String array operations with size mismatches
Debugging in Tinybird¶
- Check array column sizes: Verify array lengths in data source queries
- Review pipe SQL: Ensure array operations handle size differences
- Test with tb sql: Use CLI to test array operations
- Validate array processing: Check array size handling in transformations
- Use Query Builder: Test array operations interactively
Common Tinybird scenarios¶
-- In data source definitions, handle array size differences SCHEMA > `timestamp` DateTime, `user_id` UInt32, `tags` Array(String), `scores` Array(Float64) -- ❌ Wrong: Arrays of different sizes in pipe NODE processed_data SQL > SELECT user_id, arrayMap(tag, score -> tag + toString(score), tags, scores) FROM your_data_source; -- ✅ Correct: Handle size differences in pipe NODE processed_data SQL > SELECT user_id, CASE WHEN length(tags) = length(scores) THEN arrayMap(tag, score -> tag + toString(score), tags, scores) ELSE NULL END AS processed_data FROM your_data_source;
Array data processing¶
-- In pipe definitions, handle array size safely NODE array_processing SQL > SELECT user_id, arrayMap(tag, score -> tag + toString(score), tags, arrayResize(scores, length(tags), 0.0) ) AS processed_tags FROM your_data_source WHERE length(tags) > 0;
Best practices¶
- Always check array sizes before performing operations
- Use array functions that handle size differences gracefully
- Implement size validation in your array operations
- Use padding or truncation to handle size mismatches
- Test array operations with different size combinations
- Document array size requirements for your team
- Use Query Builder to test array operations interactively
- Handle edge cases like empty arrays or null values
See also¶
- Array Functions - Array manipulation functions
- Data Types - Array data types
- Error Handling - General error handling patterns
- Data Validation - Data quality and validation
- JSON Functions - JSON array processing