in src/afs.cc [1870:1929]
void select()
{
const char* tag = "select";
pgstat_report_activity(STATE_RUNNING, (std::string(Tag) + ": selecting").c_str());
auto session = find_session();
SharedSessionReleaser sessionReleaser(sessions_, session);
if (!DsaPointerIsValid(session->selectQuery))
{
set_error_message(
session,
std::string(Tag) + ": " + tag_ + ": " + tag + ": query is missing",
tag);
return;
}
std::string query;
{
ProcessorLockGuard lock(this);
query =
static_cast<const char*>(dsa_get_address(area_, session->selectQuery));
dsa_free(area_, session->selectQuery);
session->selectQuery = InvalidDsaPointer;
}
P("%s: %s: %s: %s", Tag, tag_, tag, query.c_str());
{
ScopedTransaction scopedTransaction;
ScopedSnapshot scopedSnapshot;
SetCurrentStatementStartTimestamp();
SPI_connect();
needFinish_ = true;
auto result = SPI_execute(query.c_str(), true, 0);
if (result > 0)
{
pgstat_report_activity(
STATE_RUNNING, (std::string(Tag) + ": " + tag + ": writing").c_str());
auto status = write_record_batches(tag);
if (!status.ok())
{
set_error_message(session,
std::string(Tag) + ": " + tag_ + ": " + tag +
": failed to write: " + status.ToString(),
tag);
}
}
else
{
set_error_message(session,
std::string(Tag) + ": " + tag_ + ": " + tag +
": failed to run a query: <" + query +
">: " + SPI_result_code_string(result),
tag);
}
SPI_finish();
needFinish_ = false;
signal_server(tag);
}
}