Делаем такую вещь:
$ create table testt (id serial PRIMARY KEY, val text not null);
$ insert into testt (val) values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9');
....(повторяем несколько раз след строку)....
$ insert into testt (id, val) select nextval('testt_id_seq'::regclass), currval('testt_id_seq'::regclass) + val::integer from testt;
Далее, повторяем несколько раз:
$ select * from testt where id = (random()* 100000)::integer;
И иногда выскакивает что-то типа такого:
id | val
-------+--------
11894 | 15051
29233 | 42198
80725 | 90213
85688 | 100992
88017 | 108075
(5 строк)
Так может быть 2,3 и другое кол-во строк. КАК?!!!
Если перезаписать запрос так:
$ with ter(i) AS (select (random()* 100000)::integer) select t.*,ter.i from testt t, ter where t.id = ter.i;
То все как и ожидается. Только 1-на строка в выхлопе...
PS.
$ select version();
PostgreSQL 9.1.3 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.6.3-1) 4.6.3, 64-bit
Сделал всё по вашему рецепту.
Сделал всё по вашему рецепту. В итоге получаю либо одну строку, либо ни одной.
Ни разу не получилось несколько строк.
select version();
version
-------------------------------------------------------------------------------------------------------------
PostgreSQL 9.1.3 on x86_64-redhat-linux-gnu, compiled by gcc (GCC) 4.6.2 20111027 (Red Hat 4.6.2-1), 64-bit
(1 строка)
Весело... Debian-related bug
Весело... Debian-related bug чель?... У меня повторяется с завидным постоянством...
Подтверждаю
Подтверждаю все, написанное ТС.
test=# select * from test where id = (random()* 100000)::integer;
id | val
-------+--------
38303 | 44537
80251 | 101591
99281 | 163058
(3 строки)
test=# select version();
version
----------------------------------------------------------------------------------------------
PostgreSQL 9.1.3 on x86_64-unknown-linux-gnu, compiled by gcc (Debian 4.6.3-1) 4.6.3, 64-bit
(1 строка)
UDP:
Для наглядности
http://habrastorage.org/storage2/93f/c3d/e12/93fc3de120c988bbf9abbe34734...
Блин, ну не знаю что сказать.
Блин, ну не знаю что сказать. Дайте тогда свою таблицу что ли. По идее там select касается уже данных в ней.
Или говорите как воспроизвести.
Дак данные я же показал как
Дак данные я же показал как заполнил... Записей под миллион повторами insert into ... select ... from ...
Под миллион? А точнее
Под миллион? А точнее можно?
А также max(id) тоже можно сделать?
$ select count(true) from
$ select count(true) from testt;
count
---------
1179648
(1 строка)
Соответственно:
$ select max(id) from testt;
max
---------
1179648
Ну и на всяк случай моя база
Видимо у меня было мало
Видимо у меня было мало записей. Да, взяв вашу базу вижу то же что и вы.
Что могу сказать - очень странное поведение.
У меня идей нет. Попробуйте написать разработчикам PostgreSQL в их список рассылки
Ха, PostgreSQL 8.4.8 on
Ха, PostgreSQL 8.4.8 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real (Debian 4.4.5-8) 4.4.5, 64-bit тоже аффектится...
Позор на мою седую
Позор на мою седую голову!!!
Все работает как и ожидалось-то на самом деле....
Ф-я random() помечена как volatile -- те последовательные вызовы с одним и тем-же набором аргументов (в данном случае конешн аргументов нет, но тем не менее...) могут возвращать разные результаты ( что как-бы естественно для random()) и результат не может быть закеширован. Поэтому будет произведен full table scan и ДЛЯ КАЖДОГО рядка вызвана ф-я random() и ... если повезет и выхлоп того выражения таки равен ID-шнику и так несколько раз... ТО и будет выведено несколько строк..... Ааааа!!! (Ушел посыпать голову пеплом)...