From cd13d8dc00e7c2a2ada2d85f340b72b9ef351306 Mon Sep 17 00:00:00 2001 From: ChrisJoosse Date: Tue, 29 Jul 2025 11:24:30 -0700 Subject: [PATCH 1/4] coverage for Issue 52739 --- src/org/labkey/test/tests/PivotQueryTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/org/labkey/test/tests/PivotQueryTest.java b/src/org/labkey/test/tests/PivotQueryTest.java index a402c25111..26bba5b3fd 100644 --- a/src/org/labkey/test/tests/PivotQueryTest.java +++ b/src/org/labkey/test/tests/PivotQueryTest.java @@ -26,7 +26,12 @@ import org.labkey.test.categories.Data; import org.labkey.test.components.ChartTypeDialog; import org.labkey.test.pages.study.DatasetDesignerPage; +import org.labkey.test.params.FieldDefinition; import org.labkey.test.util.DataRegionTable; +import org.labkey.test.util.DomainUtils; +import org.labkey.test.util.EscapeUtil; +import org.labkey.test.util.TestDataGenerator; +import org.labkey.test.util.data.TestDataUtils; import java.io.File; import java.util.Arrays; @@ -182,6 +187,54 @@ public void testPivotQueryChartingTextFieldMeasure() assertTextPresent("The y-axis measure '" + MEASURE_COLUMN + "' had 1 value(s) that could not be converted to a number and are not included in the plot"); } + // coverage for Issue 52739 + @Test + public void testBadPivotQuery() + { + String datasetName = TestDataGenerator.randomDomainName("D2", DomainUtils.DomainKind.StudyDatasetVisit); + String textFieldName = TestDataGenerator.randomFieldName("F1", ":,;'\""); + FieldDefinition textField = new FieldDefinition(textFieldName, FieldDefinition.ColumnType.String); + goToProjectHome(); + + var datasetDesigner = _studyHelper.defineDataset(datasetName, getProjectName()); + datasetDesigner.getFieldsPanel().addFields(List.of(textField)); + var viewDatasetPage = datasetDesigner.clickSave() + .clickViewData(); + TestDataUtils.TsvQuoter _tsvQuoter = new TestDataUtils.TsvQuoter(); + String bulkData = """ + ParticipantId date [F1] + 1 7/28/2025 this + 2 7/29/2025 that + 3 7/30/2025 the other + 4 7/31/2025 and more + 5 8/1/2025 but wait + 6 8/2/2025 still more + """.replace("[F1]", _tsvQuoter.quoteValue(textFieldName)); + var importPage = viewDatasetPage.getDataRegion().clickImportBulkData(); + importPage.setText(bulkData); + importPage.submit(); + + // configure the query + String queryName = "Q1"; + String queryText = """ + SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max, [F1] FROM study.[D2] + GROUP BY ParticipantId, SequenceNum, [F1] + PIVOT I1Max BY [F1] + """.replace("[F1]", EscapeUtil.getSqlQuotedValue(textFieldName)) + .replace("[D2]", EscapeUtil.getSqlQuotedValue(datasetName)); + + goToModule("Query"); + var createQueryPage = createNewQuery("study", datasetName); + createQueryPage.setName(queryName); + var sourceQueryPage = createQueryPage.clickCreate(); + sourceQueryPage.setSource(queryText); + var executeQueryPage = sourceQueryPage.clickSaveAndFinish(); + + // ensure query results contain F1 contents + executeQueryPage.getDataRegion(); + assertTextPresent("this", "that", "the other", "and more", "but wait", "still more"); + } + @Override public BrowserType bestBrowser() { return BrowserType.CHROME; From 1586cca3e4c9356bc3b851cb5cc065cf0998e7e3 Mon Sep 17 00:00:00 2001 From: ChrisJoosse Date: Tue, 29 Jul 2025 11:43:37 -0700 Subject: [PATCH 2/4] clean up --- src/org/labkey/test/tests/PivotQueryTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/org/labkey/test/tests/PivotQueryTest.java b/src/org/labkey/test/tests/PivotQueryTest.java index 26bba5b3fd..1079658854 100644 --- a/src/org/labkey/test/tests/PivotQueryTest.java +++ b/src/org/labkey/test/tests/PivotQueryTest.java @@ -228,10 +228,9 @@ SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max, [F1] FROM study.[D2] createQueryPage.setName(queryName); var sourceQueryPage = createQueryPage.clickCreate(); sourceQueryPage.setSource(queryText); - var executeQueryPage = sourceQueryPage.clickSaveAndFinish(); + sourceQueryPage.clickSaveAndFinish(); // ensure query results contain F1 contents - executeQueryPage.getDataRegion(); assertTextPresent("this", "that", "the other", "and more", "but wait", "still more"); } From 4efd7feff566a1496419f4a5fdad74fc00905864 Mon Sep 17 00:00:00 2001 From: ChrisJoosse Date: Wed, 30 Jul 2025 12:54:53 -0700 Subject: [PATCH 3/4] verify bad pivot gets helpful error --- src/org/labkey/test/tests/PivotQueryTest.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/org/labkey/test/tests/PivotQueryTest.java b/src/org/labkey/test/tests/PivotQueryTest.java index 1079658854..0878f9609e 100644 --- a/src/org/labkey/test/tests/PivotQueryTest.java +++ b/src/org/labkey/test/tests/PivotQueryTest.java @@ -25,6 +25,7 @@ import org.labkey.test.categories.Daily; import org.labkey.test.categories.Data; import org.labkey.test.components.ChartTypeDialog; +import org.labkey.test.pages.query.SourceQueryPage; import org.labkey.test.pages.study.DatasetDesignerPage; import org.labkey.test.params.FieldDefinition; import org.labkey.test.util.DataRegionTable; @@ -214,10 +215,10 @@ public void testBadPivotQuery() importPage.setText(bulkData); importPage.submit(); - // configure the query + // configure the query without F1 as pivot field String queryName = "Q1"; String queryText = """ - SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max, [F1] FROM study.[D2] + SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max FROM study.[D2] GROUP BY ParticipantId, SequenceNum, [F1] PIVOT I1Max BY [F1] """.replace("[F1]", EscapeUtil.getSqlQuotedValue(textFieldName)) @@ -230,6 +231,22 @@ SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max, [F1] FROM study.[D2] sourceQueryPage.setSource(queryText); sourceQueryPage.clickSaveAndFinish(); + // expect query error + waitForText("Query 'Q1' has errors", "Error on line 3: Can not find pivot column:"); + + // update the query to include the pivot column and verify it works + String updatedQueryText = """ + SELECT ParticipantId, SequenceNum, MAX([F1]) AS I1Max, [F1] FROM study.[D2] + GROUP BY ParticipantId, SequenceNum, [F1] + PIVOT I1Max BY [F1] + """.replace("[F1]", EscapeUtil.getSqlQuotedValue(textFieldName)) + .replace("[D2]", EscapeUtil.getSqlQuotedValue(datasetName)); + + clickAndWait(Locator.linkWithText("Edit Query")); + var editQueryPage = new SourceQueryPage(getDriver()); + editQueryPage.setSource(updatedQueryText); + editQueryPage.clickSaveAndFinish(); + // ensure query results contain F1 contents assertTextPresent("this", "that", "the other", "and more", "but wait", "still more"); } From 8c153baa02f01cc17f7b4093202eb142e3f93ed6 Mon Sep 17 00:00:00 2001 From: ChrisJoosse Date: Thu, 31 Jul 2025 15:10:34 -0700 Subject: [PATCH 4/4] remove random exclusions for broader fuzz --- src/org/labkey/test/tests/PivotQueryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/labkey/test/tests/PivotQueryTest.java b/src/org/labkey/test/tests/PivotQueryTest.java index 0878f9609e..34be805a0e 100644 --- a/src/org/labkey/test/tests/PivotQueryTest.java +++ b/src/org/labkey/test/tests/PivotQueryTest.java @@ -193,7 +193,7 @@ public void testPivotQueryChartingTextFieldMeasure() public void testBadPivotQuery() { String datasetName = TestDataGenerator.randomDomainName("D2", DomainUtils.DomainKind.StudyDatasetVisit); - String textFieldName = TestDataGenerator.randomFieldName("F1", ":,;'\""); + String textFieldName = TestDataGenerator.randomFieldName("F1"); FieldDefinition textField = new FieldDefinition(textFieldName, FieldDefinition.ColumnType.String); goToProjectHome();