Postgres JDBC 驱动程序未返回错误行号,如 PGAdmin 中所示

Postgres JDBC driver not returning error line number as shown in PGAdmin

Postgres JDBC 驱动程序未返回准确的错误行号,如 PGAdmin 中所示。当我 运行 下面的程序时:

import java.sql.*;

public class Test {

  public static void main(String[] args) {

    String query = "SELECT table_name, table_type\n" +
      "  FROM information_schema.tabls\n" +
      " WHERE table_schema='public'\n" +
      "   AND table_type in ('BASE TABLE','VIEW') ORDER BY table_type, table_name;";

    try (Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "postgres", "postgres")) {

      System.out.println("Connected to PostgreSQL database!");
      Statement statement = connection.createStatement();
      ResultSet resultSet = statement.executeQuery(query);
      while (resultSet.next()) {
        System.out.printf("%-30.30s  %-30.30s%n", resultSet.getString("table_name"), resultSet.getString("table_type"));
      }

    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}

我收到以下错误:

 org.postgresql.util.PSQLException: ERROR: relation "information_schema.tabls" does not exist
  Position: 38

但是当我 运行 在 pgadmin4 上进行相同的查询时,我收到以下错误:

    ERROR:  relation "information_schema.tabls" does not exist
LINE 2:   FROM information_schema.tabls
               ^
SQL state: 42P01
Character: 38

我也想要 java 程序中的行号。我怎样才能得到它?

PGAdmin4 是一个使用 Python 驱动程序 psycopg2 的 node.js 后端。此驱动程序只不过是名为 libpq 的 C 驱动程序的包装器,由 PostgreSQL 团队创建。

JDBC 驱动程序与数据库通信并使用从服务器收到的响应。 org.postgresql.core.v3.QueryExecutorImpl#receiveNoticeResponse 负责解析服务器错误的私有方法,它只是创建新的 org.postgresql.util.ServerErrorMessage 实例。因此,服务器给出的响应等于 JDBC 驱动程序显示的响应。

但是对于libpq,从服务器接收到的消息和在客户端显示的消息是不一样的。 libpq sources 中有 reportErrorPosition 方法就是用来添加行信息的。这是 reference for reportErrorPosition sources for PostgreSQL 13.3. Here is place where LINE: x is added 给客户端的错误。

总结

使用JDBC驱动需要自行计算行号。或使用为您完成的 C 库。