Skip to content

Commit c33aace

Browse files
vityamanrobot-piglet
authored andcommitted
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 #9056 - Related to https://github.com/users/vityaman/projects/5/views/1?pane=issue&itemId=105056423&issue=vityaman%7Cydb%7C7 --- Pull Request resolved: ytsaurus/ytsaurus#1182 commit_hash:e87565867cf9fa82d9ac49a88d59b293d6686fe7
1 parent a24849a commit c33aace

File tree

4 files changed

+52
-6
lines changed

4 files changed

+52
-6
lines changed

yql/essentials/sql/v1/complete/sql_complete_ut.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,22 @@ Y_UNIT_TEST_SUITE(SqlCompleteTests) {
386386
UNIT_ASSERT_VALUES_EQUAL(Complete(engine, {"SELECT OPTIONAL<"}), expected);
387387
}
388388

389+
Y_UNIT_TEST(TypeNameAsArgument) {
390+
auto engine = MakeSqlCompletionEngineUT();
391+
{
392+
TVector<TCandidate> expected = {
393+
{TypeName, "Uint64"},
394+
};
395+
UNIT_ASSERT_VALUES_EQUAL(Complete(engine, {"SELECT Nothing(Uint"}), expected);
396+
}
397+
{
398+
TVector<TCandidate> expected = {
399+
{Keyword, "OPTIONAL<"},
400+
};
401+
UNIT_ASSERT_VALUES_EQUAL(Complete(engine, {"SELECT Nothing(Option"}), expected);
402+
}
403+
}
404+
389405
Y_UNIT_TEST(UTF8Wide) {
390406
auto engine = MakeSqlCompletionEngineUT();
391407
UNIT_ASSERT_VALUES_EQUAL(Complete(engine, {"\xF0\x9F\x98\x8A"}).size(), 0);

yql/essentials/sql/v1/complete/syntax/grammar.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ namespace NSQLComplete {
77
class TSqlGrammar: public ISqlGrammar {
88
public:
99
TSqlGrammar(const NSQLReflect::TLexerGrammar& grammar)
10-
: Vocabulary(GetVocabularyP())
10+
: Parser(MakeDummyParser())
1111
, AllTokens(ComputeAllTokens())
1212
, KeywordTokens(ComputeKeywordTokens(grammar))
1313
, PunctuationTokens(ComputePunctuationTokens(grammar))
1414
{
1515
}
1616

1717
const antlr4::dfa::Vocabulary& GetVocabulary() const override {
18-
return *Vocabulary;
18+
return Parser->getVocabulary();
1919
}
2020

2121
const std::unordered_set<TTokenId>& GetAllTokens() const override {
@@ -30,9 +30,13 @@ namespace NSQLComplete {
3030
return PunctuationTokens;
3131
}
3232

33+
const std::string& SymbolizedRule(TRuleId rule) const override {
34+
return Parser->getRuleNames().at(rule);
35+
}
36+
3337
private:
34-
static const antlr4::dfa::Vocabulary* GetVocabularyP() {
35-
return &NALADefaultAntlr4::SQLv1Antlr4Parser(nullptr).getVocabulary();
38+
static THolder<antlr4::Parser> MakeDummyParser() {
39+
return MakeHolder<NALADefaultAntlr4::SQLv1Antlr4Parser>(nullptr);
3640
}
3741

3842
std::unordered_set<TTokenId> ComputeAllTokens() {
@@ -72,7 +76,7 @@ namespace NSQLComplete {
7276
return punctuationTokens;
7377
}
7478

75-
const antlr4::dfa::Vocabulary* Vocabulary;
79+
const THolder<antlr4::Parser> Parser;
7680
const std::unordered_set<TTokenId> AllTokens;
7781
const std::unordered_set<TTokenId> KeywordTokens;
7882
const std::unordered_set<TTokenId> PunctuationTokens;

yql/essentials/sql/v1/complete/syntax/grammar.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <contrib/libs/antlr4_cpp_runtime/src/Vocabulary.h>
66

77
#include <unordered_set>
8+
#include <string>
89

910
#ifdef TOKEN_QUERY // Conflict with the winnt.h
1011
#undef TOKEN_QUERY
@@ -19,6 +20,7 @@ namespace NSQLComplete {
1920
class ISqlGrammar {
2021
public:
2122
virtual const antlr4::dfa::Vocabulary& GetVocabulary() const = 0;
23+
virtual const std::string& SymbolizedRule(TRuleId rule) const = 0;
2224
virtual const std::unordered_set<TTokenId>& GetAllTokens() const = 0;
2325
virtual const std::unordered_set<TTokenId>& GetKeywordTokens() const = 0;
2426
virtual const std::unordered_set<TTokenId>& GetPunctuationTokens() const = 0;

yql/essentials/sql/v1/complete/syntax/parser_call_stack.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66
#include <util/generic/algorithm.h>
77
#include <util/generic/yexception.h>
88

9+
#define DEBUG_SYMBOLIZE_STACK(stack) \
10+
auto debug_symbolized_##stack = Symbolized(stack)
11+
912
namespace NSQLComplete {
1013

1114
const TVector<TRuleId> KeywordRules = {
@@ -23,6 +26,7 @@ namespace NSQLComplete {
2326

2427
const TVector<TRuleId> TypeNameRules = {
2528
RULE(Type_name_simple),
29+
RULE(An_id_or_type),
2630
};
2731

2832
const TVector<TRuleId> FunctionNameRules = {
@@ -31,6 +35,17 @@ namespace NSQLComplete {
3135
RULE(Id_or_type),
3236
};
3337

38+
TVector<std::string> Symbolized(const TParserCallStack& stack) {
39+
const ISqlGrammar& grammar = GetSqlGrammar();
40+
41+
TVector<std::string> symbolized;
42+
symbolized.reserve(stack.size());
43+
for (const TRuleId& rule : stack) {
44+
symbolized.emplace_back(grammar.SymbolizedRule(rule));
45+
}
46+
return symbolized;
47+
}
48+
3449
bool EndsWith(const TParserCallStack& suffix, const TParserCallStack& stack) {
3550
if (stack.size() < suffix.size()) {
3651
return false;
@@ -39,12 +54,21 @@ namespace NSQLComplete {
3954
return Equal(std::begin(stack) + prefixSize, std::end(stack), std::begin(suffix));
4055
}
4156

57+
bool Contains(const TParserCallStack& sequence, const TParserCallStack& stack) {
58+
return !std::ranges::search(stack, sequence).empty();
59+
}
60+
4261
bool ContainsRule(TRuleId rule, const TParserCallStack& stack) {
4362
return Find(stack, rule) != std::end(stack);
4463
}
4564

4665
bool IsLikelyTypeStack(const TParserCallStack& stack) {
47-
return EndsWith({RULE(Type_name_simple)}, stack);
66+
return EndsWith({RULE(Type_name_simple)}, stack) ||
67+
(Contains({RULE(Invoke_expr),
68+
RULE(Named_expr_list),
69+
RULE(Named_expr),
70+
RULE(Expr)}, stack) &&
71+
EndsWith({RULE(Atom_expr), RULE(An_id_or_type)}, stack));
4872
}
4973

5074
bool IsLikelyFunctionStack(const TParserCallStack& stack) {

0 commit comments

Comments
 (0)