Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как с этим бороться ? / 17 сообщений из 17, страница 1 из 1
17.11.2007, 13:53
    #34946736
slp
slp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Postgresql 8.2

CREATE UNIQUE INDEX dogovornumber2
ON contragentteplo
USING btree
(to_number(dogovor,'99999'), period_id);

ERROR: фунции в идексном выражении должны быть помечены как IMMUTABLE

Вопрос

1 Как фунции в идексном выражении должны быть пометить как IMMUTABLE ?

PS В 8.1 все работает
...
Рейтинг: 0 / 0
17.11.2007, 22:36
    #34947073
Nick Gazaloff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Функция to_number теперь не IMMUTABLE. Пишите свою функцию или меняйте логику.
...
Рейтинг: 0 / 0
19.11.2007, 22:45
    #34950344
slp
slp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Написал

CREATE OR REPLACE FUNCTION to_number(character varying)
RETURNS numeric AS
$BODY$select to_number($1,'99999');$BODY$
LANGUAGE 'sql' IMMUTABLE;
ALTER FUNCTION to_number(character varying) OWNER TO postgres;

Создал индекс

CREATE UNIQUE INDEX dogovornumber2
ON contragentteplo
USING btree
(to_number(dogovor), period_id);


Но новая беда
select * from contragentteplo where 12433=to_number(dogovor)
индекс подключает

select * from contragentteplo where 12433=to_number(dogovor,'99999')
индекс не подключает
что вообщем-то правильно

НО у меня масса запрсов именно с to_number(dogovor,'99999')
Как обхитрить Postgresql ?

Как его заставить при to_number(dogovor,'99999') подключать индекс dogovornumber2 ?

Неохота менять тексты
...
Рейтинг: 0 / 0
20.11.2007, 15:36
    #34952386
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
slpНаписал

CREATE OR REPLACE FUNCTION to_number(character varying)
RETURNS numeric AS
$BODY$select to_number($1,'99999');$BODY$
LANGUAGE 'sql' IMMUTABLE;
ALTER FUNCTION to_number(character varying) OWNER TO postgres;

Создал индекс

CREATE UNIQUE INDEX dogovornumber2
ON contragentteplo
USING btree
(to_number(dogovor), period_id);


Но новая беда
select * from contragentteplo where 12433=to_number(dogovor)
индекс подключает

select * from contragentteplo where 12433=to_number(dogovor,'99999')
индекс не подключает
что вообщем-то правильно

НО у меня масса запрсов именно с to_number(dogovor,'99999')
Как обхитрить Postgresql ?

Как его заставить при to_number(dogovor,'99999') подключать индекс dogovornumber2 ?

Неохота менять тексты
А ничего что это разные функции? То, что они одинаково называется еще не значит что одинаково работают

Может так:
Код: plaintext
1.
2.
3.
4.
CREATE UNIQUE INDEX return_of_dogovornumber
  ON contragentteplo
  USING btree
  (to_number(dogovor,'99999'), period_id);
Ня?
...
Рейтинг: 0 / 0
20.11.2007, 15:44
    #34952430
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
почитай первый пост
выдает

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

в 8.2
в 8.1 работает
...
Рейтинг: 0 / 0
20.11.2007, 15:55
    #34952492
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Perederiyпочитай первый пост
выдает

Точно. Я чего-то перепутал, что этот тунумбер - самописный .

Perederiy
фунции в идексном выражении должны быть помечены как IMMUTABLE

в 8.2
в 8.1 работает
Т.е. есть куча уже работающих запросов, которые нельзя менять.
И в них используется to_number(,)?
Которая с 8.2 уже не IMMUTABLE.

Возникла идея (проверить смогу в лучшем случае к вечеру) - может пересоздать эту функцию как IMMUTABLE. Если получится - будет прикольно
...
Рейтинг: 0 / 0
20.11.2007, 16:27
    #34952630
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
тебе прикольно
а мне как вспомню сколько надо менять - сразу резко плохеет

ЗЫ Нафига было это менять в 8.2 ???
...
Рейтинг: 0 / 0
20.11.2007, 17:15
    #34952858
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Perederiyтебе прикольно
а мне как вспомню сколько надо менять - сразу резко плохеет

ЗЫ Нафига было это менять в 8.2 ???
Вроде краем уха видел - что там бывают проблемы из серии "если гад пользователь меняет локаль во время выполнения запроса".
...
Рейтинг: 0 / 0
20.11.2007, 17:39
    #34952953
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Таки нашел.

Код: plaintext
1.
to_number() and to_char(numeric) are now STABLE, not IMMUTABLE, for new initdb installs (Tom) 
This is because lc_numeric can potentially change the output of these functions.

(C) дока
...
Рейтинг: 0 / 0
20.11.2007, 18:55
    #34953286
slp
slp
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
и что из этого следует ?
как практически поступить в моем случае ?
...
Рейтинг: 0 / 0
20.11.2007, 19:25
    #34953369
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
slpи что из этого следует ?
как практически поступить в моем случае ?
Хм. Я правильно подозреваю единость в двух лицах?
Попробовать пересоздать функцию с указением того, что она IMMUTABLE.
Если не поможет - то таки создавать свою функцию на эту тему, и по ней ваять индекс.
Я других вариантов не вижу. Может гуру чего подскажут другого.
...
Рейтинг: 0 / 0
21.11.2007, 01:39
    #34953741
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Сидеть на 8.1 и не дергаться. Зачем переносить корректно работающую систему на новую версию? Вот начинать проекты да, лучше на 8.2 или 8.3 в зависимости от планируемого срока разработки.
...
Рейтинг: 0 / 0
21.11.2007, 08:14
    #34953907
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
у меня в дистрибутиве Linux - Mandriva Linux 2008 стоит по умолчанию 8.2.
вообще-то изначально я писал под ASPLinux под Postgresql 7.
Потом прошел путь до 8.1
...
Рейтинг: 0 / 0
21.11.2007, 10:05
    #34954152
Andrey Daeron
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
MBGСидеть на 8.1 и не дергаться. Зачем переносить корректно работающую систему на новую версию? Вот начинать проекты да, лучше на 8.2 или 8.3 в зависимости от планируемого срока разработки.
Ну, переносить - например из-за повышения производительности и надежности.
Кроме того, судя по моей ссылке, на любой новой базе эта ошибка будет повторятся, ибо это был багфикс в 8.1.6 (и кста глубоко вниз до 7.3 кажется).
предлогаемый Вами путь - вечно висеть на 8.1.5 для новых instance + апгрейд до текущей. Кривовато в общем.
С другой стороны, если система в пром и на доработку ресурсы не выделяются (деньги, время и т.д.) то можно оставить и так.

ЗЫ Придумал еще один "зверский" вариант.
ВНИМАНИЕ! За последствия ОТВЕСТВЕННОСТИ НЕ НЕСУ И НЕ ХОЧУ НЕСТИ!!!
Код: plaintext
1.
 UPDATE pg_proc SET provolatile='i' WHERE proname='to_number';
После этого индекс создаётся. Судя по коментам - проблема в lc_numeric, т.е. если его не трогать, то всё должно быть ОК, а если трогать то ясен пень - капец.

ЗЗЫ Полезная вещь - исходники
...
Рейтинг: 0 / 0
21.11.2007, 12:29
    #34954868
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Короче поступил так

CREATE OR REPLACE FUNCTION to_numberslp(character varying,character varying,)
RETURNS numeric AS
$BODY$select to_number($1,$2);$BODY$
LANGUAGE 'sql' IMMUTABLE;
ALTER FUNCTION to_number(character varying,character varying) OWNER TO postgres;

Создал индекс

CREATE UNIQUE INDEX dogovornumber2
ON contragentteplo
USING btree
(to_numberslp(dogovor,'99999'), period_id);

Дальше поменял в прогах to_number на to_numberslp.
KFileReplace рулит !!!
Запросы в отчетах пришлось менять вручную . Там их после этого надо перекомпилировать (я пользую iReport) . Благо их штук 15 всего оказалось. За полчаса справился.

Сейчас тихо радуюсь. Но вот поделиться радостью не с кем. Многие в конторе считают что программирование сродни написанию текста в текстовом редакторе.
...
Рейтинг: 0 / 0
21.11.2007, 12:32
    #34954891
Thamerlan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Perederiy... Многие в конторе считают что программирование сродни написанию текста в текстовом редакторе.

А разве это не так? :)
Что сложного в том, что вы сделали?
...
Рейтинг: 0 / 0
21.11.2007, 12:44
    #34954948
Perederiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как с этим бороться ?
Это напоминает мне реальный случай рассказанный одним программером
Он занимался проблемой распознавания рукописного текста

Его мать - чем занимаешься сынок ?
Программер - Пытаюсь научить компьютер распознавать написанный текст
Мать - Так это каждый человек может !!!
Вот те которые научили компьютер быстро складывать числа - это вот настоящие гении !
Человек так не может.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как с этим бороться ? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]