Tóm lại, bạn cần cài đặt lại postgis, có thể chỉ cần drop extension postgis;
và create extension postgis;
.
Giải thích dài hơn
Bạn có thể thiếu chỉ loại này, nhưng tôi nghi ngờ nó chỉ là vậy, nếu bạn muốn thử, đây là từ 2.3:
CREATE TYPE public.geometry
(INPUT=geometry_in,
OUTPUT=geometry_out,
RECEIVE=geometry_recv,
SEND=geometry_send,
TYPMOD_IN=geometry_typmod_in,
TYPMOD_OUT=geometry_typmod_out,
ANALYZE=geometry_analyze,
CATEGORY='U', DEFAULT='',
INTERNALLENGTH=-1, ALIGNMENT=double, STORAGE=MAIN);
ALTER TYPE public.geometry
OWNER TO postgres;
COMMENT ON TYPE public.geometry
IS 'postgis type: Planar spatial data type.';
Đối với những shell nào, bạn có thể đọc thêm về chúng trong tài liệu .
Tóm lại :Một số kiểu yêu cầu các hàm đến lượt nó yêu cầu kiểu đó phải được khai báo, do đó, cả hai loại đều không thể được tạo - bình thường.
Để giải quyết vấn đề đó, Postgres sẽ tạo các loại trình bao có khá nhiều trình giữ chỗ chỉ để đáp ứng việc xác thực.
Trong trường hợp của bạn geometry
là loại shell và không được khai báo đúng cách, có nghĩa là postgis không được cài đặt đúng cách.
Loại vỏ trông như thế này:
CREATE TYPE public.geometry
(INPUT=shell_in,
OUTPUT=shell_out,
RECEIVE=-,
SEND=-,
ANALYZE=-,
CATEGORY='P',
PASSEDBYVALUE, DEFAULT='',
INTERNALLENGTH=4, ALIGNMENT=int4, STORAGE=PLAIN);
ALTER TYPE public.geometry
OWNER TO postgres;
Và hàm yêu cầu loại shell có thể là:
CREATE OR REPLACE FUNCTION geometry_in(cstring)
RETURNS geometry
AS '$libdir/postgis-2.3','LWGEOM_in'
LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;
Nếu bạn nhìn lại geometry
thích hợp định nghĩa, bạn sẽ nhận thấy rằng chức năng này là một phần của nó, nhưng không nằm trong trình bao này.