Greetings,

When a LinkedTable is defined to point to a table in Oracle with a 
function-based index, H2 throws a NullPointerException when attempting to 
model that index as a LinkedIndex.

The problem is that a column reported 
by OracleDatabaseMetaData.getIndexInfo for this index is system-generated 
(e.g. "SYS_NC00021$"), which is not among the table's columns, so the 
column map returns null for this column.

As best as I can tell, a function-based index is reported through 
DatabaseMetaData exactly like a regular index, so they can't be filtered 
out directly (as H2 does with tableIndexStatistic).

I suppose entire index can be skipped if it contains a null column, but I 
propose the following optimization to take advantage of any leading columns 
we do recognize:

// in class TableLink

    private void addIndex(List<Column> list, IndexType indexType) {

     // bind the index to the leading recognized columns in the index
     // null columns might come from a function-based index
    int firstNull = list.indexOf(null);
    if (firstNull == 0) {
    trace.info("Omitting linked index - prefix has no recognized columns.");
    return;
    } else if (firstNull > 0) {
    trace.info("Unrecognized columns in linked index. Registering the index 
against the leading {0} recognized columns of {1} total columns.", 
firstNull, list.size());
    list = list.subList(0, firstNull);
    }
    
        Column[] cols = new Column[list.size()];
        list.toArray(cols);
        Index index = new LinkedIndex(this, 0, IndexColumn.wrap(cols), 
indexType);
        indexes.add(index);
    }


Hopefully this generalizes well enough for other databases, but there may 
be desirable null columns I don't have an intuition about.

Thank you for considering this bug report and proposed solution. I look 
forward to discussion and feedback from the community.

Yours,

Jared

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to