Я использую SQLite 3.25.2 для Windows, скачал последние скомпилированные двоичные файлы с официальной страницы https://sqlite.org/download.html
Выполнение следующего кода
DROP TABLE IF EXISTS TestReal;
CREATE TABLE TestReal(A REAL UNIQUE);
INSERT INTO TestReal values (9223372036854775807.0);
INSERT INTO TestReal values (9223372036854775807.0 - 1);
INSERT INTO TestReal values (9223372036854775807.0 - 2);
INSERT INTO TestReal values (9223372036854775807.0 - 3);
терпит неудачу, как и ожидалось, так как 9223372036854775807.0 равен 2 ^ 63, эти числа выходят за пределы диапазона, где все целые числа точно представлены в виде двойных чисел. Я имею в виду
sqlite> select 9223372036854775807.0 = 9223372036854775807.0 - 1;
1
sqlite> select 9223372036854775807.0 = 9223372036854775807.0 - 512;
1
И столбец А уникален, поэтому имеет смысл напечатать сообщение «УНИКАЛЬНОЕ ограничение не выполнено: TestReal.A». Но, кажется, непреднамеренный обходной путь
DROP TABLE IF EXISTS TestReal;
CREATE TABLE TestReal(A REAL UNIQUE);
INSERT INTO TestReal values (9223372036854775807);
INSERT INTO TestReal values (9223372036854775807 - 1);
INSERT INTO TestReal values (9223372036854775807 - 2);
INSERT INTO TestReal values (9223372036854775807 - 3);
работает без проблем. Следующие запросы подтверждают, что в таблицу теперь вставлено ровно 4 значения, но только одно отдельное значение, несмотря на наличие уникального ограничения
sqlite> SELECT * FROM TestReal;
9.22337203685478e+18
9.22337203685478e+18
9.22337203685478e+18
9.22337203685478e+18
sqlite> SELECT DISTINCT(A) FROM TestReal;
9.22337203685478e+18
sqlite> .schema
CREATE TABLE TestReal(A REAL UNIQUE);
Итак, мой вопрос: это ошибка в SQLite? Или я не правильно понимаю, что на самом деле означает «уникальный»?