Search in sources :

Example 21 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVSecondaryIndex method add.

@Override
public void add(Session session, Row row) {
    TransactionMap<Value, Value> map = getMap(session);
    ValueArray array = convertToKey(row);
    ValueArray unique = null;
    if (indexType.isUnique()) {
        // this will detect committed entries only
        unique = convertToKey(row);
        unique.getList()[keyColumns - 1] = ValueLong.MIN;
        if (mayHaveNullDuplicates(row)) {
            // No further unique checks required
            unique = null;
        } else {
            requireUnique(row, map, unique);
        }
    }
    try {
        map.put(array, ValueNull.INSTANCE);
    } catch (IllegalStateException e) {
        throw mvTable.convertException(e);
    }
    if (unique != null) {
        // This code expects that mayHaveDuplicates(row) == false
        Iterator<Value> it = map.keyIterator(unique, true);
        while (it.hasNext()) {
            ValueArray k = (ValueArray) it.next();
            if (compareRows(row, convertToSearchRow(k)) != 0) {
                break;
            }
            if (map.isSameTransaction(k)) {
                continue;
            }
            if (map.get(k) != null) {
                // committed
                throw getDuplicateKeyException(k.toString());
            }
            throw DbException.get(ErrorCode.CONCURRENT_UPDATE_1, table.getName());
        }
    }
}
Also used : Value(org.h2.value.Value) ValueArray(org.h2.value.ValueArray)

Example 22 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class MVPrimaryIndex method getRow.

@Override
public Row getRow(Session session, long key) {
    TransactionMap<Value, Value> map = getMap(session);
    Value v = map.get(ValueLong.get(key));
    if (v == null) {
        throw DbException.get(ErrorCode.ROW_NOT_FOUND_IN_PRIMARY_INDEX, getSQL() + ": " + key);
    }
    ValueArray array = (ValueArray) v;
    Row row = session.createRow(array.getList(), 0);
    row.setKey(key);
    return row;
}
Also used : Value(org.h2.value.Value) Row(org.h2.result.Row) SearchRow(org.h2.result.SearchRow) ValueArray(org.h2.value.ValueArray)

Example 23 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class ValueDataType method writeValue.

private void writeValue(WriteBuffer buff, Value v) {
    if (v == ValueNull.INSTANCE) {
        buff.put((byte) 0);
        return;
    }
    int type = v.getType();
    switch(type) {
        case Value.BOOLEAN:
            buff.put((byte) (v.getBoolean() ? BOOLEAN_TRUE : BOOLEAN_FALSE));
            break;
        case Value.BYTE:
            buff.put((byte) type).put(v.getByte());
            break;
        case Value.SHORT:
            buff.put((byte) type).putShort(v.getShort());
            break;
        case Value.ENUM:
        case Value.INT:
            {
                int x = v.getInt();
                if (x < 0) {
                    buff.put((byte) INT_NEG).putVarInt(-x);
                } else if (x < 16) {
                    buff.put((byte) (INT_0_15 + x));
                } else {
                    buff.put((byte) type).putVarInt(x);
                }
                break;
            }
        case Value.LONG:
            {
                long x = v.getLong();
                if (x < 0) {
                    buff.put((byte) LONG_NEG).putVarLong(-x);
                } else if (x < 8) {
                    buff.put((byte) (LONG_0_7 + x));
                } else {
                    buff.put((byte) type).putVarLong(x);
                }
                break;
            }
        case Value.DECIMAL:
            {
                BigDecimal x = v.getBigDecimal();
                if (BigDecimal.ZERO.equals(x)) {
                    buff.put((byte) DECIMAL_0_1);
                } else if (BigDecimal.ONE.equals(x)) {
                    buff.put((byte) (DECIMAL_0_1 + 1));
                } else {
                    int scale = x.scale();
                    BigInteger b = x.unscaledValue();
                    int bits = b.bitLength();
                    if (bits <= 63) {
                        if (scale == 0) {
                            buff.put((byte) DECIMAL_SMALL_0).putVarLong(b.longValue());
                        } else {
                            buff.put((byte) DECIMAL_SMALL).putVarInt(scale).putVarLong(b.longValue());
                        }
                    } else {
                        byte[] bytes = b.toByteArray();
                        buff.put((byte) type).putVarInt(scale).putVarInt(bytes.length).put(bytes);
                    }
                }
                break;
            }
        case Value.TIME:
            {
                ValueTime t = (ValueTime) v;
                long nanos = t.getNanos();
                long millis = nanos / 1000000;
                nanos -= millis * 1000000;
                buff.put((byte) type).putVarLong(millis).putVarLong(nanos);
                break;
            }
        case Value.DATE:
            {
                long x = ((ValueDate) v).getDateValue();
                buff.put((byte) type).putVarLong(x);
                break;
            }
        case Value.TIMESTAMP:
            {
                ValueTimestamp ts = (ValueTimestamp) v;
                long dateValue = ts.getDateValue();
                long nanos = ts.getTimeNanos();
                long millis = nanos / 1000000;
                nanos -= millis * 1000000;
                buff.put((byte) type).putVarLong(dateValue).putVarLong(millis).putVarLong(nanos);
                break;
            }
        case Value.TIMESTAMP_TZ:
            {
                ValueTimestampTimeZone ts = (ValueTimestampTimeZone) v;
                long dateValue = ts.getDateValue();
                long nanos = ts.getTimeNanos();
                long millis = nanos / 1000000;
                nanos -= millis * 1000000;
                buff.put((byte) type).putVarLong(dateValue).putVarLong(millis).putVarLong(nanos).putVarInt(ts.getTimeZoneOffsetMins());
                break;
            }
        case Value.JAVA_OBJECT:
            {
                byte[] b = v.getBytesNoCopy();
                buff.put((byte) type).putVarInt(b.length).put(b);
                break;
            }
        case Value.BYTES:
            {
                byte[] b = v.getBytesNoCopy();
                int len = b.length;
                if (len < 32) {
                    buff.put((byte) (BYTES_0_31 + len)).put(b);
                } else {
                    buff.put((byte) type).putVarInt(b.length).put(b);
                }
                break;
            }
        case Value.UUID:
            {
                ValueUuid uuid = (ValueUuid) v;
                buff.put((byte) type).putLong(uuid.getHigh()).putLong(uuid.getLow());
                break;
            }
        case Value.STRING:
            {
                String s = v.getString();
                int len = s.length();
                if (len < 32) {
                    buff.put((byte) (STRING_0_31 + len)).putStringData(s, len);
                } else {
                    buff.put((byte) type);
                    writeString(buff, s);
                }
                break;
            }
        case Value.STRING_IGNORECASE:
        case Value.STRING_FIXED:
            buff.put((byte) type);
            writeString(buff, v.getString());
            break;
        case Value.DOUBLE:
            {
                double x = v.getDouble();
                if (x == 1.0d) {
                    buff.put((byte) (DOUBLE_0_1 + 1));
                } else {
                    long d = Double.doubleToLongBits(x);
                    if (d == ValueDouble.ZERO_BITS) {
                        buff.put((byte) DOUBLE_0_1);
                    } else {
                        buff.put((byte) type).putVarLong(Long.reverse(d));
                    }
                }
                break;
            }
        case Value.FLOAT:
            {
                float x = v.getFloat();
                if (x == 1.0f) {
                    buff.put((byte) (FLOAT_0_1 + 1));
                } else {
                    int f = Float.floatToIntBits(x);
                    if (f == ValueFloat.ZERO_BITS) {
                        buff.put((byte) FLOAT_0_1);
                    } else {
                        buff.put((byte) type).putVarInt(Integer.reverse(f));
                    }
                }
                break;
            }
        case Value.BLOB:
        case Value.CLOB:
            {
                buff.put((byte) type);
                ValueLobDb lob = (ValueLobDb) v;
                byte[] small = lob.getSmall();
                if (small == null) {
                    buff.putVarInt(-3).putVarInt(lob.getTableId()).putVarLong(lob.getLobId()).putVarLong(lob.getPrecision());
                } else {
                    buff.putVarInt(small.length).put(small);
                }
                break;
            }
        case Value.ARRAY:
            {
                Value[] list = ((ValueArray) v).getList();
                buff.put((byte) type).putVarInt(list.length);
                for (Value x : list) {
                    writeValue(buff, x);
                }
                break;
            }
        case Value.RESULT_SET:
            {
                buff.put((byte) type);
                try {
                    ResultSet rs = ((ValueResultSet) v).getResultSet();
                    rs.beforeFirst();
                    ResultSetMetaData meta = rs.getMetaData();
                    int columnCount = meta.getColumnCount();
                    buff.putVarInt(columnCount);
                    for (int i = 0; i < columnCount; i++) {
                        writeString(buff, meta.getColumnName(i + 1));
                        buff.putVarInt(meta.getColumnType(i + 1)).putVarInt(meta.getPrecision(i + 1)).putVarInt(meta.getScale(i + 1));
                    }
                    while (rs.next()) {
                        buff.put((byte) 1);
                        for (int i = 0; i < columnCount; i++) {
                            int t = org.h2.value.DataType.getValueTypeFromResultSet(meta, i + 1);
                            Value val = org.h2.value.DataType.readValue(null, rs, i + 1, t);
                            writeValue(buff, val);
                        }
                    }
                    buff.put((byte) 0);
                    rs.beforeFirst();
                } catch (SQLException e) {
                    throw DbException.convert(e);
                }
                break;
            }
        case Value.GEOMETRY:
            {
                byte[] b = v.getBytes();
                int len = b.length;
                buff.put((byte) type).putVarInt(len).put(b);
                break;
            }
        default:
            if (JdbcUtils.customDataTypesHandler != null) {
                byte[] b = v.getBytesNoCopy();
                buff.put((byte) CUSTOM_DATA_TYPE).putVarInt(type).putVarInt(b.length).put(b);
                break;
            }
            DbException.throwInternalError("type=" + v.getType());
    }
}
Also used : ValueUuid(org.h2.value.ValueUuid) ValueLobDb(org.h2.value.ValueLobDb) SQLException(java.sql.SQLException) ValueTimestampTimeZone(org.h2.value.ValueTimestampTimeZone) ValueString(org.h2.value.ValueString) BigDecimal(java.math.BigDecimal) ValueTime(org.h2.value.ValueTime) ResultSetMetaData(java.sql.ResultSetMetaData) ValueTimestamp(org.h2.value.ValueTimestamp) Value(org.h2.value.Value) SimpleResultSet(org.h2.tools.SimpleResultSet) ResultSet(java.sql.ResultSet) ValueResultSet(org.h2.value.ValueResultSet) BigInteger(java.math.BigInteger)

Example 24 with ValueArray

use of org.h2.value.ValueArray in project h2database by h2database.

the class LocalResult method removeDistinct.

/**
 * Remove the row from the result set if it exists.
 *
 * @param values the row
 */
public void removeDistinct(Value[] values) {
    if (!distinct) {
        DbException.throwInternalError();
    }
    if (distinctRows != null) {
        ValueArray array = ValueArray.get(values);
        distinctRows.remove(array);
        rowCount = distinctRows.size();
    } else {
        rowCount = external.removeRow(values);
    }
}
Also used : ValueArray(org.h2.value.ValueArray)

Aggregations

Value (org.h2.value.Value)21 ValueArray (org.h2.value.ValueArray)17 SearchRow (org.h2.result.SearchRow)5 ValueString (org.h2.value.ValueString)5 Column (org.h2.table.Column)4 Row (org.h2.result.Row)3 ValueTimestamp (org.h2.value.ValueTimestamp)3 BigDecimal (java.math.BigDecimal)2 BigInteger (java.math.BigInteger)2 ResultSet (java.sql.ResultSet)2 ResultSetMetaData (java.sql.ResultSetMetaData)2 SQLException (java.sql.SQLException)2 Database (org.h2.engine.Database)2 IndexColumn (org.h2.table.IndexColumn)2 SimpleResultSet (org.h2.tools.SimpleResultSet)2 CompareMode (org.h2.value.CompareMode)2 ValueLobDb (org.h2.value.ValueLobDb)2 ValueResultSet (org.h2.value.ValueResultSet)2 ValueTime (org.h2.value.ValueTime)2 ValueTimestampTimeZone (org.h2.value.ValueTimestampTimeZone)2