2016-05-04 2 views
0

(Используя приведенный ниже пример кода ...) Я был озадачен, чтобы выполнить некоторые (повторно исполняемые) сценарии (сохранение/управление db-логикой в ​​репозитории исходного кода), заявив, что четко определенная столбец foo.foo_b не существовал, хотя он был успешно выполнен в сценариях.Каскад каскада композитного типа Postgres удаляет только зависимые столбцы

Код испытания, которые показывают это:

-- foo.sql type script 
drop type if exists foo cascade ; 
create type foo as (
    --foo_b bar, -- (a) not there in first script version 
    foo_c char 
) ; 

-- bar.sql type script 
drop type if exists bar cascade ; 
create type bar as (
    bar_i int 
) ; 

-- simple sample code that may cause the strange error 

select (null::foo).* ; 
--select (null::foo).foo_b ; -- (a) not there in first script version 

выполнение сценария с (a) outcommented (как есть):

(0 rows affected) 
(0 rows affected) 
(0 rows affected) 
(0 rows affected) 
foo_c 
----- 
- 
(0 rows affected) 

выполнение сценария с нашей новой foo_b колонки используется (удалено комментарий -- префикса от вышеуказанных 2 (a)):

(0 rows affected) 
(0 rows affected) 
(0 rows affected) 
(0 rows affected) 
foo_c 
----- 
- 
(0 rows affected) 
ERROR: column "foo_b" not found in data type foo 
    Position: 9 

Мой оригинальный SQL отличается и на самом деле вызвало еще одну ошибку по той же причине:

select row(null::bar, 'xxx') 

ERROR: cannot cast type record to foo 
    Detail: Input has too many columns. 
    Position: 7818 
+0

то же относится к таблицам, если 'bar' является' table' (или неявно созданным типом) –

ответ

0

Так очевидно затруднительное было то, что логика исполнения должны теперь выполнить bar.sql перед тем foo.sql, но ошибка является довольно странный и вводящий в заблуждение, так как не ожидалось, что столбец foo.foo_b упал, но зависимый тип foo должен был быть отброшен.

Смежные вопросы