Обсуждение: 42.2.3 regression in fn timestampadd(SQL_TSI_MINUTE)
Simple Java 8 test case below outputs different results when run against the 42.2.2 driver vs. the just released 42.2.3 driver:
PostgreSQL JDBC Driver 42.2.2
PostgreSQL 10.4 database "labkey2"
SQL_TSI_SECOND: 2003-01-01 00:00:03.0
SQL_TSI_MINUTE: 2003-01-01 00:03:00.0
SQL_TSI_HOUR: 2003-01-01 03:00:00.0
PostgreSQL JDBC Driver 42.2.3
PostgreSQL 10.4 database "labkey2"
SQL_TSI_SECOND: 2003-01-01 00:00:03.0
SQL_TSI_MINUTE: 2003-01-01 00:00:03.0
SQL_TSI_HOUR: 2003-01-01 03:00:00.0
SQL_TSI_MINUTE seems to be acting like SQL_TSI_SECOND in 42.2.3.
Thanks,
Adam
PostgreSQL JDBC Driver 42.2.2
PostgreSQL 10.4 database "labkey2"
SQL_TSI_SECOND: 2003-01-01 00:00:03.0
SQL_TSI_MINUTE: 2003-01-01 00:03:00.0
SQL_TSI_HOUR: 2003-01-01 03:00:00.0
PostgreSQL JDBC Driver 42.2.3
PostgreSQL 10.4 database "labkey2"
SQL_TSI_SECOND: 2003-01-01 00:00:03.0
SQL_TSI_MINUTE: 2003-01-01 00:00:03.0
SQL_TSI_HOUR: 2003-01-01 03:00:00.0
SQL_TSI_MINUTE seems to be acting like SQL_TSI_SECOND in 42.2.3.
Thanks,
Adam
import java.sql.*; public class PGTest { public static void main(String[] args) throws SQLException { try (Connection conn = (3 == args.length ? DriverManager.getConnection(args[0], args[1], args[2]) : DriverManager.getConnection("jdbc:postgresql://" + args[0] + ":" + args[1] + "/" + args[2], args[3], args[4]))) { DatabaseMetaData dmd = conn.getMetaData(); System.out.println(dmd.getDriverName() + " " + dmd.getDriverVersion()); System.out.println(dmd.getDatabaseProductName() + " " + dmd.getDatabaseProductVersion() + " database \"" + conn.getCatalog() + "\""); testTimestampAdd("SQL_TSI_SECOND", conn); testTimestampAdd("SQL_TSI_MINUTE", conn); testTimestampAdd("SQL_TSI_HOUR", conn); System.out.flush(); System.out.close(); } } private static void testTimestampAdd(String interval, Connection conn) throws SQLException { String sql = "SELECT {fn timestampadd(" + interval + ", 3, CAST('01 Jan 2003' AS TIMESTAMP))} AS ThreeMinutes"; try (Statement st = conn.createStatement(); ResultSet rs = st.executeQuery(sql)) { while (rs.next()) System.out.println(interval + ": " + rs.getTimestamp(1)); } } }
Adam, thanks for the prompt report.
Vladimir
Please feel free to review a suggested fix: https://github.com/pgjdbc/pgjdbc/pull/1250
Vladimir, thanks for the prompt fix! I've confirmed that 42.2.4 works correctly with our unit tests (which exercise timestampadd using all the standard constants)... i.e., fix looks great. Minor issue: I believe there's a typo in the 42.2.3 known issues section of the changelogs (/CHANGELOG.md and /docs/_posts/2018-07-12-42.2.3-release.md): I think "SQL_TSI_MINUTE is treated as minute" should be "SQL_TSI_MINUTE is treated as second". Thanks! Adam On 7/14/2018 3:06 AM, Vladimir Sitnikov wrote: > Adam, thanks for the prompt report. > > Please feel free to review a suggested fix: > https://github.com/pgjdbc/pgjdbc/pull/1250 > > Vladimir