use pgwire::api::portal::Portal;
use pgwire::api::results::{DescribePortalResponse, DescribeResponse, DescribeStatementResponse};
use pgwire::api::stmt::StoredStatement;
use pgwire::api::{ClientInfo, Type};
use pgwire::error::PgWireResult;
use super::super::core::NodeDbPgHandler;
use super::statement::ParsedStatement;
impl NodeDbPgHandler {
pub(crate) async fn describe_statement_impl<C>(
&self,
_client: &mut C,
target: &StoredStatement<ParsedStatement>,
) -> PgWireResult<DescribeStatementResponse>
where
C: ClientInfo + Unpin + Send + Sync,
{
let stmt = &target.statement;
let max_len = stmt.param_types.len().max(target.parameter_types.len());
let param_types: Vec<Type> = (0..max_len)
.map(|i| {
let client = target.parameter_types.get(i).and_then(|t| t.clone());
let server = stmt.param_types.get(i).and_then(|t| t.clone());
client.or(server).unwrap_or(Type::UNKNOWN)
})
.collect();
if stmt.result_fields.is_empty() {
Ok(DescribeStatementResponse::new(param_types, vec![]))
} else {
Ok(DescribeStatementResponse::new(
param_types,
stmt.result_fields.clone(),
))
}
}
pub(crate) async fn describe_portal_impl<C>(
&self,
_client: &mut C,
target: &Portal<ParsedStatement>,
) -> PgWireResult<DescribePortalResponse>
where
C: ClientInfo + Unpin + Send + Sync,
{
let stmt = &target.statement.statement;
if stmt.result_fields.is_empty() {
return Ok(DescribePortalResponse::no_data());
}
Ok(DescribePortalResponse::new(stmt.result_fields.clone()))
}
}