!70 [bugfix] repair clob issue in batchMode on
Merge pull request !70 from 周斌/repair_clob_batch_issue
This commit is contained in:
		@ -202,7 +202,7 @@ class PgPreparedStatement extends PgStatement implements PreparedStatement {
 | 
				
			|||||||
      sqlTypeToOid.put(Types.VARBINARY, Oid.BYTEA);
 | 
					      sqlTypeToOid.put(Types.VARBINARY, Oid.BYTEA);
 | 
				
			||||||
      sqlTypeToOid.put(Types.LONGVARBINARY, Oid.BYTEA);
 | 
					      sqlTypeToOid.put(Types.LONGVARBINARY, Oid.BYTEA);
 | 
				
			||||||
      sqlTypeToOid.put(Types.BLOB, Oid.BLOB);
 | 
					      sqlTypeToOid.put(Types.BLOB, Oid.BLOB);
 | 
				
			||||||
      sqlTypeToOid.put(Types.CLOB, Oid.OID);
 | 
					      sqlTypeToOid.put(Types.CLOB, Oid.CLOB);
 | 
				
			||||||
      sqlTypeToOid.put(Types.ARRAY, Oid.UNSPECIFIED);
 | 
					      sqlTypeToOid.put(Types.ARRAY, Oid.UNSPECIFIED);
 | 
				
			||||||
      sqlTypeToOid.put(Types.DISTINCT, Oid.UNSPECIFIED);
 | 
					      sqlTypeToOid.put(Types.DISTINCT, Oid.UNSPECIFIED);
 | 
				
			||||||
      sqlTypeToOid.put(Types.STRUCT, Oid.UNSPECIFIED);
 | 
					      sqlTypeToOid.put(Types.STRUCT, Oid.UNSPECIFIED);
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,121 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 2004, PostgreSQL Global Development Group
 | 
				
			||||||
 | 
					 * See the LICENSE file in the project root for more information.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package org.postgresql.test.jdbc2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.After;
 | 
				
			||||||
 | 
					import org.junit.Before;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					import org.postgresql.test.TestUtil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.sql.rowset.serial.SerialClob;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.sql.Clob;
 | 
				
			||||||
 | 
					import java.sql.Connection;
 | 
				
			||||||
 | 
					import java.sql.PreparedStatement;
 | 
				
			||||||
 | 
					import java.sql.ResultSet;
 | 
				
			||||||
 | 
					import java.sql.SQLException;
 | 
				
			||||||
 | 
					import java.sql.Statement;
 | 
				
			||||||
 | 
					import java.sql.Types;
 | 
				
			||||||
 | 
					import java.util.Properties;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertEquals;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertNull;
 | 
				
			||||||
 | 
					import static org.junit.Assert.assertTrue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Some simple tests based on problems reported by users. Hopefully these will help prevent previous
 | 
				
			||||||
 | 
					 * problems from re-occurring ;-)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public class ClobBatchTest {
 | 
				
			||||||
 | 
					  private static final int LOOP = 0; // LargeObject API using loop
 | 
				
			||||||
 | 
					  private static final int NATIVE_STREAM = 1; // LargeObject API using OutputStream
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private Connection con;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Before
 | 
				
			||||||
 | 
					  public void setUp() throws Exception {
 | 
				
			||||||
 | 
					    Properties props = new Properties();
 | 
				
			||||||
 | 
					    // blob and clob can exchange must set string is not varchar!
 | 
				
			||||||
 | 
					//    props.setProperty(PGProperty.STRING_TYPE.getName(), "unspecified");
 | 
				
			||||||
 | 
					    con = TestUtil.openDB(props);
 | 
				
			||||||
 | 
					    TestUtil.createTable(con, "testclob", "id int,lo clob");
 | 
				
			||||||
 | 
					    con.setAutoCommit(false);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @After
 | 
				
			||||||
 | 
					  public void tearDown() throws Exception {
 | 
				
			||||||
 | 
					    con.setAutoCommit(true);
 | 
				
			||||||
 | 
					    TestUtil.dropTable(con, "testclob");
 | 
				
			||||||
 | 
					    TestUtil.closeDB(con);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testNormalInsert() throws SQLException, IOException {
 | 
				
			||||||
 | 
					    String sql = "insert into testclob (id, lo) values " + " (?, ?)";
 | 
				
			||||||
 | 
					    Clob data = new SerialClob("abcd".toCharArray());
 | 
				
			||||||
 | 
					    int id = 0;
 | 
				
			||||||
 | 
					    try (PreparedStatement ps = con.prepareStatement(sql)) {
 | 
				
			||||||
 | 
					      ps.setInt(1, id);
 | 
				
			||||||
 | 
					      ps.setClob(2, data);
 | 
				
			||||||
 | 
					      ps.execute();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    String query = "select id, lo from testclob where id = 0";
 | 
				
			||||||
 | 
					    try (Statement st = con.createStatement()) {
 | 
				
			||||||
 | 
					      try (ResultSet rs = st.executeQuery(query)) {
 | 
				
			||||||
 | 
					        assertTrue(rs.next());
 | 
				
			||||||
 | 
					        int id1 = rs.getInt(1);
 | 
				
			||||||
 | 
					        assertEquals(id, id1);
 | 
				
			||||||
 | 
					        Clob data1 = rs.getClob(2);
 | 
				
			||||||
 | 
					        assertEquals(data.getSubString(1, 4), data1.getSubString(1, 4));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testSetNull() throws Exception {
 | 
				
			||||||
 | 
					    PreparedStatement pstmt = con.prepareStatement("INSERT INTO testclob(lo) VALUES (?)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pstmt.setClob(1, (Clob) null);
 | 
				
			||||||
 | 
					    pstmt.executeUpdate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pstmt.setNull(1, Types.CLOB);
 | 
				
			||||||
 | 
					    pstmt.executeUpdate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pstmt.setObject(1, null, Types.CLOB);
 | 
				
			||||||
 | 
					    pstmt.executeUpdate();
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    pstmt.setObject(1, "");
 | 
				
			||||||
 | 
					    pstmt.executeUpdate();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void testInsertNullBatch() throws SQLException {
 | 
				
			||||||
 | 
					    String sql = "insert into testclob (id, lo) values " + " (?, ?)";
 | 
				
			||||||
 | 
					    Object[] inputs = {null, ""};
 | 
				
			||||||
 | 
					    try (PreparedStatement ps = con.prepareStatement(sql)) {
 | 
				
			||||||
 | 
					      ps.setInt(1, 0);
 | 
				
			||||||
 | 
					      ps.setObject(2, null, Types.CLOB);
 | 
				
			||||||
 | 
					      ps.addBatch();
 | 
				
			||||||
 | 
					      ps.setInt(1, 1);
 | 
				
			||||||
 | 
					      ps.setObject(2, "");
 | 
				
			||||||
 | 
					      ps.addBatch();
 | 
				
			||||||
 | 
					      ps.executeBatch();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    String query = "select id, lo from testclob";
 | 
				
			||||||
 | 
					    try (Statement st = con.createStatement()) {
 | 
				
			||||||
 | 
					      try (ResultSet rs = st.executeQuery(query)) {
 | 
				
			||||||
 | 
					        while (rs.next()) {
 | 
				
			||||||
 | 
					          Clob data1 = rs.getClob(2);
 | 
				
			||||||
 | 
					          if (data1 != null) {
 | 
				
			||||||
 | 
					            assertTrue(data1.length() == 0);
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user