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();
}