in c/driver/postgresql/statement.cc [183:260]
AdbcStatusCode SetParamTypes(const PostgresTypeResolver& type_resolver,
struct AdbcError* error) {
param_types.resize(bind_schema->n_children);
param_values.resize(bind_schema->n_children);
param_lengths.resize(bind_schema->n_children);
param_formats.resize(bind_schema->n_children, kPgBinaryFormat);
param_values_offsets.reserve(bind_schema->n_children);
for (size_t i = 0; i < bind_schema_fields.size(); i++) {
PostgresTypeId type_id;
switch (bind_schema_fields[i].type) {
case ArrowType::NANOARROW_TYPE_INT8:
case ArrowType::NANOARROW_TYPE_INT16:
type_id = PostgresTypeId::kInt2;
param_lengths[i] = 2;
break;
case ArrowType::NANOARROW_TYPE_INT32:
type_id = PostgresTypeId::kInt4;
param_lengths[i] = 4;
break;
case ArrowType::NANOARROW_TYPE_INT64:
type_id = PostgresTypeId::kInt8;
param_lengths[i] = 8;
break;
case ArrowType::NANOARROW_TYPE_FLOAT:
type_id = PostgresTypeId::kFloat4;
param_lengths[i] = 4;
break;
case ArrowType::NANOARROW_TYPE_DOUBLE:
type_id = PostgresTypeId::kFloat8;
param_lengths[i] = 8;
break;
case ArrowType::NANOARROW_TYPE_STRING:
type_id = PostgresTypeId::kText;
param_lengths[i] = 0;
break;
case ArrowType::NANOARROW_TYPE_BINARY:
type_id = PostgresTypeId::kBytea;
param_lengths[i] = 0;
break;
case ArrowType::NANOARROW_TYPE_DATE32:
type_id = PostgresTypeId::kDate;
param_lengths[i] = 4;
break;
case ArrowType::NANOARROW_TYPE_TIMESTAMP:
type_id = PostgresTypeId::kTimestamp;
param_lengths[i] = 8;
break;
case ArrowType::NANOARROW_TYPE_INTERVAL_MONTH_DAY_NANO:
type_id = PostgresTypeId::kInterval;
param_lengths[i] = 16;
break;
default:
SetError(error, "%s%" PRIu64 "%s%s%s%s", "[libpq] Field #",
static_cast<uint64_t>(i + 1), " ('", bind_schema->children[i]->name,
"') has unsupported parameter type ",
ArrowTypeString(bind_schema_fields[i].type));
return ADBC_STATUS_NOT_IMPLEMENTED;
}
param_types[i] = type_resolver.GetOID(type_id);
if (param_types[i] == 0) {
SetError(error, "%s%" PRIu64 "%s%s%s%s", "[libpq] Field #",
static_cast<uint64_t>(i + 1), " ('", bind_schema->children[i]->name,
"') has type with no corresponding PostgreSQL type ",
ArrowTypeString(bind_schema_fields[i].type));
return ADBC_STATUS_NOT_IMPLEMENTED;
}
}
size_t param_values_length = 0;
for (int length : param_lengths) {
param_values_offsets.push_back(param_values_length);
param_values_length += length;
}
param_values_buffer.resize(param_values_length);
return ADBC_STATUS_OK;
}