@@ -344,10 +344,60 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) {
344
344
{
345
345
const auto creationResult = session.ExecuteSchemeQuery (creationQuery).GetValueSync ();
346
346
UNIT_ASSERT (!creationResult.IsSuccess ());
347
- UNIT_ASSERT (creationResult.GetIssues ().ToString (). Contains ( " error: path exist, request accepts it" ) );
347
+ UNIT_ASSERT_STRING_CONTAINS (creationResult.GetIssues ().ToString (), " error: path exist, request accepts it" );
348
348
}
349
349
}
350
350
351
+ Y_UNIT_TEST (CreateViewOccupiedName) {
352
+ TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
353
+ EnableViewsFeatureFlag (kikimr);
354
+ auto session = kikimr.GetQueryClient ().GetSession ().ExtractValueSync ().GetSession ();
355
+
356
+ constexpr const char * path = " table" ;
357
+
358
+ const TString createTable = std::format (R"(
359
+ CREATE TABLE {} (key Int32, value Utf8, PRIMARY KEY (key));
360
+ )" , path
361
+ );
362
+ ExecuteQuery (session, createTable);
363
+
364
+ auto checkError = [&session](const TString& query, const TString& expectedError) {
365
+ const auto result = session.ExecuteQuery (query, NQuery::TTxControl::NoTx ()).ExtractValueSync ();
366
+ UNIT_ASSERT (!result.IsSuccess ());
367
+ UNIT_ASSERT_STRING_CONTAINS (result.GetIssues ().ToString (), expectedError);
368
+ };
369
+
370
+ const TString queryTemplate = std::format (R"(
371
+ CREATE VIEW {{}}{} WITH (security_invoker = true) AS SELECT 1;
372
+ )" , path
373
+ );
374
+ const TString expectedError = std::format (" path: '/Root/{}', error: unexpected path type" , path);
375
+
376
+ for (std::string existenceCheck : {" " , " IF NOT EXISTS " }) {
377
+ const TString createView = std::vformat (queryTemplate, std::make_format_args (existenceCheck));
378
+ checkError (createView, expectedError);
379
+ }
380
+ }
381
+
382
+ Y_UNIT_TEST (CreateViewIfNotExists) {
383
+ TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
384
+ EnableViewsFeatureFlag (kikimr);
385
+ auto session = kikimr.GetQueryClient ().GetSession ().ExtractValueSync ().GetSession ();
386
+
387
+ constexpr const char * path = " /Root/TheView" ;
388
+ constexpr const char * queryInView = " SELECT 1" ;
389
+
390
+ const TString creationQuery = std::format (R"(
391
+ CREATE VIEW IF NOT EXISTS `{}` WITH (security_invoker = true) AS {};
392
+ )" ,
393
+ path,
394
+ queryInView
395
+ );
396
+ ExecuteQuery (session, creationQuery);
397
+ // an attempt to create a duplicate does not produce an error
398
+ ExecuteQuery (session, creationQuery);
399
+ }
400
+
351
401
Y_UNIT_TEST (DropView) {
352
402
TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
353
403
EnableViewsFeatureFlag (kikimr);
@@ -399,6 +449,42 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) {
399
449
UNIT_ASSERT_STRING_CONTAINS (dropResult.GetIssues ().ToString (), " Error: Views are disabled" );
400
450
}
401
451
452
+ Y_UNIT_TEST (DropNonexistingView) {
453
+ TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
454
+ EnableViewsFeatureFlag (kikimr);
455
+ auto session = kikimr.GetQueryClient ().GetSession ().ExtractValueSync ().GetSession ();
456
+
457
+ const auto dropResult = session.ExecuteQuery (
458
+ " DROP VIEW NonexistingView;" , NQuery::TTxControl::NoTx ()
459
+ ).ExtractValueSync ();
460
+
461
+ UNIT_ASSERT (!dropResult.IsSuccess ());
462
+ UNIT_ASSERT_STRING_CONTAINS (dropResult.GetIssues ().ToString (), " Error: Path does not exist" );
463
+ }
464
+
465
+ Y_UNIT_TEST (CallDropViewOnTable) {
466
+ TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
467
+ EnableViewsFeatureFlag (kikimr);
468
+ auto session = kikimr.GetQueryClient ().GetSession ().ExtractValueSync ().GetSession ();
469
+
470
+ constexpr const char * path = " table" ;
471
+
472
+ const TString createTable = std::format (R"(
473
+ CREATE TABLE {} (key Int32, value Utf8, PRIMARY KEY (key));
474
+ )" , path
475
+ );
476
+ ExecuteQuery (session, createTable);
477
+
478
+ auto checkError = [&session](const TString& query, const TString& expectedError) {
479
+ const auto result = session.ExecuteQuery (query, NQuery::TTxControl::NoTx ()).ExtractValueSync ();
480
+ UNIT_ASSERT (!result.IsSuccess ());
481
+ UNIT_ASSERT_STRING_CONTAINS (result.GetIssues ().ToString (), expectedError);
482
+ };
483
+ const TString expectedError = std::format (" path: '/Root/{}', error: path is not a view" , path);
484
+ checkError (std::format (" DROP VIEW {};" , path), expectedError);
485
+ checkError (std::format (" DROP VIEW IF EXISTS {};" , path), expectedError);
486
+ }
487
+
402
488
Y_UNIT_TEST (DropSameViewTwice) {
403
489
TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
404
490
EnableViewsFeatureFlag (kikimr);
@@ -424,10 +510,36 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) {
424
510
{
425
511
const auto dropResult = session.ExecuteSchemeQuery (dropQuery).GetValueSync ();
426
512
UNIT_ASSERT (!dropResult.IsSuccess ());
427
- UNIT_ASSERT (dropResult.GetIssues ().ToString (). Contains ( " Error: Path does not exist" ) );
513
+ UNIT_ASSERT_STRING_CONTAINS (dropResult.GetIssues ().ToString (), " Error: Path does not exist" );
428
514
}
429
515
}
430
516
517
+ Y_UNIT_TEST (DropViewIfExists) {
518
+ TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
519
+ EnableViewsFeatureFlag (kikimr);
520
+ auto session = kikimr.GetQueryClient ().GetSession ().ExtractValueSync ().GetSession ();
521
+
522
+ constexpr const char * path = " /Root/TheView" ;
523
+ constexpr const char * queryInView = " SELECT 1" ;
524
+
525
+ const TString creationQuery = std::format (R"(
526
+ CREATE VIEW `{}` WITH (security_invoker = true) AS {};
527
+ )" ,
528
+ path,
529
+ queryInView
530
+ );
531
+ ExecuteQuery (session, creationQuery);
532
+
533
+ const TString dropQuery = std::format (R"(
534
+ DROP VIEW IF EXISTS `{}`;
535
+ )" ,
536
+ path
537
+ );
538
+ ExecuteQuery (session, dropQuery);
539
+ // an attempt to drop an already deleted view does not produce an error
540
+ ExecuteQuery (session, dropQuery);
541
+ }
542
+
431
543
Y_UNIT_TEST (DropViewInFolder) {
432
544
TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
433
545
EnableViewsFeatureFlag (kikimr);
0 commit comments