From c3fca99c2179bd015ecd72222e70a0e643679872 Mon Sep 17 00:00:00 2001 From: Iwao AVE! Date: Wed, 23 Apr 2025 00:26:36 +0900 Subject: [PATCH] Unknown element inside `` should throw exception When using XML script in annotation (e.g. `@Select("")`), the XML parser's validation is disabled. There are other error cases (e.g. invalid attributes) which are undetectable with the current implementation, but it is not our goal to implement full-featured XML validation logic, IMHO. --- .../scripting/xmltags/XMLScriptBuilder.java | 2 ++ .../scripting/xmltags/XMLScriptBuilderTest.java | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java b/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java index 50ffe66a86d..bff492afd8d 100644 --- a/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java +++ b/src/main/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilder.java @@ -247,6 +247,8 @@ private void handleWhenOtherwiseNodes(XNode chooseSqlNode, List ifSqlNo handler.handleNode(child, ifSqlNodes); } else if (handler instanceof OtherwiseHandler) { handler.handleNode(child, defaultSqlNodes); + } else { + throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement."); } } } diff --git a/src/test/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilderTest.java b/src/test/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilderTest.java index d85bb234bba..e53d5b17d4f 100644 --- a/src/test/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilderTest.java +++ b/src/test/java/org/apache/ibatis/scripting/xmltags/XMLScriptBuilderTest.java @@ -17,7 +17,9 @@ package org.apache.ibatis.scripting.xmltags; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import org.apache.ibatis.builder.BuilderException; import org.apache.ibatis.mapping.SqlSource; import org.apache.ibatis.parsing.XPathParser; import org.apache.ibatis.session.Configuration; @@ -42,4 +44,19 @@ void shouldWhereInsertWhitespace() throws Exception { .containsPattern("(?m)^\\s*select \\* from user\\s+WHERE\\s+id = 1\\s+and id > 0\\s*$"); } + @Test + void shouldThrowIfUnknownElementFound() { + String xml = """ + + """; + XMLScriptBuilder parser = new XMLScriptBuilder(new Configuration(), new XPathParser(xml).evalNode("/script")); + assertThatThrownBy(parser::parseScriptNode).isInstanceOf(BuilderException.class) + .hasMessage("Unknown element in SQL statement."); + } }