absl::Status FilterResolvedFunction()

in backend/query/feature_filter/sql_feature_filter.cc [153:200]


absl::Status FilterResolvedFunction(
    const zetasql::LanguageOptions& language_options,
    const SqlFeaturesView& query_features,
    const zetasql::ResolvedFunctionCall& function_call) {
  const std::string name = function_call.function()->FullName(false);

  if (IsDisabledFunction(query_features, name)) {
    return error::UnsupportedFunction(name);
  }

  if (name == "is_not_distinct_from") {
    if (!function_call.argument_list(0)->type()->SupportsEquality(
            language_options)) {
      return error::ComparisonNotSupported(/*arg_num=*/0, name);
    }
    if (function_call.argument_list(0)->type()->IsStruct()) {
      return error::StructComparisonNotSupported(name);
    }
  }

  if (name == "pending_commit_timestamp" ||
      name == "pending_commit_timestamp_int64") {
    return error::PendingCommitTimestampDmlValueOnly();
  }

  if (name == "date_trunc" && !query_features.iso_date_parts()) {
    return IsNotIsoDatePart(function_call.argument_list(1), "DATE_TRUNC");
  }

  if (name == "timestamp_trunc" && !query_features.iso_date_parts()) {
    return IsNotIsoDatePart(function_call.argument_list(1), "TIMESTAMP_TRUNC");
  }

  if (name == "date_diff" && !query_features.iso_date_parts()) {
    return IsNotIsoDatePart(function_call.argument_list(2), "DATE_DIFF");
  }
  if (name == "nullif" && function_call.argument_list(0)->type()->IsStruct()) {
    return error::NullifStructNotSupported();
  }
  if (name == "to_json_string" &&
      !function_call.argument_list(0)->type()->IsJsonType()) {
    return error::ToJsonStringNonJsonTypeNotSupported(
        function_call.argument_list(0)->type()->TypeName(
            zetasql::PRODUCT_EXTERNAL, /*use_external_float32=*/true));
  }

  return absl::OkStatus();
}