```
clickhouse-client -q 'create table typed_nulls( str Nullable(String) ) Engine=Log'

clickhouse-client --param_n='\N' --query='insert into typed_nulls(str) values ( {n:Nullable(String)} )' --format=Vertical
Code: 456. DB::Exception: Query parameter `n` was not set

clickhouse-client --param_n='aa' --query='insert into typed_nulls(str) values ( {n:Nullable(String)} )' --format=Vertical
Code: 456. DB::Exception: Query parameter `n` was not set
```

See also https://github.com/ClickHouse/ClickHouse/commit/a58996817ff0f639686f4248ac0be43a000aac85
/cc @tavplubix 
{
    auto search = query_parameters.find(name);
    if (search != query_parameters.end())
        return search->second;
    else
        throw Exception("Substitution " + backQuote(name) + " is not set", ErrorCodes::UNKNOWN_QUERY_PARAMETER);
}
void ReplaceQueryParameterVisitor::visitQueryParameter(ASTPtr & ast)
{
    const auto & ast_param = ast->as<ASTQueryParameter &>();
    const String & value = getParamValue(ast_param.name);
    const String & type_name = ast_param.type;
    String alias = ast_param.alias;
    const auto data_type = DataTypeFactory::instance().get(type_name);
    auto temp_column_ptr = data_type->createColumn();
    IColumn & temp_column = *temp_column_ptr;
    ReadBufferFromString read_buffer{value};
    FormatSettings format_settings;
    data_type->deserializeAsTextEscaped(temp_column, read_buffer, format_settings);
    if (!read_buffer.eof())
        throw Exception("Value " + value + " cannot be parsed as " + type_name + " for query parameter '"  + ast_param.name + "'"
            " because it isn't parsed completely: only " + toString(read_buffer.count()) + " of " + toString(value.size()) + " bytes was parsed: "
            + value.substr(0, read_buffer.count()), ErrorCodes::BAD_QUERY_PARAMETER);
    ast = addTypeConversionToAST(std::make_shared<ASTLiteral>(temp_column[0]), type_name);
    ast->setAlias(alias);
}
}