| Ingres Dialect is using the MultiTableBulkIdStrategy of GlobalTemporaryTableBulkIdStrategy. Unfortunately unlike Oracle, Ingres doesn't support multiple sessions accessing a global temporary table (it is per session, odd i know!). Current Implementation
@Override
public MultiTableBulkIdStrategy getDefaultMultiTableBulkIdStrategy() {
return new GlobalTemporaryTableBulkIdStrategy(
new IdTableSupportStandardImpl() {
@Override
public String generateIdTableName(String baseName) {
return "session." + super.generateIdTableName( baseName );
}
@Override
public String getCreateIdTableCommand() {
return "declare global temporary table";
}
@Override
public String getCreateIdTableStatementOptions() {
return "on commit preserve rows with norecovery";
}
},
AfterUseAction.CLEAN
);
}
Possible Improved Implementation (that actually works!), to fix this we need to implement our own dialect and override the default multi table bulk id strategy.
@Override
public MultiTableBulkIdStrategy getDefaultMultiTableBulkIdStrategy() {
return new LocalTemporaryTableBulkIdStrategy(
new IdTableSupportStandardImpl() {
@Override
public String generateIdTableName(String baseName) {
return "session." + super.generateIdTableName( baseName );
}
@Override
public String getCreateIdTableCommand() {
return "declare global temporary table";
}
@Override
public String getCreateIdTableStatementOptions() {
return "on commit preserve rows with norecovery";
}
@Override
public String getDropIdTableCommand() {
return "drop table";
}
},
AfterUseAction.DROP,
null
);
}
Using the original implementation results in an sql exception
I can create a pull request if you'd like.. Do you have an Ingres DB to run test against? or should I just skip implementing a test case? |