Upgrade no PostGIS

Algumas vezes é necessário um upgrade no banco de dados. E chegou a vez do PostgreSQL, para ir da versão 8.2 para a 8.3.  Aproveitando, fiz um upgrade do PostGIS 1.1.6 para a versão 1.4.  Surpreendentemente não ocorreram grandes problemas. Quer dizer, não até eu migrar os dados.

O próprio PostGIS possui um script para migração de dados. Se trata de um script Perl que recebe um dump do PostgreSQL e mais alguns outros parâmetros, trata-os gerando um novo dump e depois finalmente faz o restore do dump no banco de dados.

Problemas

Parecia tudo ok, até eu tentar fazer um backup do novo banco:

ERROR:  geometry contains non closed rings

Será que os dados se corromperam durante a migração?

O PostGIS 1.4 é um pouco mais restritivo quanto aos dados que armazena. Um multipolygon *ou *polygon, por exemplo, só podem ser inseridos no sistema se estiverem bem formados, o que significa que devem ser polígonos fechados (hmm,  e existe “polígono aberto”?).

O problema é que a versão 1.1.6 é mais, digamos, liberal. Você consegue gravar “polígonos  abertos”, consegue fazer SELECTs e backups em cima deles. Apenas operações  que envolvam as formas geométricas podem dar problema.

E o processo de migração de dados não realiza nenhuma verificação de validade destas entidades.

Assim, os dados migrados para a nova versão continua com “polígonos abertos”,  impossibilitando, na versão 1.4,  até mesmo um simples select sobre os dados da tabela.

A solução foi encontrar os registros com este problema e removê-los da tabela através da seguinte consulta SQL:

DELETE FROM WHERE isvalid(coords) != 't'

E se você possui muitas tabelas com o problema, boa sorte!