服务器无法识别自定义类型文字

Server does not recognize a custom type literal

我在 postgres 中创建了一个自定义类型:

CREATE TYPE semanticversion AS (
    major integer, 
    minor integer, 
    patch integer, 
    prerelease text, 
    prerelease_number integer);

并填充了一些数据 (select * from TABLE order by id):

 id |   version   
----+-------------
  1 | (1,0,0,,)
  2 | (2,0,0,,)
  3 | (1,2,3,,)
  4 | (1,2,3,b,1)
  5 | (1,2,3,d,1)
  6 | (1,2,3,h,1)

当我按此字段订购时,它按预期工作 (select * from TABLE order by version):

 id |   version   
----+-------------
  1 | (1,0,0,,)
  4 | (1,2,3,b,1)
  5 | (1,2,3,d,1)
  6 | (1,2,3,h,1)
  3 | (1,2,3,,)
  2 | (2,0,0,,)

但是当我尝试截断 (select * from TABLE where version < (1,2,3,'h',1)) 时,它会抛出一个错误:

ERROR:  cannot compare dissimilar column types text and unknown at record column 4

我觉得这很混乱,因为它显然能够比较这些值,否则就无法成功排序它们。

不确定 WHERE 子句中的 h 应该引用什么,但除此之外它似乎对我有用。

richard=> SELECT * FROM t ORDER BY v;
      v      
-------------
 (1,0,0,"",)
 (1,1,0,"",)
 (1,2,0,a,1)
(3 rows)

richard=> SELECT * FROM t WHERE v < (1,1,1,'',null);
      v      
-------------
 (1,0,0,"",)
 (1,1,0,"",)
(2 rows)

类型转换机制需要两次通过才能隐式解决这种情况。使用显式转换之一:

where version < (1,2,3,'h'::text,1)
-- or
where version < (1,2,3,'h',1)::semanticversion
-- or
where version < '(1,2,3,h,1)'::semanticversion