@@ -60,17 +60,25 @@ void ExecuteDataDefinitionQuery(TSession& session, const TString& script) {
60
60
<< script << " \n The issues:\n " << result.GetIssues ().ToString ());
61
61
}
62
62
63
- TDataQueryResult ExecuteDataModificationQuery (TSession& session, const TString& script) {
63
+ TDataQueryResult ExecuteDataModificationQuery (TSession& session,
64
+ const TString& script,
65
+ const TExecDataQuerySettings& settings = {}
66
+ ) {
64
67
const auto result = session.ExecuteDataQuery (
65
68
script,
66
- TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx ()
69
+ TTxControl::BeginTx (TTxSettings::SerializableRW ()).CommitTx (),
70
+ settings
67
71
).ExtractValueSync ();
68
72
UNIT_ASSERT_C (result.IsSuccess (), " Failed to execute the following DML script:\n "
69
73
<< script << " \n The issues:\n " << result.GetIssues ().ToString ());
70
74
71
75
return result;
72
76
}
73
77
78
+ TString GetYsonResults (TSession& session, const TString& query, const TExecDataQuerySettings& settings = {}) {
79
+ return FormatResultSetYson (ExecuteDataModificationQuery (session, query, settings).GetResultSet (0 ));
80
+ }
81
+
74
82
void CompareResults (const TDataQueryResult& first, const TDataQueryResult& second) {
75
83
const auto & firstResults = first.GetResultSets ();
76
84
const auto & secondResults = second.GetResultSets ();
@@ -89,7 +97,7 @@ void InitializeTablesAndSecondaryViews(TSession& session) {
89
97
90
98
}
91
99
92
- Y_UNIT_TEST_SUITE (TKQPViewTest ) {
100
+ Y_UNIT_TEST_SUITE (TCreateAndDropViewTest ) {
93
101
94
102
Y_UNIT_TEST (CheckCreatedView) {
95
103
TKikimrRunner kikimr (TKikimrSettings ().SetWithSampleTables (false ));
@@ -377,3 +385,82 @@ Y_UNIT_TEST_SUITE(TSelectFromViewTest) {
377
385
}
378
386
}
379
387
}
388
+
389
+ Y_UNIT_TEST_SUITE (TEvaluateExprInViewTest) {
390
+
391
+ Y_UNIT_TEST (EvaluateExpr) {
392
+ TKikimrRunner kikimr;
393
+ EnableViewsFeatureFlag (kikimr);
394
+ auto session = kikimr.GetTableClient ().CreateSession ().GetValueSync ().GetSession ();
395
+
396
+ constexpr const char * viewName = " TheView" ;
397
+ constexpr const char * timeQuery = R"(
398
+ SELECT EvaluateExpr(CurrentUtcTimestamp())
399
+ )" ;
400
+
401
+ const TString creationQuery = std::format (R"(
402
+ CREATE VIEW {} WITH (security_invoker = TRUE) AS {};
403
+ )" ,
404
+ viewName,
405
+ timeQuery
406
+ );
407
+ ExecuteDataDefinitionQuery (session, creationQuery);
408
+
409
+ const TString selectFromViewQuery = std::format (R"(
410
+ SELECT * FROM {};
411
+ )" ,
412
+ viewName
413
+ );
414
+ TExecDataQuerySettings queryExecutionSettings;
415
+ queryExecutionSettings.KeepInQueryCache (true );
416
+ const auto executeTwice = [&](const TString& query) {
417
+ return TVector<TString>{
418
+ GetYsonResults (session, query, queryExecutionSettings),
419
+ GetYsonResults (session, query, queryExecutionSettings)
420
+ };
421
+ };
422
+ const auto viewResults = executeTwice (selectFromViewQuery);
423
+ const auto etalonResults = executeTwice (timeQuery);
424
+ UNIT_ASSERT_EQUAL_C (viewResults[0 ] < viewResults[1 ], etalonResults[0 ] < etalonResults[1 ],
425
+ TStringBuilder ()
426
+ << " \n Query cache works differently for EvaluateExpr written (1) in a view versus (2) in a plain SELECT statement.\n "
427
+ << " (1) SELECT from view results: (first call) " << viewResults[0 ] << " , (second call) " << viewResults[1 ]
428
+ << " (2) SELECT EvaluateExpr(...) results: (first call) " << etalonResults[0 ] << " , (second call) " << etalonResults[1 ] << " \n "
429
+ );
430
+ }
431
+
432
+ Y_UNIT_TEST (NakedCallToCurrentTimeFunction) {
433
+ TKikimrRunner kikimr;
434
+ EnableViewsFeatureFlag (kikimr);
435
+ auto session = kikimr.GetTableClient ().CreateSession ().GetValueSync ().GetSession ();
436
+
437
+ constexpr const char * viewName = " TheView" ;
438
+ constexpr const char * timeQuery = R"(
439
+ SELECT CurrentUtcTimestamp()
440
+ )" ;
441
+
442
+ const TString creationQuery = std::format (R"(
443
+ CREATE VIEW {} WITH (security_invoker = TRUE) AS {};
444
+ )" ,
445
+ viewName,
446
+ timeQuery
447
+ );
448
+ ExecuteDataDefinitionQuery (session, creationQuery);
449
+
450
+ const TString selectFromViewQuery = std::format (R"(
451
+ SELECT * FROM {};
452
+ )" ,
453
+ viewName
454
+ );
455
+ TExecDataQuerySettings queryExecutionSettings;
456
+ queryExecutionSettings.KeepInQueryCache (true );
457
+ const auto executeTwice = [&](const TString& query) {
458
+ return TVector<TString>{
459
+ GetYsonResults (session, query, queryExecutionSettings),
460
+ GetYsonResults (session, query, queryExecutionSettings)
461
+ };
462
+ };
463
+ const auto viewResults = executeTwice (selectFromViewQuery);
464
+ UNIT_ASSERT_LT (viewResults[0 ], viewResults[1 ]);
465
+ }
466
+ }
0 commit comments