Estou usando a extensão Postgres de tabelas temporais ( http://pgxn.org/dist/temporal_tables/ ) no Postgres 9.5.4 no Windows. Isso funciona bem para a maioria dos casos, mas estou enfrentando um problema estranho com colunas de matriz.
Eu criei algumas etapas mínimas para reproduzir isso, a configuração da tabela e a extensão das tabelas temporais é a seguinte:
CREATE EXTENSION IF NOT EXISTS temporal_tables;
DROP TABLE IF EXISTS test;
DROP TABLE IF EXISTS test_history;
CREATE TABLE test
(
id SERIAL PRIMARY KEY,
a integer,
directories text[],
sys_period tstzrange NOT NULL
);
CREATE TABLE test_history (LIKE test);
CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON test FOR EACH ROW EXECUTE PROCEDURE versioning('sys_period', 'test_history', true);
E em transações separadas os dois comandos a seguir:
INSERT INTO test(a) VALUES (1);
UPDATE test SET a = 5 WHERE id = 1;
Estou tendo o erro a seguir:
ERRO: a coluna "diretórios" da relação "teste" é do tipo text[] mas a coluna "diretórios" da relação de histórico "test_history" é do tipo text[]
O erro não faz sentido para mim, ambas as colunas têm o mesmo tipo e o erro até afirma isso. Isso só acontece quando uma coluna text[] está presente na tabela. Não é necessário escrever nessa coluna, apenas tem que estar presente. Se eu não criar a coluna array, não há erro.
A extensão não menciona nada sobre incompatibilidade com arrays, e eu esperaria que esse tipo de restrição fosse grande o suficiente para ser mencionado. Eu estou querendo saber se há algo errado com a forma como eu configuro as tabelas, ou se estou faltando mais alguma coisa aqui. Existe algum motivo subjacente pelo qual duas colunas de matriz text[] seriam de tipo diferente?
Alguma idéia do que realmente causa esse erro e como eu poderia me livrar dele?
O problema é versionamento.c:412:
Quando mudei para mostrar
attndims
, o resultado foi:Descobri que o problema está em
heap_openrv
(função PostgreSQL) não preenche corretamente este campo para tabelas criadas porLIKE
. Eu não sei como repará-lo. Mas encontrei uma solução:Depois disso:
É um bug de longa data do PostgreSQL .