Skip to content

Commit 86b613c

Browse files
authored
Add support for casts in json expressions (#1189)
1 parent 2320b1b commit 86b613c

File tree

5 files changed

+29
-15
lines changed

5 files changed

+29
-15
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ protected void visitBinaryExpression(BinaryExpression expr) {
399399

400400
@Override
401401
public void visit(JsonExpression jsonExpr) {
402-
visit(jsonExpr.getColumn());
402+
jsonExpr.getExpression().accept(this);
403403
}
404404

405405
@Override

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@
1313
import java.util.List;
1414

1515
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
16-
import net.sf.jsqlparser.schema.Column;
1716

1817
public class JsonExpression extends ASTNodeAccessImpl implements Expression {
1918

20-
private Column column;
19+
private Expression expr;
2120

2221
private List<String> idents = new ArrayList<String>();
2322
private List<String> operators = new ArrayList<String>();
@@ -27,12 +26,12 @@ public void accept(ExpressionVisitor expressionVisitor) {
2726
expressionVisitor.visit(this);
2827
}
2928

30-
public Column getColumn() {
31-
return column;
29+
public Expression getExpression() {
30+
return expr;
3231
}
3332

34-
public void setColumn(Column column) {
35-
this.column = column;
33+
public void setExpression(Expression expr) {
34+
this.expr = expr;
3635
}
3736

3837
// public List<String> getIdents() {
@@ -46,7 +45,7 @@ public void setColumn(Column column) {
4645
// operators.add("->");
4746
// }
4847
// }
49-
//
48+
//
5049
// public void addIdent(String ident) {
5150
// addIdent(ident, "->");
5251
// }
@@ -58,15 +57,15 @@ public void addIdent(String ident, String operator) {
5857
@Override
5958
public String toString() {
6059
StringBuilder b = new StringBuilder();
61-
b.append(column.toString());
60+
b.append(expr.toString());
6261
for (int i = 0; i < idents.size(); i++) {
6362
b.append(operators.get(i)).append(idents.get(i));
6463
}
6564
return b.toString();
6665
}
6766

68-
public JsonExpression withColumn(Column column) {
69-
this.setColumn(column);
67+
public JsonExpression withExpression(Expression expr) {
68+
this.setExpression(expr);
7069
return this;
7170
}
7271
}

src/main/java/net/sf/jsqlparser/util/validation/validator/ExpressionValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ public void visit(RegExpMySQLOperator rexpr) {
454454

455455
@Override
456456
public void visit(JsonExpression jsonExpr) {
457-
validateOptionalExpression(jsonExpr.getColumn());
457+
validateOptionalExpression(jsonExpr.getExpression());
458458
}
459459

460460
@Override

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3483,18 +3483,28 @@ ArrayConstructor ArrayConstructor(final boolean arrayKeyword) : {
34833483

34843484
JsonExpression JsonExpression() : {
34853485
JsonExpression result = new JsonExpression();
3486-
Column column;
3486+
Expression expr;
34873487
Token token;
3488+
ColDataType type = null;
3489+
CastExpression castExpr = null;
34883490
}
34893491
{
3490-
column=Column() (
3492+
expr=Column()
3493+
( "::" type=ColDataType() {
3494+
castExpr = new CastExpression();
3495+
castExpr.setUseCastKeyword(false);
3496+
castExpr.setLeftExpression(expr);
3497+
castExpr.setType(type);
3498+
expr=castExpr;
3499+
} )*
3500+
(
34913501
"->" (token=<S_CHAR_LITERAL> | token=<S_LONG>) {result.addIdent(token.image,"->");} |
34923502
"->>" (token=<S_CHAR_LITERAL> | token=<S_LONG>) {result.addIdent(token.image,"->>");} |
34933503
"#>" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"#>");} |
34943504
"#>>" token=<S_CHAR_LITERAL> {result.addIdent(token.image,"#>>");}
34953505
)+
34963506
{
3497-
result.setColumn(column);
3507+
result.setExpression(expr);
34983508
return result;
34993509
}
35003510
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,6 +2723,11 @@ public void testJsonExpression() throws JSQLParserException {
27232723
}
27242724
}
27252725

2726+
@Test
2727+
public void testJsonExpressionWithCastExpression() throws JSQLParserException {
2728+
assertSqlCanBeParsedAndDeparsed("SELECT id FROM tbl WHERE p.company::json->'info'->>'country' = 'test'");
2729+
}
2730+
27262731
@Test
27272732
public void testJsonExpressionWithIntegerParameterIssue909() throws JSQLParserException {
27282733
assertSqlCanBeParsedAndDeparsed("select uc.\"id\", u.nickname, u.avatar, b.title, uc.images, uc.created_at as createdAt from library.ugc_comment uc INNER JOIN library.book b on (uc.books_id ->> 0)::INTEGER = b.\"id\" INNER JOIN library.users u ON uc.user_id = u.user_id where uc.id = 1", true);

0 commit comments

Comments
 (0)