Skip to content

Commit 9765050

Browse files
author
David Hayes
committed
Add support for multiple Trino JSON functions
Adding support for clauses in JSON Functions. Fixes #2368 Adds support for the extra clauses found in Trino's JSON functions https://trino.io/docs/current/functions/json.html#json-exists, and includes test cases for these extra functions directly taken from the documentations. Before: Result "net.sf.jsqlparser.benchmark.JSQLParserBenchmark.parseSQLStatements": 34.858 ±(99.9%) 1.724 ms/op [Average] (min, avg, max) = (32.578, 34.858, 38.383), stdev = 2.302 CI (99.9%): [33.133, 36.582] (assumes normal distribution) After: Result "net.sf.jsqlparser.benchmark.JSQLParserBenchmark.parseSQLStatements": 36.154 ±(99.9%) 1.701 ms/op [Average] (min, avg, max) = (33.100, 36.154, 38.353), stdev = 2.271 CI (99.9%): [34.453, 37.855] (assumes normal distribution)
1 parent 7c52e7f commit 9765050

File tree

15 files changed

+2534
-23
lines changed

15 files changed

+2534
-23
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -652,6 +652,14 @@ default void visit(JsonFunction jsonFunction) {
652652
this.visit(jsonFunction, null);
653653
}
654654

655+
default <S> T visit(JsonTableFunction jsonTableFunction, S context) {
656+
return visit((Function) jsonTableFunction, context);
657+
}
658+
659+
default void visit(JsonTableFunction jsonTableFunction) {
660+
this.visit(jsonTableFunction, null);
661+
}
662+
655663
<S> T visit(ConnectByRootOperator connectByRootOperator, S context);
656664

657665
default void visit(ConnectByRootOperator connectByRootOperator) {

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,12 +722,40 @@ public <S> T visit(JsonAggregateFunction jsonAggregateFunction, S context) {
722722
@Override
723723
public <S> T visit(JsonFunction jsonFunction, S context) {
724724
ArrayList<Expression> subExpressions = new ArrayList<>();
725+
for (JsonKeyValuePair keyValuePair : jsonFunction.getKeyValuePairs()) {
726+
if (keyValuePair.getKey() instanceof Expression) {
727+
subExpressions.add((Expression) keyValuePair.getKey());
728+
}
729+
if (keyValuePair.getValue() instanceof Expression) {
730+
subExpressions.add((Expression) keyValuePair.getValue());
731+
}
732+
}
725733
for (JsonFunctionExpression expr : jsonFunction.getExpressions()) {
726734
subExpressions.add(expr.getExpression());
727735
}
736+
if (jsonFunction.getInputExpression() != null) {
737+
subExpressions.add(jsonFunction.getInputExpression().getExpression());
738+
}
739+
if (jsonFunction.getJsonPathExpression() != null) {
740+
subExpressions.add(jsonFunction.getJsonPathExpression());
741+
}
742+
subExpressions.addAll(jsonFunction.getPassingExpressions());
743+
if (jsonFunction.getOnEmptyBehavior() != null
744+
&& jsonFunction.getOnEmptyBehavior().getExpression() != null) {
745+
subExpressions.add(jsonFunction.getOnEmptyBehavior().getExpression());
746+
}
747+
if (jsonFunction.getOnErrorBehavior() != null
748+
&& jsonFunction.getOnErrorBehavior().getExpression() != null) {
749+
subExpressions.add(jsonFunction.getOnErrorBehavior().getExpression());
750+
}
728751
return visitExpressions(jsonFunction, context, subExpressions);
729752
}
730753

754+
@Override
755+
public <S> T visit(JsonTableFunction jsonTableFunction, S context) {
756+
return visitExpressions(jsonTableFunction, context, jsonTableFunction.getAllExpressions());
757+
}
758+
731759
@Override
732760
public <S> T visit(ConnectByRootOperator connectByRootOperator, S context) {
733761
return connectByRootOperator.getColumn().accept(this, context);

0 commit comments

Comments
 (0)