From 3b70beee363d6a98f2a39ad66611bafb3f3f55e4 Mon Sep 17 00:00:00 2001 From: c0ff75 Date: Tue, 15 Sep 2020 01:36:04 +0300 Subject: [PATCH 30/30] ISPN-12323 - Index creation error in Oracle 12.1 and below --- .../jdbc/impl/table/OracleTableManager.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/persistence/jdbc/src/main/java/org/infinispan/persistence/jdbc/impl/table/OracleTableManager.java b/persistence/jdbc/src/main/java/org/infinispan/persistence/jdbc/impl/table/OracleTableManager.java index bc710be102..fb0c6a07ce 100644 --- a/persistence/jdbc/src/main/java/org/infinispan/persistence/jdbc/impl/table/OracleTableManager.java +++ b/persistence/jdbc/src/main/java/org/infinispan/persistence/jdbc/impl/table/OracleTableManager.java @@ -24,7 +24,8 @@ private static final Log log = LogFactory.getLog(OracleTableManager.class, Log.class); private static final int MAX_INDEX_IDENTIFIER_SIZE = 30; - private static final String INDEX_PREFIX = "IDX"; + private static final String TIMESTAMP_INDEX_PREFIX = "IDX"; + private static final String SEGMENT_INDEX_PREFIX = "IDX1"; OracleTableManager(ConnectionFactory connectionFactory, TableManipulationConfiguration config, DbMetaData metaData, String cacheName) { super(connectionFactory, config, metaData, cacheName, log); @@ -72,10 +73,18 @@ protected boolean indexExists(String indexName, Connection conn) throws Persiste public String getIndexName(boolean withIdentifier, String indexExt) { if (indexExt.equals(timestampIndexExt)) { // Timestamp for Oracle began with IDX, to keep backwards compatible we have to keep using that - indexExt = INDEX_PREFIX; + indexExt = TIMESTAMP_INDEX_PREFIX; } - int maxNameSize = MAX_INDEX_IDENTIFIER_SIZE - indexExt.length() - 1; String plainTableName = tableName.toString().replace(identifierQuoteString, ""); + /* Oracle version 12.1 and below supports index names only 30 characters long. + If cache names have length greater that 15 and starts with same begin it possible generation identical index names for different caches. + */ + if (metaData.getMajorVersion() * 100 + metaData.getMinorVersion() <= 1201 && + indexExt.equals(segmentIndexExt) && + plainTableName.length() + indexExt.length() + 1 > MAX_INDEX_IDENTIFIER_SIZE) { + indexExt = SEGMENT_INDEX_PREFIX; + } + int maxNameSize = MAX_INDEX_IDENTIFIER_SIZE - indexExt.length() - 1; String truncatedName = plainTableName.length() > maxNameSize ? plainTableName.substring(0, maxNameSize) : plainTableName; String indexName = indexExt + "_" + truncatedName; if (withIdentifier) { -- 2.28.0.windows.1