in backend/query/ann_validator.cc [110:178]
absl::Status GetNotNullColumns(
std::vector<const zetasql::ResolvedNode*>& child_nodes,
const zetasql::ResolvedScan*& scan,
std::vector<zetasql::ResolvedColumn>& not_null_columns) {
for (auto child : child_nodes) {
if (child->Is<zetasql::ResolvedScan>()) {
scan = child->GetAs<zetasql::ResolvedScan>();
if (scan->Is<zetasql::ResolvedFilterScan>()) {
const zetasql::ResolvedFilterScan* filter_scan =
scan->GetAs<zetasql::ResolvedFilterScan>();
scan = filter_scan->input_scan();
if (filter_scan->filter_expr() != nullptr &&
filter_scan->filter_expr()->Is<zetasql::ResolvedFunctionCall>()) {
const zetasql::ResolvedFunctionCall* func =
filter_scan->filter_expr()
->GetAs<zetasql::ResolvedFunctionCall>();
if (func->function()->Name() == "$and") {
for (const auto& arg : func->argument_list()) {
if (arg->Is<zetasql::ResolvedFunctionCall>()) {
const zetasql::ResolvedFunctionCall* not_func =
arg->GetAs<zetasql::ResolvedFunctionCall>();
if (not_func->function()->Name() == "$not" &&
not_func->argument_list_size() == 1 &&
not_func->argument_list(0)
->Is<zetasql::ResolvedFunctionCall>() &&
not_func->argument_list(0)
->GetAs<zetasql::ResolvedFunctionCall>()
->function()
->Name() == "$is_null") {
const zetasql::ResolvedFunctionCall* is_null_func =
not_func->argument_list(0)
->GetAs<zetasql::ResolvedFunctionCall>();
if (is_null_func->argument_list_size() == 1 &&
is_null_func->argument_list(0)
->Is<zetasql::ResolvedColumnRef>()) {
not_null_columns.push_back(
is_null_func->argument_list(0)
->GetAs<zetasql::ResolvedColumnRef>()
->column());
}
}
}
}
} else if (func->function()->Name() == "$not") {
if (func->argument_list_size() == 1 &&
func->argument_list(0)->Is<zetasql::ResolvedFunctionCall>() &&
func->argument_list(0)
->GetAs<zetasql::ResolvedFunctionCall>()
->function()
->Name() == "$is_null") {
const zetasql::ResolvedFunctionCall* is_null_func =
func->argument_list(0)
->GetAs<zetasql::ResolvedFunctionCall>();
if (is_null_func->argument_list_size() == 1 &&
is_null_func->argument_list(0)
->Is<zetasql::ResolvedColumnRef>()) {
not_null_columns.push_back(
is_null_func->argument_list(0)
->GetAs<zetasql::ResolvedColumnRef>()
->column());
}
}
}
}
}
}
}
return absl::OkStatus();
}