Esta é a vista:
SELECT DISTINCT d.comic_book_id as comic_book_id,
d.comic_detail_id as comic_detail_id,
d.archive_type as archive_type,
d.comic_state as comic_state,
CASE
WHEN EXISTS(SELECT *
FROM comic_metadata_sources s
WHERE s.comic_book_id = d.comic_book_id)
THEN false
ELSE true END AS is_unscraped,
d.comic_type as comic_type,
d.publisher as publisher,
d.series as series,
d.volume as volume,
d.issue_number as issue_number,
d.description as description,
d.notes as notes,
(SELECT RIGHT(CONCAT('0000000000', d.issue_number), 10)) as sortable_issue_number, d.title as title, (
SELECT COUNT(*)
FROM comic_pages cp
WHERE cp.comic_book_id = d.comic_book_id) as page_count
, d.cover_date as cover_date
, CASE WHEN d.cover_date IS NULL THEN 0 ELSE MONTH (cover_date)
END
as month_published
, CASE WHEN d.cover_date IS NULL THEN 0 ELSE YEAR (cover_date)
END
as year_published,
d.store_date as store_date,
d.added_date as added_date
FROM comic_details d
Na v2 do nosso projeto, essa visualização foi criada e funcionou perfeitamente.
Atualmente, estou trabalhando na versão 3 do projeto, e parte do requisito é fornecer um novo conjunto de migrações para permitir que os usuários criem as tabelas do zero e que elas tenham a mesma aparência que um usuário existente obteria. Então, copiei o conteúdo da visualização da nossa base de código da versão 2 para a migração da versão 3.
Quando executo a migração em todos os outros bancos de dados suportados (H2, MySQL, Mariadb), ela e todas as operações relacionadas funcionam bem.
Mas, quando executo no Postgres, ele retorna um erro com:
Caused by: org.postgresql.util.PSQLException: ERROR: function month(date) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Mas, quando volto ao nosso código v2 e executo exatamente o mesmo conteúdo de migração do Liquibase, funciona perfeitamente, sem problemas. Até copiei o corpo da migração antiga para a nova, mas falhou . Mas o código antigo ainda funciona na mesma instância do Postgres e cria uma visualização funcional.
Tentei substituir a chamada para month()
e year()
por:
THEN SELECT EXTRACT(MONTH FROM cover_date)
e:
THEN SELECT EXTRACT(YEAR FROM cover_date)
A visualização é criada corretamente, mas o tempo de execução as substitui por uma chamada para MONTH()
e YEAR()
respectivamente, e o Postgres novamente exibe a mesma mensagem de erro.
Outra diferença entre nossos códigos v2 e v3 é que na v3 migramos do Spring Boot 3.2.3 para o 3.4.1. Não tenho certeza se a versão do Liquibase mudou entre eles, mas será que pode haver algum tipo de bug na versão mais recente do LB? Presumo que o Spring a tenha atualizado para uma versão mais recente.
Por fim, modifiquei a visualização para usar:
E descobri que uma das classes tinha uma variável de instância que usava uma fórmula anotada que também usava a função month(). Atualizar isso para usar a função acima resolveu todos os problemas.
Em resposta a @Adrian, o seguinte foi retirado diretamente de uma instância em execução da nossa versão v2 que usa um servidor Postgres:
Se o Postgres não tem um método month() ou year(), então como os métodos acima funcionam?