**Use case**

```
clickhouse-local --query "SELECT * FROM file(0, JSONEachRow)" < something
```

**Additional context**

I also tried other intuitive options:
```
clickhouse-local --query "SELECT * FROM file(stdin, JSONEachRow)" < something
clickhouse-local --query "SELECT * FROM file('-', JSONEachRow)" < something
```

Although this works:
```
clickhouse-local --query "SELECT * FROM file('/dev/stdin', JSONEachRow)"
```

I think, solution with numeric file descriptors should be supported, as we already support it for `File` table engine,
and it is also useful if a script is opening file descriptors with higher numbers like

```
clickhouse-local --query "SELECT * FROM file(5, JSONEachRow)" 5<test
```

Note: it is already possible to process stdin in clickhouse-local and it is also intuitive and convenient:

```
clickhouse-local --query "SELECT * table" < something
```

I just want other ways to work consistently.
{
    
    ASTs & args_func = ast_function->children;
    if (args_func.size() != 1)
        throw Exception("Table function '" + getName() + "' must have arguments.", ErrorCodes::LOGICAL_ERROR);
    ASTs & args = args_func.at(0)->children;
    if (args.empty())
        throw Exception("Table function '" + getName() + "' requires at least 1 argument", ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
    for (auto & arg : args)
        arg = evaluateConstantExpressionOrIdentifierAsLiteral(arg, context);
    filename = args[0]->as<ASTLiteral &>().value.safeGet<String>();
    if (args.size() > 1)
        format = args[1]->as<ASTLiteral &>().value.safeGet<String>();
    if (format == "auto")
        format = FormatFactory::instance().getFormatFromFileName(filename, true);
    if (args.size() <= 2)
        return;
    if (args.size() != 3 && args.size() != 4)
        throw Exception("Table function '" + getName() + "' requires 1, 2, 3 or 4 arguments: filename, format (default auto), structure (default auto) and compression method (default auto)",
            ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
    structure = args[2]->as<ASTLiteral &>().value.safeGet<String>();
    if (structure.empty())
        throw Exception(ErrorCodes::BAD_ARGUMENTS,
            "Table structure is empty for table function '{}'. If you want to use automatic schema inference, use 'auto'",
            ast_function->formatForErrorMessage());
    if (args.size() == 4)
        compression_method = args[3]->as<ASTLiteral &>().value.safeGet<String>();
}
StoragePtr ITableFunctionFileLike::executeImpl(const ASTPtr & , ContextPtr context, const std::string & table_name, ColumnsDescription ) const