diff options
author | aidarsamer <aidarsamer@ydb.tech> | 2023-04-04 14:48:11 +0300 |
---|---|---|
committer | aidarsamer <aidarsamer@ydb.tech> | 2023-04-04 14:48:11 +0300 |
commit | 2b8c0531462af1575ad27e634bc6c3febc7a73d1 (patch) | |
tree | b8b212afc326ce3073fa5df5594f7c534a490d62 | |
parent | 32830aa8b6342ef94dd825f029f2c5d3340c6344 (diff) | |
download | ydb-2b8c0531462af1575ad27e634bc6c3febc7a73d1.tar.gz |
Always use scan query for column shards. Add fail to data query reads from column shards.
-rw-r--r-- | ydb/core/kqp/executer_actor/kqp_data_executer.cpp | 18 | ||||
-rw-r--r-- | ydb/core/kqp/host/kqp_host.cpp | 4 | ||||
-rw-r--r-- | ydb/core/kqp/provider/yql_kikimr_gateway.h | 4 | ||||
-rw-r--r-- | ydb/core/kqp/ut/olap/kqp_olap_ut.cpp | 112 |
4 files changed, 132 insertions, 6 deletions
diff --git a/ydb/core/kqp/executer_actor/kqp_data_executer.cpp b/ydb/core/kqp/executer_actor/kqp_data_executer.cpp index 69f0bf5c152..37a6c2a25f2 100644 --- a/ydb/core/kqp/executer_actor/kqp_data_executer.cpp +++ b/ydb/core/kqp/executer_actor/kqp_data_executer.cpp @@ -1334,7 +1334,6 @@ private: Y_VERIFY_DEBUG(stageInfo.Meta.TablePath == op.GetTable().GetPath()); auto columns = BuildKqpColumns(op, table); switch (op.GetTypeCase()) { - case NKqpProto::TKqpPhyTableOperation::kReadOlapRange: case NKqpProto::TKqpPhyTableOperation::kReadRanges: case NKqpProto::TKqpPhyTableOperation::kReadRange: case NKqpProto::TKqpPhyTableOperation::kLookup: { @@ -1438,6 +1437,11 @@ private: break; } + case NKqpProto::TKqpPhyTableOperation::kReadOlapRange: { + YQL_ENSURE(false, "The previous check did not work! Data query read does not support column shard tables." << Endl + << this->DebugString()); + } + default: { YQL_ENSURE(false, "Unexpected table operation: " << (ui32) op.GetTypeCase() << Endl << this->DebugString()); @@ -1676,6 +1680,18 @@ private: } } + for (auto& op : stage.GetTableOps()) { + if (op.GetTypeCase() == NKqpProto::TKqpPhyTableOperation::kReadOlapRange + && tx.Body->GetType() == NKqpProto::TKqpPhyTx::TYPE_DATA) + { + auto error = TStringBuilder() << "Data query read does not support column shard tables."; + LOG_E(error); + ReplyErrorAndDie(Ydb::StatusIds::PRECONDITION_FAILED, + YqlIssue({}, NYql::TIssuesIds::KIKIMR_PRECONDITION_FAILED, error)); + return; + } + } + LOG_D("Stage " << stageInfo.Id << " AST: " << stage.GetProgramAst()); if (stage.SourcesSize() > 0) { diff --git a/ydb/core/kqp/host/kqp_host.cpp b/ydb/core/kqp/host/kqp_host.cpp index 24cd0f8ce99..32858840b19 100644 --- a/ydb/core/kqp/host/kqp_host.cpp +++ b/ydb/core/kqp/host/kqp_host.cpp @@ -816,8 +816,8 @@ private: for (const auto& operation : queryBlock.Operations()) { auto& tableData = SessionCtx->Tables().ExistingTable(operation.Cluster(), operation.Table()); - if (!tableData.Metadata->SysView.empty()) { - // Always use ScanQuery for queries with system tables. + if (tableData.Metadata->IsOlap() || !tableData.Metadata->SysView.empty()) { + // Always use ScanQuery for queries with OLAP and system tables. return true; } } diff --git a/ydb/core/kqp/provider/yql_kikimr_gateway.h b/ydb/core/kqp/provider/yql_kikimr_gateway.h index d9f5e7d5279..464e6e638ae 100644 --- a/ydb/core/kqp/provider/yql_kikimr_gateway.h +++ b/ydb/core/kqp/provider/yql_kikimr_gateway.h @@ -450,6 +450,10 @@ struct TKikimrTableMetadata : public TThrRefBase { } return {nullptr, TIndexDescription::EIndexState::Invalid}; } + + bool IsOlap() const { + return Kind == EKikimrTableKind::Olap; + } }; struct TCreateUserSettings { diff --git a/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp b/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp index 20678157d7b..62041b9d870 100644 --- a/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp +++ b/ydb/core/kqp/ut/olap/kqp_olap_ut.cpp @@ -762,7 +762,7 @@ Y_UNIT_TEST_SUITE(KqpOlap) { session.Close(); } - Y_UNIT_TEST(QueryOltpAndOlap) { + Y_UNIT_TEST(ScanQueryOltpAndOlap) { auto settings = TKikimrSettings() .SetWithSampleTables(false); TKikimrRunner kikimr(settings); @@ -794,6 +794,36 @@ Y_UNIT_TEST_SUITE(KqpOlap) { } } + Y_UNIT_TEST(YqlScriptOltpAndOlap) { + auto settings = TKikimrSettings() + .SetWithSampleTables(false); + TKikimrRunner kikimr(settings); + + // EnableDebugLogging(kikimr); + + TLocalHelper(kikimr).CreateTestOlapTable(); + WriteTestData(kikimr, "/Root/olapStore/olapTable", 0, 1000000, 3); + + CreateSampleOltpTable(kikimr); + + { + NScripting::TScriptingClient client(kikimr.GetDriver()); + auto it = client.ExecuteYqlScript(R"( + --!syntax_v1 + + SELECT a.`resource_id`, a.`timestamp`, t.* + FROM `/Root/OltpTable` AS t + JOIN `/Root/olapStore/olapTable` AS a ON CAST(t.Key AS Utf8) = a.resource_id + ORDER BY a.`resource_id`, a.`timestamp` + )").GetValueSync(); + + UNIT_ASSERT_C(it.IsSuccess(), it.GetIssues().ToString()); + TString result = FormatResultSetYson(it.GetResultSet(0)); + Cout << result << Endl; + CompareYson(result, R"([[[1u];["Value-001"];["1"];["1"];1000001u];[[2u];["Value-002"];["2"];["2"];1000002u]])"); + } + } + Y_UNIT_TEST(EmptyRange) { auto settings = TKikimrSettings() .SetWithSampleTables(false); @@ -3920,8 +3950,10 @@ Y_UNIT_TEST_SUITE(KqpOlap) { } Y_UNIT_TEST(OlapDeleteImmediate) { - TPortManager pm; + // Should be fixed in KIKIMR-17582 + return; + TPortManager pm; ui32 grpcPort = pm.GetPort(); ui32 msgbPort = pm.GetPort(); @@ -3974,8 +4006,10 @@ Y_UNIT_TEST_SUITE(KqpOlap) { } Y_UNIT_TEST(OlapDeleteImmediatePK) { - TPortManager pm; + // Should be fixed in KIKIMR-17582 + return; + TPortManager pm; ui32 grpcPort = pm.GetPort(); ui32 msgbPort = pm.GetPort(); @@ -4276,6 +4310,78 @@ Y_UNIT_TEST_SUITE(KqpOlap) { TestTableWithNulls({ testCase }); } + + Y_UNIT_TEST(OlapRead_FailsOnDataQuery) { + auto settings = TKikimrSettings() + .SetWithSampleTables(false) + .SetEnableOlapSchemaOperations(true); + TKikimrRunner kikimr(settings); + + EnableDebugLogging(kikimr); + TTableWithNullsHelper(kikimr).CreateTableWithNulls(); + TLocalHelper(kikimr).CreateTestOlapTable(); + + auto tableClient = kikimr.GetTableClient(); + + { + WriteTestDataForTableWithNulls(kikimr, "/Root/tableWithNulls"); + WriteTestData(kikimr, "/Root/olapStore/olapTable", 0, 1000000, 2); + } + + auto session = tableClient.CreateSession().GetValueSync().GetSession(); + + auto result = session.ExecuteDataQuery(R"( + SELECT * FROM `/Root/tableWithNulls`; + )", TTxControl::BeginTx().CommitTx()).GetValueSync(); + + UNIT_ASSERT_C(!result.IsSuccess(), result.GetIssues().ToString()); + } + + Y_UNIT_TEST(OlapRead_UsesScanOnJoin) { + auto settings = TKikimrSettings() + .SetWithSampleTables(false) + .SetEnableOlapSchemaOperations(true); + TKikimrRunner kikimr(settings); + + EnableDebugLogging(kikimr); + TTableWithNullsHelper(kikimr).CreateTableWithNulls(); + TLocalHelper(kikimr).CreateTestOlapTable(); + + { + WriteTestDataForTableWithNulls(kikimr, "/Root/tableWithNulls"); + WriteTestData(kikimr, "/Root/olapStore/olapTable", 0, 1000000, 2); + } + + NScripting::TScriptingClient client(kikimr.GetDriver()); + auto result = client.ExecuteYqlScript(R"( + SELECT * FROM `/Root/olapStore/olapTable` WHERE resource_id IN (SELECT CAST(id AS Utf8) FROM `/Root/tableWithNulls`); + )").GetValueSync(); + + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } + + Y_UNIT_TEST(OlapRead_UsesScanOnJoinWithDataShardTable) { + auto settings = TKikimrSettings() + .SetWithSampleTables(false) + .SetEnableOlapSchemaOperations(true); + TKikimrRunner kikimr(settings); + + EnableDebugLogging(kikimr); + TTableWithNullsHelper(kikimr).CreateTableWithNulls(); + TLocalHelper(kikimr).CreateTestOlapTable(); + + { + WriteTestDataForTableWithNulls(kikimr, "/Root/tableWithNulls"); + WriteTestData(kikimr, "/Root/olapStore/olapTable", 0, 1000000, 2); + } + + NScripting::TScriptingClient client(kikimr.GetDriver()); + auto result = client.ExecuteYqlScript(R"( + SELECT * FROM `/Root/olapStore/olapTable` WHERE resource_id IN (SELECT CAST(id AS Utf8) FROM `/Root/tableWithNulls`); + )").GetValueSync(); + + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } } } // namespace NKqp |