Changeset: 761f406f4713 for monetdb-java
URL: https://dev.monetdb.org/hg/monetdb-java/rev/761f406f4713
Modified Files:
        tests/JDBC_API_Tester.java
Branch: default
Log Message:

Add test for reproducing issue #7337


diffs (148 lines):

diff --git a/tests/JDBC_API_Tester.java b/tests/JDBC_API_Tester.java
--- a/tests/JDBC_API_Tester.java
+++ b/tests/JDBC_API_Tester.java
@@ -94,6 +94,9 @@ final public class JDBC_API_Tester {
                jt.BugExecuteUpdate_Bug_3350();
                jt.Bug_IsValid_Timeout_Bug_6782(con_URL);
                jt.Bug_LargeQueries_6571_6693(con_URL);
+               jt.Bug_PrepStmtManyParams_7337(250);    // this works as 
expected
+               jt.Bug_PrepStmtManyParams_7337(251);    // this fails with: 
resultBlocks[1] should have been fetched by now
+               jt.Bug_PrepStmtManyParams_7337(480);    // this fails with: 
resultBlocks[1] should have been fetched by now
                jt.Bug_PrepStmtSetObject_CLOB_6349();
                jt.Bug_PrepStmtSetString_6382();
                jt.Bug_PrepStmt_With_Errors_Jira292();
@@ -5693,6 +5696,134 @@ final public class JDBC_API_Tester {
                sb.append("getQueryTimeout = 
").append(st.getQueryTimeout()).append("\n");
        }
 
+       private void Bug_PrepStmtManyParams_7337(int nrParams) {
+               sb.setLength(0);        // clear the output log buffer
+
+               // TODO: when nrParams is 251 or higher it fails to work as 
expected, see at the end.
+               final int NR_COLUMNS = nrParams;
+               final StringBuilder sql = new StringBuilder(100 + (NR_COLUMNS * 
25));
+
+               Statement stmt = null;
+               PreparedStatement pstmt = null;
+               try {
+                       int col;
+
+                       // construct the Create Table SQL text
+                       sql.append("CREATE TABLE t7337 (ID BIGINT 
AUTO_INCREMENT PRIMARY KEY, ");
+                       for (col = 1; col <= NR_COLUMNS; col++) {
+                               sql.append("column").append(col).append(" 
VARCHAR(256),");
+                       }
+                       sql.append("column").append(col).append(" TIMESTAMP);");
+
+                       sb.append("1. create table with 
").append(NR_COLUMNS+2).append(" columns, sql has length: 
").append(sql.length()).append("\n");
+                       stmt = con.createStatement();
+                       int ret = stmt.executeUpdate(sql.toString());
+                       sb.append("2. table created. ret = 
").append(ret).append("\n");
+                       stmt.close();
+                       stmt = null;
+
+                       // construct the Insert Into Table SQL text, first 
without any parameter makers
+                       sql.setLength(0);       // clear the sql buffer
+                       sql.append("INSERT INTO t7337 \n(");
+                       for (col = 1; col <= NR_COLUMNS; col++) {
+                               sql.append("column").append(col).append(",");
+                       }
+                       sql.append("column").append(col).append(" ) VALUES 
\n(");
+                       int posFirstPart = sql.length();
+                       for (col = 1; col <= NR_COLUMNS; col++) {
+                               sql.append("'someTextHere',");
+                       }
+                       sql.append("'2022-11-11');");
+
+                       sb.append("3. prepare insert statement (no params), sql 
has length: ").append(sql.length()).append("\n");
+                       pstmt = con.prepareStatement(sql.toString());
+                       if (pstmt != null) {
+                               ParameterMetaData pmd = 
pstmt.getParameterMetaData();
+                               sb.append("   pmd. 
").append(pmd.getParameterCount()).append(" parameters\n");
+                               sb.append("4. execute prepared insert\n");
+                               int inserted = pstmt.executeUpdate();
+                               sb.append("5. first execute returned: 
").append(inserted).append("\n");
+                               // do it one more time
+                               inserted = pstmt.executeUpdate();
+                               sb.append("5. second execute returned: 
").append(inserted).append("\n");
+                               sb.append("6. inserted data committed\n");
+                               pstmt.close();
+                               pstmt = null;
+                       }
+
+                       // construct the Insert Into Table SQL text, now with 
parameter makers
+                       sql.setLength(posFirstPart);    // clear the sql part 
after the: VALUES (
+                       for (col = 1; col <= NR_COLUMNS; col++) {
+                               sql.append("?,");
+                       }
+                       sql.append("'2022-11-16');");
+
+                       sb.append("7. prepare insert statement (with params), 
sql has length: ").append(sql.length()).append("\n");
+                       pstmt = con.prepareStatement(sql.toString());   // this 
fails when nr of parameter markers > 250
+                       if (pstmt != null) {
+                               ParameterMetaData pmd = 
pstmt.getParameterMetaData();
+                               sb.append("   pmd. 
").append(pmd.getParameterCount()).append(" parameters\n");
+                               sb.append("8. bind parameters\n");
+                               for (col = 1; col <= NR_COLUMNS; col++) {
+                                       pstmt.setString(col, "someMoreText");
+                               }
+                               sb.append("9. execute prepared insert with 
parameters\n");
+                               int inserted = pstmt.executeUpdate();
+                               sb.append("10. first execute returned: 
").append(inserted).append("\n");
+                               // do it one more time
+                               inserted = pstmt.executeUpdate();
+                               sb.append("10. second execute returned: 
").append(inserted).append("\n");
+                               sb.append("11. inserted data committed\n");
+                               pstmt.close();
+                               pstmt = null;
+                       }
+               } catch (SQLException e) {
+                       sb.append("FAILED: 
").append(e.getMessage()).append("\n");
+//                     sb.append("sql: ").append(sql.toString()).append("\n");
+               }
+               closeStmtResSet(pstmt, null);
+
+               // cleanup table
+               try {
+                       stmt = con.createStatement();
+                       stmt.executeUpdate("DROP TABLE IF EXISTS t7337;");
+               } catch (SQLException e) {
+                       sb.append("FAILED: 
").append(e.getMessage()).append("\n");
+               }
+               closeStmtResSet(stmt, null);
+
+               // TODO: when nrParams is 251 or higher it generates an error: 
resultBlocks[1] should have been fetched by now, see below
+               compareExpectedOutput("Bug_PrepStmtManyParams_7337(" + 
(NR_COLUMNS) + ")",
+                       (NR_COLUMNS <= 250) ?   // it works as expected when 
the nr of parameter markers is less than or equal to 250
+                       "1. create table with " + (NR_COLUMNS+2) + " columns, 
sql has length: " + ((NR_COLUMNS * 23) -29) + "\n" +
+                       "2. table created. ret = -2\n" +
+                       "3. prepare insert statement (no params), sql has 
length: " + ((NR_COLUMNS * 25) -53) + "\n" +
+                       "   pmd. 0 parameters\n" +
+                       "4. execute prepared insert\n" +
+                       "5. first execute returned: 1\n" +
+                       "5. second execute returned: 1\n" +
+                       "6. inserted data committed\n" +
+                       "7. prepare insert statement (with params), sql has 
length: " + ((NR_COLUMNS * 12) -53) + "\n" +
+                       "   pmd. " + (NR_COLUMNS) + " parameters\n" +
+                       "8. bind parameters\n" +
+                       "9. execute prepared insert with parameters\n" +
+                       "10. first execute returned: 1\n" +
+                       "10. second execute returned: 1\n" +
+                       "11. inserted data committed\n"
+                       :       // it fails when the nr of parameter markers is 
more than 250
+                       "1. create table with " + (NR_COLUMNS+2) + " columns, 
sql has length: " + ((NR_COLUMNS * 23) -29) + "\n" +
+                       "2. table created. ret = -2\n" +
+                       "3. prepare insert statement (no params), sql has 
length: " + ((NR_COLUMNS * 25) -53) + "\n" +
+                       "   pmd. 0 parameters\n" +
+                       "4. execute prepared insert\n" +
+                       "5. first execute returned: 1\n" +
+                       "5. second execute returned: 1\n" +
+                       "6. inserted data committed\n" +
+                       "7. prepare insert statement (with params), sql has 
length: " + ((NR_COLUMNS * 12) -53) + "\n" +
+                       "FAILED: resultBlocks[1] should have been fetched by 
now\n"
+                       );
+       }
+
        /**
         * This SQLcopyinto program demonstrates how the MonetDB JDBC driver 
can facilitate
         * in performing COPY INTO ... FROM STDIN sequences.
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to