diff --git a/src/main/antlr/SDBLLexer.g4 b/src/main/antlr/SDBLLexer.g4 index f085fff2..eb109fa1 100644 --- a/src/main/antlr/SDBLLexer.g4 +++ b/src/main/antlr/SDBLLexer.g4 @@ -164,8 +164,8 @@ ENUM_TYPE: RU_P RU_E RU_R RU_E RU_CH RU_I RU_S RU_L RU_E RU_N RU_I RU_E EXCHANGE_PLAN_TYPE: PLAN_RU RU_O RU_B RU_M RU_E RU_N RU_A | E X C H A N G E P L A N; EXTERNAL_DATA_SOURCE_TYPE: - RU_V RU_N RU_E RU_SH RU_N RU_I RU_J RU_I RU_S RU_T RU_O RU_CH RU_N RU_I RU_K RU_D RU_A RU_N RU_N RU_Y RU_H - | E X T E R N A L D A T A S O U R C E; + (RU_V RU_N RU_E RU_SH RU_N RU_I RU_J RU_I RU_S RU_T RU_O RU_CH RU_N RU_I RU_K RU_D RU_A RU_N RU_N RU_Y RU_H + | E X T E R N A L D A T A S O U R C E) -> pushMode(EXTERNAL_DATA_SOURCE_MODE); FILTER_CRITERION_TYPE: RU_K RU_R RU_I RU_T RU_E RU_R RU_I RU_J RU_O RU_T RU_B RU_O RU_R RU_A | F I L T E R C R I T E R I O N; INFORMATION_REGISTER_TYPE: @@ -357,3 +357,13 @@ ID_TASK_TYPE : TASK_TYPE -> type(TASK_TYPE), popMode; ID_DOT : DOT -> type(DOT), pushMode(DOT_MODE), popMode; ID_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER), popMode; ID_UNKNOWN : . -> channel(HIDDEN), type(UNKNOWN); + +mode EXTERNAL_DATA_SOURCE_MODE; +EDS_TABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A | T A B L E) -> popMode; +EDS_CUBE: (RU_K RU_U RU_B | C U B E); +EDS_CUBE_DIMTABLE: (RU_T RU_A RU_B RU_L RU_I RU_C RU_A RU_I RU_Z RU_M RU_E RU_R RU_E RU_N RU_I RU_YA + | D I M E N S I O N T A B L E) -> popMode; +EDS_WHITE_SPACE : WHITE_SPACE -> channel(HIDDEN), type(WHITE_SPACE); +EDS_MUL: MUL -> type(MUL); +EDS_DOT : DOT -> type(DOT); +EDS_IDENTIFIER : IDENTIFIER -> type(IDENTIFIER); diff --git a/src/main/antlr/SDBLParser.g4 b/src/main/antlr/SDBLParser.g4 index 02e71a1c..43cd4830 100644 --- a/src/main/antlr/SDBLParser.g4 +++ b/src/main/antlr/SDBLParser.g4 @@ -308,7 +308,7 @@ dataSources: tables+=dataSource (COMMA tables+=dataSource)*; dataSource: (LPAREN dataSource RPAREN) | (( - ((virtualTable | table | parameterTable) alias?) + ((virtualTable | table | parameterTable | externalDataSourceTable) alias?) | (LPAREN (virtualTable | table | parameterTable | subquery) RPAREN alias?) ) joins+=joinPart*) ; @@ -345,6 +345,10 @@ virtualTableParameter: logicalExpression?; // таблица как параметр, соединяться ни с чем не может parameterTable: parameter; +externalDataSourceTable: + mdo DOT EDS_TABLE DOT tableName=identifier + | mdo DOT EDS_CUBE DOT cubeName=identifier DOT EDS_CUBE_DIMTABLE DOT tableName=identifier; + // соединения таблиц joinPart: ( // тип соединения diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java index 0c5614f7..ade00f79 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLLexerTest.java @@ -177,4 +177,26 @@ void testMDOTT() { assertMatch(".ДанныеГрафика", ".SCHEDULEDATA", SDBLLexer.DOT, SDBLLexer.SCHEDULE_DATA_VT); assertMatch(".ЗадачиПоИсполнителю", ".TASKBYPERFORMER", SDBLLexer.DOT, SDBLLexer.TASK_BY_PERFORMER_VT); } + + @Test + void testExternalTypes() { + assertMatch("ВнешнийИсточникДанных.ВИД1.Таблица", + "ExternalDataSource.EDS1.Table", + SDBLLexer.EXTERNAL_DATA_SOURCE_TYPE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_TABLE); + assertMatch("ВнешнийИсточникДанных.ВИД1.Куб.Куб1.ТаблицаИзмерения", + "ExternalDataSource.EDS1.Cube.Cube1.DimensionTable", + SDBLLexer.EXTERNAL_DATA_SOURCE_TYPE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_CUBE, + SDBLLexer.DOT, + SDBLLexer.IDENTIFIER, + SDBLLexer.DOT, + SDBLLexer.EDS_CUBE_DIMTABLE); + } } diff --git a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java index c79b794c..fd986621 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/parser/SDBLParserTest.java @@ -300,6 +300,22 @@ void testSelect05() { ); } + @Test + void testSelect06() { + checkSource("src/test/resources/sdbl/select06.sdbl", + pair(SDBLParser.RULE_queries, 4), + pair(SDBLParser.RULE_dataSource, 4) + ); + } + + @Test + void testSelect07() { + checkSource("src/test/resources/sdbl/select07.sdbl", + pair(SDBLParser.RULE_queries, 1), + pair(SDBLParser.RULE_dataSource, 1) + ); + } + private void checkSource(String filePath, Pair... rules) { var exampleString = TestUtils.getSourceFromFile(filePath); setInput(exampleString); diff --git a/src/test/resources/sdbl/select06.sdbl b/src/test/resources/sdbl/select06.sdbl new file mode 100644 index 00000000..b3484e8e --- /dev/null +++ b/src/test/resources/sdbl/select06.sdbl @@ -0,0 +1,19 @@ +ВЫБРАТЬ +timestamp +ИЗ +ВнешнийИсточникДанных.ClickHouse.Таблица.test01_log +; +SELECT +timestamp +FROM +ExternalDataSource.ClickHouse.Table.test01_log +; +ВЫБРАТЬ +Поле1 КАК Поле1 +ИЗ +ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Куб.Куб1.ТаблицаИзмерения.ТаблицаИзмерения1 +; +SELECT +Cube1DimensionTableDimensionTable1.Ref AS Ref +FROM +ExternalDataSource.ExternalDataSource1.Cube.Cube1.DimensionTable.DimensionTable1 AS Cube1DimensionTableDimensionTable1 \ No newline at end of file diff --git a/src/test/resources/sdbl/select07.sdbl b/src/test/resources/sdbl/select07.sdbl new file mode 100644 index 00000000..3ba9b0a1 --- /dev/null +++ b/src/test/resources/sdbl/select07.sdbl @@ -0,0 +1,2 @@ +ВЫБРАТЬ * +ИЗ РегистрСведений.Таблица КАК Таблица