Estou recriando uma tabela que costumava ser atualizada por triggers, para os novos tipos de colunas geradas.
Estou com um problema em que, se a coluna gerada puder ser NULL
, ela falhará silenciosamente e será inserida como NULL
. Se as colunas forem, NOT NULL
a inserção falhará como um arquivo NOT NULL constraint
.
Ambos os casos falham e não geram os valores de célula esperados.
create table test_table
(
coord_array double precision[] not null,
wkb_geometry geometry generated always as (st_setsrid(st_point(coord_array[0], coord_array[1]), 4326)) stored not null,
wkt_geometry text generated always as (st_astext(st_setsrid(st_point(coord_array[0], coord_array[1]), 4326))) stored not null,
geojson_coord_string jsonb generated always as ((st_asgeojson(st_setsrid(st_point(coord_array[0], coord_array[1]), 4326)))::jsonb) stored not null
);
O ideal é que a inserção só aconteça com valores paracoord_array
insert into test_table (coord_array) values ('{25.0 ,-26.0}')
O problema imediato com seu código é que em arrays SQL (e Postgres) começam no índice 1, não 0. Então
coord_array[0]
sempre retornaránull
e assim as expressões de suas colunas geradas sempre retornarão nulo, mesmo se dois valores de array não nulos forem fornecidos .No entanto, a
not null
restrição na matriz em si não é suficiente. Isso não garante que a matriz contenha (pelo menos) dois valores não nulos. Para validar isso, você precisa de uma restrição de verificação.Isso permitiria matrizes com mais de dois elementos - mas suas colunas geradas não se importarão, pois as expressões nunca usam mais do que os dois primeiros elementos.