Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / FBI c REGEXP_REPLACE / 13 сообщений из 13, страница 1 из 1
09.11.2017, 23:38
    #39550608
Дон Бассаэро
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
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
09.11.2017, 23:47
    #39550613
orac_list
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Дон Бассаэро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
10.11.2017, 02:58
    #39550634
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Дон БассаэроПочему 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
10.11.2017, 03:07
    #39550635
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Хотя то же самое применимо и к обычному 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
10.11.2017, 03:26
    #39550638
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Все остальные 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
10.11.2017, 07:55
    #39550654
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
dbms_photoshop
Код: plsql
1.
regexp_replace(dummy, 'X', date '2017-12-31')

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


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

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

.....
stax
...
Рейтинг: 0 / 0
10.11.2017, 10:45
    #39550761
Дон Бассаэро
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Да, бардак. Не понятно только почему именно regexp_replace ни с того ни с сего решили точечно "починить".
...
Рейтинг: 0 / 0
10.11.2017, 10:50
    #39550769
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
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
10.11.2017, 10:56
    #39550780
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
env,

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

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

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

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

Была идея поначалу, что regexp_replace чем-то особенная из-за аргумента-заменителя, но все строковые-NLS-зависимые одинаково недетерминированны.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
06.02.2019, 09:20
    #39769930
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FBI c REGEXP_REPLACE
Кто завел баг 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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / FBI c REGEXP_REPLACE / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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