c - 在Postgresql扩展C中获取用户定义的类型OID

标签 c postgresql

我正在使用 C 开发 PostgreSQL 的扩展。我创建了一个名为 geo_trajc_elem 的用户定义类型。我还创建了一个函数来生成这种新类型的数组。

  ArrayType *result_array;
  struct geo_trajc_elem *traje = (struct geo_trajc_elem *)palloc(sizeof(struct geo_trajc_elem));

  Timestamp time_el = PG_GETARG_TIMESTAMP(1);
  struct geo_point *pt = PG_GETARG_GEOPOINT_TYPE_P(2);

  int16 typlen;
  bool typbyval;
  char typalign;

  Datum datum_element;


  traje = DatumGetGeoTrajETypeP(DirectFunctionCall2(get_trajectory_elem, PointerGetDatum(time_el), PointerGetDatum(pt)));
  datum_element = PointerGetDatum(traje);

  /* Oid element_type = get_fn_expr_argtype(fcinfo->flinfo, 0); */ 

  Oid element_type = ?

  get_typlenbyvalalign(element_type, &typlen, &typbyval, &typalign);

是否有一个函数可以获取对象的 oid 类型?就像 get_oid_elem (struct geo_trajc_elem)

在这种情况下,不可能使用 get_fn_expr_argtype 因为我没有将新类型作为参数传递,而是在函数本身中创建它,对吗?

提前致谢

最佳答案

要知道属于某个类型名称的Oid,您必须查阅pg_type

您可以使用 parser/parse_type.h 中的函数 typenameTypeId 并以 NULL 作为第一个参数来实现此目的。

如果您有数组类型 Oid,要获取元素类型的 Oid,请使用 utils/lsyscache 中的 get_element_type。 h.

关于c - 在Postgresql扩展C中获取用户定义的类型OID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887484/

相关文章:

c - Malloc双指针

c++ - udp 选择超时问题。超时或从所有客户端读取

postgresql - 如何生成没有破折号的uuid

PostgreSQL - 关系 [表] 不存在

mysql - 在 mysql 数据库中查找行和时间戳之间的交集

PostgreSQL 将 cidr 扩展到单独的地址

c - 循环遍历 C 中的索引

c - 显示数组时c中的段错误

html - 使用 Apache 上传文件

php - Laravel 迁移 Postgres 报错