Skip to content

Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry#17017

Open
natashasehgal wants to merge 3 commits intofacebookincubator:mainfrom
natashasehgal:export-D99197524
Open

Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry#17017
natashasehgal wants to merge 3 commits intofacebookincubator:mainfrom
natashasehgal:export-D99197524

Conversation

@natashasehgal
Copy link
Copy Markdown
Contributor

Summary:
TypeCoercer::coerceTypeBase maintained a separate static map (kAllowedCoercions) for built-in implicit coercions (TINYINT→SMALLINT, INTEGER→BIGINT, etc.) alongside the CastRulesRegistry used for custom types. This meant two lookup paths for the same concept — one lock-free static map for built-ins, one registry for custom types.

This diff makes CastRulesRegistry the single source of truth for all coercion rules:

  1. Register built-in coercions in the registry. Replace kAllowedCoercions with registerBuiltInCoercions(), called once on first use via a function-local static. Same type pairs, same costs — just stored in the registry instead of a separate map.

  2. Add getScalarType(name). A non-throwing type resolver for built-in scalar singletons (BOOLEAN, INTEGER, VARCHAR, etc.) and custom types (JSON, UUID, etc.). Skips parametric types (ARRAY, MAP, ROW) since they aren't valid leaf coercion targets. Replaces getCustomType() in TypeCoercer, which returned nullptr for built-in types and silently dropped registry lookups for built-in pairs.

  3. Relax registerCastRules() validation. Previously required a CastOperator on at least one side, blocking built-in→built-in rules. Now also accepts rules where both types are known built-in types, since Velox's native cast machinery in CastExpr handles execution.

Before: coerceTypeBase checked kAllowedCoercions first, then fell back to CastRulesRegistry (which couldn't see built-in types anyway).
After: coerceTypeBase uses only CastRulesRegistry for all coercion lookups — built-in and custom.

Differential Revision: D99197524

@netlify
Copy link
Copy Markdown

netlify bot commented Apr 2, 2026

Deploy Preview for meta-velox canceled.

Name Link
🔨 Latest commit 9ecf3cc
🔍 Latest deploy log https://app.netlify.com/projects/meta-velox/deploys/69d5732ba2dd2f0008a2cdf4

@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 Apr 2, 2026
@meta-codesync
Copy link
Copy Markdown

meta-codesync bot commented Apr 2, 2026

@natashasehgal has exported this pull request. If you are a Meta employee, you can view the originating Diff in D99197524.

@github-actions
Copy link
Copy Markdown

github-actions bot commented Apr 2, 2026

Build Impact Analysis

Selective Build Targets (building these covers all 505 affected)

cmake --build _build/release --target aggregate_companion_functions_test bias_vector_test cached_factory_test copy_benchmark file_utils_test physical_size_aggregator_test presto_sql_test simple_lru_cache_test simple_vector_test spark_aggregation_fuzzer_test spark_expression_fuzzer_test velox_abfs_test velox_aggregates_GeometryAggregateTest velox_aggregates_reduce_agg_bm velox_aggregates_simple_aggregates_bm velox_aggregates_string_keys_bm velox_aggregates_test_group0 velox_aggregates_test_group1 velox_aggregates_test_group2 velox_aggregates_test_group3 velox_aggregates_test_group4 velox_aggregation_fuzzer_test velox_aggregation_runner_test velox_arrow_bridge_test velox_base_test 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_estimate_flat_size velox_benchmark_expr_flat_no_nulls velox_benchmark_feature_normalization 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_buffer_test velox_cache_fuzzer velox_cache_test_group0 velox_cast_benchmark velox_common_base_benchmarks velox_common_compression_test velox_common_encode_test velox_common_geospatial_serde_test velox_common_hyperloglog_dense_hll_bm velox_common_hyperloglog_test velox_common_indexed_priority_queue_benchmark velox_common_sorting_network_benchmark velox_common_split_block_bloom_filter_benchmark velox_common_stringsearch_benchmarks velox_common_test velox_concurrent_allocation_benchmark velox_config_test velox_connector_test velox_constrained_input_generators_test velox_constrained_vector_generator_test velox_core_plan_consistency_checker_test velox_core_test velox_demo_rpc_function_test velox_driver_test velox_duckdb_conversion_test velox_dwio_arrow_parquet_writer_test velox_dwio_cache_test velox_dwio_common_bitpack_decoder_benchmark velox_dwio_common_data_buffer_benchmark velox_dwio_common_int_decoder_benchmark velox_dwio_common_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_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_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_test 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_iceberg_reader_benchmark velox_dwio_orc_column_statistics_test velox_dwio_orc_reader_filter_test velox_dwio_orc_reader_test velox_dwio_parquet_common_test velox_dwio_parquet_page_reader_test velox_dwio_parquet_reader_benchmark 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_table_scan_test velox_dwio_parquet_thrift_test velox_dwio_parquet_tpch_test 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_writer_extended_test velox_dwrf_writer_flush_test velox_example_expression_eval velox_example_opaque_type velox_example_operator_extensibility velox_example_scan_orc velox_example_simple_functions velox_example_vector_reader_writer velox_exchange_benchmark velox_exchange_fuzzer velox_exec_SpatialJoinTest velox_exec_bm_duplicate_project velox_exec_infra_test velox_exec_prefixsort_test velox_exec_test_group0 velox_exec_test_group1 velox_exec_test_group2 velox_exec_test_group3 velox_exec_test_group4 velox_exec_test_group5 velox_exec_test_group6 velox_exec_test_group7 velox_exec_util_test_group0 velox_exec_vector_hasher_benchmark velox_expression_fuzzer_test velox_expression_fuzzer_unit_test velox_expression_runner_test velox_expression_runner_unit_test velox_expression_test velox_expression_verifier_unit_test velox_file_test velox_filemetadata_test velox_filter_benchmark velox_filter_project_benchmark velox_format_datetime_benchmark velox_fragmentation_benchmark velox_function_dynamic velox_function_dynamic_link_test velox_function_err_dynamic velox_function_non_default_dynamic velox_function_registry_test 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_json_test velox_functions_lib_test velox_functions_prestosql_benchmarks_array_contains 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_input 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_sfm_test velox_functions_spark_aggregates_test velox_functions_spark_test velox_functions_string_test velox_functions_test velox_fuzzer_connector_test velox_gcs_file_test velox_gcs_insert_test velox_gcs_multiendpoints_test velox_gcsfile_example velox_hash_benchmark velox_hash_join_build_benchmark velox_hash_join_list_result_benchmark velox_hash_join_prepare_join_table_benchmark velox_hdfs_file_test velox_hdfs_insert_test velox_hierarchical_timer_test velox_hive_connector_test velox_hive_iceberg_insert_test velox_hive_iceberg_test velox_hive_paimon_connector velox_hive_paimon_data_file_meta_test velox_hive_paimon_deletion_file_test velox_hive_paimon_row_kind_test velox_hive_paimon_split_test velox_hive_partition_function_benchmark velox_id_map_test velox_in_10_min_demo velox_join_fuzzer velox_key_encoder_test velox_like_benchmark velox_like_tpch_benchmark velox_mark_distinct_fuzzer velox_mark_sorted_benchmark velox_memcpy_meter velox_memory_arbitration_fuzzer velox_memory_test velox_merge_benchmark velox_mock_rpc_client_test velox_negated_bigint_range_benchmark velox_negated_bytes_range_benchmark velox_negated_bytes_values_benchmark velox_negated_values_filter_benchmark velox_orderby_benchmark velox_overload_int_function_dynamic velox_overload_varchar_function_dynamic velox_overwrite_int_function_dynamic velox_overwrite_varchar_function_dynamic velox_parquet_e2e_filter_test velox_parquet_writer_sink_test velox_parquet_writer_test velox_parse_test velox_prefix_sort_algorithm_benchmark velox_prefixsort_benchmark velox_presto_type_parser_test velox_presto_types_fuzzer_utils_test velox_presto_types_test velox_prestosql_coverage velox_process_test velox_query_replayer velox_re2_functions_benchmarks velox_read_benchmark velox_row_number_fuzzer velox_row_serializer_benchmark velox_row_test velox_rpc_node_test velox_rpc_operator_test velox_rpc_state_test velox_s3config_test velox_s3file_test velox_s3finalize_test velox_s3insert_test velox_s3metrics_test velox_s3multiendpoints_test velox_s3read_test velox_s3registration_test velox_scoped_registry_test velox_serialization_test velox_serializer_benchmark velox_serializer_test_group0 velox_signature_parser_test velox_simple_aggregate_test velox_sort_benchmark velox_spark_function_registry_test velox_spark_query_runner_test velox_spark_types_test velox_spark_windows_test 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_spatial_join_benchmark velox_spatial_join_fuzzer velox_spiller_aggregate_benchmark velox_spiller_join_benchmark velox_streaming_aggregation_benchmark velox_string_core_benchmark velox_string_view_benchmark velox_table_evolution_fuzzer_test velox_test_util_test velox_text_reader_test velox_text_writer_test velox_time_test velox_tool_trace_test velox_topn_row_number_fuzzer velox_tpcds_connector_test velox_tpcds_gen_test velox_tpch_benchmark velox_tpch_connector_test velox_tpch_gen_test velox_tpch_speed_test velox_trace_file_tool velox_type_fbhive_test velox_type_serializer_fbhive_test velox_type_test velox_type_tz_ext_invalid_test velox_type_tz_test velox_unsafe_row_serialize_benchmark velox_vector_fuzzer_test velox_vector_hash_all_benchmark velox_vector_map_update_benchmark velox_vector_selectivity_vector_benchmark velox_vector_test velox_wave_benchmark velox_wave_common_test velox_wave_decode_test velox_wave_exec_test velox_window_fuzzer_test velox_window_prefixsort_benchmark velox_window_sub_partitioned_sort_benchmark velox_windows_agg_test velox_windows_rank_test velox_windows_value_test velox_writer_fuzzer_test

Total affected: 505/557 targets

Affected targets (505)

Directly changed (431)

Target Changed Files
aggregate_companion_functions_test Type.h
bias_vector_test Type.h
copy_benchmark Type.h
physical_size_aggregator_test Type.h
presto_sql_test Type.h
simple_vector_test Type.h
spark_aggregation_fuzzer_test Type.h, TypeCoercer.h
spark_expression_fuzzer_test Type.h
velox_abfs Type.h
velox_abfs_test Type.h
velox_aggregates Type.h
velox_aggregates_GeometryAggregateTest Type.h
velox_aggregates_reduce_agg_bm Type.h
velox_aggregates_simple_aggregates_bm Type.h
velox_aggregates_string_keys_bm Type.h
velox_aggregates_test_group0 Type.h, TypeCoercer.h
velox_aggregates_test_group1 Type.h
velox_aggregates_test_group2 Type.h
velox_aggregates_test_group3 Type.h
velox_aggregates_test_group4 Type.h
velox_aggregation_fuzzer Type.h
velox_aggregation_fuzzer_base Type.h, TypeCoercer.h
velox_aggregation_fuzzer_test Type.h, TypeCoercer.h
velox_aggregation_result_verifier Type.h
velox_aggregation_runner_test Type.h, TypeCoercer.h
velox_arrow_bridge Type.h
velox_arrow_bridge_test Type.h
velox_async_rpc_function_registry Type.h
velox_base_test Type.h
velox_benchmark_array_writer_no_nulls Type.h, TypeCoercer.h
velox_benchmark_array_writer_with_nulls Type.h, TypeCoercer.h
velox_benchmark_basic_comparison_conjunct Type.h, TypeCoercer.h
velox_benchmark_basic_decoded_vector Type.h, TypeCoercer.h
velox_benchmark_basic_preproc Type.h, TypeCoercer.h
velox_benchmark_basic_selectivity_vector Type.h, TypeCoercer.h
velox_benchmark_basic_simple_arithmetic Type.h, TypeCoercer.h
velox_benchmark_basic_simple_cast Type.h, TypeCoercer.h
velox_benchmark_basic_vector_compare Type.h, TypeCoercer.h
velox_benchmark_basic_vector_fuzzer Type.h
velox_benchmark_basic_vector_slice Type.h
velox_benchmark_builder Type.h, TypeCoercer.h
velox_benchmark_estimate_flat_size Type.h, TypeCoercer.h
velox_benchmark_expr_flat_no_nulls Type.h, TypeCoercer.h
velox_benchmark_feature_normalization Type.h, TypeCoercer.h
velox_benchmark_map_writer_no_nulls Type.h, TypeCoercer.h
velox_benchmark_map_writer_with_nulls Type.h, TypeCoercer.h
velox_benchmark_nested_array_writer_no_nulls Type.h, TypeCoercer.h
velox_benchmark_nested_array_writer_with_nulls Type.h, TypeCoercer.h
velox_cache_fuzzer_lib Type.h
velox_cache_test_group0 Type.h
velox_caching Type.h
velox_cast_benchmark Type.h, TypeCoercer.h
velox_common_base Type.h
velox_common_fuzzer_util Type.h
velox_common_geospatial_serde Type.h
velox_common_geospatial_serde_test Type.h
velox_common_hyperloglog Type.h
velox_common_hyperloglog_dense_hll_bm Type.h
velox_common_hyperloglog_test Type.h
velox_common_test Type.h
velox_connector Type.h
velox_connector_registry Type.h
velox_connector_test Type.h
velox_constrained_input_generators Type.h
velox_constrained_input_generators_test Type.h
velox_constrained_vector_generator Type.h
velox_constrained_vector_generator_test Type.h
velox_core Type.h, TypeCoercer.h
velox_core_plan_consistency_checker_test Type.h
velox_core_test Type.h, TypeCoercer.h
velox_coverage_util Type.h
velox_cursor Type.h
velox_demo_rpc_function Type.h
velox_demo_rpc_function_test Type.h
velox_driver_test Type.h
velox_duckdb_conversion Type.h
velox_duckdb_conversion_test Type.h
velox_duckdb_parser Type.h
velox_dwio_arrow_parquet_writer Type.h
velox_dwio_arrow_parquet_writer_lib Type.h
velox_dwio_arrow_parquet_writer_test Type.h
velox_dwio_cache_test Type.h
velox_dwio_common Type.h
velox_dwio_common_compression Type.h
velox_dwio_common_int_decoder_benchmark Type.h
velox_dwio_common_test Type.h
velox_dwio_common_test_utils Type.h, TypeCoercer.h
velox_dwio_dwrf_buffered_output_stream_test Type.h
velox_dwio_dwrf_byte_rle_encoder_test Type.h
velox_dwio_dwrf_byte_rle_test Type.h
velox_dwio_dwrf_column_reader_test Type.h
velox_dwio_dwrf_column_statistics_test Type.h
velox_dwio_dwrf_common Type.h
velox_dwio_dwrf_compression_test Type.h
velox_dwio_dwrf_config_test Type.h
velox_dwio_dwrf_data_buffer_holder_test Type.h
velox_dwio_dwrf_decompression_test Type.h
velox_dwio_dwrf_decryption_test Type.h
velox_dwio_dwrf_dictionary_encoder_test Type.h
velox_dwio_dwrf_dictionary_encoding_utils_test Type.h
velox_dwio_dwrf_encryption_test Type.h
velox_dwio_dwrf_flush_policy_test Type.h
velox_dwio_dwrf_index_builder_test Type.h
velox_dwio_dwrf_int_direct_test Type.h
velox_dwio_dwrf_int_encoder_test Type.h
velox_dwio_dwrf_layout_planner_test Type.h
velox_dwio_dwrf_reader Type.h
velox_dwio_dwrf_reader_base_test Type.h
velox_dwio_dwrf_reader_test Type.h
velox_dwio_dwrf_rle_test Type.h
velox_dwio_dwrf_rlev1_encoder_test Type.h
velox_dwio_dwrf_stripe_dictionary_cache_test Type.h
velox_dwio_dwrf_stripe_reader_base_test Type.h
velox_dwio_dwrf_stripe_stream_test Type.h
velox_dwio_dwrf_utils Type.h
velox_dwio_dwrf_utils_test Type.h
velox_dwio_dwrf_writer Type.h
velox_dwio_dwrf_writer_context_test Type.h
velox_dwio_dwrf_writer_encoding_manager_test Type.h
velox_dwio_dwrf_writer_sink_test Type.h
velox_dwio_dwrf_writer_test Type.h
velox_dwio_faulty_file_sink Type.h
velox_dwio_iceberg_reader_benchmark Type.h
velox_dwio_iceberg_reader_benchmark_lib Type.h
velox_dwio_native_parquet_reader Type.h
velox_dwio_orc_column_statistics_test Type.h
velox_dwio_orc_reader Type.h
velox_dwio_orc_reader_filter_test Type.h
velox_dwio_orc_reader_test Type.h
velox_dwio_parquet_common Type.h
velox_dwio_parquet_page_reader_test Type.h
velox_dwio_parquet_reader Type.h
velox_dwio_parquet_reader_benchmark Type.h
velox_dwio_parquet_reader_benchmark_lib Type.h
velox_dwio_parquet_reader_test Type.h
velox_dwio_parquet_structure_decoder_benchmark Type.h
velox_dwio_parquet_structure_decoder_test Type.h
velox_dwio_parquet_table_scan_test Type.h
velox_dwio_parquet_thrift_test Type.h
velox_dwio_parquet_tpch_test Type.h, TypeCoercer.h
velox_dwio_parquet_writer Type.h
velox_dwio_text_reader Type.h
velox_dwio_text_reader_register Type.h
velox_dwio_text_writer Type.h
velox_dwio_text_writer_register Type.h
velox_dwrf_column_writer_index_test Type.h
velox_dwrf_column_writer_stats_test Type.h
velox_dwrf_column_writer_test Type.h
velox_dwrf_e2e_filter_test Type.h
velox_dwrf_e2e_reader_test Type.h
velox_dwrf_e2e_writer_test Type.h
velox_dwrf_float_column_writer_benchmark Type.h
velox_dwrf_int_encoder_benchmark Type.h
velox_dwrf_statistics_builder_utils_test Type.h
velox_dwrf_test_utils Type.h
velox_dwrf_writer_extended_test Type.h
velox_dwrf_writer_flush_test Type.h
velox_example_expression_eval Type.h, TypeCoercer.h
velox_example_opaque_type Type.h, TypeCoercer.h
velox_example_operator_extensibility Type.h
velox_example_scan_orc Type.h
velox_example_simple_functions Type.h, TypeCoercer.h
velox_example_vector_reader_writer Type.h
velox_exchange_benchmark Type.h, TypeCoercer.h
velox_exchange_fuzzer Type.h, TypeCoercer.h
velox_exec Type.h, TypeCoercer.h
velox_exec_SpatialJoinTest Type.h
velox_exec_bm_duplicate_project Type.h
velox_exec_infra_test Type.h, TypeCoercer.h
velox_exec_prefixsort_test Type.h
velox_exec_prefixsort_test_lib Type.h
velox_exec_test_group0 Type.h
velox_exec_test_group1 Type.h
velox_exec_test_group2 Type.h, TypeCoercer.h
velox_exec_test_group3 Type.h, TypeCoercer.h
velox_exec_test_group4 Type.h
velox_exec_test_group5 Type.h, TypeCoercer.h
velox_exec_test_group6 Type.h, TypeCoercer.h
velox_exec_test_group7 Type.h, TypeCoercer.h
velox_exec_test_lib Type.h, TypeCoercer.h
velox_exec_util_test_group0 Type.h, TypeCoercer.h
velox_exec_vector_hasher_benchmark Type.h
velox_expression CastExpr.cpp, CastExpr.h, Type.h, TypeCoercer.h
velox_expression_functions SignatureBinder.cpp, Type.h, TypeCoercer.h
velox_expression_fuzzer Type.h, TypeCoercer.h
velox_expression_fuzzer_test Type.h
velox_expression_fuzzer_test_utility Type.h, TypeCoercer.h
velox_expression_fuzzer_unit_test Type.h
velox_expression_runner Type.h, TypeCoercer.h
velox_expression_runner_test Type.h
velox_expression_runner_unit_test Type.h, TypeCoercer.h
velox_expression_test CastExpr.h, Type.h, TypeCoercer.h
velox_expression_test_utility Type.h, TypeCoercer.h
velox_expression_verifier Type.h, TypeCoercer.h
velox_expression_verifier_unit_test Type.h, TypeCoercer.h
velox_file Type.h
velox_file_test Type.h
velox_filemetadata_test Type.h
velox_filter_benchmark Type.h
velox_filter_project_benchmark Type.h, TypeCoercer.h
velox_format_datetime_benchmark Type.h, TypeCoercer.h
velox_function_dynamic Type.h, TypeCoercer.h
velox_function_dynamic_link_test Type.h, TypeCoercer.h
velox_function_err_dynamic Type.h, TypeCoercer.h
velox_function_non_default_dynamic Type.h, TypeCoercer.h
velox_function_registry Type.h, TypeCoercer.h
velox_function_registry_test Type.h, TypeCoercer.h
velox_functions_aggregates Type.h
velox_functions_aggregates_test Type.h, TypeCoercer.h
velox_functions_aggregates_test_lib Type.h, TypeCoercer.h
velox_functions_benchmarks_compare Type.h, TypeCoercer.h
velox_functions_benchmarks_row_writer_no_nulls Type.h, TypeCoercer.h
velox_functions_benchmarks_simdjson_function_with_expr Type.h, TypeCoercer.h
velox_functions_benchmarks_string_writer_no_nulls Type.h, TypeCoercer.h
velox_functions_benchmarks_url Type.h, TypeCoercer.h
velox_functions_geo Type.h
velox_functions_iceberg Type.h, TypeCoercer.h
velox_functions_iceberg_test Type.h, TypeCoercer.h
velox_functions_lib Type.h, TypeCoercer.h
velox_functions_lib_test Type.h, TypeCoercer.h
velox_functions_prestosql CastExpr.h, Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_array_contains Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_array_min_max Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_array_position Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_array_sum Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_bitwise Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_cardinality Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_comparisons Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_concat Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_date_time Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_field_reference Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_generic Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_in Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_map_input Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_map_subscript Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_map_zip_with Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_not Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_regexp_replace Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_row Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_string_ascii_utf_functions Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_uuid_cast Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_width_bucket Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_zip Type.h, TypeCoercer.h
velox_functions_prestosql_benchmarks_zip_with Type.h, TypeCoercer.h
velox_functions_prestosql_impl CastExpr.h, JsonCastOperator.h, Type.h, TypeCoercer.h
velox_functions_sfm Type.h
velox_functions_sfm_test Type.h
velox_functions_spark CastExpr.h, Type.h, TypeCoercer.h
velox_functions_spark_aggregates Type.h
velox_functions_spark_aggregates_test Type.h
velox_functions_spark_impl Type.h, TypeCoercer.h
velox_functions_spark_specialforms CastExpr.h, Type.h
velox_functions_spark_test Type.h, TypeCoercer.h
velox_functions_spark_window Type.h
velox_functions_string_test Type.h
velox_functions_test CastExpr.h, Type.h, TypeCoercer.h
velox_functions_test_lib Type.h, TypeCoercer.h
velox_functions_util Type.h
velox_functions_window Type.h
velox_functions_window_test_lib Type.h
velox_fuzzer_connector Type.h
velox_fuzzer_connector_test Type.h
velox_fuzzer_util Type.h, TypeCoercer.h
velox_gcs Type.h
velox_gcs_insert_test Type.h
velox_gcs_multiendpoints_test Type.h
velox_hash_benchmark Type.h
velox_hash_join_build_benchmark Type.h
velox_hash_join_list_result_benchmark Type.h
velox_hash_join_prepare_join_table_benchmark Type.h
velox_hdfs Type.h
velox_hdfs_insert_test Type.h
velox_hive_connector Type.h
velox_hive_connector_test Type.h, TypeCoercer.h
velox_hive_iceberg_insert_test Type.h
velox_hive_iceberg_splitreader Type.h
velox_hive_iceberg_test Type.h
velox_hive_paimon_connector Type.h
velox_hive_paimon_split Type.h
velox_hive_paimon_split_test Type.h
velox_hive_partition_function Type.h
velox_hive_partition_function_benchmark Type.h, TypeCoercer.h
velox_id_map Type.h
velox_id_map_test Type.h
velox_in_10_min_demo Type.h, TypeCoercer.h
velox_is_null_functions Type.h
velox_join_fuzzer Type.h, TypeCoercer.h
velox_key_encoder Type.h
velox_key_encoder_test Type.h
velox_like_benchmark Type.h, TypeCoercer.h
velox_like_tpch_benchmark Type.h, TypeCoercer.h
velox_mark_distinct_fuzzer Type.h
velox_mark_distinct_fuzzer_lib Type.h
velox_mark_sorted_benchmark Type.h
velox_memory Type.h
velox_memory_arbitration_fuzzer Type.h
velox_memory_test Type.h
velox_merge_benchmark Type.h
velox_negated_bigint_range_benchmark Type.h
velox_negated_bytes_range_benchmark Type.h
velox_negated_bytes_values_benchmark Type.h
velox_negated_values_filter_benchmark Type.h
velox_orderby_benchmark Type.h
velox_orderby_benchmark_util Type.h
velox_overload_int_function_dynamic Type.h, TypeCoercer.h
velox_overload_varchar_function_dynamic Type.h, TypeCoercer.h
velox_overwrite_int_function_dynamic Type.h, TypeCoercer.h
velox_overwrite_varchar_function_dynamic Type.h, TypeCoercer.h
velox_parquet_e2e_filter_test Type.h
velox_parquet_writer_sink_test Type.h
velox_parquet_writer_test Type.h
velox_parse_expression Type.h
velox_parse_parser Type.h
velox_parse_test Type.h
velox_parse_utils Type.h, TypeCoercer.h
velox_prefix_sort_algorithm_benchmark Type.h
velox_prefixsort_benchmark Type.h
velox_presto_serializer Type.h
velox_presto_type_parser Type.h
velox_presto_type_parser_test Type.h
velox_presto_types BigintEnumRegistration.cpp, BingTileRegistration.cpp, CastExpr.h, CastRegistry.h, IPAddressRegistration.cpp, ... (+10 more)
velox_presto_types_fuzzer_utils Type.h
velox_presto_types_fuzzer_utils_test Type.h, TypeCoercer.h
velox_presto_types_test CastExpr.h, IPPrefixTypeTest.cpp, Type.h, TypeCoercer.h
velox_prestosql_coverage Type.h
velox_query_benchmark Type.h, TypeCoercer.h
velox_query_replayer Type.h
velox_query_trace_replayer_base Type.h, TypeCoercer.h
velox_re2_functions_benchmarks Type.h, TypeCoercer.h
velox_row_fast Type.h
velox_row_number_fuzzer Type.h
velox_row_number_fuzzer_lib Type.h
velox_row_serializer_benchmark Type.h
velox_row_test Type.h
velox_rpc_function_stubs Type.h
velox_rpc_node_test Type.h
velox_rpc_operator Type.h
velox_rpc_operator_test Type.h
velox_rpc_plan_node_translator Type.h
velox_rpc_state Type.h
velox_rpc_state_test Type.h
velox_s3file_test Type.h
velox_s3fs Type.h
velox_s3insert_test Type.h
velox_s3metrics_test Type.h
velox_s3multiendpoints_test Type.h
velox_s3read_test Type.h
velox_s3registration_test Type.h
velox_serializer_benchmark Type.h
velox_serializer_test_group0 Type.h
velox_signature_parser Type.h
velox_signature_parser_test Type.h
velox_simple_aggregate Type.h
velox_simple_aggregate_test Type.h
velox_sort_benchmark Type.h
velox_spark_function_registry_test CastExpr.h, Type.h, TypeCoercer.h
velox_spark_query_runner Type.h
velox_spark_query_runner_test Type.h, TypeCoercer.h
velox_spark_types CastExpr.h, TimestampNTZRegistration.cpp, Type.h
velox_spark_types_test Type.h, TypeCoercer.h
velox_spark_windows_test Type.h
velox_sparksql_benchmarks_cast Type.h, TypeCoercer.h
velox_sparksql_benchmarks_compare Type.h, TypeCoercer.h
velox_sparksql_benchmarks_from_json Type.h, TypeCoercer.h
velox_sparksql_benchmarks_get_funcs TypeCoercer.h
velox_sparksql_benchmarks_hash Type.h, TypeCoercer.h
velox_sparksql_benchmarks_in Type.h, TypeCoercer.h
velox_sparksql_benchmarks_simd_compare Type.h, TypeCoercer.h
velox_sparksql_benchmarks_split Type.h, TypeCoercer.h
velox_sparksql_coverage Type.h
velox_spatial_join_benchmark Type.h, TypeCoercer.h
velox_spatial_join_fuzzer Type.h, TypeCoercer.h
velox_spill_fuzzer_base_lib Type.h
velox_spiller_aggregate_benchmark Type.h
velox_spiller_aggregate_benchmark_base Type.h
velox_spiller_join_benchmark Type.h
velox_spiller_join_benchmark_base Type.h
velox_streaming_aggregation_benchmark Type.h
velox_string_view_benchmark Type.h
velox_table_evolution_fuzzer_test Type.h, TypeCoercer.h
velox_text_reader_test Type.h
velox_text_writer_test Type.h
velox_tool_trace_test Type.h
velox_topn_row_number_fuzzer Type.h
velox_topn_row_number_fuzzer_lib Type.h
velox_tpcds_append_info Type.h
velox_tpcds_connector Type.h
velox_tpcds_connector_test Type.h
velox_tpcds_gen Type.h
velox_tpcds_gen_test Type.h
velox_tpch_benchmark Type.h
velox_tpch_benchmark_lib Type.h
velox_tpch_connector Type.h
velox_tpch_connector_test Type.h
velox_tpch_gen Type.h
velox_tpch_gen_test Type.h
velox_tpch_speed_test Type.h
velox_trace Type.h
velox_type CastRegistry.cpp, CastRegistry.h, Type.cpp, Type.h, TypeCoercer.cpp, ... (+1 more)
velox_type_fbhive Type.h
velox_type_fbhive_test Type.h
velox_type_serializer_fbhive_test Type.h
velox_type_test CastRegistry.h, CastRegistryTest.cpp, Type.h, TypeCoercer.h, TypeCoercerTest.cpp
velox_unsafe_row_serialize_benchmark Type.h
velox_vector Type.h
velox_vector_fuzzer Type.h
velox_vector_fuzzer_test Type.h
velox_vector_fuzzer_util Type.h
velox_vector_hash_all_benchmark Type.h
velox_vector_map_update_benchmark Type.h
velox_vector_test Type.h
velox_vector_test_lib Type.h
velox_wave_benchmark Type.h
velox_wave_common Type.h
velox_wave_dwio Type.h
velox_wave_exec Type.h
velox_wave_exec_test Type.h
velox_wave_mock_file Type.h
velox_wave_mock_reader Type.h
velox_wave_stream Type.h
velox_wave_vector Type.h
velox_window Type.h
velox_window_fuzzer Type.h
velox_window_fuzzer_test Type.h, TypeCoercer.h
velox_window_prefixsort_benchmark Type.h
velox_window_sub_partitioned_sort_benchmark Type.h
velox_windows_agg_test Type.h
velox_windows_rank_test Type.h
velox_windows_value_test Type.h
velox_writer_fuzzer Type.h, TypeCoercer.h
velox_writer_fuzzer_test Type.h, TypeCoercer.h

Transitively affected (74)

  • cached_factory_test
  • file_utils_test
  • simple_lru_cache_test
  • velox_buffer
  • velox_buffer_test
  • velox_cache_fuzzer
  • velox_common_base_benchmarks
  • velox_common_compression
  • velox_common_compression_test
  • velox_common_config
  • velox_common_encode_test
  • velox_common_indexed_priority_queue_benchmark
  • velox_common_sorting_network_benchmark
  • velox_common_split_block_bloom_filter_benchmark
  • velox_common_stringsearch_benchmarks
  • velox_concurrent_allocation_benchmark
  • velox_config_test
  • velox_dwio_arrow_parquet_writer_test_lib
  • velox_dwio_arrow_parquet_writer_util_lib
  • velox_dwio_catalog_fbhive
  • velox_dwio_common_bitpack_decoder_benchmark
  • velox_dwio_common_data_buffer_benchmark
  • velox_dwio_common_exception
  • velox_dwio_dwrf_checksum_test
  • velox_dwio_dwrf_encoding_selector_test
  • velox_dwio_dwrf_ratio_checker_test
  • velox_dwio_dwrf_stream_labels_test
  • velox_dwio_parquet_common_test
  • velox_dwio_parquet_rlebp_decoder_test
  • velox_dynamic_library_loader
  • velox_exception
  • velox_file_test_utils
  • velox_fragmentation_benchmark
  • velox_functions_iceberg_hash
  • velox_functions_json
  • velox_functions_json_test
  • velox_functions_lib_date_time_formatter
  • velox_gcs_file_test
  • velox_gcsfile_example
  • velox_hdfs_file_test
  • velox_hierarchical_timer
  • velox_hierarchical_timer_test
  • velox_hive_config
  • velox_hive_paimon_data_file_meta_test
  • velox_hive_paimon_deletion_file_test
  • velox_hive_paimon_row_kind_test
  • velox_memcpy_meter
  • velox_mock_rpc_client
  • velox_mock_rpc_client_test
  • velox_process
  • velox_process_test
  • velox_read_benchmark
  • velox_read_benchmark_lib
  • velox_s3config_test
  • velox_s3finalize_test
  • velox_scoped_registry_test
  • velox_serialization
  • velox_serialization_test
  • velox_string_core_benchmark
  • velox_test_util
  • velox_test_util_test
  • velox_time
  • velox_time_test
  • velox_tpcds_dsdgen
  • velox_trace_file_tool
  • velox_trace_file_tool_base
  • velox_type_calculation
  • velox_type_signature
  • velox_type_tz_ext_invalid_test
  • velox_type_tz_test
  • velox_vector_selectivity_vector_benchmark
  • velox_wave_common_test
  • velox_wave_decode
  • velox_wave_decode_test

Fast path • Graph from main@472701f4a4828b995dcaa9f0dc44f00b20a2bf4c

@natashasehgal natashasehgal changed the title Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry feat: Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry Apr 2, 2026
natashasehgal and others added 3 commits April 7, 2026 12:29
… types

Summary:
Register CastRulesRegistry rules for all Presto custom types that support casts: BigintEnum, VarcharEnum, BingTile, IPAddress, IPPrefix, Uuid, Json, P4HyperLogLog, and Spark TimestampNTZ.

Add a `coerceTypeBase(TypePtr, TypePtr)` overload that checks the CastRulesRegistry directly without reconstructing the type from a name. The existing string overload calls `getCustomType(name, {})` which throws for parametric custom types like BigintEnum whose factories require parameters. Internal call sites in `coercible()` and `leastCommonSuperType()` now use the safe TypePtr overload. The string overload is retained for SignatureBinder (which only has a type name), with a `typeSignature.parameters().empty()` guard to prevent parametric type names from reaching `getCustomType`.

Also fix CastRegistry.cpp to try rule lookup before checking for custom cast existence (enabling cast rules for custom types that extend RowType like IPPREFIX), and remove a duplicate assertion in IPPrefixTypeTest.

Differential Revision: D99173066
…perator methods

Summary:
CastRulesRegistry is now the sole source of truth for all custom type cast validation. CastExpr::applyPeeled() checks CastRulesRegistry::canCast() instead of per-operator isSupportedFromType()/isSupportedToType() methods.

Changes:
1. **CastExpr.cpp**: Replace the two-step validation (registry → operator fallback) with a single `CastRulesRegistry::canCast()` check. If a CastOperator exists but the registry says the cast is unsupported, fail immediately.
2. **CastExpr.h**: Change `isSupportedFromType`/`isSupportedToType` from pure virtual to default-true and mark as deprecated. Subclasses no longer need to override them.
3. **All non-JSON CastOperator subclasses**: Remove `isSupportedFromType`/`isSupportedToType` overrides from BigintEnum, BingTile, IPAddress, IPPrefix, P4HyperLogLog, TimestampWithTimezone, TimeWithTimezone, UUID, VarcharEnum, TimestampNTZ.
4. **JsonCastOperator**: Remove recursive `isSupportedFromType`/`isSupportedToType` methods and the `isSupportedBasicType` helper. Register ARRAY/MAP/ROW ↔ JSON cast rules in CastRulesRegistry with recursive validator callbacks that check element/child type compatibility. Add missing DATE → JSON and DECIMAL → JSON (short decimal only) rules.

Before: CastExpr checked the registry first, fell back to per-operator methods.
After: CastExpr uses only the registry. The operator methods are deprecated dead code (default-true).

Differential Revision: D99232117
Summary:
`TypeCoercer::coerceTypeBase` maintained a separate static map (`kAllowedCoercions`) for built-in implicit coercions (TINYINT→SMALLINT, INTEGER→BIGINT, etc.) alongside the `CastRulesRegistry` used for custom types. This meant two lookup paths for the same concept — one lock-free static map for built-ins, one registry for custom types.

This diff makes `CastRulesRegistry` the single source of truth for all coercion rules:

1. **Register built-in coercions in the registry.** Replace `kAllowedCoercions` with `registerBuiltInCoercions()`, called once on first use via a function-local static. Same type pairs, same costs — just stored in the registry instead of a separate map.

2. **Add `getScalarType(name)`.** A non-throwing type resolver for built-in scalar singletons (BOOLEAN, INTEGER, VARCHAR, etc.) and custom types (JSON, UUID, etc.). Skips parametric types (ARRAY, MAP, ROW) since they aren't valid leaf coercion targets. Replaces `getCustomType()` in TypeCoercer, which returned nullptr for built-in types and silently dropped registry lookups for built-in pairs.

3. **Relax `registerCastRules()` validation.** Previously required a CastOperator on at least one side, blocking built-in→built-in rules. Now also accepts rules where both types are known built-in types, since Velox's native cast machinery in CastExpr handles execution.

Before: `coerceTypeBase` checked `kAllowedCoercions` first, then fell back to `CastRulesRegistry` (which couldn't see built-in types anyway).
After: `coerceTypeBase` uses only `CastRulesRegistry` for all coercion lookups — built-in and custom.

Differential Revision: D99197524
@meta-codesync meta-codesync bot changed the title feat: Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry Migrate built-in coercions from kAllowedCoercions to CastRulesRegistry Apr 7, 2026
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. fb-exported meta-exported

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant