private void buildKeyDesc(CachedRowSet crs) throws SQLException {

        keyCols = crs.getKeyColumns();
        ResultSetMetaData resultsetmd = crs.getMetaData();
        if (keyCols == null || keyCols.length == 0) {
            ArrayList<Integer> listKeys = new ArrayList<Integer>();

            for (int i = 0; i < callerColumnCount; i++ ) {
                if(resultsetmd.getColumnType(i+1) != Types.CLOB &&
                        resultsetmd.getColumnType(i+1) != Types.STRUCT &&
                        resultsetmd.getColumnType(i+1) != Types.SQLXML &&
                        resultsetmd.getColumnType(i+1) != Types.BLOB &&
                        resultsetmd.getColumnType(i+1) != Types.ARRAY &&
                        resultsetmd.getColumnType(i+1) != Types.OTHER )
                    listKeys.add(i+1);
            }
            keyCols = new int[listKeys.size()];
            for (int i = 0; i < listKeys.size(); i++ )
                keyCols[i] = listKeys.get(i);
        }
        params = new Object[keyCols.length];
    }
Assigns to the given <code>CachedRowSet</code> object's
<code>params</code>
field an array whose length equals the number of columns needed
to uniquely identify a row in the rowset. The array is given
values by the method <code>buildWhereClause</code>.
<P>
If the <code>CachedRowSet</code> object's <code>keyCols</code>
field has length <code>0</code> or is <code>null</code>, the array
is set with the column number of every column in the rowset.
Otherwise, the array in the field <code>keyCols</code> is set with only
the column numbers of the columns that are required to form a unique
identifier for a row.

@param crs the <code>CachedRowSet</code> object for which this
    <code>CachedRowSetWriter</code> object is the writer

@throws SQLException if a database access error occurs
src/main/java/org/replicadb/rowset/sun/rowset/internal/CachedRowSetWriter.java