You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: set.go
    path of file: ./repos/cockroach/pkg/sql/opt/ordering
    
    the code of the file until where you have to start completion: // Copyright 2021 The Cockroach Authors.
//
// Use of this software is governed by the Business Source License
// included in the file licenses/BSL.txt.
//
// As of the Change Date specified in that file, in accordance with
// the Business Source License, use of this software will be governed
// by the Apache License, Version 2.0, included in the file
// licenses/APL.txt.

package ordering

import (
	"github.com/cockroachdb/cockroach/pkg/sql/opt"
	"github.com/cockroachdb/cockroach/pkg/sql/opt/memo"
	"github.com/cockroachdb/cockroach/pkg/sql/opt/props"
)

func setOpCanProvideOrdering(expr memo.RelExpr, required *props.OrderingChoice) bool {
	// Set operations can provide the required ordering 
    
func StreamingSetOpOrdering(expr memo.RelExpr, required *props.OrderingChoice) opt.Ordering {
	required = setOpBuildRequired(expr, required)
	ordering := required.ToOrdering()
	if ordering.Empty() {
		return ordering
	}

	// UNION ALL is implemented with only an ordered synchronizer, so there is no
	// need to add extra ordering columns.
	if expr.Op() == opt.UnionAllOp {
		return ordering
	}

	// Pad the ordering to make sure every column is accounted for in the
	// ordering. This won't change the order of data (setOpBuildRequired already
	// ensured the required ordering was fully specified according to the FDs),
	// but it's necessary for the execution engine to plan a streaming operation.
	// TODO(rytaft): Consider changing the execution engine to accept the
	// optimizer's decision to plan a streaming operation even if all columns are
	// not included in the ordering.
	missing := expr.Relational().OutputCols.Difference(ordering.ColSet())
	missing.ForEach(func(col opt.ColumnID) {
		ordering = append(ordering, opt.MakeOrderingColumn(col, false /* descending */))
	})
	return ordering
}