@@ -143,9 +143,12 @@ Y_UNIT_TEST_SUITE(KqpS3PlanTest) {
143
143
UNIT_ASSERT (NJson::ReadJsonTree (*queryResult.GetStats ()->GetPlan (), &plan));
144
144
145
145
const auto & writeStagePlan = plan[" Plan" ][" Plans" ][0 ][" Plans" ][0 ];
146
- UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Node Type" ].GetStringSafe (), " Stage-Sink" );
147
- UNIT_ASSERT (writeStagePlan[" Operators" ].GetArraySafe ().size () >= 1 );
148
- const auto & sinkOp = writeStagePlan[" Operators" ].GetArraySafe ()[0 ];
146
+ UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Node Type" ].GetStringSafe (), " Stage" );
147
+
148
+ const auto & sinkPlan = plan[" Plan" ][" Plans" ][0 ];
149
+ UNIT_ASSERT_VALUES_EQUAL (sinkPlan[" Node Type" ].GetStringSafe (), " Sink" );
150
+ UNIT_ASSERT (sinkPlan[" Operators" ].GetArraySafe ().size () >= 1 );
151
+ const auto & sinkOp = sinkPlan[" Operators" ].GetArraySafe ()[0 ];
149
152
UNIT_ASSERT_VALUES_EQUAL (sinkOp[" ExternalDataSource" ].GetStringSafe (), " write_data_source" );
150
153
UNIT_ASSERT_VALUES_EQUAL (sinkOp[" Compression" ].GetStringSafe (), " gzip" );
151
154
@@ -218,13 +221,100 @@ Y_UNIT_TEST_SUITE(KqpS3PlanTest) {
218
221
UNIT_ASSERT (NJson::ReadJsonTree (*queryResult.GetStats ()->GetPlan (), &plan));
219
222
220
223
const auto & writeStagePlan = plan[" Plan" ][" Plans" ][0 ][" Plans" ][0 ];
221
- UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Node Type" ].GetStringSafe (), " Stage-Sink " );
224
+ UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Node Type" ].GetStringSafe (), " Stage" );
222
225
UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Stats" ][" Tasks" ], 1 );
223
226
227
+ const auto & sinkPlan = plan[" Plan" ][" Plans" ][0 ];
228
+ UNIT_ASSERT_VALUES_EQUAL (sinkPlan[" Node Type" ].GetStringSafe (), " Sink" );
229
+ UNIT_ASSERT (sinkPlan[" Operators" ].GetArraySafe ().size () >= 1 );
230
+ const auto & sinkOp = sinkPlan[" Operators" ].GetArraySafe ()[0 ];
231
+ UNIT_ASSERT_VALUES_EQUAL (sinkOp[" Name" ].GetStringSafe (), " FillTable" );
232
+ UNIT_ASSERT_VALUES_EQUAL (sinkOp[" Table" ].GetStringSafe (), " result_table" );
233
+
224
234
const auto & readStagePlan = plan[" Plan" ][" Plans" ][0 ][" Plans" ][0 ][" Plans" ][0 ][" Plans" ][0 ];
225
235
UNIT_ASSERT_VALUES_EQUAL (readStagePlan[" Node Type" ].GetStringSafe (), " Stage" );
226
236
UNIT_ASSERT_VALUES_EQUAL (readStagePlan[" Stats" ][" Tasks" ], 1 );
227
237
}
238
+
239
+ Y_UNIT_TEST (S3Insert) {
240
+ {
241
+ Aws::S3::S3Client s3Client = MakeS3Client ();
242
+ CreateBucket (" test_insert" , s3Client);
243
+ }
244
+
245
+ NKikimrConfig::TAppConfig appConfig;
246
+ appConfig.MutableTableServiceConfig ()->SetEnableOltpSink (true );
247
+ appConfig.MutableTableServiceConfig ()->SetEnableOlapSink (true );
248
+ appConfig.MutableTableServiceConfig ()->SetEnableCreateTableAs (true );
249
+ auto kikimr = NTestUtils::MakeKikimrRunner (appConfig);
250
+
251
+ auto tc = kikimr->GetTableClient ();
252
+ auto session = tc.CreateSession ().GetValueSync ().GetSession ();
253
+ {
254
+ const TString query = fmt::format (R"sql(
255
+ CREATE EXTERNAL DATA SOURCE insert_data_sink WITH (
256
+ SOURCE_TYPE="ObjectStorage",
257
+ LOCATION="{insert_location}",
258
+ AUTH_METHOD="NONE"
259
+ );
260
+ )sql" ,
261
+ " insert_location" _a = GetBucketLocation (" test_insert" )
262
+ );
263
+ auto result = session.ExecuteSchemeQuery (query).GetValueSync ();
264
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
265
+ }
266
+
267
+ auto queryClient = kikimr->GetQueryClient ();
268
+ {
269
+ const TString query = R"sql(
270
+ CREATE TABLE olap_source (
271
+ PRIMARY KEY (data)
272
+ ) WITH (STORE = COLUMN)
273
+ AS SELECT * FROM AS_TABLE([
274
+ <|data: "test_data"|>
275
+ ]);
276
+ )sql" ;
277
+ auto result = queryClient.ExecuteQuery (query, TTxControl::NoTx ()).GetValueSync ();
278
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), NYdb::EStatus::SUCCESS, result.GetIssues ().ToString ());
279
+ }
280
+
281
+ const TString sql = R"sql(
282
+ PRAGMA ydb.OverridePlanner = @@ [
283
+ { "tx": 0, "stage": 0, "tasks": 42 }
284
+ ] @@;
285
+
286
+ INSERT INTO insert_data_sink.`/test/`
287
+ WITH (FORMAT = "parquet")
288
+ SELECT * FROM olap_source
289
+ )sql" ;
290
+
291
+ TExecuteQueryResult queryResult = queryClient.ExecuteQuery (
292
+ sql,
293
+ TTxControl::NoTx (),
294
+ TExecuteQuerySettings ().StatsMode (EStatsMode::Full)).GetValueSync ();
295
+
296
+ UNIT_ASSERT_VALUES_EQUAL_C (queryResult.GetStatus (), NYdb::EStatus::SUCCESS, queryResult.GetIssues ().ToString ());
297
+ UNIT_ASSERT (queryResult.GetStats ());
298
+ UNIT_ASSERT (queryResult.GetStats ()->GetPlan ());
299
+ Cerr << " Plan: " << *queryResult.GetStats ()->GetPlan () << Endl;
300
+ NJson::TJsonValue plan;
301
+ UNIT_ASSERT (NJson::ReadJsonTree (*queryResult.GetStats ()->GetPlan (), &plan));
302
+
303
+ const auto & writeStagePlan = plan[" Plan" ][" Plans" ][0 ][" Plans" ][0 ];
304
+ UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Node Type" ].GetStringSafe (), " Stage" );
305
+ UNIT_ASSERT_VALUES_EQUAL (writeStagePlan[" Stats" ][" Tasks" ], 42 );
306
+
307
+ const auto & sinkPlan = plan[" Plan" ][" Plans" ][0 ];
308
+ UNIT_ASSERT_VALUES_EQUAL (sinkPlan[" Node Type" ].GetStringSafe (), " Sink" );
309
+ UNIT_ASSERT (sinkPlan[" Operators" ].GetArraySafe ().size () >= 1 );
310
+ const auto & sinkOp = sinkPlan[" Operators" ].GetArraySafe ()[0 ];
311
+ UNIT_ASSERT_VALUES_EQUAL (sinkOp[" ExternalDataSource" ].GetStringSafe (), " insert_data_sink" );
312
+ UNIT_ASSERT_VALUES_EQUAL (sinkOp[" Extension" ].GetStringSafe (), " .parquet" );
313
+
314
+ const auto & readStagePlan = plan[" Plan" ][" Plans" ][0 ][" Plans" ][0 ][" Plans" ][0 ][" Plans" ][0 ];
315
+ UNIT_ASSERT_VALUES_EQUAL (readStagePlan[" Node Type" ].GetStringSafe (), " TableFullScan" );
316
+ UNIT_ASSERT_VALUES_EQUAL (readStagePlan[" Stats" ][" Tasks" ], 42 );
317
+ }
228
318
}
229
319
230
320
} // namespace NKikimr::NKqp
0 commit comments