Skip to content

Commit 38ae88a

Browse files
committed
fix(parser): parse mysql fulltext AGAINST concat expression
1 parent bfcb8b7 commit 38ae88a

File tree

5 files changed

+42
-18
lines changed

5 files changed

+42
-18
lines changed

src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@
99
*/
1010
package net.sf.jsqlparser.expression.operators.relational;
1111

12+
import java.util.Arrays;
13+
import java.util.Collection;
14+
import java.util.Iterator;
15+
import java.util.Optional;
1216
import net.sf.jsqlparser.expression.Expression;
1317
import net.sf.jsqlparser.expression.ExpressionVisitor;
1418
import net.sf.jsqlparser.expression.JdbcNamedParameter;
@@ -17,11 +21,6 @@
1721
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1822
import net.sf.jsqlparser.schema.Column;
1923

20-
import java.util.Arrays;
21-
import java.util.Collection;
22-
import java.util.Iterator;
23-
import java.util.Optional;
24-
2524
public class FullTextSearch extends ASTNodeAccessImpl implements Expression {
2625

2726
private ExpressionList<Column> _matchColumns;
@@ -44,16 +43,20 @@ public Expression getAgainstValue() {
4443
return this._againstValue;
4544
}
4645

47-
public void setAgainstValue(StringValue val) {
46+
public void setAgainstValue(Expression val) {
4847
this._againstValue = val;
4948
}
5049

50+
public void setAgainstValue(StringValue val) {
51+
setAgainstValue((Expression) val);
52+
}
53+
5154
public void setAgainstValue(JdbcNamedParameter val) {
52-
this._againstValue = val;
55+
setAgainstValue((Expression) val);
5356
}
5457

5558
public void setAgainstValue(JdbcParameter val) {
56-
this._againstValue = val;
59+
setAgainstValue((Expression) val);
5760
}
5861

5962
public String getSearchModifier() {
@@ -92,6 +95,10 @@ public FullTextSearch withMatchColumns(ExpressionList<Column> matchColumns) {
9295
}
9396

9497
public FullTextSearch withAgainstValue(StringValue againstValue) {
98+
return withAgainstValue((Expression) againstValue);
99+
}
100+
101+
public FullTextSearch withAgainstValue(Expression againstValue) {
95102
this.setAgainstValue(againstValue);
96103
return this;
97104
}

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ public <S> Void visit(ExcludesExpression excludesExpression, S context) {
275275
@Override
276276
public <S> Void visit(FullTextSearch fullTextSearch, S context) {
277277
validateOptionalExpressions(fullTextSearch.getMatchColumns());
278+
validateOptionalExpression(fullTextSearch.getAgainstValue(), this);
278279
return null;
279280
}
280281

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8810,22 +8810,14 @@ Execute Execute(): {
88108810

88118811
FullTextSearch FullTextSearch() : {
88128812
Token searchModifier;
8813-
Token againstValue;
8814-
JdbcParameter jdbcParameter;
8815-
JdbcNamedParameter jdbcNamedParameter;
8813+
Expression againstValue;
88168814
FullTextSearch fs = new FullTextSearch();
88178815
ExpressionList<Column> matchedColumns;
88188816
}
88198817
{
88208818
<K_MATCH> "(" matchedColumns=ColumnList() ")" <K_AGAINST>
88218819
"("
8822-
(
8823-
againstValue=<S_CHAR_LITERAL> { fs.setAgainstValue(new StringValue(againstValue.image)); }
8824-
|
8825-
jdbcParameter=JdbcParameter() { fs.setAgainstValue( jdbcParameter ); }
8826-
|
8827-
jdbcNamedParameter=JdbcNamedParameter() { fs.setAgainstValue( jdbcNamedParameter ); }
8828-
)
8820+
againstValue=SimpleExpression() { fs.setAgainstValue(againstValue); }
88298821
[
88308822
(
88318823
searchModifier="IN NATURAL LANGUAGE MODE"

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
5656
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
5757
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
58+
import net.sf.jsqlparser.expression.operators.relational.FullTextSearch;
5859
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
5960
import net.sf.jsqlparser.expression.operators.relational.InExpression;
6061
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
@@ -2279,6 +2280,18 @@ public void testFullTextSearchInDefaultMode() throws JSQLParserException {
22792280
assertSqlCanBeParsedAndDeparsed(statement);
22802281
}
22812282

2283+
@Test
2284+
public void testFullTextSearchAgainstFunctionInBooleanMode() throws JSQLParserException {
2285+
String statement =
2286+
"SELECT MATCH (name) AGAINST (concat('',?,'') IN BOOLEAN MODE) AS full_text FROM commodity";
2287+
Select select = (Select) assertSqlCanBeParsedAndDeparsed(statement);
2288+
FullTextSearch fullTextSearch = assertInstanceOf(FullTextSearch.class,
2289+
select.getPlainSelect().getSelectItem(0).getExpression());
2290+
2291+
assertInstanceOf(Function.class, fullTextSearch.getAgainstValue());
2292+
assertEquals("IN BOOLEAN MODE", fullTextSearch.getSearchModifier());
2293+
}
2294+
22822295
@Test
22832296
public void testIsTrue() throws JSQLParserException {
22842297
String statement = "SELECT col FROM tbl WHERE col IS TRUE";

src/test/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidatorTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package net.sf.jsqlparser.util.validation.validator;
1111

1212
import net.sf.jsqlparser.JSQLParserException;
13+
import net.sf.jsqlparser.parser.feature.Feature;
1314
import net.sf.jsqlparser.util.validation.ValidationTestAsserts;
1415
import net.sf.jsqlparser.util.validation.feature.DatabaseType;
1516
import net.sf.jsqlparser.util.validation.feature.FeaturesAllowed;
@@ -216,6 +217,16 @@ public void testOneColumnFullTextSearchMySQL() throws JSQLParserException {
216217
EXPRESSIONS);
217218
}
218219

220+
@Test
221+
public void testFullTextSearchAgainstFunctionRequiresJdbcFeature() throws JSQLParserException {
222+
validateNotAllowed(
223+
"SELECT * FROM commodity WHERE MATCH (name) AGAINST (concat('',?,'') IN BOOLEAN MODE)",
224+
1,
225+
1,
226+
EXPRESSIONS,
227+
Feature.jdbcParameter);
228+
}
229+
219230
@Test
220231
public void testAnalyticFunctionFilter() throws JSQLParserException {
221232
validateNoErrors(

0 commit comments

Comments
 (0)