absl::Status GetNotNullColumns()

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