/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.db; import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import org.h2.test.TestBase; /** * Test a BLOB larger than Integer.MAX_VALUE */ public class TestLargeBlob extends TestBase { /** * Run just this test. * * @param a ignored */ public static void main(String... a) throws Exception { TestBase.createCaller().init().test(); } public void test() throws Exception { if (!config.big || config.memory || config.mvcc || config.networked) { return; } deleteDb("largeBlob"); String url = getURL("largeBlob;TRACE_LEVEL_FILE=0", true); Connection conn = getConnection(url); final long testLength = Integer.MAX_VALUE + 110L; Statement stat = conn.createStatement(); stat.execute("set COMPRESS_LOB LZF"); stat.execute("create table test(x blob)"); PreparedStatement prep = conn.prepareStatement( "insert into test values(?)"); prep.setBinaryStream(1, new InputStream() { long remaining = testLength; int p; byte[] oneByte = { 0 }; public void close() { // ignore } public int read(byte[] buff, int off, int len) { len = (int) Math.min(remaining, len); remaining -= len; if (p++ % 5000 == 0) { println("" + remaining); } return len == 0 ? -1 : len; } public int read() { return read(oneByte, 0, 1) < 0 ? -1 : oneByte[0]; } }, -1); prep.executeUpdate(); ResultSet rs = stat.executeQuery( "select length(x) from test"); rs.next(); assertEquals(testLength, rs.getLong(1)); rs = stat.executeQuery("select x from test"); rs.next(); InputStream in = rs.getBinaryStream(1); byte[] buff = new byte[4 * 1024]; long length = 0; while (true) { int len = in.read(buff); if (len < 0) { break; } length += len; } assertEquals(testLength, length); conn.close(); } }