Skip to content

fix: VectorHasher timestamp precision handling in value-id paths - #18598

Open
rui-mo wants to merge 1 commit into
facebookincubator:mainfrom
rui-mo:wip_ts_hasher
Open

fix: VectorHasher timestamp precision handling in value-id paths#18598
rui-mo wants to merge 1 commit into
facebookincubator:mainfrom
rui-mo:wip_ts_hasher

Conversation

@rui-mo

@rui-mo rui-mo commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator

Problem

VectorHasher maps timestamps to value ids using millisecond precision. The
direct valueId(Timestamp) and lookupValueId(Timestamp) paths already reject
timestamps that cannot be represented losslessly in milliseconds, but the range
fast path and row-wise analyze path could call toInt64(Timestamp), which
uses timestamp.toMillis() directly. This could silently map distinct sub-
millisecond timestamps to the same millisecond value id while still reporting that
value-id mapping was usable.

Changes

This PR fixes the issue by:

  • Adding a Timestamp specialization for range mapping that rejects sub-
    millisecond values.
  • Adding a Timestamp overload for row-wise analyze with the same lossless
    millisecond check.
  • Also fixes VectorHasher::empty() so a hasher that has overflowed distinct
    value tracking is not treated as empty during merge. This is required for
    timestamp precision overflow.

Issue related: #18597.

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Aug 20, 2026
@netlify

netlify Bot commented Aug 20, 2026

Copy link
Copy Markdown

Deploy Preview for meta-velox canceled.

Name Link
🔨 Latest commit c9eb9ef
🔍 Latest deploy log https://app.netlify.com/projects/meta-velox/deploys/6a86fbdd258f970008edb21c

@github-actions

Copy link
Copy Markdown

Selective Build Plan

Linux release with adapters is running a selective build of 368 cmake targets (out of 620 total). See the CI workflows README for what this means.

Affected targets (368)

Directly changed (135)

Target Changed Files
spark_aggregation_fuzzer_test VectorHasher.h
velox_aggregates_GeometryAggregateTest VectorHasher.h
velox_aggregates_reduce_agg_bm VectorHasher.h
velox_aggregates_simple_aggregates_bm VectorHasher.h
velox_aggregates_string_keys_bm VectorHasher.h
velox_aggregates_test_group0 VectorHasher.h
velox_aggregates_test_group1 VectorHasher.h
velox_aggregates_test_group2 VectorHasher.h
velox_aggregates_test_group3 VectorHasher.h
velox_aggregates_test_group4 VectorHasher.h
velox_aggregation_fuzzer VectorHasher.h
velox_aggregation_fuzzer_base VectorHasher.h
velox_aggregation_fuzzer_test VectorHasher.h
velox_aggregation_result_verifier VectorHasher.h
velox_aggregation_runner_test VectorHasher.h
velox_core_test VectorHasher.h
velox_coverage_util VectorHasher.h
velox_cursor VectorHasher.h
velox_driver_test VectorHasher.h
velox_dwio_common VectorHasher.h
velox_dwio_common_test VectorHasher.h
velox_dwio_parquet_table_scan_test VectorHasher.h
velox_dwio_parquet_tpch_test VectorHasher.h
velox_example_operator_extensibility VectorHasher.h
velox_exchange_benchmark VectorHasher.h
velox_exchange_fuzzer VectorHasher.h
velox_exec VectorHasher.cpp, VectorHasher.h
velox_exec_SpatialJoinTest VectorHasher.h
velox_exec_bm_duplicate_project VectorHasher.h
velox_exec_infra_test VectorHasher.h
velox_exec_test_group0 VectorHasher.h
velox_exec_test_group1 VectorHasher.h
velox_exec_test_group2 VectorHasher.h
velox_exec_test_group3 VectorHasher.h
velox_exec_test_group4 VectorHasher.h
velox_exec_test_group5 VectorHasher.h
velox_exec_test_group6 VectorHasher.h
velox_exec_test_group7 VectorHasher.h, VectorHasherTest.cpp
velox_exec_test_group8 VectorHasher.h
velox_exec_test_lib VectorHasher.h
velox_exec_util_test_group0 VectorHasher.h
velox_exec_vector_hasher_benchmark VectorHasher.h
velox_exec_window VectorHasher.h
velox_expression_fuzzer VectorHasher.h
velox_expression_fuzzer_test VectorHasher.h
velox_expression_runner VectorHasher.h
velox_expression_runner_test VectorHasher.h
velox_expression_test VectorHasher.h
velox_expression_test_utility VectorHasher.h
velox_expression_verifier VectorHasher.h
velox_filter_project_benchmark VectorHasher.h
velox_functions_aggregates_test_lib VectorHasher.h
velox_functions_spark_aggregates_test VectorHasher.h
velox_functions_window VectorHasher.h
velox_functions_window_test_lib VectorHasher.h
velox_fuzzer_connector_test VectorHasher.h
velox_fuzzer_util VectorHasher.h
velox_gcs_insert_test VectorHasher.h
velox_gcs_multiendpoints_test VectorHasher.h
velox_hash_benchmark VectorHasher.h
velox_hash_join_build_benchmark VectorHasher.h
velox_hash_join_left_benchmark VectorHasher.h
velox_hash_join_list_result_benchmark VectorHasher.h
velox_hash_join_prepare_join_table_benchmark VectorHasher.h
velox_hash_join_right_semi_benchmark VectorHasher.h
velox_hdfs_insert_test VectorHasher.h
velox_hive_connector VectorHasher.h
velox_hive_connector_test VectorHasher.h
velox_hive_iceberg_equality_delete_test VectorHasher.h
velox_hive_iceberg_insert_test VectorHasher.h
velox_hive_iceberg_merge_sink_test VectorHasher.h
velox_hive_iceberg_splitreader VectorHasher.h
velox_hive_iceberg_test VectorHasher.h
velox_hive_paimon_connector VectorHasher.h
velox_in_10_min_demo VectorHasher.h
velox_join_fuzzer VectorHasher.h
velox_key_encoder_test VectorHasher.h
velox_local_runner_service_lib VectorHasher.h
velox_mark_distinct_fuzzer VectorHasher.h
velox_mark_distinct_fuzzer_lib VectorHasher.h
velox_mark_sorted_benchmark VectorHasher.h
velox_memory_arbitration_fuzzer VectorHasher.h
velox_memory_test VectorHasher.h
velox_merge_benchmark VectorHasher.h
velox_orderby_benchmark VectorHasher.h
velox_parquet_writer_test VectorHasher.h
velox_prefixsort_benchmark VectorHasher.h
velox_query_benchmark VectorHasher.h
velox_query_trace_replayer_base VectorHasher.h
velox_row_number_fuzzer VectorHasher.h
velox_row_number_fuzzer_lib VectorHasher.h
velox_rows_streaming_window_benchmark VectorHasher.h
velox_rpc_aimd_under_load_test VectorHasher.h
velox_rpc_operator_test VectorHasher.h
velox_s3file_test VectorHasher.h
velox_s3insert_test VectorHasher.h
velox_s3metrics_test VectorHasher.h
velox_s3multiendpoints_test VectorHasher.h
velox_s3read_test VectorHasher.h
velox_s3registration_test VectorHasher.h
velox_simple_aggregate_test VectorHasher.h
velox_sort_benchmark VectorHasher.h
velox_spark_query_runner VectorHasher.h
velox_spark_query_runner_test VectorHasher.h
velox_spark_windows_test VectorHasher.h
velox_spatial_join_benchmark VectorHasher.h
velox_spatial_join_fuzzer VectorHasher.h
velox_spill_fuzzer_base_lib VectorHasher.h
velox_spiller_aggregate_benchmark VectorHasher.h
velox_spiller_aggregate_benchmark_base VectorHasher.h
velox_spiller_join_benchmark VectorHasher.h
velox_spiller_join_benchmark_base VectorHasher.h
velox_streaming_aggregation_benchmark VectorHasher.h
velox_table_evolution_fuzzer_test VectorHasher.h
velox_tool_trace_test VectorHasher.h
velox_topn_row_number_fuzzer VectorHasher.h
velox_topn_row_number_fuzzer_lib VectorHasher.h
velox_tpcds_benchmark VectorHasher.h
velox_tpcds_benchmark_lib VectorHasher.h
velox_tpcds_connector_test VectorHasher.h
velox_tpch_benchmark VectorHasher.h
velox_tpch_benchmark_lib VectorHasher.h
velox_tpch_connector VectorHasher.h
velox_tpch_connector_test VectorHasher.h
velox_tpch_speed_test VectorHasher.h
velox_window VectorHasher.h
velox_window_fuzzer VectorHasher.h
velox_window_fuzzer_test VectorHasher.h
velox_window_prefixsort_benchmark VectorHasher.h
velox_window_sub_partitioned_sort_benchmark VectorHasher.h
velox_windows_agg_test VectorHasher.h
velox_windows_rank_test VectorHasher.h
velox_windows_value_test VectorHasher.h
velox_writer_fuzzer VectorHasher.h
velox_writer_fuzzer_test VectorHasher.h

Transitively affected (233)

  • aggregate_companion_functions_test
  • local_runner_service_test
  • physical_size_aggregator_test
  • presto_sql_test
  • spark_expression_fuzzer_test
  • velox_abfs
  • velox_abfs_registration_test
  • velox_abfs_test
  • velox_aggregates
  • velox_benchmark_array_writer_no_nulls
  • velox_benchmark_array_writer_with_nulls
  • velox_benchmark_basic_comparison_conjunct
  • velox_benchmark_basic_decoded_vector
  • velox_benchmark_basic_preproc
  • velox_benchmark_basic_selectivity_vector
  • velox_benchmark_basic_simple_arithmetic
  • velox_benchmark_basic_simple_cast
  • velox_benchmark_basic_vector_compare
  • velox_benchmark_basic_vector_fuzzer
  • velox_benchmark_basic_vector_slice
  • velox_benchmark_builder
  • velox_benchmark_estimate_flat_size
  • velox_benchmark_expr_flat_no_nulls
  • velox_benchmark_feature_normalization
  • velox_benchmark_local_remote_comparison
  • velox_benchmark_map_writer_no_nulls
  • velox_benchmark_map_writer_with_nulls
  • velox_benchmark_nested_array_writer_no_nulls
  • velox_benchmark_nested_array_writer_with_nulls
  • velox_cache_fuzzer
  • velox_cache_fuzzer_lib
  • velox_cast_benchmark
  • velox_common_compression_test
  • velox_common_test
  • velox_core_plan_consistency_checker_test
  • velox_date_extract_benchmark
  • velox_duckdb_conversion_test
  • velox_duckdb_parser
  • velox_dwio_arrow_parquet_writer
  • velox_dwio_arrow_parquet_writer_lib
  • velox_dwio_arrow_parquet_writer_test
  • velox_dwio_arrow_parquet_writer_test_lib
  • velox_dwio_arrow_parquet_writer_util_lib
  • velox_dwio_cache_test
  • velox_dwio_common_bitpack_decoder_benchmark
  • velox_dwio_common_compression
  • velox_dwio_common_data_buffer_benchmark
  • velox_dwio_common_int_decoder_benchmark
  • velox_dwio_common_test_utils
  • velox_dwio_dwrf_binary_stream_reader_test
  • velox_dwio_dwrf_buffered_output_stream_test
  • velox_dwio_dwrf_byte_rle_encoder_test
  • velox_dwio_dwrf_byte_rle_test
  • velox_dwio_dwrf_checksum_test
  • velox_dwio_dwrf_column_reader_test
  • velox_dwio_dwrf_column_statistics_test
  • velox_dwio_dwrf_common
  • velox_dwio_dwrf_compression_test
  • velox_dwio_dwrf_config_test
  • velox_dwio_dwrf_data_buffer_holder_test
  • velox_dwio_dwrf_decompression_test
  • velox_dwio_dwrf_decryption_test
  • velox_dwio_dwrf_dictionary_encoder_test
  • velox_dwio_dwrf_dictionary_encoding_utils_test
  • velox_dwio_dwrf_encoding_selector_test
  • velox_dwio_dwrf_encryption_test
  • velox_dwio_dwrf_flush_policy_test
  • velox_dwio_dwrf_index_builder_test
  • velox_dwio_dwrf_int_direct_test
  • velox_dwio_dwrf_int_encoder_test
  • velox_dwio_dwrf_layout_planner_test
  • velox_dwio_dwrf_ratio_checker_test
  • velox_dwio_dwrf_reader
  • velox_dwio_dwrf_reader_base_test
  • velox_dwio_dwrf_reader_test
  • velox_dwio_dwrf_rle_test
  • velox_dwio_dwrf_rlev1_encoder_test
  • velox_dwio_dwrf_stream_labels_test
  • velox_dwio_dwrf_stripe_dictionary_cache_test
  • velox_dwio_dwrf_stripe_reader_base_test
  • velox_dwio_dwrf_stripe_stream_test
  • velox_dwio_dwrf_utils
  • velox_dwio_dwrf_utils_test
  • velox_dwio_dwrf_writer
  • velox_dwio_dwrf_writer_context_test
  • velox_dwio_dwrf_writer_encoding_manager_test
  • velox_dwio_dwrf_writer_sink_test
  • velox_dwio_dwrf_writer_test
  • velox_dwio_faulty_file_sink
  • velox_dwio_iceberg_reader_benchmark
  • velox_dwio_iceberg_reader_benchmark_lib
  • velox_dwio_native_parquet_reader
  • velox_dwio_orc_column_statistics_test
  • velox_dwio_orc_reader
  • velox_dwio_orc_reader_filter_test
  • velox_dwio_orc_reader_test
  • velox_dwio_parquet_boolean_decoder_benchmark
  • velox_dwio_parquet_common
  • velox_dwio_parquet_common_test
  • velox_dwio_parquet_metadata_benchmark
  • velox_dwio_parquet_page_reader_test
  • velox_dwio_parquet_reader
  • velox_dwio_parquet_reader_benchmark
  • velox_dwio_parquet_reader_benchmark_lib
  • velox_dwio_parquet_reader_test
  • velox_dwio_parquet_rlebp_decoder_test
  • velox_dwio_parquet_structure_decoder_benchmark
  • velox_dwio_parquet_structure_decoder_test
  • velox_dwio_parquet_test_base
  • velox_dwio_parquet_writer
  • velox_dwio_parquet_writer_benchmark
  • velox_dwio_text_reader
  • velox_dwio_text_reader_register
  • velox_dwio_text_writer
  • velox_dwio_text_writer_register
  • velox_dwrf_column_writer_index_test
  • velox_dwrf_column_writer_stats_test
  • velox_dwrf_column_writer_test
  • velox_dwrf_e2e_filter_test
  • velox_dwrf_e2e_reader_test
  • velox_dwrf_e2e_writer_test
  • velox_dwrf_float_column_writer_benchmark
  • velox_dwrf_int_encoder_benchmark
  • velox_dwrf_statistics_builder_utils_test
  • velox_dwrf_test_utils
  • velox_dwrf_writer_extended_test
  • velox_dwrf_writer_flush_test
  • velox_example_scan_orc
  • velox_expression_fuzzer_unit_test
  • velox_expression_runner_unit_test
  • velox_expression_verifier_unit_test
  • velox_filemetadata_test
  • velox_format_datetime_benchmark
  • velox_function_dynamic_link_test
  • velox_function_registry_test
  • velox_functions_aggregates
  • velox_functions_aggregates_test
  • velox_functions_benchmarks_compare
  • velox_functions_benchmarks_row_writer_no_nulls
  • velox_functions_benchmarks_simdjson_function_with_expr
  • velox_functions_benchmarks_string_writer_no_nulls
  • velox_functions_benchmarks_url
  • velox_functions_iceberg_test
  • velox_functions_lib_test
  • velox_functions_prestosql_benchmarks_array_contains
  • velox_functions_prestosql_benchmarks_array_join
  • velox_functions_prestosql_benchmarks_array_min_max
  • velox_functions_prestosql_benchmarks_array_position
  • velox_functions_prestosql_benchmarks_array_sum
  • velox_functions_prestosql_benchmarks_bitwise
  • velox_functions_prestosql_benchmarks_cardinality
  • velox_functions_prestosql_benchmarks_comparisons
  • velox_functions_prestosql_benchmarks_concat
  • velox_functions_prestosql_benchmarks_date_time
  • velox_functions_prestosql_benchmarks_field_reference
  • velox_functions_prestosql_benchmarks_generic
  • velox_functions_prestosql_benchmarks_in
  • velox_functions_prestosql_benchmarks_map_concat
  • velox_functions_prestosql_benchmarks_map_except
  • velox_functions_prestosql_benchmarks_map_input
  • velox_functions_prestosql_benchmarks_map_intersect
  • velox_functions_prestosql_benchmarks_map_subscript
  • velox_functions_prestosql_benchmarks_map_zip_with
  • velox_functions_prestosql_benchmarks_not
  • velox_functions_prestosql_benchmarks_regexp_replace
  • velox_functions_prestosql_benchmarks_row
  • velox_functions_prestosql_benchmarks_string_ascii_utf_functions
  • velox_functions_prestosql_benchmarks_uuid_cast
  • velox_functions_prestosql_benchmarks_width_bucket
  • velox_functions_prestosql_benchmarks_zip
  • velox_functions_prestosql_benchmarks_zip_with
  • velox_functions_remote_client_test
  • velox_functions_spark_aggregates
  • velox_functions_spark_test
  • velox_functions_spark_window
  • velox_functions_test
  • velox_functions_test_lib
  • velox_gcs
  • velox_gcs_file_test
  • velox_gcsfile_example
  • velox_hdfs
  • velox_hdfs_file_test
  • velox_hive_config
  • velox_hive_iceberg_deletion_vector_test
  • velox_hive_iceberg_deletion_vector_writer_test
  • velox_hive_iceberg_merge_processor_test
  • velox_hive_iceberg_session_credentials_test
  • velox_hive_paimon_data_file_meta_test
  • velox_hive_paimon_deletion_file_test
  • velox_hive_paimon_row_kind_test
  • velox_hive_paimon_split
  • velox_hive_paimon_split_test
  • velox_hive_partition_function
  • velox_hive_partition_function_benchmark
  • velox_hive_writer_options_adapter_test
  • velox_like_benchmark
  • velox_like_tpch_benchmark
  • velox_local_runner_service_runner
  • velox_numeric_upcast_benchmark
  • velox_output_transport_registry_test
  • velox_parquet_e2e_filter_test
  • velox_parquet_writer_sink_test
  • velox_parse_expression
  • velox_parse_parser
  • velox_parse_test
  • velox_parse_utils
  • velox_presto_types_fuzzer_utils_test
  • velox_prestosql_coverage
  • velox_query_replayer
  • velox_re2_functions_benchmarks
  • velox_read_benchmark
  • velox_rpc_operator
  • velox_rpc_plan_node_translator
  • velox_s3config_test
  • velox_s3finalize_test
  • velox_s3fs
  • velox_serializer_test_group0
  • velox_simple_aggregate
  • velox_sparksql_benchmarks_cast
  • velox_sparksql_benchmarks_compare
  • velox_sparksql_benchmarks_from_json
  • velox_sparksql_benchmarks_get_funcs
  • velox_sparksql_benchmarks_hash
  • velox_sparksql_benchmarks_in
  • velox_sparksql_benchmarks_simd_compare
  • velox_sparksql_benchmarks_split
  • velox_sparksql_coverage
  • velox_test_util_test
  • velox_text_reader_test
  • velox_text_writer_test
  • velox_trace_file_tool
  • velox_trace_file_tool_base
  • velox_unsafe_row_serialize_benchmark

Fast path • Graph from main@2ca5030f391a

Comment thread velox/exec/VectorHasher.h
return value;
}

inline int64_t toInt64(Timestamp timestamp) const {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove this seems no longer used

@pedroerp

Copy link
Copy Markdown
Contributor

@rui-mo thanks for following up on this. Question on this: since now you added support for wide 128 bit integers, could we use that for timestamps - I suppose we could fit the two 64 integers from the timestamp side by side, and not lose any precision?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants