[tarantool-patches] Re: [PATCH v1 1/1] sql: fix tarantoolSqlite3TupleColumnFast
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Thu Dec 6 00:23:39 MSK 2018
On 05/12/2018 23:41, Kirill Shcherbatov wrote:
>> In which 'some'? Yes, assert is wrong, but I do not understand
>> how is it possible that fieldno >= field_count if such errors
>> are caught during parsing stage.
> Please, read commit message referenced by my ticket 7a8de28.
It should be written in this commit message. Message in 7a8de28
is wrong.
>
> kyukhin wrote:
> "This assert is not always hold, e.g. for _schema space where max_id
> is stored behind formatted fields."
> about redefined to invalid assert
>
max_id has nothing to do with the problem. From SQL it is impossible to
select not named fields.
The problem is that first 4 tuples in _space: 257, 272, 276 and 280 have
an old format of _space with only one field (format->field_count == 1).
It happens because these 4 tuples are recovered not after tuple with id
280 which stores actual format of _space. After tuple 280 is recovered,
an actual format is set in struct space of _space and all next tuples
have full featured formats.
So for these 4 tuples tarantoolSqlite3TupleColumnFast can fail even if a
field exists, is indexed and has a name. Those features are just described
in a newer format.
Moreover, even on these tuples a memory lookup is not always dirty. This
request fails:
box.sql.execute("SELECT \"name\" FROM \"_space\"")
But these do not:
box.sql.execute("SELECT \"name\" FROM \"_space\" WHERE \"id\" < 258")
box.sql.execute("SELECT \"name\" FROM \"_space\" WHERE \"id\" = 272")
box.sql.execute("SELECT \"name\" FROM \"_space\" WHERE \"id\" = 276")
For an unknown reason the latters do not lookup 'name' field via
tarantoolSqlite3TupleColumnFast. Looks like a strange behaviour of
the planner. But this is another issue.
More information about the Tarantool-patches
mailing list