Search in sources :

Example 66 with Update

use of org.h2.command.dml.Update in project h2database by h2database.

the class Table method validateConvertUpdateSequence.

/**
 * Validate all values in this row, convert the values if required, and
 * update the sequence values if required. This call will also set the
 * default values if required and set the computed column if there are any.
 *
 * @param session the session
 * @param row the row
 */
public void validateConvertUpdateSequence(Session session, Row row) {
    for (int i = 0; i < columns.length; i++) {
        Value value = row.getValue(i);
        Column column = columns[i];
        Value v2;
        if (column.getComputed()) {
            // force updating the value
            value = null;
            v2 = column.computeValue(session, row);
        }
        v2 = column.validateConvertUpdateSequence(session, value);
        if (v2 != value) {
            row.setValue(i, v2);
        }
    }
}
Also used : SimpleRowValue(org.h2.result.SimpleRowValue) Value(org.h2.value.Value) Constraint(org.h2.constraint.Constraint)

Example 67 with Update

use of org.h2.command.dml.Update in project h2database by h2database.

the class Column method validateConvertUpdateSequence.

/**
 * Validate the value, convert it if required, and update the sequence value
 * if required. If the value is null, the default value (NULL if no default
 * is set) is returned. Check constraints are validated as well.
 *
 * @param session the session
 * @param value the value or null
 * @return the new or converted value
 */
public Value validateConvertUpdateSequence(Session session, Value value) {
    // take a local copy of defaultExpression to avoid holding the lock
    // while calling getValue
    final Expression localDefaultExpression;
    synchronized (this) {
        localDefaultExpression = defaultExpression;
    }
    Mode mode = session.getDatabase().getMode();
    if (value == null) {
        if (localDefaultExpression == null) {
            value = ValueNull.INSTANCE;
        } else {
            value = convert(localDefaultExpression.getValue(session), mode);
            if (!localDefaultExpression.isConstant()) {
                session.getGeneratedKeys().add(this);
            }
            if (primaryKey) {
                session.setLastIdentity(value);
            }
        }
    }
    if (value == ValueNull.INSTANCE) {
        if (convertNullToDefault) {
            value = convert(localDefaultExpression.getValue(session), mode);
            if (!localDefaultExpression.isConstant()) {
                session.getGeneratedKeys().add(this);
            }
        }
        if (value == ValueNull.INSTANCE && !nullable) {
            if (mode.convertInsertNullToZero) {
                DataType dt = DataType.getDataType(type);
                if (dt.decimal) {
                    value = ValueInt.get(0).convertTo(type);
                } else if (dt.type == Value.TIMESTAMP) {
                    value = ValueTimestamp.fromMillis(session.getTransactionStart());
                } else if (dt.type == Value.TIMESTAMP_TZ) {
                    long ms = session.getTransactionStart();
                    value = ValueTimestampTimeZone.fromDateValueAndNanos(DateTimeUtils.dateValueFromDate(ms), DateTimeUtils.nanosFromDate(ms), (short) 0);
                } else if (dt.type == Value.TIME) {
                    value = ValueTime.fromNanos(0);
                } else if (dt.type == Value.DATE) {
                    value = ValueDate.fromMillis(session.getTransactionStart());
                } else {
                    value = ValueString.get("").convertTo(type);
                }
            } else {
                throw DbException.get(ErrorCode.NULL_NOT_ALLOWED, name);
            }
        }
    }
    if (checkConstraint != null) {
        resolver.setValue(value);
        Value v;
        synchronized (this) {
            v = checkConstraint.getValue(session);
        }
        // Both TRUE and NULL are ok
        if (v != ValueNull.INSTANCE && !v.getBoolean()) {
            throw DbException.get(ErrorCode.CHECK_CONSTRAINT_VIOLATED_1, checkConstraint.getSQL());
        }
    }
    value = value.convertScale(mode.convertOnlyToSmallerScale, scale);
    if (precision > 0) {
        if (!value.checkPrecision(precision)) {
            String s = value.getTraceSQL();
            if (s.length() > 127) {
                s = s.substring(0, 128) + "...";
            }
            throw DbException.get(ErrorCode.VALUE_TOO_LONG_2, getCreateSQL(), s + " (" + value.getPrecision() + ")");
        }
    }
    if (isEnumerated() && value != ValueNull.INSTANCE) {
        if (!ValueEnum.isValid(enumerators, value)) {
            String s = value.getTraceSQL();
            if (s.length() > 127) {
                s = s.substring(0, 128) + "...";
            }
            throw DbException.get(ErrorCode.ENUM_VALUE_NOT_PERMITTED, getCreateSQL(), s);
        }
        value = ValueEnum.get(enumerators, value.getInt());
    }
    updateSequenceIfRequired(session, value);
    return value;
}
Also used : ValueExpression(org.h2.expression.ValueExpression) Expression(org.h2.expression.Expression) Mode(org.h2.engine.Mode) Value(org.h2.value.Value) SequenceValue(org.h2.expression.SequenceValue) DataType(org.h2.value.DataType) ValueString(org.h2.value.ValueString)

Example 68 with Update

use of org.h2.command.dml.Update in project h2database by h2database.

the class JoinBatch method fetchCurrent.

@SuppressWarnings("unchecked")
private void fetchCurrent(final int jfId) {
    assert current.prev == null || current.prev.isRow(jfId) : "prev must be already fetched";
    assert jfId == 0 || current.isRow(jfId - 1) : "left must be already fetched";
    assert !current.isRow(jfId) : "double fetching";
    Object x = current.row(jfId);
    assert x != null : "x null";
    // in case of outer join we don't have any future around empty cursor
    boolean newCursor = x == EMPTY_CURSOR;
    if (newCursor) {
        if (jfId == 0) {
            // the top cursor is new and empty, then the whole select will
            // not produce any rows
            current.drop();
            return;
        }
    } else if (current.isFuture(jfId)) {
        // get cursor from a future
        x = get((Future<Cursor>) x);
        current.updateRow(jfId, x, JoinRow.S_FUTURE, JoinRow.S_CURSOR);
        newCursor = true;
    }
    final JoinFilter jf = filters[jfId];
    Cursor c = (Cursor) x;
    assert c != null;
    JoinFilter join = jf.join;
    while (true) {
        if (c == null || !c.next()) {
            if (newCursor && jf.isOuterJoin()) {
                // replace cursor with null-row
                current.updateRow(jfId, jf.getNullRow(), JoinRow.S_CURSOR, JoinRow.S_ROW);
                c = null;
                newCursor = false;
            } else {
                // cursor is done, drop it
                current.drop();
                return;
            }
        }
        if (!jf.isOk(c == null)) {
            // try another row from the cursor
            continue;
        }
        boolean joinEmpty = false;
        if (join != null && !join.collectSearchRows()) {
            if (join.isOuterJoin()) {
                joinEmpty = true;
            } else {
                // join will fail, try next row in the cursor
                continue;
            }
        }
        if (c != null) {
            current = current.copyBehind(jfId);
            // update jf, set current row from cursor
            current.updateRow(jfId, c.get(), JoinRow.S_CURSOR, JoinRow.S_ROW);
        }
        if (joinEmpty) {
            // update jf.join, set an empty cursor
            current.updateRow(join.id, EMPTY_CURSOR, JoinRow.S_NULL, JoinRow.S_CURSOR);
        }
        return;
    }
}
Also used : Cursor(org.h2.index.Cursor) IndexCursor(org.h2.index.IndexCursor) ViewCursor(org.h2.index.ViewCursor)

Example 69 with Update

use of org.h2.command.dml.Update in project h2database by h2database.

the class Db method upgradeDb.

Db upgradeDb() {
    if (!upgradeChecked.contains(dbUpgrader.getClass())) {
        // flag as checked immediately because calls are nested.
        upgradeChecked.add(dbUpgrader.getClass());
        JQDatabase model = dbUpgrader.getClass().getAnnotation(JQDatabase.class);
        if (model.version() > 0) {
            DbVersion v = new DbVersion();
            DbVersion dbVersion = // (SCHEMA="" && TABLE="") == DATABASE
            from(v).where(v.schema).is("").and(v.table).is("").selectFirst();
            if (dbVersion == null) {
                // database has no version registration, but model specifies
                // version: insert DbVersion entry and return.
                DbVersion newDb = new DbVersion(model.version());
                insert(newDb);
            } else {
                // check to see if upgrade is required.
                if ((model.version() > dbVersion.version) && (dbUpgrader != null)) {
                    // database is an older version than the model
                    boolean success = dbUpgrader.upgradeDatabase(this, dbVersion.version, model.version());
                    if (success) {
                        dbVersion.version = model.version();
                        update(dbVersion);
                    }
                }
            }
        }
    }
    return this;
}
Also used : JQDatabase(org.h2.jaqu.Table.JQDatabase)

Example 70 with Update

use of org.h2.command.dml.Update in project h2database by h2database.

the class JdbcPreparedStatement method executeBatch.

/**
 * Executes the batch.
 * If one of the batched statements fails, this database will continue.
 *
 * @return the array of update counts
 */
@Override
public int[] executeBatch() throws SQLException {
    try {
        debugCodeCall("executeBatch");
        if (batchParameters == null) {
            // TODO batch: check what other database do if no parameters are
            // set
            batchParameters = New.arrayList();
        }
        batchIdentities = new MergedResultSet();
        int size = batchParameters.size();
        int[] result = new int[size];
        boolean error = false;
        SQLException next = null;
        checkClosedForWrite();
        try {
            for (int i = 0; i < size; i++) {
                Value[] set = batchParameters.get(i);
                ArrayList<? extends ParameterInterface> parameters = command.getParameters();
                for (int j = 0; j < set.length; j++) {
                    Value value = set[j];
                    ParameterInterface param = parameters.get(j);
                    param.setValue(value, false);
                }
                try {
                    result[i] = executeUpdateInternal();
                    // Cannot use own implementation, it returns batch identities
                    ResultSet rs = super.getGeneratedKeys();
                    batchIdentities.add(rs);
                } catch (Exception re) {
                    SQLException e = logAndConvert(re);
                    if (next == null) {
                        next = e;
                    } else {
                        e.setNextException(next);
                        next = e;
                    }
                    result[i] = Statement.EXECUTE_FAILED;
                    error = true;
                }
            }
            batchParameters = null;
            if (error) {
                throw new JdbcBatchUpdateException(next, result);
            }
            return result;
        } finally {
            afterWriting();
        }
    } catch (Exception e) {
        throw logAndConvert(e);
    }
}
Also used : ParameterInterface(org.h2.expression.ParameterInterface) MergedResultSet(org.h2.util.MergedResultSet) SQLException(java.sql.SQLException) Value(org.h2.value.Value) ResultSet(java.sql.ResultSet) MergedResultSet(org.h2.util.MergedResultSet) DbException(org.h2.message.DbException) SQLException(java.sql.SQLException)

Aggregations

SQLException (java.sql.SQLException)44 DbException (org.h2.message.DbException)40 Database (org.h2.engine.Database)39 Connection (java.sql.Connection)37 PreparedStatement (java.sql.PreparedStatement)35 Value (org.h2.value.Value)34 ResultSet (java.sql.ResultSet)32 Statement (java.sql.Statement)31 Column (org.h2.table.Column)30 Table (org.h2.table.Table)23 JdbcConnection (org.h2.jdbc.JdbcConnection)22 Expression (org.h2.expression.Expression)19 StatementBuilder (org.h2.util.StatementBuilder)14 ValueExpression (org.h2.expression.ValueExpression)13 ValueString (org.h2.value.ValueString)13 ArrayList (java.util.ArrayList)10 Constraint (org.h2.constraint.Constraint)10 Index (org.h2.index.Index)10 IndexColumn (org.h2.table.IndexColumn)10 Task (org.h2.util.Task)10