[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Bryan Pendleton updated DERBY-6884: --- Attachment: JustChangeOffset.diff After thinking about it some more in the clear light of morning, I took a closer look at the reference pages for the CLOB and BLOB data types. Both data types are limited to 2GB as their maximum length. So I think the only actual problem here is the offset in the external file, which needs to be a long to allow for external files > 2GB in size. The 'JustChangeOffset.diff' patch contains a modification to the offset field only; the length field is left as an int. This makes the code diff very small. I'll run various tests and see how it behaves. > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > Attachments: DerbyIssue.java, JustChangeOffset.diff, > firstTryAtTest.diff, testForLargeDataSuite.diff, trivial.diff > > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { > // derby url > public static final String DBURL = "jdbc:derby:testdb;create=true"; > // any random binary file such as a large image or document > public static final String BLOB_DATA_FILE = "..."; > public static final String EXPORT_TABLE_FILE = "table-data"; > public static final String EXPORT_BLOB_FILE = "blob-data"; > public static void main(String... args) throws Exception { > final DerbyIssue test = new DerbyIssue(); >
[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Bryan Pendleton updated DERBY-6884: --- Attachment: testForLargeDataSuite.diff I've moved the test cases to their own test program, so that they won't be run by the regular test suites, but can still be run as desired. Just as Knut Anders predicted, with 'trivial.diff' applied, the behavior of the CLOB test case changes from the integer parse error to a "Negative seek offset" error, due to casting the value from a long to an int producing a negative value. I'll try turning my attention to that detail later; for now I just wanted to record the progress I'd made. A snip from the stack trace is below. Caused by: java.io.IOException: Negative seek offset at java.io.RandomAccessFile.seek(RandomAccessFile.java:555) at org.apache.derby.impl.load.ImportFileInputStream.seek(ImportLobFile.java:266) at org.apache.derby.impl.load.ImportLobFile.getString(ImportLobFile.java:132) at org.apache.derby.impl.load.ImportReadData.getClobColumnFromExtFileAsString(ImportReadData.java:959) > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > Attachments: DerbyIssue.java, firstTryAtTest.diff, > testForLargeDataSuite.diff, trivial.diff > > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { > // derby url > public static final String DBURL = "jdbc:derby:testdb;create=true"; > // any
[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Bryan Pendleton updated DERBY-6884: --- Attachment: firstTryAtTest.diff Attached is my first try at writing a regression test for these problems. Unfortunately, although this regression test appears to demonstrate the problem with "clob" data when the external file exceeds Integer.MAX_VALUE in size, the test is problematic: it takes more than 1 hour to run. I hope that I can improve the test program, because obviously a test that takes an hour is not appropriate to put into our test suite. My first ideas are (a) to not commit so often, and (b) to write a smaller number of larger clob objects. I'll try some of those ideas, and see if the runtime of the test is improved at all. Once I get a reliable test, including the "blob" version should be straightforward. > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > Attachments: DerbyIssue.java, firstTryAtTest.diff, trivial.diff > > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { > // derby url > public static final String DBURL = "jdbc:derby:testdb;create=true"; > // any random binary file such as a large image or document > public static final String BLOB_DATA_FILE = "..."; > public static final String EXPORT_TABLE_FILE = "table-data"; > public static final String EXPORT_BLOB_FILE = "blob-data"; > public static void
[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Bryan Pendleton updated DERBY-6884: --- Attachment: trivial.diff I'm not really familiar with the code in this part of Derby, but I took the famous approach of trying to "do the simplest thing that could possibly work", and made the trivial change to the "lobOffset" and "lobLength" fields in the ImportReadData class. Attached 'trivial.diff' is the result. With this patch applied, the test program passes. I'm not willing to say this is the correct answer; in particular, I had to down-cast the offset and length fields to int in order to pass them to ImportLobFile.getString(), which expects int values for accessing clob data. But it did make the test program pass, so maybe it's a start toward a fix of some sort. I did no other testing at all. > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > Attachments: DerbyIssue.java, trivial.diff > > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { > // derby url > public static final String DBURL = "jdbc:derby:testdb;create=true"; > // any random binary file such as a large image or document > public static final String BLOB_DATA_FILE = "..."; > public static final String EXPORT_TABLE_FILE = "table-data"; > public static final String EXPORT_BLOB_FILE = "blob-data"; > public static void main(String... args) throws Exception { >
[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Bryan Pendleton updated DERBY-6884: --- Attachment: DerbyIssue.java The problem reproduces for me, just as described, using the current head of trunk on Windows, with JDK 1.8.0_77-b03 I attached a re-formatted version of the repro program, which was easier for me to read and follow, as "DerbyIssue.java". I also removed the explicit load of the Derby ClientDriver which appears to be unnecessary with the repro program, as it uses the EmbeddedDriver and hence can run with just derby.jar. Also, to be clear: to run the repro program, you need to edit the program text to replace the three dots in the next line with the name of a valid file in your test directory. public static final String BLOB_DATA_FILE = "..."; I used a 75 MB PDF file that I happened to have sitting around. The program cleverly loops, counting the size of the blobs that it has inserted, until it has more than 2 GB of them, so it doesn't really matter what file you use, but you have to pick a file. It would be nice to figure out a clever way to have a smaller repro, as this repro takes several minutes to run on my system, but for the purposes of demonstrating the bug the repro was great -- thanks! > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > Attachments: DerbyIssue.java > > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { >
[jira] [Updated] (DERBY-6884) SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE bytes of blob data
[ https://issues.apache.org/jira/browse/DERBY-6884?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Rick Hillegas updated DERBY-6884: - Urgency: Normal Bug behavior facts: Seen in production Issue & fix info: Newcomer,Repro attached Component/s: (was: Miscellaneous) SQL > SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE can't import more than Integer.MAX_VALUE > bytes of blob data > > > Key: DERBY-6884 > URL: https://issues.apache.org/jira/browse/DERBY-6884 > Project: Derby > Issue Type: Bug > Components: SQL >Affects Versions: 10.11.1.1 >Reporter: Edward Howe > > Using SYSCS_EXPORT_TABLE_LOBS_TO_EXTFILE to export a table containing a blob > column, SYSCS_IMPORT_TABLE_LOBS_FROM_EXTFILE will fail with a > NumberFormatException if the offset for a blob record is > Integer.MAX_VALUE. > This is because ImportReadData.initExternalLobFile() is parsing the offset > as an Integer. > The stack trace and a program to reproduce are below. > java.lang.NumberFormatException: For input string: "2147483770" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:583) ~[na:1.8.0_45] > at java.lang.Integer.parseInt(Integer.java:615) ~[na:1.8.0_45] > at > org.apache.derby.impl.load.ImportReadData.initExternalLobFile(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.load.ImportReadData.getBlobColumnFromExtFile(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.ImportAbstract.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.load.Import.getBlob(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at org.apache.derby.iapi.types.SQLBlob.setValueFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.populateFromResultSet(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.VTIResultSet.getNextRowCore(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NormalizeResultSet.getNextRowCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.NoPutResultSetImpl.getNextRowFromRowSource(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.HeapController.load(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.store.access.heap.Heap.load(Unknown Source) > ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.loadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.store.access.RAMTransaction.recreateAndLoadConglomerate(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.execute.InsertResultSet.bulkInsertCore(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.execute.InsertResultSet.open(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at > org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown > Source) ~[derby-10.11.1.1.jar:na] > at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown > Source) ~[derby-10.11.1.1.jar:na] > ... 36 common frames omitted > == > package blob; > import java.io.BufferedInputStream; > import java.io.File; > import java.io.FileInputStream; > import java.io.IOException; > import java.sql.*; > public final class DerbyIssue { > // derby url > public static final String DBURL = "jdbc:derby:testdb;create=true"; > // any random binary file such as a large image or document > public static final String BLOB_DATA_FILE = "..."; > public static final String EXPORT_TABLE_FILE = "table-data"; > public static final String EXPORT_BLOB_FILE = "blob-data"; > public static void main(String... args) throws Exception { > final DerbyIssue test = new DerbyIssue(); > test.run(); > } > public void run() throws Exception { > > Class.forName("org.apache.derby.jdbc.ClientDriver").getConstructor().newInstance(); > try(final Connection con = DriverManager.getConnection(DBURL)) { > try (final Statement stmt = con.createStatement()) { > stmt.execute("CREATE TABLE TESTBLOB(id BIGINT, content > BLOB)"); > } > System.out.printf("inserting test data%n"); > try (final PreparedStatement pstmt =