[PostgreSQL] parser fixes

This commit is contained in:
aboyko
2024-10-09 16:11:52 -04:00
parent 899389ee33
commit d2608475f6
5 changed files with 9148 additions and 9024 deletions

View File

@@ -643,6 +643,7 @@ TIMEZONE_MINUTE : T I M E Z O N E '_' M I N U T E;
TIMING : T I M I N G;
TO : T O;
TOAST : T O A S T;
TOP : T O P;
TOP_LEVEL_COUNT : T O P '_' L E V E L '_' C O U N T;
TRAILING : T R A I L I N G;
TRANSACTION : T R A N S A C T I O N;

View File

@@ -1323,7 +1323,7 @@ values_stmt
;
selector_clause
:(ALL | (DISTINCT (ON expr_list)?))? column_list
:(ALL | (DISTINCT (ON expr_list)?) | TOP INTEGER_LITERAL)? column_list
;
from_clause
@@ -1477,7 +1477,7 @@ expr
) expr
| expr (NOT LIKE | LIKE) expr //(STRING_LITERAL_SINGLE_Q | REGEX_STRING)
| expr NOT? BETWEEN expr AND expr
| expr IN expr
| expr (NOT IN | IN) expr
| expr op=(LT | GT | EQUAL | LTE | GTE | LT_GT | BANG_EQUAL) expr
| expr op=IS (bool_expr | NULL | NOT NULL)
| expr IS NOT? DISTINCT FROM expr
@@ -1889,7 +1889,7 @@ non_reserved_keyword
| SUBCLASS_ORIGIN | SUBMULTISET | SUBSTRING | SUM | SYSID
| SYSTEM | SYSTEM_USER | TABLESPACE | TABLE_NAME
| TEMP | TEMPLATE | TEMPORARY | TEXT | TIES | TIME
| TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE | TOP_LEVEL_COUNT | TRANSACTION
| TIMESTAMP | TIMEZONE_HOUR | TIMEZONE_MINUTE | TOP | TOP_LEVEL_COUNT | TRANSACTION
| TRANSACTIONS_COMMITTED | TRANSACTIONS_ROLLED_BACK | TRANSACTION_ACTIVE | TRANSFORM | TRANSFORMS
| TRANSLATE | TRANSLATION | TREAT | TRIGGER | TRIGGER_CATALOG
| TRIGGER_NAME | TRIGGER_SCHEMA | TRIM | TRUE | TRUNCATE | TRUSTED
@@ -1898,7 +1898,7 @@ non_reserved_keyword
| UNTIL | UPDATE | UPPER | USAGE | USER_DEFINED_TYPE_CATALOG
| USER_DEFINED_TYPE_CODE | USER_DEFINED_TYPE_NAME | USER_DEFINED_TYPE_SCHEMA | VACUUM | VALID
| VALIDATOR | VALUE | VALUES | VARCHAR | VARYING
| VAR_POP | VAR_SAMP | VIEW | VOLATILE | WHENEVER
| VAR_POP | VAR_SAMP | VERSION | VIEW | VOLATILE | WHENEVER
| WHITESPACE | WIDTH_BUCKET | WITHIN | WITHOUT | WORK
| WRITE | YEAR | ZONE
;

View File

@@ -178,4 +178,34 @@ public class PostgreSqlSemanticTokensTest {
assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(44, 45, "operator", new String[0]));
assertThat(tokens.get(11)).isEqualTo(new SemanticTokenData(45, 50, "parameter", new String[0]));
}
@Test
void notInInsideWhereClausePredicate() {
List<SemanticTokenData> tokens = provider.computeTokens("delete from SAMPLE_TABLE where id not in (select top 1 id from SAMPLE_TABLE order by TABLE_NAME desc)", 0);
assertThat(tokens.size()).isEqualTo(19);
}
@Test
void keywordAsIdentifier() {
List<SemanticTokenData> tokens = provider.computeTokens("SELECT SCHEMA_NAME, TABLE_NAME, VERSION from SAMPLE_TABLE", 0);
assertThat(tokens.size()).isEqualTo(8);
}
@Test
void topInSelectClause() {
List<SemanticTokenData> tokens = provider.computeTokens("select top 1 * from SAMPLE_TABLE where SCHEMA_NAME = ?1", 0);
assertThat(tokens.size()).isEqualTo(11);
assertThat(tokens.get(0)).isEqualTo(new SemanticTokenData(0, 6, "keyword", new String[0]));
assertThat(tokens.get(1)).isEqualTo(new SemanticTokenData(7, 10, "keyword", new String[0]));
assertThat(tokens.get(2)).isEqualTo(new SemanticTokenData(11, 12, "number", new String[0]));
assertThat(tokens.get(3)).isEqualTo(new SemanticTokenData(13, 14, "operator", new String[0]));
assertThat(tokens.get(4)).isEqualTo(new SemanticTokenData(15, 19, "keyword", new String[0]));
assertThat(tokens.get(5)).isEqualTo(new SemanticTokenData(20, 32, "variable", new String[0]));
assertThat(tokens.get(6)).isEqualTo(new SemanticTokenData(33, 38, "keyword", new String[0]));
assertThat(tokens.get(7)).isEqualTo(new SemanticTokenData(39, 50, "keyword", new String[0]));
assertThat(tokens.get(8)).isEqualTo(new SemanticTokenData(51, 52, "operator", new String[0]));
assertThat(tokens.get(9)).isEqualTo(new SemanticTokenData(53, 54, "operator", new String[0]));
assertThat(tokens.get(10)).isEqualTo(new SemanticTokenData(54, 55, "parameter", new String[0]));
}
}