File tree Expand file tree Collapse file tree 4 files changed +44
-15
lines changed
javacc/net/sf/jsqlparser/parser
test/java/net/sf/jsqlparser/test/select Expand file tree Collapse file tree 4 files changed +44
-15
lines changed Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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);
Original file line number Diff line number Diff 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" ;
You can’t perform that action at this time.
0 commit comments