Skip to content

Commit f36eb48

Browse files
Better workaround for NULL, NULL NULL ON NULL
1 parent e3fadf6 commit f36eb48

File tree

2 files changed

+21
-24
lines changed

2 files changed

+21
-24
lines changed

src/main/java/net/sf/jsqlparser/expression/JsonFunction.java

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -182,27 +182,23 @@ public StringBuilder appendObject(StringBuilder builder) {
182182
public StringBuilder appendArray(StringBuilder builder) {
183183
builder.append("JSON_ARRAY( ");
184184
int i = 0;
185-
185+
int n = expressions.size();
186+
186187
// @fixme: this is a workaround for NULL ON NULL parsed as expressions
187-
if (expressions.size() == 3 && (expressions.get(0).toString().equalsIgnoreCase("null")
188-
|| expressions.get(0).toString().equalsIgnoreCase("absent")
189-
&& expressions.get(1).toString().equalsIgnoreCase("on")
190-
&& expressions.get(2).toString().equalsIgnoreCase("null"))) {
191-
for (JsonFunctionExpression expr : expressions) {
192-
if (i > 0) {
193-
builder.append(" ");
194-
}
195-
expr.append(builder);
196-
i++;
197-
}
198-
} else {
199-
for (JsonFunctionExpression expr : expressions) {
200-
if (i > 0) {
201-
builder.append(", ");
202-
}
203-
expr.append(builder);
204-
i++;
188+
// json_array(null on null)
189+
// json_array(null null on null)
190+
// json_array(null, null null on null)
191+
boolean noSeparatorsForNullOnNull =
192+
n >= 3 && expressions.get(n - 3).toString().equalsIgnoreCase("null")
193+
&& expressions.get(n - 2).toString().equalsIgnoreCase("on")
194+
&& expressions.get(n - 1).toString().equalsIgnoreCase("null");
195+
196+
for (JsonFunctionExpression expr : expressions) {
197+
if (i > 0) {
198+
builder.append(noSeparatorsForNullOnNull && i >= n - 3 ? " " : ", ");
205199
}
200+
expr.append(builder);
201+
i++;
206202
}
207203

208204
if (onNullType != null) {

src/test/java/net/sf/jsqlparser/expression/JsonFunctionTest.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,14 @@ public void testArray() throws JSQLParserException {
104104
"SELECT JSON_ARRAY( (SELECT * from dual) ) FROM dual ", true);
105105
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT JSON_ARRAY( 1, 2, 3 ) FROM dual ", true);
106106
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT JSON_ARRAY( \"v0\" ) FROM dual ", true);
107-
TestUtils.assertSqlCanBeParsedAndDeparsed("SELECT json_array(null on null) FROM dual ", true);
107+
}
108+
109+
@Test
110+
public void testArrayWithNullExpressions() throws JSQLParserException {
108111
TestUtils.assertExpressionCanBeParsedAndDeparsed("JSON_ARRAY( 1, 2, 3 )", true);
109-
110112
TestUtils.assertExpressionCanBeParsedAndDeparsed("json_array(null on null)", true);
111-
112-
TestUtils.assertExpressionCanBeParsedAndDeparsed("json_array(absent on null)", true);
113-
113+
TestUtils.assertExpressionCanBeParsedAndDeparsed("json_array(null null on null)", true);
114+
TestUtils.assertExpressionCanBeParsedAndDeparsed("json_array(null, null null on null)", true);
114115
TestUtils.assertExpressionCanBeParsedAndDeparsed("json_array()", true);
115116
}
116117

0 commit comments

Comments
 (0)