aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrey Neporada <neporada@gmail.com>2022-06-20 14:19:02 +0300
committerAndrey Neporada <neporada@gmail.com>2022-06-20 14:19:02 +0300
commit1d8096cb186a7cd8bb3553b1a8670e8f09da875a (patch)
tree9d6ddcacd423b13f0af4c00f0b6688460e1cfefe
parent6f0b74127774647a2c866a3583e4468f8e0f1232 (diff)
downloadydb-1d8096cb186a7cd8bb3553b1a8670e8f09da875a.tar.gz
[YQL-15024] Deprecate pragma DisableAnsiOrderByLimitInUnionAll
ref:b9e2bdd137704fc5c22bf90c30cea36df1f0b994
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/pragma/global.md14
-rw-r--r--ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md12
-rw-r--r--ydb/library/yql/sql/v1/context.cpp1
-rw-r--r--ydb/library/yql/sql/v1/context.h1
-rw-r--r--ydb/library/yql/sql/v1/sql.cpp4
-rw-r--r--ydb/library/yql/sql/v1/sql_ut.cpp8
6 files changed, 22 insertions, 18 deletions
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/pragma/global.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/pragma/global.md
index d58559066c..079887fd09 100644
--- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/pragma/global.md
+++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/pragma/global.md
@@ -135,20 +135,6 @@ StrictJoinKeyTypes является [scoped](#pragmascope) настройкой.
Разница состоит в трактовке `CURRENT ROW`. В режиме `ROWS` `CURRENT ROW` трактуется буквально – текущая строка в партиции.
А в режиме `RANGE` конец рамки `CURRENT ROW` означает "последняя строка в партиции с ключом сортировки, равным текущей строке".
-### AnsiOrderByLimitInUnionAll
-
-| Тип значения | По умолчанию |
-| --- | --- |
-| Флаг | false |
-
-Приводит поведение UNION ALL в соответствие со стандартом при наличии `ORDER BY/LIMIT/DISCARD/INSERT INTO` в объединяемых подзапросах. А именно:
-* `ORDER BY/LIMIT/INSERT INTO` допускается только после последнего подзапроса;
-* `DISCARD` допускается только перед первым подзапросом;
-* указанные операторы действуют на результат `UNION ALL` (в отличии от текущего поведения, когда они действуют на подзапрос);
-* чтобы применить оператор к подзапросу, подзапрос необходимо взять в скобки.
-
-Явным образом выбрать старое поведению можно указав прагму `DisableAnsiOrderByLimitInUnionAll`. Если никакой прагмы не задано, то выдается предупреждение и работает старый вариант.
-
### OrderedColumns {#orderedcolumns}
`OrderedColumns` / `DisableOrderedColumns`
diff --git a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md
index dc5c00e685..c7f2ee31e8 100644
--- a/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md
+++ b/ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md
@@ -19,6 +19,12 @@
Порядок выходных колонок в этом режиме совпадает с порядком колонок первого входа.
+При наличии `ORDER BY/LIMIT/DISCARD/INTO RESULT` в объединяемых подзапросах применяются следующие правила:
+* `ORDER BY/LIMIT/INTO RESULT` допускается только после последнего подзапроса;
+* `DISCARD` допускается только перед первым подзапросом;
+* указанные операторы действуют на результат `UNION ALL` а на не подзапрос;
+* чтобы применить оператор к подзапросу, подзапрос необходимо взять в скобки.
+
**Примеры**
``` yql
@@ -40,6 +46,12 @@ UNION ALL
SELECT * FROM AS_TABLE([<|x:3, y:4|>]); -- ошибка: порядок колонок в AS_TABLE не определен
```
+``` yql
+SELECT * FROM T1
+UNION ALL
+(SELECT * FROM T2 ORDER BY key LIMIT 100); -- при отсутствии скобок ORDER BY/LIMIT применится к результату всего UNION ALL
+```
+
{% if feature_mapreduce %}
{% note warning "Внимание" %}
diff --git a/ydb/library/yql/sql/v1/context.cpp b/ydb/library/yql/sql/v1/context.cpp
index 1512ae5452..a46d7e3fcc 100644
--- a/ydb/library/yql/sql/v1/context.cpp
+++ b/ydb/library/yql/sql/v1/context.cpp
@@ -55,6 +55,7 @@ THashMap<TStringBuf, TPragmaField> CTX_PRAGMA_FIELDS = {
{"FlexibleTypes", &TContext::FlexibleTypes},
{"AnsiCurrentRow", &TContext::AnsiCurrentRow},
{"EmitStartsWith", &TContext::EmitStartsWith},
+ {"EnforceAnsiOrderByLimitInUnionAll", &TContext::EnforceAnsiOrderByLimitInUnionAll},
};
typedef TMaybe<bool> TContext::*TPragmaMaybeField;
diff --git a/ydb/library/yql/sql/v1/context.h b/ydb/library/yql/sql/v1/context.h
index f4bd15847e..e3e9a3caf7 100644
--- a/ydb/library/yql/sql/v1/context.h
+++ b/ydb/library/yql/sql/v1/context.h
@@ -248,6 +248,7 @@ namespace NSQLTranslationV1 {
TMaybe<bool> AnsiInForEmptyOrNullableItemsCollections;
TMaybe<bool> AnsiRankForNullableKeys = true;
TMaybe<bool> AnsiOrderByLimitInUnionAll = true;
+ bool EnforceAnsiOrderByLimitInUnionAll = false;
const bool AnsiQuotedIdentifiers;
bool AnsiOptionalAs = true;
bool OrderedColumns = false;
diff --git a/ydb/library/yql/sql/v1/sql.cpp b/ydb/library/yql/sql/v1/sql.cpp
index 8792f57f7c..d1b9efb359 100644
--- a/ydb/library/yql/sql/v1/sql.cpp
+++ b/ydb/library/yql/sql/v1/sql.cpp
@@ -9629,8 +9629,10 @@ TNodePtr TSqlQuery::PragmaStatement(const TRule_pragma_stmt& stmt, bool& success
} else if (normalizedPragma == "ansiorderbylimitinunionall") {
Ctx.AnsiOrderByLimitInUnionAll = true;
Ctx.IncrementMonCounter("sql_pragma", "AnsiOrderByLimitInUnionAll");
- } else if (normalizedPragma == "disableansiorderbylimitinunionall") {
+ } else if (!Ctx.EnforceAnsiOrderByLimitInUnionAll && normalizedPragma == "disableansiorderbylimitinunionall") {
Ctx.AnsiOrderByLimitInUnionAll = false;
+ Ctx.Warning(Ctx.Pos(), TIssuesIds::YQL_DEPRECATED_PRAGMA)
+ << "Use of deprecated DisableAnsiOrderByLimitInUnionAll pragma. It will be dropped soon";
Ctx.IncrementMonCounter("sql_pragma", "DisableAnsiOrderByLimitInUnionAll");
} else if (normalizedPragma == "ansioptionalas") {
Ctx.AnsiOptionalAs = true;
diff --git a/ydb/library/yql/sql/v1/sql_ut.cpp b/ydb/library/yql/sql/v1/sql_ut.cpp
index 986daff1d5..ad6d427cdd 100644
--- a/ydb/library/yql/sql/v1/sql_ut.cpp
+++ b/ydb/library/yql/sql/v1/sql_ut.cpp
@@ -1241,7 +1241,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
auto res = SqlToYql(req);
UNIT_ASSERT(res.Root);
- UNIT_ASSERT_NO_DIFF(Err2Str(res), "");
+ UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:8: Warning: Use of deprecated DisableAnsiOrderByLimitInUnionAll pragma. It will be dropped soon, code: 4518\n");
}
Y_UNIT_TEST(WarnUnionAllWithDiscardIntoResultWithExplicitLegacyMode) {
@@ -1254,7 +1254,8 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
auto res = SqlToYql(req);
UNIT_ASSERT(res.Root);
- UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:4:21: Warning: INTO RESULT will be ignored here. Please use INTO RESULT after last subquery in UNION ALL if you want label entire UNION ALL result, code: 4522\n"
+ UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:2:8: Warning: Use of deprecated DisableAnsiOrderByLimitInUnionAll pragma. It will be dropped soon, code: 4518\n"
+ "<main>:4:21: Warning: INTO RESULT will be ignored here. Please use INTO RESULT after last subquery in UNION ALL if you want label entire UNION ALL result, code: 4522\n"
"<main>:6:1: Warning: DISCARD will be ignored here. Please use DISCARD before first subquery in UNION ALL if you want to discard entire UNION ALL result, code: 4522\n");
}
@@ -1269,7 +1270,8 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
");";
auto res = SqlToYql(req);
UNIT_ASSERT(res.Root);
- UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:7:3: Warning: ORDER BY without LIMIT in subquery will be ignored, code: 4504\n");
+ UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:2:8: Warning: Use of deprecated DisableAnsiOrderByLimitInUnionAll pragma. It will be dropped soon, code: 4518\n"
+ "<main>:7:3: Warning: ORDER BY without LIMIT in subquery will be ignored, code: 4504\n");
}
Y_UNIT_TEST(ReduceUsingUdfWithShortcutsWorks) {