sql >> Base de Datos >  >> RDS >> PostgreSQL

El tipo de Postgres {tipo de campo} es solo un shell

En resumen, debe reinstalar postgis, posiblemente solo drop extension postgis; y create extension postgis; .

Explicación más larga

Es posible que te estés perdiendo solo este tipo, pero dudo que sea solo eso, aunque si quieres probar, aquí está de 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.';

En cuanto a los shells, puede leer más sobre ellos en la documentación .

En resumen :Algunos tipos requieren funciones que a su vez requieren que se declare el tipo with, por lo que ninguno puede crearse, normalmente.

Para solucionar ese problema, Postgres creará tipos de shell que son prácticamente marcadores de posición solo para satisfacer la validación.

En tu caso geometry es de tipo shell y no se declaró correctamente, lo que significa que postgis no se instaló correctamente.

El tipo de shell se ve así:

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;

Y la función que requiere el tipo de shell podría ser:

CREATE OR REPLACE FUNCTION geometry_in(cstring)
    RETURNS geometry
    AS '$libdir/postgis-2.3','LWGEOM_in'
    LANGUAGE 'c' IMMUTABLE STRICT PARALLEL SAFE;

Si miras hacia atrás a la geometry adecuada definición notará que esta función es parte de ella, pero no en este shell.