2016-08-13 24 views
2

Npgsql(v。3.1.7)を使用してタプルを取得しようとすると、さまざまな結果が得られます。Npgsqlはどのような種類のタプルをサポートしていますか?

整数のタプルは大丈夫動作するようです:

SELECT (1, 2) 

これは、整数1と2

を含むオブジェクトの配列を返しますが、他のデータ型で、私は障害の様々なタイプを取得します:

これにより
SELECT (1, 'two') 

、私はテキストでNpgsqlExceptionを取得。


SELECT (1, 2, 'three') 

同じことが、今回は、不明なメッセージ・コードは101です。これはASCII値が'e'で、末尾に'f'を付けると('threef')、コードは102になります。


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

Iは整数1、2、3を含むオブジェクトの配列を取得し、この時、及び1718580594.この最後は0x666F7572あります。 0x66,0x6F,0x75および0x72は、'f','o','u'および'r'のASCII値である。


SELECT ('one', 2) 

これは最終的にタイムアウトハングと。 1点で


(データセットを充填する際にも再現性)のExecuteReaderを使用して、私は内側のEndOfStreamExceptionとNpgsqlExceptionを得たが、私はそのいずれかに掲示する簡単なREPROを見つけることができません。


これらはNpgsqlのバグですか、何か間違っていますか?

答えて

1

これらはNpgsqlのバグです。これらのケースはすべて実際には1つのバグに由来する可能性があります。 http://github.com/npgsql/npgsqlでこれらの問題を開けてください。

レコードの場合、PostgreSQL用語集SELECT (1, 2)は配列を返さず、レコードを返します。配列は、SELECT '{1, 2}'::INTEGER[]で返すことができる別のデータ型です。

+0

ありがとう、シェイ、。はい、私はタプル/レコード対Postgresの配列の違いを理解していますが、 'SELECT(1,2)での最初のテストからオブジェクト配列が返されたので、オブジェクト配列はNpgsqlがPostgreSQLのタプルを表すために使う型です私には合理的です。 –

+0

Shayに通知するために、この問題を修正したプルリクエストを提出します –

+0

この修正は、テストケースと実際の使用事例で機能します。ありがとう、シェイとサミ! –

2

はい、Npgsqlソースです。私はそれを使ってデバッグしました。かなり面白いバグがあります。 Npgsqlは、タプルアイテムタイプをintと読み込みますが、マッパータイプはuintsと想定しています。 オブジェクトのインデクサもあります。です。これがコードの先頭です。これにより、すべてがintとして読み取られるようになります。

Npgsqlにパッチを提出しますが、何らかの理由でそれを修正したい場合は、TypeHandlers \ RecordHandlerに移動してください。CS、メソッド読む(オブジェクト[]結果アウト)と(現在のdevのブランチ86)は、この行を修正:

var typeOID = _readBuf.ReadUInt32(); 

を、それがこの問題の原因ReadInt32()を持っている現在の源で。

私はこれを修正した後、GetValue()を使用し、ints、textsなどでオブジェクト配列を取得することができました。

+1

さて、私はそれを自分で修正しました:)実際の問題が開かれるのを待っていて、これをコミットします。 –

関連する問題