Но как?!!

Делаем такую вещь:
$ 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-шнику и так несколько раз... ТО и будет выведено несколько строк..... Ааааа!!! (Ушел посыпать голову пеплом)...

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023