```
milovidov-desktop :) CREATE TABLE hits2 AS hits

CREATE TABLE hits2 AS hits

Query id: ef73b907-c73b-42ba-8194-db88c88cc85b

Ok.

0 rows in set. Elapsed: 0.024 sec. 

milovidov-desktop :) INSERT INTO hits2 FROM INFILE 'hits.tsv'

INSERT INTO hits2 FROM INFILE 'hits.tsv'

Query id: 0588941e-ff9e-4741-97ce-7784aee1e253

↓ Progress: 0.00 rows, 0.00 B (0.00 rows/s., 0.00 B/s.)
```

Two problems:
- no progress;
- it is displaying a fractional number of rows (`0.00`).
{
    // We have to skip the trailing semicolon that might be left
    // after VALUES parsing or just after a normal semicolon-terminated query.
    Tokens after_query_tokens(th all_queries_end);
    IParser::Pos after_query_iterator(after_query_tokens, max_parser_depth);
    while (after_query_iterator.isValid() && after_query_iterator->type == TokenType::Semicolon)
    {
        this_query_end = after_query_iterator->end;
        ++after_query_iterator;
    }
    // Now we have to do some extra work to add the trailing
    // same-line comment to the query, but preserve the leading
    // comments of the next query. The trailing comment is important
    // because the test hints are usually written this way, e.g.:
    // select nonexistent_column; -- { serverError 12345 }.
    // The token iterator skips comments and whitespace, so we have
    // to find the newline in the string manually. If it's earlier
    // than the next significant token, it means that the text before
    // newline is some trailing whitespace or comment, and we should
    // add it to our query. There are also several special cases
    // that are described below.
    const_symbols<'\n'>(th all_queries_end);