void select()

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);
		}
	}