Странности при делении больших цисел

Делаю запрос select 1695201600/60; ответом получаю 28253358.000000; а правильный ответ 28253360;

Со всеми большими цифрами так, и ладно бы просто округляла, но реально неправильный результат деления…

можете попробовать использовать конверсию в double первого аргумента выражения?

select double(num1)/num2 from idx

или всех аргументов?

Запускаю не с индекса, а напрямую запрос и там ОК

select double(1695201600)/60; select 1695201600/60;
±----------------------+
| double(1695201600)/60 |
±----------------------+
| 28253360.000000 |
±----------------------+
1 row in set (0.000 sec)

±----------------+
| 1695201600/60 |
±----------------+
| 28253358.000000 |
±----------------+

А вот если беру значения из базы, то double не спасает

лучше бы привести пример запроса, вместе с резалт сетом, тк мне не понятно, что такое
беру из базы

Если делаю запрос select double(1695201600)/60; то результат корректный

Если делаю запрос к индексу в виде select double(DT)/60 from stats where DT=1695201600; то результат кривой.

не могу повторить

mysql> CREATE TABLE t2 (id bigint,s string attribute, d bigint);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t2 (id, d) values (1, 1695201600);
Query OK, 1 row affected (0.00 sec)

mysql>  select double(d)/60 from t2;
+-----------------+
| double(d)/60    |
+-----------------+
| 28253360.000000 |
+-----------------+
1 row in set (0.02 sec)

у меня получается корректное значение

А я вот пробую:

MySQL [(none)]> CREATE TABLE t2 (id bigint,s string attribute, d bigint);
Query OK, 0 rows affected (0.003 sec)

MySQL [(none)]> insert into t2 (id, d) values (1, 1726494300);
Query OK, 1 row affected (0.000 sec)

MySQL [(none)]> select double(d)/60 from t2;
±----------------+
| double(d)/60 |
±----------------+
| 28774908.000000 |
±----------------+
1 row in set (0.000 sec)

А должно быть 28774905…

Таблица создавалась как:

CREATE TABLE IF NOT EXISTS stats (
id bigint,
stype bigint,
sourceid bigint,
tgmedia bigint,
dt bigint,
dtd bigint,
dth bigint,
views bigint,
likes bigint,
comments bigint,
reposts bigint,
orbits multi,
words multi)

То есть ничего военного. Версия Мантикоры последняя. Версия системы FreeBSD 13.2

Из лога подробнее:

Manticore 6.2.12 455347112e@230823
-------------- backtrace begins here ---------------
Program compiled with Clang 13.0.0
Configured with flags: Configured with these definitions: -DUSE_SYSLOG=1 -DWITH_GALERA=1 -DWITH_RE2=1 -DWITH_RE2_FORCE_STATIC=1 -DWITH_STEMMER=1 -DWITH_STEMMER_FORCE_STATIC=1 -DWITH_NLJSON=1 -DWITH_UNIALGO=1 -DWITH_ICU=1 -DWITH_ICU_FORCE_STATIC=1 -DWITH_SSL=1 -DWITH_ZLIB=1 -DWITH_ZSTD=1 -DDL_ZSTD=1 -DZSTD_LIB=libzstd.so.1 -DWITH_CURL=1 -DDL_CURL=1 -DCURL_LIB=libcurl.so.4 -DWITH_ODBC=1 -DDL_ODBC=1 -DODBC_LIB=libodbc.so.2 -DWITH_EXPAT=1 -DDL_EXPAT=1 -DEXPAT_LIB=libexpat.so.1 -DWITH_ICONV=1 -DWITH_MYSQL=1 -DDL_MYSQL=1 -DMYSQL_LIB=libmariadb.so.3 -DWITH_POSTGRESQL=1 -DDL_POSTGRESQL=1 -DPOSTGRESQL_LIB=libpq.so.5 -DLOCALDATADIR=/usr/local/var -DFULL_SHARE_DIR=/usr/local/share/manticore
Built on FreeBSD amd64

лучше тогда создать тикет на github - где выложить приведенный MRE и версию демона, OS, пакет на котором повторяется кейс

Понятно, была мысль в сторону того что какой-то настройки не хватает. Сейчас на всякий пожарный пересоберу заново и проверю, если повторится то на гите.

если вы сами собираете - то можете попробовать сначала тот же кейс в docker контейнере - чтобы исключить влияние ключей компилятора?

Docker на FreeBSD не пользуем. Но попробую на чистой системе.

просто чтобы быть уверенным, что на том же боксе - референсная сборка имеет такое же поведение как вы описываете

На чистой сборке выпало…

ld: error: undefined symbol: re2::RE2::RE2(std::__1::basic_string_view<char, std::__1::char_traits >, re2::RE2::Options const&)

referenced by unique_ptr.h:725 (/usr/include/c++/v1/__memory/unique_ptr.h:725)
sphinx.cpp.o:(CSphFieldRegExps::AddRegExp(char const*, StringBuilder_c&)) in archive liblmanticore.a
referenced by sphinxexpr.cpp:8545 (/home/manticoreinstall/manticoresearch-6.2.12/src/sphinxexpr.cpp:8545)
sphinxexpr.cpp.o:(Expr_Regex_c::SetupRE2()) in archive liblmanticore.a

ld: error: undefined symbol: re2::RE2::CheckRewriteString(std::__1::basic_string_view<char, std::__1::char_traits >, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >*) const

referenced by sphinx.cpp:12809 (/home/manticoreinstall/manticoresearch-6.2.12/src/sphinx.cpp:12809)
sphinx.cpp.o:(CSphFieldRegExps::AddRegExp(char const*, StringBuilder_c&)) in archive liblmanticore.a

ld: error: undefined symbol: re2::RE2::GlobalReplace(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >*, re2::RE2 const&, std::__1::basic_string_view<char, std::__1::char_traits >)

referenced by sphinx.cpp:12760 (/home/manticoreinstall/manticoresearch-6.2.12/src/sphinx.cpp:12760)
sphinx.cpp.o:(CSphFieldRegExps::Apply(unsigned char const*, int, sph::Vector_T<unsigned char, sph::DefaultCopy_T, sph::DefaultRelimit, sph::DefaultStorage_T >&, bool)) in archive liblmanticore.a

ld: error: undefined symbol: re2::RE2::PartialMatchN(std::__1::basic_string_view<char, std::__1::char_traits >, re2::RE2 const&, re2::RE2::Arg const* const*, int)

referenced by sphinxexpr.cpp:8511 (/home/manticoreinstall/manticoresearch-6.2.12/src/sphinxexpr.cpp:8511)
sphinxexpr.cpp.o:(Expr_Regex_c::IntEval(CSphMatch const&) const) in archive liblmanticore.a

вы можете использовать сборочные контейнеры как описано в нашей документации или повторить созданное там окружение

snikolaev@dev2:~$ docker run -e EXTRA=1 --name manticore --rm -d manticoresearch/manticore:6.2.12 && echo "Waiting for Manticore docker to start. Consider mapping the data_dir to make it start faster next time" && until docker logs manticore 2>&1 | grep -q "accepting connections"; do sleep 1; echo -n .; done && echo && docker exec -it manticore mysql && docker stop manticore
2533986c7cb8c26331b569a945b3756afcff59eb21e9612a9da89f9949122f89
Waiting for Manticore docker to start. Consider mapping the data_dir to make it start faster next time
...
mysql> drop table if exists t; create table t(i int); insert into t(i) values(1726494300); select double(i)/60 from t;
+-----------------+
| double(i)/60    |
+-----------------+
| 28774908.000000 |
+-----------------+