diff options
author | Andrey Neporada <neporada@gmail.com> | 2022-06-20 14:19:02 +0300 |
---|---|---|
committer | Andrey Neporada <neporada@gmail.com> | 2022-06-20 14:19:02 +0300 |
commit | 1d8096cb186a7cd8bb3553b1a8670e8f09da875a (patch) | |
tree | 9d6ddcacd423b13f0af4c00f0b6688460e1cfefe | |
parent | 6f0b74127774647a2c866a3583e4468f8e0f1232 (diff) | |
download | ydb-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.md | 14 | ||||
-rw-r--r-- | ydb/docs/ru/core/yql/reference/yql-core/syntax/_includes/select/union_all.md | 12 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/context.cpp | 1 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/context.h | 1 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql.cpp | 4 | ||||
-rw-r--r-- | ydb/library/yql/sql/v1/sql_ut.cpp | 8 |
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) { |