Skip to content

Commit 52c862f

Browse files
committed
added :: cast mode for columns
1 parent 777a08b commit 52c862f

File tree

4 files changed

+44
-15
lines changed

4 files changed

+44
-15
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class CastExpression implements Expression {
3131

3232
private Expression leftExpression;
3333
private ColDataType type;
34+
boolean useCastKeyword;
3435

3536
public ColDataType getType() {
3637
return type;
@@ -53,8 +54,20 @@ public void accept(ExpressionVisitor expressionVisitor) {
5354
expressionVisitor.visit(this);
5455
}
5556

57+
public boolean isUseCastKeyword() {
58+
return useCastKeyword;
59+
}
60+
61+
public void setUseCastKeyword(boolean useCastKeyword) {
62+
this.useCastKeyword = useCastKeyword;
63+
}
64+
5665
@Override
5766
public String toString() {
58-
return "CAST(" + leftExpression + " AS " + type.toString() + ")";
67+
if (useCastKeyword) {
68+
return "CAST(" + leftExpression + " AS " + type.toString() + ")";
69+
} else {
70+
return leftExpression + "::" + type.toString();
71+
}
5972
}
6073
}

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -468,11 +468,17 @@ public void visit(BitwiseXor bitwiseXor) {
468468

469469
@Override
470470
public void visit(CastExpression cast) {
471-
buffer.append("CAST(");
472-
buffer.append(cast.getLeftExpression());
473-
buffer.append(" AS ");
474-
buffer.append(cast.getType());
475-
buffer.append(")");
471+
if (cast.isUseCastKeyword()) {
472+
buffer.append("CAST(");
473+
buffer.append(cast.getLeftExpression());
474+
buffer.append(" AS ");
475+
buffer.append(cast.getType());
476+
buffer.append(")");
477+
} else {
478+
buffer.append(cast.getLeftExpression());
479+
buffer.append("::");
480+
buffer.append(cast.getType());
481+
}
476482
}
477483

478484
@Override

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1503,12 +1503,12 @@ Expression PrimaryExpression():
15031503

15041504
| LOOKAHEAD([ "+" | "-"] <S_INTEGER>) [ "+" | "-" { tmp = "-"; }] token=<S_INTEGER> { retval = new LongValue(tmp+token.image); }
15051505

1506-
| LOOKAHEAD(2) [ "+" | "-" { isInverse = true; }] retval=Column()
1506+
| LOOKAHEAD(CastExpression()) [ "+" | "-" { isInverse = true; }] retval=CastExpression()
1507+
1508+
| LOOKAHEAD(Column()) [ "+" | "-" { isInverse = true; }] retval=Column()
15071509

15081510
| LOOKAHEAD(2) [ "+" | "-" { isInverse = true; }] "(" retval=PrimaryExpression() ")" {retval = new Parenthesis(retval); }
15091511

1510-
| LOOKAHEAD(2) [ "+" | "-" { isInverse = true; }] retval=CastExpression()
1511-
15121512
| token=<S_CHAR_LITERAL> { retval = new StringValue(token.image); }
15131513

15141514
| [ "+" | "-" { isInverse = true; }] "(" retval=SubSelect() ")"
@@ -1577,14 +1577,14 @@ CastExpression CastExpression():
15771577
CastExpression retval = new CastExpression();
15781578
ColDataType type = null;
15791579
Expression expression = null;
1580+
boolean useCastKeyword;
15801581
}
15811582
{
1582-
<K_CAST>
1583-
"("
1584-
expression=SimpleExpression()
1585-
<K_AS>
1586-
type=ColDataType()
1587-
")"
1583+
(
1584+
<K_CAST> "(" expression=SimpleExpression() <K_AS> type=ColDataType() ")" { retval.setUseCastKeyword(true); }
1585+
|
1586+
expression=Column() "::" type=ColDataType() { retval.setUseCastKeyword(false); }
1587+
)
15881588

15891589
{
15901590
retval.setLeftExpression(expression);

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,16 @@ public void testCastTypeProblem() throws JSQLParserException {
594594
String stmt = "SELECT CAST(col1 AS varchar (256)) FROM tabelle1";
595595
assertSqlCanBeParsedAndDeparsed(stmt);
596596
}
597+
598+
public void testCastTypeProblem2() throws JSQLParserException {
599+
String stmt = "SELECT col1::varchar FROM tabelle1";
600+
assertSqlCanBeParsedAndDeparsed(stmt);
601+
}
602+
603+
public void testCastTypeProblem3() throws JSQLParserException {
604+
String stmt = "SELECT col1::varchar (256) FROM tabelle1";
605+
assertSqlCanBeParsedAndDeparsed(stmt);
606+
}
597607

598608
public void testCaseElseAddition() throws JSQLParserException {
599609
String stmt = "SELECT CASE WHEN 1 + 3 > 20 THEN 0 ELSE 1000 + 1 END AS d FROM dual";

0 commit comments

Comments
 (0)