aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp
diff options
context:
space:
mode:
authorvityaman <vityaman.dev@yandex.ru>2025-04-07 14:33:48 +0300
committerrobot-piglet <robot-piglet@yandex-team.com>2025-04-07 15:00:33 +0300
commitc33aace83a03e01fbf260c3a28c614a58cbce812 (patch)
treeee4b771468122bad5bbcfe5a5ba5b842dfc4f561 /yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp
parenta24849a5e16381ec0c969cd30331c8da1de23aba (diff)
downloadydb-c33aace83a03e01fbf260c3a28c614a58cbce812.tar.gz
YQL-19747 Complete type name as a function argument
As I understand, type name should not be completed at `SELECT |`, so I added a check that we are at `invoke_expr` context. Currently composite type keywords are suggested at `SELECT |` and also are uppercased. I will fix it separately when this merged during - https://github.com/users/vityaman/projects/5?pane=issue&itemId=105056723&issue=vityaman%7Cydb%7C8 --- - Related to https://github.com/ydb-platform/ydb/issues/9056 - Related to https://github.com/users/vityaman/projects/5/views/1?pane=issue&itemId=105056423&issue=vityaman%7Cydb%7C7 --- Pull Request resolved: https://github.com/ytsaurus/ytsaurus/pull/1182 commit_hash:e87565867cf9fa82d9ac49a88d59b293d6686fe7
Diffstat (limited to 'yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp')
-rw-r--r--yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp26
1 files changed, 25 insertions, 1 deletions
diff --git a/yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp b/yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp
index 855d9af1601..57e058fa900 100644
--- a/yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp
+++ b/yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp
@@ -6,6 +6,9 @@
#include <util/generic/algorithm.h>
#include <util/generic/yexception.h>
+#define DEBUG_SYMBOLIZE_STACK(stack) \
+ auto debug_symbolized_##stack = Symbolized(stack)
+
namespace NSQLComplete {
const TVector<TRuleId> KeywordRules = {
@@ -23,6 +26,7 @@ namespace NSQLComplete {
const TVector<TRuleId> TypeNameRules = {
RULE(Type_name_simple),
+ RULE(An_id_or_type),
};
const TVector<TRuleId> FunctionNameRules = {
@@ -31,6 +35,17 @@ namespace NSQLComplete {
RULE(Id_or_type),
};
+ TVector<std::string> Symbolized(const TParserCallStack& stack) {
+ const ISqlGrammar& grammar = GetSqlGrammar();
+
+ TVector<std::string> symbolized;
+ symbolized.reserve(stack.size());
+ for (const TRuleId& rule : stack) {
+ symbolized.emplace_back(grammar.SymbolizedRule(rule));
+ }
+ return symbolized;
+ }
+
bool EndsWith(const TParserCallStack& suffix, const TParserCallStack& stack) {
if (stack.size() < suffix.size()) {
return false;
@@ -39,12 +54,21 @@ namespace NSQLComplete {
return Equal(std::begin(stack) + prefixSize, std::end(stack), std::begin(suffix));
}
+ bool Contains(const TParserCallStack& sequence, const TParserCallStack& stack) {
+ return !std::ranges::search(stack, sequence).empty();
+ }
+
bool ContainsRule(TRuleId rule, const TParserCallStack& stack) {
return Find(stack, rule) != std::end(stack);
}
bool IsLikelyTypeStack(const TParserCallStack& stack) {
- return EndsWith({RULE(Type_name_simple)}, stack);
+ return EndsWith({RULE(Type_name_simple)}, stack) ||
+ (Contains({RULE(Invoke_expr),
+ RULE(Named_expr_list),
+ RULE(Named_expr),
+ RULE(Expr)}, stack) &&
+ EndsWith({RULE(Atom_expr), RULE(An_id_or_type)}, stack));
}
bool IsLikelyFunctionStack(const TParserCallStack& stack) {