Skip to content

Commit a42e7b6

Browse files
authored
Merge branch 'ydb-platform:main' into fuse_shuffle_by_keys
2 parents 8ea0192 + 457b2b4 commit a42e7b6

File tree

85 files changed

+830
-351
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

85 files changed

+830
-351
lines changed

ydb/core/fq/libs/actors/database_resolver.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,10 +478,12 @@ class TDatabaseResolver: public TActor<TDatabaseResolver>
478478
continue;
479479
}
480480

481+
const auto& servicesArray = hostMap.at("services").GetArraySafe();
482+
481483
// check if all services of a particular host are alive
482484
const bool alive = std::all_of(
483-
hostMap.at("services").GetArraySafe().begin(),
484-
hostMap.at("services").GetArraySafe().end(),
485+
servicesArray.begin(),
486+
servicesArray.end(),
485487
[](const auto& service) {
486488
return service["health"].GetString() == "ALIVE";
487489
}

ydb/core/fq/libs/config/protos/control_plane_storage.proto

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,15 @@ message TQueryMapping {
2424

2525
// 1. StatusCode(s) are handled with defined policies, non-unique StatusCode(s) across all policies is UB
2626
// 2. RetryCount and RetryPeriodMs are used to calculate actual RetryRate, if it exceeds RetryCount, query is aborted
27+
// - Number of retries during RetryPeriod time less than 2 * RetryCount due to RetryRate
2728
// 3. BackoffPeriodMs is factor of RetryRate to delay query execution before next retry
28-
// 4. There are no default retry policy, all unhandled statuses are fatal
29+
// 4. RetryLimit is hard limit for amount query retry count, after that query is aborted
30+
// - If RetryLimit = 0, query can be abborted only by RetryRate
31+
// 5. There are no default retry policy, all unhandled statuses are fatal
2932

3033
message TRetryPolicy {
3134
uint64 RetryCount = 1;
35+
uint64 RetryLimit = 4;
3236
string RetryPeriod = 2;
3337
string BackoffPeriod = 3;
3438
}

ydb/core/fq/libs/control_plane_storage/config.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,11 @@ TControlPlaneStorageConfig::TControlPlaneStorageConfig(const NConfig::TControlPl
5050
for (const auto& mapping : Proto.GetRetryPolicyMapping()) {
5151
auto& retryPolicy = mapping.GetPolicy();
5252
auto retryCount = retryPolicy.GetRetryCount();
53+
auto retryLimit = retryPolicy.GetRetryLimit();
5354
auto retryPeriod = GetDuration(retryPolicy.GetRetryPeriod(), TDuration::Hours(1));
5455
auto backoffPeriod = GetDuration(retryPolicy.GetBackoffPeriod(), TDuration::Zero());
5556
for (const auto statusCode: mapping.GetStatusCode()) {
56-
RetryPolicies.emplace(statusCode, TRetryPolicyItem(retryCount, retryPeriod, backoffPeriod));
57+
RetryPolicies.emplace(statusCode, TRetryPolicyItem(retryCount, retryLimit, retryPeriod, backoffPeriod));
5758
}
5859
}
5960

ydb/core/fq/libs/control_plane_storage/internal/task_ping.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ TPingTaskParams ConstructHardPingTask(
173173
internal.clear_operation_id();
174174
}
175175

176-
TRetryPolicyItem policy(0, TDuration::Seconds(1), TDuration::Zero());
176+
TRetryPolicyItem policy(0, 0, TDuration::Seconds(1), TDuration::Zero());
177177
auto it = retryPolicies.find(request.status_code());
178178
auto policyFound = it != retryPolicies.end();
179179
if (policyFound) {
@@ -200,7 +200,7 @@ TPingTaskParams ConstructHardPingTask(
200200
TStringBuilder builder;
201201
builder << "Query failed with code " << NYql::NDqProto::StatusIds_StatusCode_Name(request.status_code());
202202
if (policy.RetryCount) {
203-
builder << " (failure rate " << retryLimiter.RetryRate << " exceeds limit of " << policy.RetryCount << ")";
203+
builder << " (" << retryLimiter.LastError << ")";
204204
}
205205
builder << " at " << Now();
206206

ydb/core/fq/libs/control_plane_storage/util.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,16 @@ bool TRetryLimiter::UpdateOnRetry(const TInstant& lastSeenAt, const TRetryPolicy
2828
RetryRate = 0.0;
2929
}
3030
}
31-
bool shouldRetry = RetryRate < policy.RetryCount;
31+
32+
bool shouldRetry = true;
33+
if (RetryRate >= policy.RetryCount) {
34+
shouldRetry = false;
35+
LastError = TStringBuilder() << "failure rate " << RetryRate << " exceeds limit of " << policy.RetryCount;
36+
} else if (policy.RetryLimit && RetryCount >= policy.RetryLimit) {
37+
shouldRetry = false;
38+
LastError = TStringBuilder() << "retry count reached limit of " << policy.RetryLimit;
39+
}
40+
3241
if (shouldRetry) {
3342
RetryCount++;
3443
RetryCounterUpdatedAt = now;
@@ -145,6 +154,7 @@ NConfig::TControlPlaneStorageConfig FillDefaultParameters(NConfig::TControlPlane
145154
policyMapping.AddStatusCode(NYql::NDqProto::StatusIds::EXTERNAL_ERROR);
146155
auto& policy = *policyMapping.MutablePolicy();
147156
policy.SetRetryCount(10);
157+
policy.SetRetryLimit(40);
148158
policy.SetRetryPeriod("1m");
149159
policy.SetBackoffPeriod("1s");
150160
}

ydb/core/fq/libs/control_plane_storage/util.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ namespace NFq {
1515
class TRetryPolicyItem {
1616
public:
1717
TRetryPolicyItem() = default;
18-
TRetryPolicyItem(ui64 retryCount, const TDuration& retryPeriod, const TDuration& backoffPeriod)
19-
: RetryCount(retryCount), RetryPeriod(retryPeriod), BackoffPeriod(backoffPeriod)
18+
TRetryPolicyItem(ui64 retryCount, ui64 retryLimit, const TDuration& retryPeriod, const TDuration& backoffPeriod)
19+
: RetryCount(retryCount), RetryLimit(retryLimit), RetryPeriod(retryPeriod), BackoffPeriod(backoffPeriod)
2020
{ }
2121
ui64 RetryCount = 0;
22+
ui64 RetryLimit = 0;
2223
TDuration RetryPeriod = TDuration::Zero();
2324
TDuration BackoffPeriod = TDuration::Zero();
2425
};
@@ -32,6 +33,7 @@ class TRetryLimiter {
3233
ui64 RetryCount = 0;
3334
TInstant RetryCounterUpdatedAt = TInstant::Zero();
3435
double RetryRate = 0.0;
36+
TString LastError;
3537
};
3638

3739
bool IsTerminalStatus(FederatedQuery::QueryMeta::ComputeStatus status);

ydb/core/protos/tx_datashard.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,6 +1829,7 @@ message TEvApplyReplicationChangesResult {
18291829
REASON_SCHEME_ERROR = 2;
18301830
REASON_BAD_REQUEST = 3;
18311831
REASON_UNEXPECTED_ROW_OPERATION = 4;
1832+
REASON_OUTDATED_SCHEME = 6;
18321833
}
18331834

18341835
optional EStatus Status = 1;

ydb/core/tx/datashard/datashard_repl_apply.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ class TDataShard::TTxApplyReplicationChanges : public TTransactionBase<TDataShar
2727
if (Self->State != TShardState::Ready) {
2828
Result = MakeHolder<TEvDataShard::TEvApplyReplicationChangesResult>(
2929
NKikimrTxDataShard::TEvApplyReplicationChangesResult::STATUS_REJECTED,
30-
NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_WRONG_STATE);
30+
NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_WRONG_STATE,
31+
TStringBuilder() << "DataShard is not ready");
3132
return true;
3233
}
3334

3435
if (!Self->IsReplicated()) {
3536
Result = MakeHolder<TEvDataShard::TEvApplyReplicationChangesResult>(
3637
NKikimrTxDataShard::TEvApplyReplicationChangesResult::STATUS_REJECTED,
37-
NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_BAD_REQUEST);
38+
NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_BAD_REQUEST,
39+
TStringBuilder() << "Table is not replicated");
3840
return true;
3941
}
4042

@@ -65,7 +67,9 @@ class TDataShard::TTxApplyReplicationChanges : public TTransactionBase<TDataShar
6567
<< " and cannot apply changes for schema version " << tableId.GetSchemaVersion();
6668
Result = MakeHolder<TEvDataShard::TEvApplyReplicationChangesResult>(
6769
NKikimrTxDataShard::TEvApplyReplicationChangesResult::STATUS_REJECTED,
68-
NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_SCHEME_ERROR,
70+
tableId.GetSchemaVersion() < userTable.GetTableSchemaVersion()
71+
? NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_OUTDATED_SCHEME
72+
: NKikimrTxDataShard::TEvApplyReplicationChangesResult::REASON_SCHEME_ERROR,
6973
std::move(error));
7074
return true;
7175
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% if backend_name == "YDB" %}
2+
3+
{% note warning %}
4+
5+
{% include [OLAP_not_allow_text](not_allow_for_olap_text.md) %}
6+
7+
{% endnote %}
8+
9+
{% endif %}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Supported only for [row-oriented](../concepts/datamodel/table.md#row-oriented-tables) tables. Support for [column-oriented](../concepts/datamodel/table.md#column-oriented-tables) tables is currently under development.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
## Retrieving data with a Select {#query-processing}
22

3-
Retrieving data using a [`SELECT`](../../../../yql/reference/syntax/select.md) statement in [YQL](../../../../yql/reference/index.md). Handling the retrieved data selection in the app.
3+
Retrieving data using a [`SELECT`](../../../../yql/reference/syntax/select/index.md) statement in [YQL](../../../../yql/reference/index.md). Handling the retrieved data selection in the app.
44

ydb/docs/en/core/dev/yql-tutorial/select_all_columns.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Selecting data from all columns
22

3-
Select all columns from the table using [SELECT](../../yql/reference/syntax/select.md):
3+
Select all columns from the table using [SELECT](../../yql/reference/syntax/select/index.md):
44

55
{% include [yql-reference-prerequisites](_includes/yql_tutorial_prerequisites.md) %}
66

ydb/docs/en/core/reference/ydb-sdk/topic.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,14 @@ When you update a topic, you must specify the topic path and the parameters to b
200200

201201
- Python
202202

203-
This feature is under development.
203+
Example of updating a topic's list of supported codecs and minimum number of partitions:
204+
205+
```python
206+
driver.topic_client.create_topic(topic_path,
207+
set_supported_codecs=[ydb.TopicCodec.RAW, ydb.TopicCodec.GZIP], # optional
208+
set_min_active_partitions=3, # optional
209+
)
210+
```
204211

205212
- Java
206213

ydb/docs/en/core/yql/reference/yql-core/builtins/_includes/basic/evaluate_expr_atom.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## EvaluateExpr, EvaluateAtom {#evaluate_expr_atom}
22

3-
Evaluate an expression before the start of the main calculation and input its result to the query as a literal (constant). In many contexts, where only a constant would be expected in standard SQL (for example, in table names, in the number of rows in [LIMIT](../../../syntax/select.md#limit), and so on), this functionality is implicitly enabled automatically.
3+
Evaluate an expression before the start of the main calculation and input its result to the query as a literal (constant). In many contexts, where only a constant would be expected in standard SQL (for example, in table names, in the number of rows in [LIMIT](../../../syntax/select/limit_offset.md), and so on), this functionality is implicitly enabled automatically.
44

55
EvaluateExpr can be used where the grammar already expects an expression. For example, you can use it to:
66

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{% include [x](_includes/select/commit.md) %}

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/discard.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# DISCARD
22

3-
Calculates {% if select_command == "SELECT STREAM" %}[`SELECT STREAM`](../select_stream.md){% else %}[`SELECT`](../select.md){% endif %}{% if feature_mapreduce %}{% if reduce_command %}, [`{{ reduce_command }}`](../reduce.md){% endif %}, or [`{{ process_command }}`](../process.md){% endif %} without returning the result neither to the client or table. {% if feature_mapreduce %}You can't use it along with [INTO RESULT](../into_result.md).{% endif %}
3+
Calculates {% if select_command == "SELECT STREAM" %}[`SELECT STREAM`](../select_stream.md){% else %}[`SELECT`](../select/index.md){% endif %}{% if feature_mapreduce %}{% if reduce_command %}, [`{{ reduce_command }}`](../reduce.md){% endif %}, or [`{{ process_command }}`](../process.md){% endif %} without returning the result neither to the client or table. {% if feature_mapreduce %}You can't use it along with [INTO RESULT](../into_result.md).{% endif %}
44

55
It's good to combine it with [`Ensure`](../../builtins/basic.md#ensure) to check the final calculation result against the user's criteria.
66

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/expressions/lambda.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ List arguments in round brackets, following them by the arrow and lambda functio
66

77
The scope for the lambda body: first the local named expressions, then arguments, then named expressions defined above by the lambda function at the top level of the query.
88

9-
Only use pure expressions inside the lambda body (those might also be other lambdas, possibly passed through arguments). However, you can't use [SELECT](../../select.md), [INSERT INTO](../../insert_into.md), or other top-level expressions.
9+
Only use pure expressions inside the lambda body (those might also be other lambdas, possibly passed through arguments). However, you can't use [SELECT](../../select/index.md), [INSERT INTO](../../insert_into.md), or other top-level expressions.
1010

1111
One or more of the last lambda parameters can be marked with a question mark as optional: if they haven't been specified when calling lambda, they are assigned the `NULL` value.
1212

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/expressions/tables.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ A table expression is an expression that returns a table. Table expressions in Y
1010

1111
Semantics of a table expression depends on the context where it is used. In YQL, table expressions can be used in the following contexts:
1212

13-
* Table context: after [FROM](../../select.md#from).
13+
* Table context: after [FROM](../../select/from.md).
1414
In this case, table expressions work as expected: for example, `$input = SELECT a, b, c FROM T; SELECT * FROM $input` returns a table with three columns.
15-
The table context also occurs after [UNION ALL](../../select.md#unionall){% if feature_join %}, [JOIN](../../join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../../process.md#process), [REDUCE](../../reduce.md#reduce){% endif %};
15+
The table context also occurs after [UNION ALL](../../select/union.md#unionall){% if feature_join %}, [JOIN](../../join.md#join){% endif %}{% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../../process.md#process), [REDUCE](../../reduce.md#reduce){% endif %};
1616
* Vector context: after [IN](#in). In this context, the table expression must contain exactly one column (the name of this column doesn't affect the expression result in any way).
1717
A table expression in a vector context is typed as a list (the type of the list element is the same as the column type in this case). Example: `SELECT * FROM T WHERE key IN (SELECT k FROM T1)`;
1818
* A scalar context arises _in all the other cases_. As in a vector context, a table expression must contain exactly one column, but the value of the table expression is a scalar, that is, an arbitrarily selected value of this column (if no rows are returned, the result is `NULL`). Example: `$count = SELECT COUNT(*) FROM T; SELECT * FROM T ORDER BY key LIMIT $count / 2`;

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/group_by/distinct.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Applying [aggregate functions](../../../builtins/aggregation.md) only to distinc
44

55
{% note info %}
66

7-
Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, you can use a [subquery](../../select.md#from) or the expression `GROUP BY ... AS ...`.
7+
Applying `DISTINCT` to calculated values is not currently implemented. For this purpose, you can use a [subquery](../../select/from.md) or the expression `GROUP BY ... AS ...`.
88

99
{% endnote %}
1010

@@ -20,5 +20,5 @@ ORDER BY count DESC
2020
LIMIT 3;
2121
```
2222

23-
You can also use `DISTINCT` to fetch distinct rows using [`SELECT DISTINCT`](../../select.md#distinct).
23+
You can also use `DISTINCT` to fetch distinct rows using [`SELECT DISTINCT`](../../select/distinct.md).
2424

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/group_by/general.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ GROUP BY
6060

6161
{% note warning %}
6262

63-
Specifying a name for a column or expression in `GROUP BY .. AS foo` it is an extension on top of YQL. Such a name becomes visible in `WHERE` despite the fact that filtering by `WHERE` is executed [before](../../select.md#selectexec) the grouping. For example, if the `T` table includes two columns, `foo` and `bar`, then the query `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` would actually filter data by the `bar` column from the source table.
63+
Specifying a name for a column or expression in `GROUP BY .. AS foo` it is an extension on top of YQL. Such a name becomes visible in `WHERE` despite the fact that filtering by `WHERE` is executed [before](../../select/where.md) the grouping. For example, if the `T` table includes two columns, `foo` and `bar`, then the query `SELECT foo FROM T WHERE foo > 0 GROUP BY bar AS foo` would actually filter data by the `bar` column from the source table.
6464

6565
{% endnote %}
6666

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/group_by/having.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## HAVING {#having}
22

3-
Filtering a `SELECT` based on the calculation results of [aggregate functions](../../../builtins/aggregation.md). The syntax is similar to [WHERE](../../select.md#where).
3+
Filtering a `SELECT` based on the calculation results of [aggregate functions](../../../builtins/aggregation.md). The syntax is similar to [WHERE](../../select/where.md).
44

55
**Example**
66

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/into_result.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# INTO RESULT
22

3-
Lets you set a custom label for [SELECT](../select.md){% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../process.md), or [REDUCE](../reduce.md){% endif %}. It can't be used along with [DISCARD](../discard.md).
3+
Lets you set a custom label for [SELECT](../select/index.md){% if feature_mapreduce and process_command == "PROCESS" %}, [PROCESS](../process.md), or [REDUCE](../reduce.md){% endif %}. It can't be used along with [DISCARD](../discard.md).
44

55
**Examples:**
66

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/pragma/global.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
| --- | --- |
77
| Flag | false |
88

9-
Automatically run [COMMIT](../../select.md#commit) after every statement.
9+
Automatically run [COMMIT](../../commit.md) after every statement.
1010

1111
### TablePathPrefix {#table-path-prefix}
1212

@@ -75,7 +75,7 @@ When set to "auto", it enables a new compute engine. Computing is made, whenever
7575

7676
When you use `SELECT foo.* FROM ... AS foo`, remove the `foo.` prefix from the names of the result columns.
7777

78-
It can be also used with a [JOIN](../../join.md), but in this case it may fail in the case of a name conflict (that can be resolved by using [WITHOUT](../../select.md#without) and renaming columns). For JOIN in SimpleColumns mode, an implicit Coalesce is made for key columns: the query `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` in the SimpleColumns mode works same as `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`.
78+
It can be also used with a [JOIN](../../join.md), but in this case it may fail in the case of a name conflict (that can be resolved by using [WITHOUT](../../select/without.md) and renaming columns). For JOIN in SimpleColumns mode, an implicit Coalesce is made for key columns: the query `SELECT * FROM T1 AS a JOIN T2 AS b USING(key)` in the SimpleColumns mode works same as `SELECT a.key ?? b.key AS key, ... FROM T1 AS a JOIN T2 AS b USING(key)`.
7979

8080
### CoalesceJoinKeysOnQualifiedAll
8181

@@ -158,11 +158,11 @@ You can explicitly select the old behavior by using the `DisableAnsiOrderByLimit
158158

159159
`OrderedColumns`/`DisableOrderedColumns`
160160

161-
Output the [column order](../../select.md#orderedcolumns) in SELECT/JOIN/UNION ALL and preserve it when writing the results. The order of columns is undefined by default.
161+
Output the [column order](../../select/order_by.md) in SELECT/JOIN/UNION ALL and preserve it when writing the results. The order of columns is undefined by default.
162162

163163
### PositionalUnionAll {#positionalunionall}
164164

165-
Enable the standard column-by-column execution for [UNION ALL](../../select.md#unionall). This automatically enables
165+
Enable the standard column-by-column execution for [UNION ALL](../../select/union.md#unionall). This automatically enables
166166
[ordered columns](#orderedcolumns).
167167

168168
### RegexUseRe2

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/select/assume_order_by.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## ASSUME ORDER BY
1+
# ASSUME ORDER BY
22

33
Checking that the `SELECT` result is sorted by the value in the specified column or multiple columns. The result of such a `SELECT` statement is treated as sorted, but without actually running a sort. Sort check is performed at the query execution stage.
44

ydb/docs/en/core/yql/reference/yql-core/syntax/_includes/select/calc.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
## SELECT
1+
# SELECT
22

33
Returns the result of evaluating the expressions specified after `SELECT`.
44

0 commit comments

Comments
 (0)