Estoy escribiendo la función ac para hacer un tipo de rango en un rango flotante. Encuentro que PostgreSQL permite usar numrange(low, high) para crear un nunrange, pero no puedo encontrar la parte correspondiente en el código C. El único método que encuentro (espero que funcione) es
TypeCacheEntry *cache=lookup_type_cache(3907,TYPECACHE_RANGE_INFO); RangeBound lower; lower.val = Float8GetDatum(b.zmin); lower.infinite = false; lower.inclusive = false; lower.lower = true; RangeBound upper; upper.val = Float8GetDatum(b.zmax); upper.infinite = false; upper.inclusive = false; upper.lower = true; return PointerGetDatum(range_serialize(cache, &lower,&upper,false));Sin embargo, la solución parece fea ... ¿Alguien podría darme alguna instrucción sobre cómo devolver un rango numérico de una manera más hermosa?
Uso DirectFunctionCall así siguiendo las instrucciones de @Laurenz Albe
Datum s1= DirectFunctionCall1(float8_numeric,Float8GetDatum(b.zmin)); Datum s2= DirectFunctionCall1(float8_numeric,Float8GetDatum(b.zmax)); return DirectFunctionCall2(range_constructor2,s1,s2); Y lamentablemente obtuve un SIGSIEV en range_get_typcache
Primero, encuentre el nombre de la función C para la versión de dos argumentos de numrange :
SELECT prosrc FROM pg_proc WHERE proname = 'numrange' AND pronargs = 2; prosrc -------------------- range_constructor2 (1 row)Ahora encuentra esa función en la fuente:
> git grep range_constructor2 src/backend/commands/typecmds.c: static const char *const prosrc[2] = {"range_constructor2", src/backend/utils/adt/rangetypes.c:range_constructor2(PG_FUNCTION_ARGS) src/include/catalog/pg_proc.dat: proargtypes => 'int4 int4', prosrc => 'range_constructor2' }, src/include/catalog/pg_proc.dat: proargtypes => 'numeric numeric', prosrc => 'range_constructor2' }, src/include/catalog/pg_proc.dat: proargtypes => 'timestamp timestamp', prosrc => 'range_constructor2' }, src/include/catalog/pg_proc.dat: proargtypes => 'timestamptz timestamptz', prosrc => 'range_constructor2' }, src/include/catalog/pg_proc.dat: proargtypes => 'date date', prosrc => 'range_constructor2' }, src/include/catalog/pg_proc.dat: proargtypes => 'int8 int8', prosrc => 'range_constructor2' }, Entonces su función está en src/backend/utils/adt/rangetypes.c .
Debería poder llamarlo con DirectFunctionCall2 .