diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index f8053931b7..7a8e90a7c6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -15,7 +15,9 @@ */ package com.alibaba.druid.sql.dialect.odps.visitor; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLHint; @@ -49,7 +51,24 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVisitor { - + + private Set builtInFunctions = new HashSet(); + + { + builtInFunctions.add("IF"); + builtInFunctions.add("COALESCE"); + builtInFunctions.add("TO_DATE"); + builtInFunctions.add("SUBSTR"); + builtInFunctions.add("INSTR"); + builtInFunctions.add("LENGTH"); + builtInFunctions.add("SPLIT"); + builtInFunctions.add("TOLOWER"); + builtInFunctions.add("TOUPPER"); + builtInFunctions.add("EXPLODE"); + builtInFunctions.add("LEAST"); + builtInFunctions.add("GREATEST"); + } + public OdpsOutputVisitor(Appendable appender){ super(appender); } @@ -683,7 +702,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis x.getOwner().accept(this); print(":"); } - print(x.getMethodName()); + printFunctionName(x.getMethodName()); print("("); printAndAccept(x.getParameters(), ", "); print(")"); @@ -712,4 +731,13 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } + + protected void printFunctionName(String name) { + String upperName = name.toUpperCase(); + if (builtInFunctions.contains(upperName)) { + print(upperName); + } else { + print(name); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 1d50a24f61..f555b041b9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -562,12 +562,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab x.getOwner().accept(this); print("."); } - print(x.getMethodName()); + printFunctionName(x.getMethodName()); print("("); printAndAccept(x.getParameters(), ", "); print(")"); return false; } + + protected void printFunctionName(String name) { + print(name); + } public boolean visit(SQLAggregateExpr x) { print(x.getMethodName()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java new file mode 100644 index 0000000000..36112f4a61 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest22 extends TestCase { + public void test_if() throws Exception { + String sql = "select if(a>0,1, 0) from dual"; + Assert.assertEquals("SELECT IF(a > 0, 1, 0)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + + public void test_coalesce() throws Exception { + String sql = "select coalesce(f1,f2) from dual"; + Assert.assertEquals("SELECT COALESCE(f1, f2)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + public void test_count() throws Exception { + String sql = "select count(*) from dual"; + Assert.assertEquals("SELECT COUNT(*)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java index 28ec943d85..53e53bb095 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java @@ -10,7 +10,7 @@ public class OdpsIfTest extends TestCase { public void test_if() throws Exception { String sql = "select sum(if(a > 0, 1, 0)) from t1"; - Assert.assertEquals("SELECT SUM(if(a > 0, 1, 0))" // + Assert.assertEquals("SELECT SUM(IF(a > 0, 1, 0))" // + "\nFROM t1", SQLUtils.formatOdps(sql)); } }