Skip to content

Commit c715192

Browse files
committed
Return virtual timestamp for scan query (#14001)
1 parent f5eea22 commit c715192

File tree

4 files changed

+22
-2
lines changed

4 files changed

+22
-2
lines changed

include/ydb-cpp-sdk/client/table/table.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2063,6 +2063,8 @@ class TReadTableSnapshot {
20632063
uint64_t TxId_;
20642064
};
20652065

2066+
using TVirtualTimestamp = TReadTableSnapshot;
2067+
20662068
template<typename TPart>
20672069
class TSimpleStreamPart : public TStreamPartStatus {
20682070
public:
@@ -2117,6 +2119,10 @@ class TScanQueryPart : public TStreamPartStatus {
21172119
const std::string& GetDiagnostics() const { return *Diagnostics_; }
21182120
std::string&& ExtractDiagnostics() { return std::move(*Diagnostics_); }
21192121

2122+
bool HasVirtualTimestamp() const { return Vt_.has_value(); }
2123+
const TVirtualTimestamp& GetVirtualTimestamp() const { return *Vt_; }
2124+
TVirtualTimestamp&& ExtractVirtualTimestamp() { return std::move(*Vt_); }
2125+
21202126
TScanQueryPart(TStatus&& status)
21212127
: TStreamPartStatus(std::move(status))
21222128
{}
@@ -2127,17 +2133,20 @@ class TScanQueryPart : public TStreamPartStatus {
21272133
, Diagnostics_(diagnostics)
21282134
{}
21292135

2130-
TScanQueryPart(TStatus&& status, TResultSet&& resultSet, const std::optional<TQueryStats>& queryStats, const std::optional<std::string>& diagnostics)
2136+
TScanQueryPart(TStatus&& status, TResultSet&& resultSet, const std::optional<TQueryStats>& queryStats,
2137+
const std::optional<std::string>& diagnostics, std::optional<TVirtualTimestamp>&& vt)
21312138
: TStreamPartStatus(std::move(status))
21322139
, ResultSet_(std::move(resultSet))
21332140
, QueryStats_(queryStats)
21342141
, Diagnostics_(diagnostics)
2142+
, Vt_(std::move(vt))
21352143
{}
21362144

21372145
private:
21382146
std::optional<TResultSet> ResultSet_;
21392147
std::optional<TQueryStats> QueryStats_;
21402148
std::optional<std::string> Diagnostics_;
2149+
std::optional<TVirtualTimestamp> Vt_;
21412150
};
21422151

21432152
using TAsyncScanQueryPart = NThreading::TFuture<TScanQueryPart>;

src/api/protos/ydb_query.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ option java_outer_classname = "QueryProtos";
88
import "google/protobuf/duration.proto";
99

1010
import "src/api/protos/annotations/validation.proto";
11+
import "src/api/protos/ydb_common.proto";
1112
import "src/api/protos/ydb_issue_message.proto";
1213
import "src/api/protos/ydb_operation.proto";
1314
import "src/api/protos/ydb_query_stats.proto";
@@ -200,6 +201,7 @@ message ExecuteQueryResponsePart {
200201
Ydb.TableStats.QueryStats exec_stats = 5;
201202

202203
TransactionMeta tx_meta = 6;
204+
VirtualTimestamp snapshot_timestamp = 7;
203205
}
204206

205207
message ExecuteScriptRequest {

src/api/protos/ydb_table.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,8 @@ message ExecuteScanQueryPartialResult {
12931293
// works only in mode: MODE_EXPLAIN,
12941294
// collects additional diagnostics about query compilation, including query plan and scheme
12951295
string query_full_diagnostics = 7 [deprecated = true];
1296+
// Optional snapshot that corresponds to the returned data
1297+
VirtualTimestamp snapshot = 8;
12961298
}
12971299

12981300
// Returns information about an external data source with a given path.

src/client/table/impl/readers.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,16 @@ TAsyncScanQueryPart TScanQueryPartIterator::TReaderImpl::ReadNext(std::shared_pt
8989

9090
diagnostics = self->Response_.result().query_full_diagnostics();
9191

92+
std::optional<TVirtualTimestamp> vt;
93+
94+
if (self->Response_.result().has_snapshot()) {
95+
const auto& snap = self->Response_.result().snapshot();
96+
vt = TVirtualTimestamp(snap.plan_step(), snap.tx_id());
97+
}
98+
9299
if (self->Response_.result().has_result_set()) {
93100
promise.SetValue({std::move(status),
94-
TResultSet(std::move(*self->Response_.mutable_result()->mutable_result_set())), queryStats, diagnostics});
101+
TResultSet(std::move(*self->Response_.mutable_result()->mutable_result_set())), queryStats, diagnostics, std::move(vt)});
95102
} else {
96103
promise.SetValue({std::move(status), queryStats, diagnostics});
97104
}

0 commit comments

Comments
 (0)