From: PJ Fanning Date: Mon, 7 Mar 2022 12:06:30 +0000 (+0000) Subject: [bug-65939] add partial fix for clearing formula with circular ref X-Git-Tag: REL_5_2_2~18 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=3317b6393f214e274009a820300dc6b1a84bde9c;p=poi.git [bug-65939] add partial fix for clearing formula with circular ref git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1898677 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java new file mode 100644 index 0000000000..6d40f40f56 --- /dev/null +++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestFormulaEval.java @@ -0,0 +1,28 @@ +package org.apache.poi.xssf.usermodel; + +import org.apache.poi.ss.usermodel.CellType; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TestFormulaEval { + @Test + void testCircularRef() throws IOException { + try (XSSFWorkbook wb = new XSSFWorkbook()) { + XSSFSheet sheet = wb.createSheet(); + XSSFRow row = sheet.createRow(0); + XSSFCell cell = row.createCell(0); + cell.setCellFormula("A1"); + XSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); + // the following assert should probably be NUMERIC not ERROR (from testing in Excel itself) + assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell)); + + cell.setCellFormula(null); + formulaEvaluator.notifyUpdateCell(cell); + //the following assert should probably be BLANK not ERROR + assertEquals(CellType.ERROR, cell.getCellType()); + } + } +} diff --git a/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java b/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java index e87b83bb95..5b10f8d99b 100644 --- a/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java +++ b/poi/src/main/java/org/apache/poi/ss/formula/CellCacheEntry.java @@ -114,7 +114,9 @@ abstract class CellCacheEntry implements ICacheEntry { for (int i = 0; i < formulaCells.length; i++) { FormulaCellCacheEntry fc = formulaCells[i]; fc.clearFormulaEntry(); - fc.recurseClearCachedFormulaResults(); + if (fc != this) { + fc.recurseClearCachedFormulaResults(); + } } } diff --git a/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java b/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java new file mode 100644 index 0000000000..24e727b7c2 --- /dev/null +++ b/poi/src/test/java/org/apache/poi/ss/formula/TestFormulaEval.java @@ -0,0 +1,53 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ==================================================================== + */ + +package org.apache.poi.ss.formula; + +import org.apache.poi.hssf.usermodel.HSSFCell; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFRow; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.CellType; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TestFormulaEval { + + @Disabled("https://bz.apache.org/bugzilla/show_bug.cgi?id=65939") + @Test + void testCircularRef() throws IOException { + try (HSSFWorkbook wb = new HSSFWorkbook()) { + HSSFSheet sheet = wb.createSheet(); + HSSFRow row = sheet.createRow(0); + HSSFCell cell = row.createCell(0); + cell.setCellFormula("A1"); + HSSFFormulaEvaluator formulaEvaluator = wb.getCreationHelper().createFormulaEvaluator(); + // the following assert should probably be NUMERIC not ERROR (from testing in Excel itself) + assertEquals(CellType.ERROR, formulaEvaluator.evaluateFormulaCell(cell)); + + cell.setCellFormula(null); //this line fails + formulaEvaluator.notifyUpdateCell(cell); + } + } +}