From e940db2fa201f5ece61e4fb968909ca3d707947d Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Sun, 19 Feb 2023 16:38:27 +0800 Subject: [PATCH] improve sql parser trino support --- .../dialect/presto/visitor/PrestoOutputVisitor.java | 12 ++++++++++++ .../com/alibaba/druid/sql/parser/SQLExprParser.java | 3 +++ 2 files changed, 15 insertions(+) diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java index aed08e1c35..560b7d03bd 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/presto/visitor/PrestoOutputVisitor.java @@ -16,9 +16,12 @@ package com.alibaba.druid.sql.dialect.presto.visitor; import com.alibaba.druid.sql.ast.SQLLimit; +import com.alibaba.druid.sql.ast.expr.SQLDecimalExpr; import com.alibaba.druid.sql.dialect.phoenix.visitor.PhoenixASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import java.math.BigDecimal; + /** * presto 的输出的视图信息 * @@ -44,4 +47,13 @@ public class PrestoOutputVisitor extends SQLASTOutputVisitor implements PhoenixA x.getRowCount().accept(this); return false; } + + public boolean visit(SQLDecimalExpr x) { + BigDecimal value = x.getValue(); + print0(ucase ? "DECIMAL '" : "decimal '"); + print(value.toString()); + print('\''); + + return false; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 3ed05b3819..b28fdf74cf 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1612,6 +1612,9 @@ public class SQLExprParser extends SQLParser { accept(Token.RPAREN); return groupingSets; + } else if (lexer.token == Token.LITERAL_CHARS && expr instanceof SQLIdentifierExpr && ((SQLIdentifierExpr) expr).hashCode64() == FnvHash.Constants.DECIMAL) { + expr = new SQLDecimalExpr(lexer.stringVal()); + lexer.nextToken(); } else { if (lexer.token == Token.LPAREN && !(expr instanceof SQLIntegerExpr) && !(expr instanceof SQLHexExpr)) {