Postgresql 如何在创建类型中使用原始Postgres输入/输出函数?

Postgresql 如何在创建类型中使用原始Postgres输入/输出函数?,postgresql,type-conversion,sqldatatypes,Postgresql,Type Conversion,Sqldatatypes,我有一个表,其中有一些类型为smallint的列,我想提供一个CAST从varchar到smallint的转换,以便只对该列执行一些转换。因此,为了能够根据我的需要创建一个特定的CAST,我需要一个特殊列的类型。已尝试使用域,但Postgres警告在强制转换中忽略这些域。。。因此,看起来我一直在使用CREATE TYPE,但我不想自己实现所需的输入/输出函数,因为最终我只需要Postgres中的smallint应该已经可用的东西 问题是我不知道这些函数的名称,它们存储在哪个lib中,如果我需要提

我有一个表,其中有一些类型为
smallint
的列,我想提供一个
CAST
varchar
smallint
的转换,以便只对该列执行一些转换。因此,为了能够根据我的需要创建一个特定的
CAST
,我需要一个特殊列的类型。已尝试使用域,但Postgres警告在
强制转换中忽略这些域。。。因此,看起来我一直在使用
CREATE TYPE
,但我不想自己实现所需的输入/输出函数,因为最终我只需要Postgres中的
smallint
应该已经可用的东西

问题是我不知道这些函数的名称,它们存储在哪个lib中,如果我需要提供在不同操作系统上安装时可能不同的路径,或者这些路径是否可用

那么,是否有可能创建一种类似于
smallint
的类型,它完全只使用Postgres函数,并且以平台/路径独立的方式使用Postgres函数


我没发现有人做那样的事。谢谢

您可以创建一个类似于
smallint
的类型,如下所示:

CREATE TYPE myint;

CREATE FUNCTION myintin(cstring) RETURNS myint
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2in';

CREATE FUNCTION myintout(myint) RETURNS cstring
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2out';

CREATE FUNCTION myintrecv(internal) RETURNS myint
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2recv';

CREATE FUNCTION myintsend(myint) RETURNS bytea
   LANGUAGE internal IMMUTABLE STRICT PARALLEL SAFE AS 'int2send';

CREATE TYPE myint (
   INPUT = myintin,
   OUTPUT = myintout,
   RECEIVE = myintrecv,
   SEND = myintsend,
   LIKE = smallint,
   CATEGORY = 'N',
   PREFERRED = FALSE,
   DELIMITER = ',',
   COLLATABLE = FALSE
);
如果要在算术表达式中使用强制转换,则必须定义对其他数值类型的强制转换

如果还添加了来自
varchar
(或
text
)的强制转换,请注意,创建太多强制转换可能会导致类型解析过程中的歧义和意外行为。这就是为什么在PostgreSQL 8.3中删除了许多类型转换的原因,请参阅


我建议您为您的问题寻找更简单的解决方案,例如显式类型转换。

我想创建一个具有两个bigint的类型。返回一个bigint,它是两个bigint的总和。@Debjit Creative。当然可以通过编写C代码来完成(参见文档中的示例)。我们不能只使用SQL而不使用C吗?绝对不行。