Skip to content

Commit f03cb70

Browse files
committed
Add check for invalid SQL - multiple where clauses
1 parent 1108cbb commit f03cb70

File tree

5 files changed

+43
-12
lines changed

5 files changed

+43
-12
lines changed

src/main/java/org/mybatis/dynamic/sql/common/AbstractBooleanExpressionDSL.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,11 @@
2828
import org.mybatis.dynamic.sql.ExistsPredicate;
2929
import org.mybatis.dynamic.sql.SqlCriterion;
3030
import org.mybatis.dynamic.sql.VisitableCondition;
31+
import org.mybatis.dynamic.sql.exception.InvalidSqlException;
32+
import org.mybatis.dynamic.sql.util.Messages;
3133

3234
public abstract class AbstractBooleanExpressionDSL<T extends AbstractBooleanExpressionDSL<T>> {
33-
protected SqlCriterion initialCriterion; // WARNING - may be null!
35+
private SqlCriterion initialCriterion; // WARNING - may be null!
3436
protected final List<AndOrCriteriaGroup> subCriteria = new ArrayList<>();
3537

3638
@NotNull
@@ -143,5 +145,18 @@ private void addSubCriteria(String connector, List<AndOrCriteriaGroup> criteria)
143145
.build());
144146
}
145147

148+
protected void setInitialCriterion(SqlCriterion initialCriterion) {
149+
if (this.initialCriterion != null) {
150+
throw new InvalidSqlException(Messages.getString("ERROR.32")); //$NON-NLS-1$
151+
}
152+
153+
this.initialCriterion = initialCriterion;
154+
}
155+
156+
// may be null!
157+
protected SqlCriterion getInitialCriterion() {
158+
return initialCriterion;
159+
}
160+
146161
protected abstract T getThis();
147162
}

src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,7 @@ public FromGatherer<R> selectDistinct(List<BasicColumn> selectList) {
602602
public class QueryExpressionHavingBuilder extends AbstractBooleanExpressionDSL<QueryExpressionHavingBuilder> implements Buildable<R> {
603603

604604
public QueryExpressionHavingBuilder(SqlCriterion initialCriterion) {
605-
this.initialCriterion = initialCriterion;
605+
setInitialCriterion(initialCriterion);
606606
}
607607

608608
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
@@ -645,7 +645,7 @@ protected QueryExpressionHavingBuilder getThis() {
645645
}
646646

647647
protected HavingModel buildHavingModel() {
648-
return new HavingModel(initialCriterion, subCriteria);
648+
return new HavingModel(getInitialCriterion(), subCriteria);
649649
}
650650
}
651651
}

src/main/java/org/mybatis/dynamic/sql/where/AbstractWhereDSL.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
5656
@NotNull
5757
public <S> T where(BindableColumn<S> column, VisitableCondition<S> condition,
5858
List<AndOrCriteriaGroup> subCriteria) {
59-
initialCriterion = ColumnAndConditionCriterion.withColumn(column)
59+
setInitialCriterion(ColumnAndConditionCriterion.withColumn(column)
6060
.withCondition(condition)
6161
.withSubCriteria(subCriteria)
62-
.build();
62+
.build());
6363
return getThis();
6464
}
6565

@@ -70,8 +70,8 @@ public T where(ExistsPredicate existsPredicate, AndOrCriteriaGroup... subCriteri
7070

7171
@NotNull
7272
public T where(ExistsPredicate existsPredicate, List<AndOrCriteriaGroup> subCriteria) {
73-
initialCriterion = new ExistsCriterion.Builder()
74-
.withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build();
73+
setInitialCriterion(new ExistsCriterion.Builder()
74+
.withExistsPredicate(existsPredicate).withSubCriteria(subCriteria).build());
7575
return getThis();
7676
}
7777

@@ -82,18 +82,18 @@ public T where(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria)
8282

8383
@NotNull
8484
public T where(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
85-
this.initialCriterion = new CriteriaGroup.Builder()
85+
setInitialCriterion(new CriteriaGroup.Builder()
8686
.withInitialCriterion(initialCriterion)
8787
.withSubCriteria(subCriteria)
88-
.build();
88+
.build());
8989
return getThis();
9090
}
9191

9292
@NotNull
9393
public T where(List<AndOrCriteriaGroup> criteria) {
94-
initialCriterion = new CriteriaGroup.Builder()
94+
setInitialCriterion(new CriteriaGroup.Builder()
9595
.withSubCriteria(criteria)
96-
.build();
96+
.build());
9797
return getThis();
9898
}
9999

@@ -104,7 +104,7 @@ public T applyWhere(WhereApplier whereApplier) {
104104
}
105105

106106
protected WhereModel internalBuild() {
107-
return new WhereModel(initialCriterion, subCriteria, statementConfiguration);
107+
return new WhereModel(getInitialCriterion(), subCriteria, statementConfiguration);
108108
}
109109

110110
protected abstract T getThis();

src/main/resources/org/mybatis/dynamic/sql/util/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,5 @@ ERROR.28=You must specify a select statement in a sub query
4747
ERROR.29=Insert Select Statements Must Contain an "into" phrase
4848
ERROR.30=The parameters for insertMultipleWithGeneratedKeys must contain exactly one parameter of type String
4949
ERROR.31=You cannot specify more than one "having" clause in a query expression
50+
ERROR.32=You cannot specify more than one "where" clause in a statement
5051
INTERNAL.ERROR=Internal Error {0}

src/test/java/org/mybatis/dynamic/sql/InvalidSQLTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
1919
import static org.mybatis.dynamic.sql.SqlBuilder.insert;
2020
import static org.mybatis.dynamic.sql.SqlBuilder.insertInto;
21+
import static org.mybatis.dynamic.sql.SqlBuilder.isEqualTo;
2122
import static org.mybatis.dynamic.sql.SqlBuilder.update;
2223

2324
import java.util.ArrayList;
@@ -43,6 +44,7 @@
4344
import org.mybatis.dynamic.sql.select.join.JoinSpecification;
4445
import org.mybatis.dynamic.sql.select.join.JoinType;
4546
import org.mybatis.dynamic.sql.select.render.PagingModelRenderer;
47+
import org.mybatis.dynamic.sql.update.UpdateDSL;
4648
import org.mybatis.dynamic.sql.update.UpdateModel;
4749
import org.mybatis.dynamic.sql.util.Messages;
4850

@@ -244,6 +246,19 @@ void testInvalidPagingModel() {
244246
.withMessage(Messages.getInternalErrorString(13));
245247
}
246248

249+
250+
@Test
251+
void testInvalidMultipleWhereClauses() {
252+
UpdateDSL<UpdateModel>.UpdateWhereBuilder builder = update(person)
253+
.set(id).equalTo(3)
254+
.where(id, isEqualTo(2));
255+
256+
assertThatExceptionOfType(InvalidSqlException.class)
257+
.isThrownBy(() -> builder.where(id, isEqualTo(5)))
258+
.withMessage(Messages.getString("ERROR.32"));
259+
260+
}
261+
247262
static class TestRow {
248263
private Integer id;
249264

0 commit comments

Comments
 (0)