From 029edbfb19e78bf1eaf2606305093a9288f9d8a8 Mon Sep 17 00:00:00 2001 From: Andreas Reichel Date: Tue, 20 Jul 2021 19:59:22 +0700 Subject: [PATCH] Allowes JdbcParameter or JdbcNamedParameter for MySQL FullTextSearch Fixes issue #1223 --- .../operators/relational/FullTextSearch.java | 14 ++++++- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 29 ++++++++++----- .../FullTextSearchExpressionTest.java | 37 +++++++++++++++++++ 3 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 src/test/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearchExpressionTest.java diff --git a/src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java b/src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java index f54dd73c6..639f0b182 100644 --- a/src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java +++ b/src/main/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearch.java @@ -17,6 +17,8 @@ import java.util.Optional; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.ExpressionVisitor; +import net.sf.jsqlparser.expression.JdbcNamedParameter; +import net.sf.jsqlparser.expression.JdbcParameter; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.parser.ASTNodeAccessImpl; import net.sf.jsqlparser.schema.Column; @@ -24,7 +26,7 @@ public class FullTextSearch extends ASTNodeAccessImpl implements Expression { private List _matchColumns; - private StringValue _againstValue; + private Expression _againstValue; private String _searchModifier; public FullTextSearch() { @@ -42,8 +44,16 @@ public List getMatchColumns() { public void setAgainstValue(StringValue val) { this._againstValue = val; } + + public void setAgainstValue(JdbcNamedParameter val) { + this._againstValue = val; + } + + public void setAgainstValue(JdbcParameter val) { + this._againstValue = val; + } - public StringValue getAgainstValue() { + public Expression getAgainstValue() { return this._againstValue; } diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 667484dda..44ffde8b2 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4149,22 +4149,31 @@ FullTextSearch FullTextSearch() : { Column col; Token searchModifier; Token againstValue; + JdbcParameter jdbcParameter; + JdbcNamedParameter jdbcNamedParameter; FullTextSearch fs = new FullTextSearch(); List matchedColumns = new ArrayList(); List expList = new ArrayList(); } { "(" col=Column() { matchedColumns.add(col); } ("," col=Column() { matchedColumns.add(col); } )* ")" - "(" againstValue= { fs.setAgainstValue(new StringValue(againstValue.image)); } - [ - ( - searchModifier="IN NATURAL LANGUAGE MODE" - | searchModifier="IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION" - | searchModifier="IN BOOLEAN MODE" - | searchModifier="WITH QUERY EXPANSION" - ) - { fs.setSearchModifier(searchModifier.image); } - ] + "(" + ( + againstValue= { fs.setAgainstValue(new StringValue(againstValue.image)); } + | + jdbcParameter=SimpleJdbcParameter() { fs.setAgainstValue( jdbcParameter ); } + | + jdbcNamedParameter=SimpleJdbcNamedParameter() { fs.setAgainstValue( jdbcNamedParameter ); } + ) + [ + ( + searchModifier="IN NATURAL LANGUAGE MODE" + | searchModifier="IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION" + | searchModifier="IN BOOLEAN MODE" + | searchModifier="WITH QUERY EXPANSION" + ) + { fs.setSearchModifier(searchModifier.image); } + ] ")" { fs.setMatchColumns(matchedColumns); diff --git a/src/test/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearchExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearchExpressionTest.java new file mode 100644 index 000000000..1275c8860 --- /dev/null +++ b/src/test/java/net/sf/jsqlparser/expression/operators/relational/FullTextSearchExpressionTest.java @@ -0,0 +1,37 @@ +/*- + * #%L + * JSQLParser library + * %% + * Copyright (C) 2004 - 2021 JSQLParser + * %% + * Dual licensed under GNU LGPL 2.1 or Apache License 2.0 + * #L% + */ + +package net.sf.jsqlparser.expression.operators.relational; + +import net.sf.jsqlparser.JSQLParserException; +import net.sf.jsqlparser.test.TestUtils; +import org.junit.Test; + +/** + * + * @author Andreas Reichel + */ +public class FullTextSearchExpressionTest { + @Test + public void testFullTextSearchExpressionWithParameters() throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed( + "select match (name) against (?) as full_text from commodity", true); + TestUtils.assertSqlCanBeParsedAndDeparsed( + "select match (name) against (:parameter) as full_text from commodity", true); + } + + @Test + public void testIssue1223() throws JSQLParserException { + TestUtils.assertSqlCanBeParsedAndDeparsed("select\n" + "c.*,\n" + + "match (name) against (?) as full_text\n" + "from\n" + "commodity c\n" + "where\n" + + "match (name) against (?)\n" + "and c.deleted = 0\n" + "order by\n" + "full_text desc", + true); + } +}