From 2e6044313aa5bd125a1a953b4ef36837a2686025 Mon Sep 17 00:00:00 2001 From: Andrei Rykov Date: Wed, 26 Jun 2024 11:23:10 +0200 Subject: [PATCH] json query transaction mode (#5574) --- ydb/core/viewer/json_query.h | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/ydb/core/viewer/json_query.h b/ydb/core/viewer/json_query.h index 4d4c7d101fa2..b0f47f135ffb 100644 --- a/ydb/core/viewer/json_query.h +++ b/ydb/core/viewer/json_query.h @@ -39,6 +39,7 @@ class TJsonQuery : public TViewerPipeClient { TString Stats; TString Syntax; TString QueryId; + TString TransactionMode; bool Direct = false; bool IsBase64Encode = true; @@ -82,6 +83,7 @@ class TJsonQuery : public TViewerPipeClient { Schema = StringToSchemaType(schemaStr); Syntax = params.Get("syntax"); QueryId = params.Get("query_id"); + TransactionMode = params.Get("transaction_mode"); Direct = FromStringWithDefault(params.Get("direct"), Direct); IsBase64Encode = FromStringWithDefault(params.Get("base64"), true); } @@ -97,6 +99,7 @@ class TJsonQuery : public TViewerPipeClient { Action = Action.empty() ? requestData["action"].GetStringSafe({}) : Action; Syntax = Syntax.empty() ? requestData["syntax"].GetStringSafe({}) : Syntax; QueryId = QueryId.empty() ? requestData["query_id"].GetStringSafe({}) : QueryId; + TransactionMode = TransactionMode.empty() ? requestData["transaction_mode"].GetStringSafe({}) : TransactionMode; } return success; } @@ -202,6 +205,22 @@ class TJsonQuery : public TViewerPipeClient { Send(NKqp::MakeKqpProxyID(SelfId().NodeId()), event.release()); } + void SetTransactionMode(NKikimrKqp::TQueryRequest& request) { + if (TransactionMode == "serializable-read-write") { + request.mutable_txcontrol()->mutable_begin_tx()->mutable_serializable_read_write(); + request.mutable_txcontrol()->set_commit_tx(true); + } else if (TransactionMode == "online-read-only") { + request.mutable_txcontrol()->mutable_begin_tx()->mutable_online_read_only(); + request.mutable_txcontrol()->set_commit_tx(true); + } else if (TransactionMode == "stale-read-only") { + request.mutable_txcontrol()->mutable_begin_tx()->mutable_stale_read_only(); + request.mutable_txcontrol()->set_commit_tx(true); + } else if (TransactionMode == "snapshot-read-only") { + request.mutable_txcontrol()->mutable_begin_tx()->mutable_snapshot_read_only(); + request.mutable_txcontrol()->set_commit_tx(true); + } + } + void HandleReply(NKqp::TEvKqp::TEvCreateSessionResponse::TPtr& ev) { if (ev->Get()->Record.GetYdbStatus() != Ydb::StatusIds::SUCCESS) { return ReplyAndPassAway( @@ -236,6 +255,7 @@ class TJsonQuery : public TViewerPipeClient { request.SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE); request.SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY); request.SetKeepSession(false); + SetTransactionMode(request); } else if (Action == "explain-query") { request.SetAction(NKikimrKqp::QUERY_ACTION_EXPLAIN); request.SetType(NKikimrKqp::QUERY_TYPE_SQL_GENERIC_QUERY); @@ -247,9 +267,8 @@ class TJsonQuery : public TViewerPipeClient { } else if (Action == "execute-data") { request.SetAction(NKikimrKqp::QUERY_ACTION_EXECUTE); request.SetType(NKikimrKqp::QUERY_TYPE_SQL_DML); - request.mutable_txcontrol()->mutable_begin_tx()->mutable_serializable_read_write(); - request.mutable_txcontrol()->set_commit_tx(true); request.SetKeepSession(false); + SetTransactionMode(request); } else if (Action == "explain" || Action == "explain-ast" || Action == "explain-data") { request.SetAction(NKikimrKqp::QUERY_ACTION_EXPLAIN); request.SetType(NKikimrKqp::QUERY_TYPE_SQL_DML); @@ -685,6 +704,17 @@ YAML::Node TJsonRequestSwagger::GetSwagger() { type: string enum: [profile, full] required: false + - name: transaction_mode + in: query + description: > + transaction mode: + * `serializable-read-write` + * `online-read-only` + * `stale-read-only` + * `snapshot-read-only` + type: string + enum: [serializable-read-write, online-read-only, stale-read-only, snapshot-read-only] + required: false - name: direct in: query description: force processing query on current node