aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraidarsamer <aidarsamer@ydb.tech>2023-04-04 14:48:11 +0300
committeraidarsamer <aidarsamer@ydb.tech>2023-04-04 14:48:11 +0300
commit2b8c0531462af1575ad27e634bc6c3febc7a73d1 (patch)
treeb8b212afc326ce3073fa5df5594f7c534a490d62
parent32830aa8b6342ef94dd825f029f2c5d3340c6344 (diff)
downloadydb-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.cpp18
-rw-r--r--ydb/core/kqp/host/kqp_host.cpp4
-rw-r--r--ydb/core/kqp/provider/yql_kikimr_gateway.h4
-rw-r--r--ydb/core/kqp/ut/olap/kqp_olap_ut.cpp112
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