2016-08-13 2 views
2

Я получаю различные результаты при попытке получить кортежи с использованием Npgsql (v. 3.1.7).Какие кортежи поддерживает Npgsql?

Кортеж целых чисел, кажется, работает хорошо:

SELECT (1, 2) 

Это возвращает массив объектов, содержащий целые числа 1 и 2.

Но с другими типами данных, я получаю варьируя типы отказов:


SELECT (1, 'two') 

с этим, я получаю NpgsqlException с текстом Unknown message code: 0.


SELECT (1, 2, 'three') 

То же самое, но на этот раз, неизвестный код сообщение 101. Это значение ASCII 'e', и если я привяжу 'f' к концу ('threef'), то код 102.


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

На этот раз я получить массив объектов, содержащий целые числа 1, 2, 3, и 1718580594. Это последнее 0x666F7572. 0x66, 0x6F, 0x75 и 0x72 - значения ASCII 'f', 'o', 'u' и 'r'.


SELECT ('one', 2) 

Это виснет и в конце концов таймаут.


В каком-то момент при использовании ExecuteReader (также воспроизводимого при заполнении набора данных), я получил NpgsqlException с внутренним EndOfStreamException, но я не могу найти простое репро размещать для того.


Это просто ошибки в Npgsql, или я делаю что-то неправильно?

ответ

1

Это ошибки в Npgsql - вероятно, все эти случаи связаны с одной ошибкой на самом деле. Не могли бы вы открыть для них вопрос на http://github.com/npgsql/npgsql?

Для записи в языке PostgreSQL SELECT (1, 2) не возвращает массив, он возвращает запись. Массив - это другой тип данных, который можно вернуть с помощью SELECT '{1, 2}'::INTEGER[].

+0

сделаю, спасибо, Shay. Да, я понимаю различие между строками/записью и массивом в Postgres, но поскольку мой первый тест с 'SELECT (1, 2)' возвратил массив объектов, я предположил, что массивы объектов являются типом Npgsql, используемым для представления кортежей PostgreSQL, что кажется разумный для меня. –

+0

Я отправлю запрос на перенос, исправляющий эту проблему, просто чтобы уведомить Shay –

+0

Исправление работает для моих тестовых случаев и для моего фактического использования. Спасибо, Шей и Сами! –

2

Да, это источник в Npgsql. Я отлаживал это, и есть довольно интересная ошибка. Npgsql читает типы элементов кортежа как ints, но тип mapper ожидает uints. Он также имеет индекс для объектов, и здесь код ведет. Это заставляет его пытаться читать все как ints.

Я отправлю патч в Npgsql, но если вы по какой-то причине исправите его, просто перейдите к TypeHandlers \ RecordHandler.CS, метод чтения (из объекта [] результат) и исправить эту линию (86 в текущей ветви DEV):

var typeOID = _readBuf.ReadUInt32(); 

В источнике тока он имеет ReadInt32(), который вызывает эту проблему.

После того как я исправил это, я мог бы использовать GetValue() и получить массив объектов с ints, тексты и т. Д., Но я хотел.

+1

Молодец, я только что исправил его сам :) Я жду, когда откроется реальная проблема, и сделаю это. –

Смежные вопросы