// internal for testing
        internal FunctionParameter CreateReturnParameter(
            FunctionDetailsRowView functionDetailsRow, Dictionary<string, RowType> tvfReturnTypes, List<EdmSchemaError> errors)
        {
            Debug.Assert(functionDetailsRow != null, "functionDetailsRow != null");
            Debug.Assert(tvfReturnTypes != null, "tvfReturnTypes != null");
            Debug.Assert(errors != null, "errors != null");

            EdmType returnType = null;

            if (functionDetailsRow.ReturnType != null)
            {
                bool excludedForVersion;
                returnType = GetStorePrimitiveTypeForVersion(functionDetailsRow.ReturnType, out excludedForVersion);

                if (returnType == null)
                {
                    errors.Add(
                        new EdmSchemaError(
                            string.Format(
                                CultureInfo.InvariantCulture,
                                excludedForVersion
                                    ? Resources_VersioningFacade.UnsupportedFunctionReturnDataTypeForTarget
                                    : Resources_VersioningFacade.UnsupportedFunctionReturnDataType,
                                functionDetailsRow.ProcedureName,
                                functionDetailsRow.ReturnType),
                            (int)ModelBuilderErrorCode.UnsupportedType,
                            EdmSchemaErrorSeverity.Warning));
                }
            }
            else if (functionDetailsRow.IsTvf)
            {
                RowType rowType;
                if (tvfReturnTypes.TryGetValue(functionDetailsRow.GetMostQualifiedFunctionName(), out rowType)
                    && !MetadataItemHelper.HasSchemaErrors(rowType))
                {
                    returnType = rowType.GetCollectionType();
                }
                else
                {
                    errors.Add(
                        new EdmSchemaError(
                            string.Format(
                                CultureInfo.InvariantCulture,
                                Resources_VersioningFacade.TableReferencedByTvfWasNotFound,
                                functionDetailsRow.GetMostQualifiedFunctionName()),
                            (int)ModelBuilderErrorCode.MissingTvfReturnTable,
                            EdmSchemaErrorSeverity.Warning));

                    // invalid row types will not be serialized so 
                    // reassign errors to the parent TVF definition 
                    if (rowType != null)
                    {
                        errors.AddRange(MetadataItemHelper.GetSchemaErrors(rowType));
                    }
                }
            }

            return
                returnType != null
                    ? FunctionParameter.Create("ReturnType", returnType, ParameterMode.ReturnValue)
                    : null;
        }