Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 FBI c REGEXP_REPLACE  [new]
Дон Бассаэро
Member

Откуда: from dual
Сообщений: 116
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?
9 ноя 17, 23:38    [20941769]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
orac_list
Member

Откуда:
Сообщений: 120
Дон Бассаэро
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!

[url=]https://asktom.oracle.com/pls/apex/f?p=100:11:::NO:RP:P11_QUESTION_ID:9536334100346650882[/url]
9 ноя 17, 23:47    [20941785]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Дон Бассаэро
Почему REGEXP_REPLACE is not Deterministic?
NLS влияемо.
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
10 ноя 17, 02:58    [20942029]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Хотя то же самое применимо и к обычному replace, но с ним FBI создаётся.
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
10 ноя 17, 03:07    [20942031]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Все остальные regex с таким же успехом недетерминированы, но индексы по ним создаются.
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
10 ноя 17, 03:26    [20942035]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29199
dbms_photoshop
regexp_replace(dummy, 'X', date '2017-12-31')
Нельзя же недетерминизм неявного преобразования так неадекватно выдавать за не пойми что.
10 ноя 17, 07:55    [20942121]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
dbms_photoshop
Дон Бассаэро
Почему REGEXP_REPLACE is not Deterministic?
NLS влияемо.


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

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

.....
stax
10 ноя 17, 09:28    [20942279]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
Дон Бассаэро
Member

Откуда: from dual
Сообщений: 116
Да, бардак. Не понятно только почему именно regexp_replace ни с того ни с сего решили точечно "починить".
10 ноя 17, 10:45    [20942530]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5936
dbms_photoshop,

Это вот что было вчера?
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.
10 ноя 17, 10:50    [20942564]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 1955
env,

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

.....
stax
10 ноя 17, 10:56    [20942616]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 5936
Stax,

Да, протупил.
До 12.2 ещё ТС написал, что всё работает.
10 ноя 17, 11:01    [20942649]     Ответить | Цитировать Сообщить модератору
 Re: FBI c REGEXP_REPLACE  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5149
Elic
dbms_photoshop
regexp_replace(dummy, 'X', date '2017-12-31')
Нельзя же недетерминизм неявного преобразования так неадекватно выдавать за не пойми что.
Покорнейше приношу извинения всем кого ввёл в заблуждение - при неявных преобразованиях и фактический аргумент будет разный.

Была идея поначалу, что regexp_replace чем-то особенная из-за аргумента-заменителя, но все строковые-NLS-зависимые одинаково недетерминированны.
10 ноя 17, 13:31    [20943419]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: FBI c REGEXP_REPLACE  [new]
-2-
Member

Откуда:
Сообщений: 14850
Кто завел баг 20804063, не думая о последствиях?
Check-констрейнты успешно мигрируют, но изменить их можно только вместе заменой regexp_replace на что-то другое.
Остальные regexp_ пока не запретили, включая 19.2. А если завтра из-за nls запретят использовать check поле in ('Y', 'N')??
Для check.
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:
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.
6 фев 19, 09:20    [21802351]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить