Еще один забавный баг, теперь с with...


Самое смешное, что еще три месяца назад про него читал на sql.ru и otn, а сегодня забыл: дело в том, что с 11.1 снято ограничение на обязательное использование всех "named queries" из subquery factoring clause в основном запросе, правда в документации ни на 11.2, ни на 11.1, ни на 10.2 я не нашел ни информации о снятии ограничения, ни его самого(кроме, естественно, самой ошибки в списке). Зато появилась забавная ORA-01762: vopdrv: view query block not in FROM.
Ясно, конечно, что это связано с улучшениями/изменениями механизма трансформации запроса при работе с subquery factoring clause и, скорее всего, с появлением Recursive Subquery Factoring 

Чтобы в очередной раз не забыть, запишу тут протестированное на 11.2.0.1.
Берем простой рабочий вариант:
with t as (select 1 from all_objects o where rownum=1)
select * from t;
         1
----------
         1

1 row selected.

Теперь добавим еще один и получим забавную ошибку:
DB11G/XTENDER> with
 2  t as (select 1 from all_objects o where rownum=1)
 3 ,t1 as (select 1 from all_indexes o where rownum=1)
 4 select * from t;
select * from t
             *
ERROR at line 4:
ORA-01762: vopdrv: view query block not in FROM
А теперь заменим в t1 all_indexes на dual или любую другую обычную таблицу, и запрос станет выполняться, хотя по идее и должен ругаться на ORA-32035: unreferenced query name defined in WITH clause:
DB11G/XTENDER> with
 2  t as (select 1 from all_objects o where rownum=1)
 3 ,t1 as (select 1 from dual o where rownum=1)
 4 select * from t;

         1
----------
         1

1 row selected.
В данном случае, вроде очевидно, что запрос трансформируется так, что удаляет ненужные именованные именованные запросы(смотрим 10053 в Final query after transformations), а ORA-01762 выскакивает тогда, когда "named query block" оказывается слишком сложным для трансформации.

Comments

Отправить комментарий