summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_select_yql.h
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-10-14 09:30:10 +0300
committervitya-smirnov <[email protected]>2025-10-14 09:48:40 +0300
commite06bac75417cb26b5603d104e58a15aeda178d5e (patch)
tree5a3cc5430cd0bc4fff262e5d37f41291914d6e70 /yql/essentials/sql/v1/sql_select_yql.h
parent6afc58f5f8644b9e12b407cfa1341dacc1aaf5e2 (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.h25
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