node-tarantool-driver icon indicating copy to clipboard operation
node-tarantool-driver copied to clipboard

int32 в индексе

Open ZUBAT opened this issue 5 years ago • 3 comments

tarantool.select(spaceId: Number or String, indexId: Number or String, limit: Number, offset: Number, iterator: Iterator, key: tuple) ключ для индекса не позволяет выполнить поиск по значению больше чем int32 connection.select('chat', 'primary', 20, 0, 'lt', [2147483648])

UnhandledPromiseRejectionWarning: TarantoolError: Supplied key type of part 0 does not match index part type: expected unsigned connection.select('chat', 'primary', 20, 0, 'lt', [2147483647]) - работает нормально

ZUBAT avatar Mar 25 '19 14:03 ZUBAT

Тоже столкнулся. Да и не только в select. Такая же проблема и в insert. Да, жесткий баг. К примеру, хранить timestamp в миллисекундах не получится из-за него.

Work-around: завернуть в хранимку (вот call нормально работает). Или просто юзать string...

1aerostorm avatar Aug 19 '21 17:08 1aerostorm

The reason is msgpack considers the value as a double if it doesn't fit:

> a=[21474836470]
[ 21474836470 ]
> typeof(a[0])
'number'
> msgpack.encode(a)
<Buffer 91 cb 42 13 ff ff ff d8 00 00>

Where 0xcb means float 64.

sergos avatar Jun 07 '24 16:06 sergos

In progress at #53 , will be fixed by using packInteger() method, which forces msgpack-lite to safely encode a number.

If value doesn't fit as int32, it will be packed as int64 rather than float 64.

goodwise avatar Jun 22 '24 16:06 goodwise