**Use case**

#18842 

**Describe the solution you'd like**

`SELECT file('nonexisting')` - throws exception;
`SELECT file('nonexisting', '')` - returns empty string;
`SELECT file('nonexisting', NULL)` - returns NULL.

#include <Columns/ColumnString.h>
#include <Columns/IColumn.h>
#include <Functions/FunctionFactory.h>
#include <DataTypes/DataTypeString.h>
#include <IO/ReadBufferFromFile.h>
#include <IO/WriteBufferFromVector.h>
#include <IO/copyData.h>
#include <Interpreters/Context.h>
#include <unistd.h>
#include <filesystem>
namespace fs = std::filesystem;
namespace DB
{
namespace ErrorCodes
{
    extern const int ILLEGAL_COLUMN;
    extern const int NOT_IMPLEMENTED;
    extern const int DATABASE_ACCESS_DENIED;
}
class FunctionFile : public IFunction, WithContext