Skip to content

Commit 6a75b0c

Browse files
authored
Merge pull request #2726 from artbear/Null_for_join_2283_2
FP FieldsFromJoinsWithoutIsNull - Поле ЕСТЬ NULL
2 parents ee91bc6 + 6bab456 commit 6a75b0c

File tree

3 files changed

+37
-162
lines changed

3 files changed

+37
-162
lines changed

src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@
6060
public class FieldsFromJoinsWithoutIsNullDiagnostic extends AbstractSDBLVisitorDiagnostic {
6161

6262
private static final Integer SELECT_ROOT = SDBLParser.RULE_selectedField;
63-
private static final Collection<Integer> SELECT_STATEMENTS = Set.of(SELECT_ROOT, SDBLParser.RULE_builtInFunctions);
63+
private static final Collection<Integer> SELECT_STATEMENTS = Set.of(SELECT_ROOT, SDBLParser.RULE_builtInFunctions,
64+
SDBLParser.RULE_isNullPredicate);
6465

6566
private static final Integer WHERE_ROOT = SDBLParser.RULE_predicate;
6667
private static final Collection<Integer> WHERE_STATEMENTS = Set.of(WHERE_ROOT, SDBLParser.RULE_builtInFunctions,
@@ -162,7 +163,7 @@ private static boolean haveExprNotWithParens(SDBLParser.PredicateContext ctx) {
162163
}
163164

164165
private void checkSelect(String tableName, SDBLParser.SelectedFieldsContext columns) {
165-
checkStatements(tableName, columns, SELECT_STATEMENTS, SELECT_ROOT, false);
166+
checkStatements(tableName, columns, SELECT_STATEMENTS, SELECT_ROOT, true);
166167
}
167168

168169
private void checkStatements(String tableName, BSLParserRuleContext expression, Collection<Integer> statements,
@@ -205,7 +206,6 @@ private static boolean haveIsNullOperator(BSLParserRuleContext ctx) {
205206
return Optional.of(ctx)
206207
.filter(SDBLParser.IsNullPredicateContext.class::isInstance)
207208
.map(SDBLParser.IsNullPredicateContext.class::cast)
208-
.filter(isNullPredicateContext -> isNullPredicateContext.NOT() == null)
209209
.isPresent();
210210
}
211211

src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnosticTest.java

Lines changed: 0 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -129,146 +129,4 @@ private void checkContent(
129129
Assertions.assertThat(relatedInformation.getLocation().getRange()).isEqualTo(relatedLocationRange);
130130
}
131131
}
132-
133-
@Test
134-
void testWithIsNotNullInsideExpression() {
135-
var sample =
136-
" Запрос = Новый Запрос;\n" +
137-
" Запрос.Текст =\n" +
138-
" \"ВЫБРАТЬ Сотрудники4.Ссылка // не ошибка\n" +
139-
" |ИЗ Справочник.Склады КАК Склады\n" +
140-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники4\n" +
141-
" |ПО Склады.Кладовщик = Сотрудники4.Ссылка\n" +
142-
" |ГДЕ Сотрудники4.Флаг ЕСТЬ НЕ NULL //не ошибка\n" +
143-
" |\";\n";
144-
145-
var documentContext = TestUtils.getDocumentContext(sample);
146-
var diagnostics = getDiagnostics(documentContext);
147-
148-
assertThat(diagnostics).isEmpty();
149-
}
150-
151-
@Test
152-
void testWithNotIsNullInsideExpression() {
153-
var sample =
154-
" Запрос = Новый Запрос;\n" +
155-
" Запрос.Текст =\n" +
156-
" \"ВЫБРАТЬ Сотрудники4.Ссылка // не ошибка\n" +
157-
" |ИЗ Справочник.Склады КАК Склады\n" +
158-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники4\n" +
159-
" |ПО Склады.Кладовщик = Сотрудники4.Ссылка\n" +
160-
" |ГДЕ НЕ Сотрудники4.Флаг ЕСТЬ NULL //не ошибка\n" +
161-
" |\";\n";
162-
163-
var documentContext = TestUtils.getDocumentContext(sample);
164-
var diagnostics = getDiagnostics(documentContext);
165-
166-
assertThat(diagnostics).isEmpty();
167-
}
168-
169-
@Test
170-
void testWithNotIsNullInPairsInsideExpression() {
171-
var sample =
172-
" Запрос = Новый Запрос;\n" +
173-
" Запрос.Текст =\n" +
174-
" \"ВЫБРАТЬ Сотрудники.Ссылка // не ошибка\n" +
175-
" |ИЗ Справочник.Склады КАК Склады\n" +
176-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники\n" +
177-
" |ПО Склады.Кладовщик = Сотрудники.Ссылка\n" +
178-
" |ГДЕ (НЕ (Сотрудники.Флаг ЕСТЬ NULL)) //не ошибка\n" +
179-
" |\"; ";
180-
181-
var documentContext = TestUtils.getDocumentContext(sample);
182-
var diagnostics = getDiagnostics(documentContext);
183-
184-
assertThat(diagnostics).isEmpty();
185-
}
186-
187-
@Test
188-
void testWithIsNullOperatorInsideWhere() {
189-
var sample =
190-
" Запрос = Новый Запрос;\n" +
191-
" Запрос.Текст =\n" +
192-
" \"ВЫБРАТЬ Сотрудники4.Ссылка // ошибка\n" +
193-
" |ИЗ Справочник.Склады КАК Склады\n" +
194-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники4\n" +
195-
" |ПО Склады.Кладовщик = Сотрудники4.Ссылка\n" +
196-
" |ГДЕ Сотрудники4.Флаг ЕСТЬ NULL //не ошибка\n" +
197-
" |\";\n";
198-
199-
var documentContext = TestUtils.getDocumentContext(sample);
200-
var diagnostics = getDiagnostics(documentContext);
201-
202-
assertThat(diagnostics).hasSize(1);
203-
}
204-
205-
@Test
206-
void testWithIsNullOperatorInsideWhereButNonTableFieldRequest() {
207-
var sample =
208-
"Процедура Тест15_в_ГДЕ_Есть_NULL_НоНетОбращенийКПолямТаблицы()\n" +
209-
"\n" +
210-
" Запрос = Новый Запрос;\n" +
211-
" Запрос.Текст =\n" +
212-
" \"ВЫБРАТЬ Истина\n" +
213-
" |ИЗ Справочник.Склады КАК Склады15\n" +
214-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники15\n" +
215-
" |ПО Склады15.Кладовщик = Сотрудники15.Ссылка\n" +
216-
" |ГДЕ Сотрудники15.Реквизит ЕСТЬ NULL // не ошибка\n" +
217-
" |\";\n" +
218-
"КонецПроцедуры";
219-
220-
var documentContext = TestUtils.getDocumentContext(sample);
221-
var diagnostics = getDiagnostics(documentContext);
222-
223-
assertThat(diagnostics).isEmpty();
224-
}
225-
226-
@Test
227-
void testWithIsNullOperatorInsideSelect() {
228-
var sample =
229-
" Запрос.Текст =\n" +
230-
" \"ВЫБРАТЬ \n" +
231-
" | ВЫБОР КОГДА Сотрудники15.Реквизит ЕСТЬ NULL ТОГДА Истина // не ошибка\n" +
232-
" | КОГДА НЕ Сотрудники15.Реквизит ЕСТЬ NULL ТОГДА Истина // не ошибка\n" +
233-
" |КОГДА Сотрудники15.Реквизит ЕСТЬ НЕ NULL ТОГДА Истина // не ошибка\n" +
234-
" | ИНАЧЕ Ложь КОНЕЦ КАК Поле1\n" +
235-
" |ИЗ Справочник.Склады КАК Склады15\n" +
236-
" |ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники15\n" +
237-
" |ПО Склады15.Кладовщик = Сотрудники15.Ссылка\n" +
238-
" |\";\n" +
239-
"КонецПроцедуры";
240-
241-
var documentContext = TestUtils.getDocumentContext(sample);
242-
var diagnostics = getDiagnostics(documentContext);
243-
244-
assertThat(diagnostics).isEmpty();
245-
}
246-
247-
@Test
248-
void tesEqualTableNamesInUnion() {
249-
var sample =
250-
" Запрос = Новый Запрос;\n" +
251-
" Запрос.Текст =\n" +
252-
" \"ВЫБРАТЬ\n" +
253-
" |\tКонтрагенты11.Ссылка КАК Ссылка //не ошибка \n" +
254-
" |ПОМЕСТИТЬ ВТ\n" +
255-
" |ИЗ\n" +
256-
" |\tТаблица КАК Контрагенты11\n" +
257-
" |\n" +
258-
" |ОБЪЕДИНИТЬ ВСЕ\n" +
259-
" |\n" +
260-
" |ВЫБРАТЬ\n" +
261-
" | Таблица11.Ссылка КАК Ссылка,\n" +
262-
" | Контрагенты11.Ссылка КАК Ссылка1 //<-- ошибка \n" +
263-
" |ИЗ\n" +
264-
" |\tСправочник.Склады КАК Таблица11\n" +
265-
" | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты11\n" +
266-
" | ПО Таблица11.Ссылка = Контрагенты11.Ссылка\n" +
267-
" |\";\n";
268-
269-
var documentContext = TestUtils.getDocumentContext(sample);
270-
var diagnostics = getDiagnostics(documentContext);
271-
272-
assertThat(diagnostics).hasSize(1);
273-
}
274132
}

src/test/resources/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.bsl

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -207,20 +207,37 @@
207207
|";
208208
КонецПроцедуры
209209

210-
// Разрыв в соединении роняет с npe
211-
Запрос = "ВЫБРАТЬ
212-
| ДополнительныеСведения.КодИФНСФЛ КАК КодИФНСФЛ
213-
|ИЗ
214-
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
215-
|
216-
| ОБЪЕДИНИТЬ ВСЕ
217-
|
218-
| ВЫБРАТЬ
219-
| ДополнительныеСведения.КодИФНСФЛ
220-
|ИЗ
221-
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
222-
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
223-
| ПО АдресныеОбъектыУровень0.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
224-
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений."+АдресныеОбъекты+" КАК АдресныеОбъектыУровень2
225-
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
226-
|";
210+
Процедура Тест16_Выбор_Есть_пробел_NULL_ЛевоеСоединение()
211+
Запрос = Новый Запрос;
212+
Запрос.Текст =
213+
"ВЫБРАТЬ
214+
| Сотрудники16.Ссылка ЕСТЬ NULL КАК Флаг, // не ошибка
215+
| Сотрудники16.Ссылка ЕСТЬ НЕ NULL КАК Флаг2, // не ошибка
216+
| ВЫБОР
217+
| КОГДА Сотрудники16.Ссылка ЕСТЬ NULL // не ошибка
218+
| ТОГДА ИСТИНА
219+
| ИНАЧЕ Ложь
220+
| КОНЕЦ КАК Флаг3
221+
|ИЗ Справочник.Склады КАК Склады16
222+
|ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Сотрудники КАК Сотрудники16
223+
|ПО Склады16.Кладовщик = Сотрудники16.Ссылка
224+
|";
225+
КонецПроцедуры
226+
227+
// Разрыв в соединении роняет с npe
228+
Запрос = "ВЫБРАТЬ
229+
| ДополнительныеСведения.КодИФНСФЛ КАК КодИФНСФЛ
230+
|ИЗ
231+
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
232+
|
233+
| ОБЪЕДИНИТЬ ВСЕ
234+
|
235+
| ВЫБРАТЬ
236+
| ДополнительныеСведения.КодИФНСФЛ
237+
|ИЗ
238+
| РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень0
239+
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АдресныеОбъекты КАК АдресныеОбъектыУровень1
240+
| ПО АдресныеОбъектыУровень0.РодительскийИдентификатор = АдресныеОбъектыУровень1.Идентификатор
241+
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений."+АдресныеОбъекты+" КАК АдресныеОбъектыУровень2
242+
| ПО (АдресныеОбъектыУровень1.РодительскийИдентификатор = АдресныеОбъектыУровень2.Идентификатор)
243+
|";

0 commit comments

Comments
 (0)