Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
fix: fix JSonExpression, accept Expressions
Make JSonExpression accept Expressions
Add Testcase
Expose Idents() and Operators()
Fixes #1696
  • Loading branch information
manticore-projects committed Dec 16, 2022
commit 1ce014ac5069af3ec2dfe6cdc62fe130de9c5e1c
24 changes: 8 additions & 16 deletions src/main/java/net/sf/jsqlparser/expression/JsonExpression.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;

public class JsonExpression extends ASTNodeAccessImpl implements Expression {

private Expression expr;

private List<String> idents = new ArrayList<String>();
Expand All @@ -34,26 +33,19 @@ public void setExpression(Expression expr) {
this.expr = expr;
}

// public List<String> getIdents() {
// return idents;
// }
//
// public void setIdents(List<String> idents) {
// this.idents = idents;
// operators = new ArrayList<String>();
// for (String ident : idents) {
// operators.add("->");
// }
// }
//
// public void addIdent(String ident) {
// addIdent(ident, "->");
// }
public void addIdent(String ident, String operator) {
idents.add(ident);
operators.add(operator);
}

public List<String> getIdents() {
return idents;
}

public List<String> getOperators() {
return operators;
}

@Override
public String toString() {
StringBuilder b = new StringBuilder();
Expand Down
34 changes: 30 additions & 4 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -3951,11 +3951,11 @@ Expression PrimaryExpression() #PrimaryExpression:

| LOOKAHEAD(3, {!interrupted}) retval=CaseWhenExpression()

| retval = SimpleJdbcParameter()
| LOOKAHEAD(3) retval = SimpleJdbcParameter()

| LOOKAHEAD(2, {!interrupted}) retval=JdbcNamedParameter()
| LOOKAHEAD(2) retval=JdbcNamedParameter()

| retval=UserVariable()
| LOOKAHEAD(3) retval=UserVariable()

| LOOKAHEAD(2, {!interrupted}) retval=NumericBind()

Expand Down Expand Up @@ -4178,7 +4178,33 @@ JsonExpression JsonExpression() : {
CastExpression castExpr = null;
}
{
expr=Column()
(
LOOKAHEAD(3, {!interrupted}) expr=CaseWhenExpression()
|
expr = SimpleJdbcParameter()
|
LOOKAHEAD(2, {!interrupted}) expr=JdbcNamedParameter()
|
expr=UserVariable()
|
LOOKAHEAD(JsonFunction(), {!interrupted}) expr = JsonFunction()
|
LOOKAHEAD(JsonAggregateFunction(), {!interrupted}) expr = JsonAggregateFunction()
|
LOOKAHEAD(FullTextSearch(), {!interrupted}) expr = FullTextSearch()
/* Do not parse Functions as this will result in a major performance loss
The Performance related tests will fail.
|
LOOKAHEAD(Function(), {!interrupted}) expr=Function()
*/
|
LOOKAHEAD(2, {!interrupted}) expr=Column()
|
token=<S_CHAR_LITERAL> { expr = new StringValue(token.image); }
|
LOOKAHEAD("(" expr=SubSelect() ")", {!interrupted} ) "(" expr=SubSelect() ")"
)

( "::" type=ColDataType() {
castExpr = new CastExpression();
castExpr.setUseCastKeyword(false);
Expand Down
12 changes: 12 additions & 0 deletions src/test/java/net/sf/jsqlparser/statement/select/PostgresTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
package net.sf.jsqlparser.statement.select;

import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.JsonExpression;
import net.sf.jsqlparser.test.TestUtils;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class PostgresTest {
Expand Down Expand Up @@ -41,4 +43,14 @@ public void testExtractFunctionIssue1582() throws JSQLParserException {
" as snijtijd_interval";
TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);
}

@Test
public void testJSonExpressionIssue1696() throws JSQLParserException {
String sqlStr="SELECT '{\"key\": \"value\"}'::json -> 'key' AS X";
Select select = (Select) TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true);

PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
SelectExpressionItem selectExpressionItem = (SelectExpressionItem) plainSelect.getSelectItems().get(0);
Assertions.assertEquals("'key'", selectExpressionItem.getExpression(JsonExpression.class).getIdents().get(0));
}
}