BUG #19350: Short circuit optimization missed when running sql scriptes in JDBC

Поиск
Список
Период
Сортировка
От PG Bug reporting form
Тема BUG #19350: Short circuit optimization missed when running sql scriptes in JDBC
Дата
Msg-id 19350-aed90efec73c66cc@postgresql.org
обсуждение исходный текст
Ответы Re: BUG #19350: Short circuit optimization missed when running sql scriptes in JDBC
Список pgsql-bugs
The following bug has been logged on the website:

Bug reference:      19350
Logged by:          Chi Zhang
Email address:      798604270@qq.com
PostgreSQL version: 17.6
Operating system:   ubuntu 24.04 with docker
Description:

Hi,

In the following test case, if I run it in JDBC, the prepared statement will
trigger a divide by zero error. But if run it in command line, there will
not be the same error.

```
SET plan_cache_mode = force_generic_plan;
CREATE TABLE t0(c0 int4range);
INSERT INTO t0(c0) VALUES('[-1920846305,-1018839689)'::int4range);
PREPARE prepare_query (int8, int8) AS SELECT
((((((upper(t0.c0))))/($1)))*(($2::int8))) FROM ONLY t0;
EXECUTE prepare_query(0, NULL);   -- trigger error in JDBC
SELECT ((((((upper(t0.c0))))/(0::int8)))*((NULL::int8))) FROM ONLY t0;   --
always no error
```

This is the Java workload:
```
import java.io.*;
import java.sql.*;
import java.util.Properties;

public class PostgresExecutor {

    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("usage: java PostgresExecutor <sql file
path>");
            System.exit(1);
        }

        String filePath = args[0];
        String url = "jdbc:postgresql://localhost:5433/test";
        String user = "sqlancer";
        String password = "sqlancer";

        try (Connection conn = DriverManager.getConnection(url, user,
password);
             BufferedReader reader = new BufferedReader(new
FileReader(filePath))) {

            System.out.println("Successfully connected to Postgres
database.");

            String line;
            try (Statement stmt = conn.createStatement()) {
                while ((line = reader.readLine()) != null) {
                    line = line.trim();
                    if (line.isEmpty() || line.startsWith("--")) {
                        continue;
                    }

                    try {
                        System.out.println("Executing SQL: " + line);
                        boolean hasResult = stmt.execute(line);
                        if (hasResult) {
                            try (ResultSet rs = stmt.getResultSet()) {
                                ResultSetMetaData meta = rs.getMetaData();
                                int columnCount = meta.getColumnCount();

                                while (rs.next()) {
                                    for (int i = 1; i <= columnCount; i++) {
                                        System.out.print(rs.getString(i));
                                        if (i < columnCount)
System.out.print("\t");
                                    }
                                    System.out.println();
                                }
                            }
                        } else {
                            int updateCount = stmt.getUpdateCount();
                            System.out.println("Execute successfully: " +
updateCount + " rows affected");
                        }
                    } catch (SQLException e) {
                        System.err.println("Execute error: " + line);
                        e.printStackTrace();
                    }
                }
            }

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

I can reproduce this with postgresql-42.7.8.jar
```
java -cp
/root/.m2/repository/org/postgresql/postgresql/42.7.8/postgresql-42.7.8.jar
PostgresExecutor.java test.sql


В списке pgsql-bugs по дате отправления: