Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,12 @@ default void visit(Function function) {
this.visit(function, null);
}

<S> T visit(FunctionParameterClauseExpression functionParameterClauseExpression, S context);

default void visit(FunctionParameterClauseExpression functionParameterClauseExpression) {
this.visit(functionParameterClauseExpression, null);
}

<S> T visit(SignedExpression signedExpression, S context);

default void visit(SignedExpression signedExpression) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,13 @@ public <S> T visit(Function function, S context) {
return visitExpressions(function, context, subExpressions);
}

@Override
public <S> T visit(FunctionParameterClauseExpression functionParameterClauseExpression,
S context) {
return visitExpressions(functionParameterClauseExpression, context,
functionParameterClauseExpression.getExpression());
}

@Override
public <S> T visit(SignedExpression signedExpression, S context) {
return signedExpression.getExpression().accept(this, context);
Expand Down
53 changes: 53 additions & 0 deletions src/main/java/net/sf/jsqlparser/expression/Function.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.sf.jsqlparser.statement.select.Limit;
import net.sf.jsqlparser.statement.select.OrderByElement;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
Expand Down Expand Up @@ -192,6 +193,58 @@ public void setParameters(ExpressionList<?> list) {
parameters = list;
}

/**
* Returns the parameter expression at the given index without any attached clause wrapper.
* Returns {@code null} if there are no parameters.
*/
public Expression getParameterExpression(int parameterIndex) {
if (parameters == null) {
return null;
}

Expression parameter = parameters.get(parameterIndex);
if (parameter instanceof FunctionParameterClauseExpression) {
return ((FunctionParameterClauseExpression) parameter).getExpression();
}
return parameter;
}

/**
* Returns the trailing clause attached to a parameter, e.g. {@code ERROR ON ERROR}, or
* {@code null} when no clause is attached.
*/
public String getParameterTrailingClause(int parameterIndex) {
if (parameters == null) {
return null;
}

Object parameter = parameters.get(parameterIndex);
if (parameter instanceof FunctionParameterClauseExpression) {
return ((FunctionParameterClauseExpression) parameter).getClause();
}
return null;
}

/**
* Returns one entry per parameter with the attached trailing clause at that index, or
* {@code null} when no clause is attached to that parameter.
*/
public List<String> getParameterTrailingClauses() {
if (parameters == null) {
return Collections.emptyList();
}

List<String> clauses = new ArrayList<>(parameters.size());
for (Object parameter : parameters) {
if (parameter instanceof FunctionParameterClauseExpression) {
clauses.add(((FunctionParameterClauseExpression) parameter).getClause());
} else {
clauses.add(null);
}
}
return clauses;
}

/**
* the parameters might be named parameters, e.g. substring('foobar' from 2 for 3)
*
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*-
* #%L
* JSQLParser library
* %%
* Copyright (C) 2004 - 2026 JSQLParser
* %%
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
* #L%
*/
package net.sf.jsqlparser.expression;

import net.sf.jsqlparser.parser.ASTNodeAccessImpl;

public class FunctionParameterClauseExpression extends ASTNodeAccessImpl implements Expression {
private Expression expression;
private String clause;

public FunctionParameterClauseExpression(Expression expression, String clause) {
this.expression = expression;
this.clause = clause;
}

public Expression getExpression() {
return expression;
}

public FunctionParameterClauseExpression setExpression(Expression expression) {
this.expression = expression;
return this;
}

public String getClause() {
return clause;
}

public FunctionParameterClauseExpression setClause(String clause) {
this.clause = clause;
return this;
}

@Override
public <T, S> T accept(ExpressionVisitor<T> expressionVisitor, S context) {
return expressionVisitor.visit(this, context);
}

@Override
public String toString() {
if (clause == null || clause.isEmpty()) {
return expression != null ? expression.toString() : "";
}
return expression + " " + clause;
}
}
9 changes: 9 additions & 0 deletions src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,15 @@ public <S> Void visit(Function function, S context) {
return null;
}

@Override
public <S> Void visit(FunctionParameterClauseExpression functionParameterClauseExpression,
S context) {
if (functionParameterClauseExpression.getExpression() != null) {
functionParameterClauseExpression.getExpression().accept(this, context);
}
return null;
}

@Override
public <S> Void visit(GreaterThan greaterThan, S context) {
visitBinaryExpression(greaterThan);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.ExtractExpression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.FunctionParameterClauseExpression;
import net.sf.jsqlparser.expression.HexValue;
import net.sf.jsqlparser.expression.HighExpression;
import net.sf.jsqlparser.expression.IntervalExpression;
Expand Down Expand Up @@ -939,6 +940,13 @@ public <S> StringBuilder visit(Function function, S context) {
return builder;
}

@Override
public <S> StringBuilder visit(
FunctionParameterClauseExpression functionParameterClauseExpression, S context) {
builder.append(functionParameterClauseExpression);
return builder;
}

@Override
public <S> StringBuilder visit(ParenthesedSelect selectBody, S context) {
selectBody.getSelect().accept(this, context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.FunctionParameterClauseExpression;
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
import net.sf.jsqlparser.expression.operators.relational.NamedExpressionList;
import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
Expand Down Expand Up @@ -55,7 +56,11 @@ public void deParse(ExpressionList<?> expressionList) {
builder.append(name);
builder.append(" ");
}
expression.accept(expressionVisitor, null);
if (expression instanceof FunctionParameterClauseExpression) {
builder.append(expression);
} else {
expression.accept(expressionVisitor, null);
}
i++;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import net.sf.jsqlparser.expression.ExpressionVisitor;
import net.sf.jsqlparser.expression.ExtractExpression;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.FunctionParameterClauseExpression;
import net.sf.jsqlparser.expression.HexValue;
import net.sf.jsqlparser.expression.HighExpression;
import net.sf.jsqlparser.expression.IntervalExpression;
Expand Down Expand Up @@ -547,6 +548,13 @@ public <S> Void visit(Function function, S context) {
return null;
}

@Override
public <S> Void visit(FunctionParameterClauseExpression functionParameterClauseExpression,
S context) {
validateOptionalExpression(functionParameterClauseExpression.getExpression(), this);
return null;
}

@Override
public <S> Void visit(DateValue dateValue, S context) {
// nothing to validate
Expand Down
Loading
Loading