Npgsql支持哪些类型的元组?



当尝试使用Npgsql (v. 3.1.7)检索元组时,我得到了各种结果。

整数元组似乎可以工作:

SELECT (1, 2)

返回一个包含整数1和2的对象数组。

但是对于其他数据类型,我得到不同类型的失败:


SELECT (1, 'two')

有了这个,我得到一个NpgsqlException与文本Unknown message code: 0


SELECT (1, 2, 'three')

同样的事情,但这一次,未知的消息代码是101。这是'e'的ASCII值,如果我在末尾加上'f' ('threef'),那么代码就是102


SELECT (1, 2, 3, 'four')

这次我得到一个对象数组,其中包含整数1、2、3和1718580594。最后一个是0x666F7572。"0x66"、"0x6F"、"0x75"、"0x72"分别为'f''o''u''r'的ASCII值。


SELECT ('one', 2)

挂起并最终超时。


在使用ExecuteReader时(在填充数据集时也可重现),我得到了一个带有内部EndOfStreamException的NpgsqlException,但我找不到一个简单的重现来发布。


这些只是bug在Npgsql,还是我做错了什么?

是的,这是一个但是在Npgsql源代码。我通过它调试,有一个相当有趣的错误。Npgsql读取元组项类型为int ,但类型映射器期望int 。它还有一个对象的索引器,这就是代码的引导。这会导致它尝试将所有内容读取为整型。

我会提交一个补丁到Npgsql,但如果你想修复它自己的某种原因,只是去TypeHandlersRecordHandler.cs,方法读取(出对象[]结果)和修复这一行(86在当前的开发分支):

var typeOID = _readBuf.ReadUInt32();

在当前源代码中,ReadInt32()导致了这个问题。

在我修复了这个问题后,我可以使用GetValue()并获得一个对象数组与int,文本等,但我想。

这些都是Npgsql中的bug——实际上很可能所有这些情况都源于一个bug。你能在http://github.com/npgsql/npgsql上为这些打开一个问题吗?

对于记录,在PostgreSQL中SELECT (1, 2)不是返回一个数组,而是返回一个记录。数组是可以用SELECT '{1, 2}'::INTEGER[]返回的另一种数据类型。

最新更新