powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / FBI c REGEXP_REPLACE
13 сообщений из 13, страница 1 из 1
FBI c REGEXP_REPLACE
    #39550608
Дон Бассаэро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FBI c использованием REGEXP_REPLACE на 11.2 и 12.1 нормально создается, на 12.2 получаем ORA-01743: only pure functions can be indexed

Bug 20804063 - ORA-1499 as REGEXP_REPLACE is allowed to be used in Function-based indexes (FBI) (Doc ID 20804063.8)

Function REGEXP_REPLACE() could be allowed to be used in functional indexes, virtual columns and
check constraints; although it is not Deterministic .

This then may cause table index/inconsistency with errors like:

ORA-1499 by analyze table validate structure cascade
ORA-8102 by UPDATE/DELETE statements

Почему REGEXP_REPLACE is not Deterministic?
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550613
orac_list
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дон БассаэроFBI c использованием REGEXP_REPLACE на 11.2 и 12.1 нормально создается, на 12.2 получаем ORA-01743: only pure functions can be indexed

Bug 20804063 - ORA-1499 as REGEXP_REPLACE is allowed to be used in Function-based indexes (FBI) (Doc ID 20804063.8)

Function REGEXP_REPLACE() could be allowed to be used in functional indexes, virtual columns and
check constraints; although it is not Deterministic .

This then may cause table index/inconsistency with errors like:

ORA-1499 by analyze table validate structure cascade
ORA-8102 by UPDATE/DELETE statements

Почему REGEXP_REPLACE is not Deterministic?

Because the regular expression you write may not be deterministic!

https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9536334100346650882
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550634
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дон БассаэроПочему REGEXP_REPLACE is not Deterministic?NLS влияемо.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
SQL> alter session set nls_date_format = 'mon';

Session altered.

SQL> alter session set nls_language = 'english';

Session altered.

SQL> select regexp_replace(dummy, '.', date '2017-12-31') x from dual;

X
-----
dec

SQL> alter session set nls_language = 'spanish';

Sesiєn modificada.

SQL> select regexp_replace(dummy, '.', date '2017-12-31') x from dual;

X
-----
dic
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550635
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя то же самое применимо и к обычному replace, но с ним FBI создаётся.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SQL> create table t_dual as select * from dual;

Table created.

SQL> create index fbi on t_dual (regexp_replace(dummy, 'X', date '2017-12-31'));
create index fbi on t_dual (regexp_replace(dummy, 'X', date '2017-12-31'))
                            *
ERROR at line 1:
ORA-01743: only pure functions can be indexed


SQL> create index fbi on t_dual (       replace(dummy, 'X', date '2017-12-31'));

Index created.

SQL> select banner from v$version where rownum = 1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550638
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все остальные regex с таким же успехом недетерминированы, но индексы по ним создаются.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
SQL> select regexp_count('Aa', 'a') c from dual;

         C
----------
         1

SQL> alter session set nls_sort = binary_ci;

Session altered.

SQL> alter session set nls_comp = linguistic;

Session altered.

SQL> select regexp_count('Aa', 'a') c from dual;

         C
----------
         2
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550654
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop
Код: plsql
1.
regexp_replace(dummy, 'X', date '2017-12-31')

Нельзя же недетерминизм неявного преобразования так неадекватно выдавать за не пойми что.
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550683
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopДон БассаэроПочему REGEXP_REPLACE is not Deterministic?NLS влияемо.


как быть тогда с to_char

ps
імхо, баг, исправят

.....
stax
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550761
Дон Бассаэро
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, бардак. Не понятно только почему именно regexp_replace ни с того ни с сего решили точечно "починить".
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550769
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

Это вот что было вчера?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
SQL>create table dropme_dual as select * from dual;

Table created.

SQL>create index ix_dropme_fbi on dropme_dual (regexp_replace(dummy, 'X', '2017-12-31'));

Index created.
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550780
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

на 12.2 получаем ORA-01743:

.....
stax
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550789
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,

Да, протупил.
До 12.2 ещё ТС написал, что всё работает.
...
Рейтинг: 0 / 0
FBI c REGEXP_REPLACE
    #39550944
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicdbms_photoshop
Код: plsql
1.
regexp_replace(dummy, 'X', date '2017-12-31')

Нельзя же недетерминизм неявного преобразования так неадекватно выдавать за не пойми что.Покорнейше приношу извинения всем кого ввёл в заблуждение - при неявных преобразованиях и фактический аргумент будет разный.

Была идея поначалу, что regexp_replace чем-то особенная из-за аргумента-заменителя, но все строковые-NLS-зависимые одинаково недетерминированны.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
FBI c REGEXP_REPLACE
    #39769930
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто завел баг 20804063, не думая о последствиях?
Check-констрейнты успешно мигрируют, но изменить их можно только вместе заменой regexp_replace на что-то другое.
Остальные regexp_ пока не запретили, включая 19.2. А если завтра из-за nls запретят использовать check поле in ('Y', 'N')??
Для check.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
02436. 00000 -  "date or system variable wrongly specified in CHECK constraint"
*Cause:    An attempt was made to use a date constant or system variable,
           such as USER, in a check constraint that was not completely
           specified in a CREATE TABLE or ALTER TABLE statement.  For
           example, a date was specified without the century.
*Action:   Completely specify the date constant or system variable.
           Setting the event 10149 allows constraints like "a1 > '10-MAY-96'",
           which a bug permitted to be created before version 8.
Причем для индекса описание явно гласит NLS-dependent functions are OK:
Код: plaintext
1.
2.
3.
4.
5.
01743. 00000 -  "only pure functions can be indexed"
*Cause:    The indexed function uses SYSDATE or the user environment.
*Action:   PL/SQL functions must be pure (RNDS, RNPS, WNDS, WNPS).  SQL
           expressions must not use SYSDATE, USER, USERENV(), or anything
           else dependent on the session state.  NLS-dependent functions
           are OK.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / FBI c REGEXP_REPLACE
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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