diff --git a/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java b/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java index 547693c9eb8..38625d3308f 100644 --- a/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java +++ b/core/src/main/java/org/apache/calcite/util/format/FormatElementEnum.java @@ -81,6 +81,14 @@ public enum FormatElementEnum implements FormatElement { sb.append(work.eeeFormat.format(date)); } }, + E("d", "The day of the month as a decimal number (1-31); " + + "single digits are left-padded with space.") { + @Override public void format(StringBuilder sb, Date date) { + final Calendar calendar = Work.get().calendar; + calendar.setTime(date); + sb.append(String.format(Locale.ROOT, "%2d", calendar.get(Calendar.DAY_OF_MONTH))); + } + }, FF1("S", "Fractional seconds to 1 digit") { @Override public void format(StringBuilder sb, Date date) { final Work work = Work.get(); diff --git a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java index f7c8e3fd216..904521d9464 100644 --- a/core/src/main/java/org/apache/calcite/util/format/FormatModels.java +++ b/core/src/main/java/org/apache/calcite/util/format/FormatModels.java @@ -34,6 +34,7 @@ import static org.apache.calcite.util.format.FormatElementEnum.DD; import static org.apache.calcite.util.format.FormatElementEnum.DDD; import static org.apache.calcite.util.format.FormatElementEnum.DY; +import static org.apache.calcite.util.format.FormatElementEnum.E; import static org.apache.calcite.util.format.FormatElementEnum.FF1; import static org.apache.calcite.util.format.FormatElementEnum.FF2; import static org.apache.calcite.util.format.FormatElementEnum.FF3; @@ -114,7 +115,7 @@ MI, literalElement(":"), SS, literalElement(" "), map.put("%E4S", FF4); map.put("%E5S", FF5); map.put("%E*S", FF6); - map.put("%e", DD); + map.put("%e", E); map.put("%F", compositeElement("The date in the format %Y-%m-%d.", YYYY, literalElement("-"), MM, literalElement("-"), DD)); diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java index 68edec1ccbc..047232b1d5d 100644 --- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java +++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java @@ -12645,6 +12645,11 @@ void testTimestampDiff(boolean coercionEnabled) { f.checkScalar("FORMAT_DATE('%b %Y', DATE '2008-12-25')", "Dec 2008", "VARCHAR(2000) NOT NULL"); + // Test case for [CALCITE-6247] https://issues.apache.org/jira/browse/CALCITE-6247 + // BigQuery FORMAT_DATE function handles incorrectly the %e format specifier + f.checkScalar("FORMAT_DATE('*%e*', DATE '2008-12-02')", + "* 2*", + "VARCHAR(2000) NOT NULL"); f.checkScalar("FORMAT_DATE('%x', DATE '2008-12-25')", "12/25/08", "VARCHAR(2000) NOT NULL");