Я изучаю, как создавать совокупные расширения C и использовать libpqxx с C++ на стороне клиента для обработки данных.
У моего игрушечного агрегатного расширения есть один аргумент типа bytea
, а состояние также имеет тип bytea
. Ниже приведен самый простой пример моей проблемы:
Сторона сервера:
PG_FUNCTION_INFO_V1( simple_func );
Datum simple_func( PG_FUNCTION_ARGS ){
bytea *new_state = (bytea *) palloc( 128 + VARHDRSZ );
memset(new_state, 0, 128 + VARHDRSZ );
SET_VARSIZE( new_state,128 + VARHDRSZ );
PG_RETURN_BYTEA_P( new_state );
}
Сторона клиента:
std::basic_string< std::byte > buffer;
pqxx::connection c{"postgresql://user:simplepassword@localhost/contrib_regression"};
pqxx::work w(c);
c.prepare( "simple_func", "SELECT simple_func( $1 ) FROM table" );
pqxx::result r = w.exec_prepared( "simple_func", buffer );
for (auto row: r){
cout << " Result Size: " << row[ "simple_func" ].size() << endl;
cout << "Raw Result Data: ";
for( int jj=0; jj < row[ "simple_func" ].size(); jj++ ) printf( "%02" PRIx8, (uint8_t) row[ "simple_func" ].c_str()[jj] ) ;
cout << endl;
}
Результат на стороне клиента печатает:
Result Size: 258
Raw Result Data: 5c783030303030303030303030303030...
Где шаблон 30
повторяется до конца строки, а напечатанная строка в шестнадцатеричном формате составляет 512 байт.
Я ожидал получить массив длиной 128 байт, где каждый байт равен нулю. Что я делаю не так?
Версия libpqxx — 7.2, а PostgreSQL 12 — в Ubuntu 20.04.
Дополнение
Установка оператора расширения sql;
CREATE OR REPLACE FUNCTION agg_simple_func( state bytea, arg1 bytea)
RETURNS bytea
AS '$libdir/agg_simple_func'
LANGUAGE C IMMUTABLE STRICT;
CREATE OR REPLACE AGGREGATE simple_func( arg1 bytea)
(
sfunc = agg_simple_func,
stype = bytea,
initcond = "\xFFFF"
);