diff options
author | vitya-smirnov <[email protected]> | 2025-10-14 09:30:10 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-10-14 09:48:40 +0300 |
commit | e06bac75417cb26b5603d104e58a15aeda178d5e (patch) | |
tree | 5a3cc5430cd0bc4fff262e5d37f41291914d6e70 /yql/essentials/sql/v1/sql_select_yql.h | |
parent | 6afc58f5f8644b9e12b407cfa1341dacc1aaf5e2 (diff) |
YQL-20436: Translate `SELECT .. FROM VALUES ..` to `YqlSelect`
Current `SQLv1` translation produces relatively low level `YQLs`
constructions that are hard to match during later optimizations, for
example, subqueries unnesting. Also it assumes that expressions are only
depend on corresponding source row, which is not true for correlated
subqueries. Both limitations blocks currelated subqueries implementation.
Although the problem exists for `SQLv1`, it is already solved for `PG`
syntax. There PostgreSQL-produced AST is converted to special `YQLs`
"bulk select" node called `PgSelect`. It is more declarative and
expanded later than translation. This fact helped to support correlated
subqueries, which with `PgSelect` are type-checkable and decorrelatable
(not generally, but heuristically).
This patch is the first step forward to "bulk select" translation
for `SQLv1`. As there are a lot of code already written for `PgSelect`
and `PG` and `SQLv1` relatively similar, I decided to rebrand `PgSelect`
into more general `SqlSelect` node. It seems that for some near future
goals `PgSelect` should be enough.
There was 2 problems solved:
1. `PgSelect` comes with `OrderedColumns` by default and its
implementation tightly coupled with it.
2. `PgSelect` does Pg type casts.
This patch contains following changes:
- Added pragma `YqlSelect = 'disable' | 'auto' | 'force'`
- Added `YqlSelect` (`PgSelect` alias) translation
- Changed `PgSelect` wrappers to support `YqlSelect`
- Changed `PgSelect` expanders to support `YqlSelect`
commit_hash:8a55d63e06c22592b2029dd260bbd259194e92dc
Diffstat (limited to 'yql/essentials/sql/v1/sql_select_yql.h')
-rw-r--r-- | yql/essentials/sql/v1/sql_select_yql.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/yql/essentials/sql/v1/sql_select_yql.h b/yql/essentials/sql/v1/sql_select_yql.h new file mode 100644 index 00000000000..367473707ed --- /dev/null +++ b/yql/essentials/sql/v1/sql_select_yql.h @@ -0,0 +1,25 @@ +#pragma once + +#include "node.h" + +#include <yql/essentials/sql/settings/translation_settings.h> + +#include <yql/essentials/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h> + +#include <expected> + +namespace NSQLTranslationV1 { + +enum class EYqlSelectError { + Error, + Unsupported, +}; + +using TYqlSelectResult = std::expected<TNodePtr, EYqlSelectError>; + +TYqlSelectResult BuildYqlSelect( + TContext& ctx, + NSQLTranslation::ESqlMode mode, + const NSQLv1Generated::TRule_select_stmt& rule); + +} // namespace NSQLTranslationV1 |