Skip to content

Commit 74e0226

Browse files
committed
fixes #648
fixes #638
1 parent 36907e4 commit 74e0226

File tree

6 files changed

+44
-19
lines changed

6 files changed

+44
-19
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Please provide feedback on:
2323
* Is there any need for a Java 7 JSqlParser build, or can we move on to at least Java 8? (https://github.com/JSQLParser/JSqlParser/issues/814)
2424

2525
## News
26+
* The array parsing is the default behaviour. Square bracket quotation has to be enabled using
27+
a parser flag (**CCJSqlParser.withSquareBracketQuotation**).
2628
* due to an API change the version will be 3.0
2729
* JSqlParser uses now Java 8 at the minimum
2830
* Released version **2.1** of JSqlParser
@@ -63,6 +65,8 @@ Also I would like to know about needed examples or documentation stuff.
6365

6466
## Extensions in the latest SNAPSHOT version 3.0
6567

68+
* support for array constructs using square brackets. This collides with square bracket
69+
quotation of SqlServer. The parser has now a flag to enable this quotation again (**CCJSqlParser.withSquareBracketQuotation**).
6670
* support for **update table1 inner join table2 ...** (API change)
6771
* support for **declare** statement
6872
* allow empty double quotes

src/main/java/net/sf/jsqlparser/parser/CCJSqlParserUtil.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.io.InputStream;
1313
import java.io.Reader;
14+
import java.util.function.Consumer;
1415
import net.sf.jsqlparser.JSQLParserException;
1516
import net.sf.jsqlparser.expression.Expression;
1617
import net.sf.jsqlparser.statement.Statement;
@@ -36,7 +37,14 @@ public static Statement parse(Reader statementReader) throws JSQLParserException
3637
}
3738

3839
public static Statement parse(String sql) throws JSQLParserException {
40+
return parse(sql, null);
41+
}
42+
43+
public static Statement parse(String sql, Consumer<CCJSqlParser> consumer) throws JSQLParserException {
3944
CCJSqlParser parser = new CCJSqlParser(new StringProvider(sql));
45+
if (consumer != null) {
46+
consumer.accept(parser);
47+
}
4048
try {
4149
return parser.Statement();
4250
} catch (Exception ex) {
@@ -96,7 +104,8 @@ public static Expression parseCondExpression(String condExpr) throws JSQLParserE
96104
}
97105

98106
/**
99-
* Parse an conditional expression. This is the expression after a where clause.
107+
* Parse an conditional expression. This is the expression after a where
108+
* clause.
100109
*
101110
* @param condExpr
102111
* @param allowPartialParse false: needs the whole string to be processed.

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,8 @@ public void visit(SimilarToExpression expr) {
812812
@Override
813813
public void visit(ArrayExpression array) {
814814
array.getObjExpression().accept(this);
815+
buffer.append("[");
815816
array.getIndexExpression().accept(this);
817+
buffer.append("]");
816818
}
817819
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public class CCJSqlParser {
8888
PARSER_END(CCJSqlParser)
8989

9090
TOKEN_MGR_DECLS : {
91-
public boolean allowSquareBracketQuotation = true;
91+
public boolean allowSquareBracketQuotation = false;
9292

9393
public void CommonTokenAction(Token t)
9494
{
@@ -2848,7 +2848,7 @@ Expression PrimaryExpression() #PrimaryExpression:
28482848
ColDataType type = null;
28492849
boolean not = false;
28502850
boolean exclamationMarkNot = false;
2851-
boolean dateExpressionAllowed = true
2851+
boolean dateExpressionAllowed = true;
28522852
Expression idxExpr;
28532853
}
28542854
{

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,23 @@ public void setup() {
4848
@Test
4949
public void testMultiPartTableNameWithServerNameAndDatabaseNameAndSchemaName() throws Exception {
5050
final String statement = "SELECT columnName FROM [server-name\\server-instance].databaseName.schemaName.tableName";
51-
Select select = (Select) parserManager.parse(new StringReader(statement));
52-
53-
assertStatementCanBeDeparsedAs(select, statement);
51+
assertSqlCanBeParsedAndDeparsed(statement, false,
52+
parser -> parser.withSquareBracketQuotation(true));
5453
}
5554

5655
@Test
5756
public void testMultiPartTableNameWithServerNameAndDatabaseName() throws Exception {
5857
final String statement = "SELECT columnName FROM [server-name\\server-instance].databaseName..tableName";
59-
Select select = (Select) parserManager.parse(new StringReader(statement));
6058

61-
assertStatementCanBeDeparsedAs(select, statement);
59+
assertSqlCanBeParsedAndDeparsed(statement, false,
60+
parser -> parser.withSquareBracketQuotation(true));
6261
}
6362

6463
@Test
6564
public void testMultiPartTableNameWithServerNameAndSchemaName() throws Exception {
6665
final String statement = "SELECT columnName FROM [server-name\\server-instance]..schemaName.tableName";
67-
Select select = (Select) parserManager.parse(new StringReader(statement));
68-
69-
assertStatementCanBeDeparsedAs(select, statement);
66+
assertSqlCanBeParsedAndDeparsed(statement, false,
67+
parser -> parser.withSquareBracketQuotation(true));
7068
}
7169

7270
@Test
@@ -78,9 +76,8 @@ public void testMultiPartTableNameWithServerProblem() throws Exception {
7876
@Test
7977
public void testMultiPartTableNameWithServerName() throws Exception {
8078
final String statement = "SELECT columnName FROM [server-name\\server-instance]...tableName";
81-
Select select = (Select) parserManager.parse(new StringReader(statement));
82-
83-
assertStatementCanBeDeparsedAs(select, statement);
79+
assertSqlCanBeParsedAndDeparsed(statement, false,
80+
parser -> parser.withSquareBracketQuotation(true));
8481
}
8582

8683
@Test
@@ -1679,13 +1676,15 @@ public void testCaseElseAddition() throws JSQLParserException {
16791676
@Test
16801677
public void testBrackets() throws JSQLParserException {
16811678
String stmt = "SELECT table_a.name AS [Test] FROM table_a";
1682-
assertSqlCanBeParsedAndDeparsed(stmt);
1679+
assertSqlCanBeParsedAndDeparsed(stmt, false,
1680+
parser -> parser.withSquareBracketQuotation(true));
16831681
}
16841682

16851683
@Test
16861684
public void testBrackets2() throws JSQLParserException {
16871685
String stmt = "SELECT [a] FROM t";
1688-
assertSqlCanBeParsedAndDeparsed(stmt);
1686+
assertSqlCanBeParsedAndDeparsed(stmt, false,
1687+
parser -> parser.withSquareBracketQuotation(true));
16891688
}
16901689

16911690
@Test
@@ -3754,4 +3753,9 @@ public void testInnerWithBlock() throws JSQLParserException {
37543753
public void testArrayIssue648() throws JSQLParserException {
37553754
assertSqlCanBeParsedAndDeparsed("select * from a join b on a.id = b.id[1]", true);
37563755
}
3756+
3757+
@Test
3758+
public void testArrayIssue638() throws JSQLParserException {
3759+
assertSqlCanBeParsedAndDeparsed("SELECT PAYLOAD[0] FROM MYTABLE");
3760+
}
37573761
}

src/test/java/net/sf/jsqlparser/test/TestUtils.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
*/
1010
package net.sf.jsqlparser.test;
1111

12+
import java.util.function.Consumer;
1213
import java.util.regex.Pattern;
1314
import net.sf.jsqlparser.JSQLParserException;
1415
import net.sf.jsqlparser.expression.Expression;
1516
import net.sf.jsqlparser.expression.OracleHint;
17+
import net.sf.jsqlparser.parser.CCJSqlParser;
1618
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
1719
import net.sf.jsqlparser.statement.Statement;
1820
import net.sf.jsqlparser.statement.select.PlainSelect;
@@ -43,12 +45,16 @@ public static void assertSqlCanBeParsedAndDeparsed(String statement) throws JSQL
4345
* Tries to parse and deparse the given statement.
4446
*
4547
* @param statement
46-
* @param laxDeparsingCheck removes all linefeeds from the original and removes all double
47-
* spaces. The check is caseinsensitive.
48+
* @param laxDeparsingCheck removes all linefeeds from the original and
49+
* removes all double spaces. The check is caseinsensitive.
4850
* @throws JSQLParserException
4951
*/
5052
public static void assertSqlCanBeParsedAndDeparsed(String statement, boolean laxDeparsingCheck) throws JSQLParserException {
51-
Statement parsed = CCJSqlParserUtil.parse(statement);
53+
assertSqlCanBeParsedAndDeparsed(statement, laxDeparsingCheck, null);
54+
}
55+
56+
public static void assertSqlCanBeParsedAndDeparsed(String statement, boolean laxDeparsingCheck, Consumer<CCJSqlParser> consumer) throws JSQLParserException {
57+
Statement parsed = CCJSqlParserUtil.parse(statement, consumer);
5258
assertStatementCanBeDeparsedAs(parsed, statement, laxDeparsingCheck);
5359
}
5460

0 commit comments

Comments
 (0)