Skip to content

Commit ecee90b

Browse files
committed
Fixed an issue with a statement with no preceding text node
1 parent e8a476f commit ecee90b

File tree

2 files changed

+25
-5
lines changed

2 files changed

+25
-5
lines changed

src/main/java/org/apache/ibatis/scripting/xmltags/DynamicContext.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,16 +91,21 @@ public String getSql() {
9191
return sqlBuilder.toString().trim();
9292
}
9393

94+
private void initTokenParser(List<ParameterMapping> parameterMappings) {
95+
if (tokenParser == null) {
96+
tokenHandler = new ParameterMappingTokenHandler(parameterMappings, configuration, parameterObject, parameterType,
97+
bindings, paramExists);
98+
tokenParser = new GenericTokenParser("#{", "}", tokenHandler);
99+
}
100+
}
101+
94102
public List<ParameterMapping> getParameterMappings() {
103+
initTokenParser(new ArrayList<>());
95104
return tokenHandler == null ? new ArrayList<>() : tokenHandler.getParameterMappings();
96105
}
97106

98107
protected String parseParam(String sql) {
99-
if (tokenParser == null) {
100-
tokenHandler = new ParameterMappingTokenHandler(getParameterMappings(), configuration, parameterObject,
101-
parameterType, bindings, paramExists);
102-
tokenParser = new GenericTokenParser("#{", "}", tokenHandler);
103-
}
108+
initTokenParser(getParameterMappings());
104109
return tokenParser.parse(sql);
105110
}
106111

src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,21 @@ void shouldPerformStrictMatchOnForEachVariableSubstitution() throws Exception {
343343
assertEquals("u", boundSql.getParameterMappings().get(3).getProperty());
344344
}
345345

346+
@Test
347+
void cornerCase_ForeachComesFirst() throws Exception {
348+
final Map<String, Object> param = new HashMap<>();
349+
List<Bean> beans = new ArrayList<>();
350+
beans.add(new Bean("bean id 1"));
351+
beans.add(new Bean("bean id 2"));
352+
param.put("beans", beans);
353+
DynamicSqlSource source = createDynamicSqlSource(new ForEachSqlNode(new Configuration(),
354+
mixedContents(new TextSqlNode("#{b.id}")), "beans", false, null, "b", "(", ")", ","));
355+
BoundSql boundSql = source.getBoundSql(param);
356+
assertEquals(2, boundSql.getParameterMappings().size());
357+
assertEquals("b.id", boundSql.getParameterMappings().get(0).getProperty());
358+
assertEquals("b.id", boundSql.getParameterMappings().get(1).getProperty());
359+
}
360+
346361
private DynamicSqlSource createDynamicSqlSource(SqlNode... contents) throws IOException, SQLException {
347362
createBlogDataSource();
348363
final String resource = "org/apache/ibatis/builder/MapperConfig.xml";

0 commit comments

Comments
 (0)