diff --git a/src/parser/parser.yy b/src/parser/parser.yy index 7b5259a7eaf..fce96a5aec6 100644 --- a/src/parser/parser.yy +++ b/src/parser/parser.yy @@ -162,7 +162,7 @@ static constexpr size_t kCommentLengthLimit = 256; %token KW_BOOL KW_INT8 KW_INT16 KW_INT32 KW_INT64 KW_INT KW_FLOAT KW_DOUBLE %token KW_STRING KW_FIXED_STRING KW_TIMESTAMP KW_DATE KW_TIME KW_DATETIME %token KW_GO KW_AS KW_TO KW_USE KW_SET KW_FROM KW_WHERE KW_ALTER -%token KW_MATCH KW_INSERT KW_VALUES KW_YIELD KW_RETURN KW_CREATE KW_VERTEX KW_VERTICES +%token KW_MATCH KW_INSERT KW_VALUE KW_VALUES KW_YIELD KW_RETURN KW_CREATE KW_VERTEX KW_VERTICES %token KW_EDGE KW_EDGES KW_STEPS KW_OVER KW_UPTO KW_REVERSELY KW_SPACE KW_DELETE KW_FIND %token KW_TAG KW_TAGS KW_UNION KW_INTERSECT KW_MINUS %token KW_NO KW_OVERWRITE KW_IN KW_DESCRIBE KW_DESC KW_SHOW KW_HOST KW_HOSTS KW_PART KW_PARTS KW_ADD @@ -433,6 +433,7 @@ legal_integer */ unreserved_keyword : KW_SPACE { $$ = new std::string("space"); } + | KW_VALUE { $$ = new std::string("value"); } | KW_VALUES { $$ = new std::string("values"); } | KW_HOST { $$ = new std::string("host"); } | KW_HOSTS { $$ = new std::string("hosts"); } diff --git a/src/parser/scanner.lex b/src/parser/scanner.lex index 6c316e4b2bf..2b209bee00d 100644 --- a/src/parser/scanner.lex +++ b/src/parser/scanner.lex @@ -157,7 +157,7 @@ IP_OCTET ([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]) "HOSTS" { return TokenType::KW_HOSTS; } "SPACE" { return TokenType::KW_SPACE; } "SPACES" { return TokenType::KW_SPACES; } -"VALUE" { return TokenType::KW_VALUES; } +"VALUE" { return TokenType::KW_VALUE; } "VALUES" { return TokenType::KW_VALUES; } "USER" { return TokenType::KW_USER; } "USERS" { return TokenType::KW_USERS; } diff --git a/src/parser/test/ScannerTest.cpp b/src/parser/test/ScannerTest.cpp index 9f1c155e868..d9e7009fdb4 100644 --- a/src/parser/test/ScannerTest.cpp +++ b/src/parser/test/ScannerTest.cpp @@ -181,8 +181,8 @@ TEST(Scanner, Basic) { CHECK_SEMANTIC_TYPE("match", TokenType::KW_MATCH), CHECK_SEMANTIC_TYPE("INSERT", TokenType::KW_INSERT), CHECK_SEMANTIC_TYPE("insert", TokenType::KW_INSERT), - CHECK_SEMANTIC_TYPE("VALUE", TokenType::KW_VALUES), - CHECK_SEMANTIC_TYPE("value", TokenType::KW_VALUES), + CHECK_SEMANTIC_TYPE("VALUE", TokenType::KW_VALUE), + CHECK_SEMANTIC_TYPE("value", TokenType::KW_VALUE), CHECK_SEMANTIC_TYPE("VALUES", TokenType::KW_VALUES), CHECK_SEMANTIC_TYPE("values", TokenType::KW_VALUES), CHECK_SEMANTIC_TYPE("YIELD", TokenType::KW_YIELD), diff --git a/tests/tck/features/bugfix/TypoError.feature b/tests/tck/features/bugfix/TypoError.feature new file mode 100644 index 00000000000..ba1b0c5ac8b --- /dev/null +++ b/tests/tck/features/bugfix/TypoError.feature @@ -0,0 +1,39 @@ +# Copyright (c) 2021 vesoft inc. All rights reserved. +# +# This source code is licensed under Apache 2.0 License. +Feature: Typo error + + # issue https://github.com/vesoft-inc/nebula/issues/2204 + Scenario: Typo error of KW_VALUE + Given an empty graph + And create a space with following options: + | partition_num | 9 | + | replica_factor | 1 | + | vid_type | FIXED_STRING(30) | + | charset | utf8 | + | collate | utf8_bin | + When executing query: + """ + CREATE tag test1(value int, values bool) + """ + Then the execution should be successful + When executing query: + """ + DESC TAG test1 + """ + Then the result should be, in any order, with relax comparison: + | Field | Type | Null | Default | Comment | + | "value" | "int64" | "YES" | | | + | "values" | "bool" | "YES" | | | + When executing query: + """ + CREATE tag value(value int, values bool) + """ + Then the execution should be successful + When executing query: + """ + SHOW CREATE TAG value + """ + Then the result should be, in any order, with relax comparison: + | Tag | Create Tag | + | "value" | 'CREATE TAG `value` (\n `value` int64 NULL, `values` bool NULL\n) ttl_duration = 0, ttl_col = ""' |