Search in sources :

Example 21 with Right

use of org.h2.engine.Right in project h2database by h2database.

the class Engine method openSession.

private Session openSession(ConnectionInfo ci, boolean ifExists, String cipher) {
    String name = ci.getName();
    Database database;
    ci.removeProperty("NO_UPGRADE", false);
    boolean openNew = ci.getProperty("OPEN_NEW", false);
    boolean opened = false;
    User user = null;
    synchronized (DATABASES) {
        if (openNew || ci.isUnnamedInMemory()) {
            database = null;
        } else {
            database = DATABASES.get(name);
        }
        if (database == null) {
            if (ifExists && !Database.exists(name)) {
                throw DbException.get(ErrorCode.DATABASE_NOT_FOUND_1, name);
            }
            database = new Database(ci, cipher);
            opened = true;
            if (database.getAllUsers().isEmpty()) {
                // users is the last thing we add, so if no user is around,
                // the database is new (or not initialized correctly)
                user = new User(database, database.allocateObjectId(), ci.getUserName(), false);
                user.setAdmin(true);
                user.setUserPasswordHash(ci.getUserPasswordHash());
                database.setMasterUser(user);
            }
            if (!ci.isUnnamedInMemory()) {
                DATABASES.put(name, database);
            }
        }
    }
    if (opened) {
        // start the thread when already synchronizing on the database
        // otherwise a deadlock can occur when the writer thread
        // opens a new database (as in recovery testing)
        database.opened();
    }
    if (database.isClosing()) {
        return null;
    }
    if (user == null) {
        if (database.validateFilePasswordHash(cipher, ci.getFilePasswordHash())) {
            user = database.findUser(ci.getUserName());
            if (user != null) {
                if (!user.validateUserPasswordHash(ci.getUserPasswordHash())) {
                    user = null;
                }
            }
        }
        if (opened && (user == null || !user.isAdmin())) {
            // reset - because the user is not an admin, and has no
            // right to listen to exceptions
            database.setEventListener(null);
        }
    }
    if (user == null) {
        DbException er = DbException.get(ErrorCode.WRONG_USER_OR_PASSWORD);
        database.getTrace(Trace.DATABASE).error(er, "wrong user or password; user: \"" + ci.getUserName() + "\"");
        database.removeSession(null);
        throw er;
    }
    checkClustering(ci, database);
    Session session = database.createSession(user);
    if (session == null) {
        // concurrently closing
        return null;
    }
    if (ci.getProperty("JMX", false)) {
        try {
            Utils.callStaticMethod("org.h2.jmx.DatabaseInfo.registerMBean", ci, database);
        } catch (Exception e) {
            database.removeSession(session);
            throw DbException.get(ErrorCode.FEATURE_NOT_SUPPORTED_1, e, "JMX");
        }
        jmx = true;
    }
    return session;
}
Also used : DbException(org.h2.message.DbException) DbException(org.h2.message.DbException)

Example 22 with Right

use of org.h2.engine.Right in project h2database by h2database.

the class CompareLike method optimize.

@Override
public Expression optimize(Session session) {
    left = left.optimize(session);
    right = right.optimize(session);
    if (left.getType() == Value.STRING_IGNORECASE) {
        ignoreCase = true;
    }
    if (left.isValueSet()) {
        Value l = left.getValue(session);
        if (l == ValueNull.INSTANCE) {
            // NULL LIKE something > NULL
            return ValueExpression.getNull();
        }
    }
    if (escape != null) {
        escape = escape.optimize(session);
    }
    if (right.isValueSet() && (escape == null || escape.isValueSet())) {
        if (left.isValueSet()) {
            return ValueExpression.get(getValue(session));
        }
        Value r = right.getValue(session);
        if (r == ValueNull.INSTANCE) {
            // something LIKE NULL > NULL
            return ValueExpression.getNull();
        }
        Value e = escape == null ? null : escape.getValue(session);
        if (e == ValueNull.INSTANCE) {
            return ValueExpression.getNull();
        }
        String p = r.getString();
        initPattern(p, getEscapeChar(e));
        if (invalidPattern) {
            return ValueExpression.getNull();
        }
        if ("%".equals(p)) {
            // optimization for X LIKE '%': convert to X IS NOT NULL
            return new Comparison(session, Comparison.IS_NOT_NULL, left, null).optimize(session);
        }
        if (isFullMatch()) {
            // optimization for X LIKE 'Hello': convert to X = 'Hello'
            Value value = ValueString.get(patternString);
            Expression expr = ValueExpression.get(value);
            return new Comparison(session, Comparison.EQUAL, left, expr).optimize(session);
        }
        isInit = true;
    }
    return this;
}
Also used : Value(org.h2.value.Value) ValueString(org.h2.value.ValueString)

Example 23 with Right

use of org.h2.engine.Right in project h2database by h2database.

the class Comparison method optimize.

@Override
public Expression optimize(Session session) {
    left = left.optimize(session);
    if (right != null) {
        right = right.optimize(session);
        if (right instanceof ExpressionColumn) {
            if (left.isConstant() || left instanceof Parameter) {
                Expression temp = left;
                left = right;
                right = temp;
                compareType = getReversedCompareType(compareType);
            }
        }
        if (left instanceof ExpressionColumn) {
            if (right.isConstant()) {
                Value r = right.getValue(session);
                if (r == ValueNull.INSTANCE) {
                    if ((compareType & NULL_SAFE) == 0) {
                        return ValueExpression.getNull();
                    }
                }
                int colType = left.getType();
                int constType = r.getType();
                int resType = Value.getHigherOrder(colType, constType);
                // once.
                if (constType != resType) {
                    Column column = ((ExpressionColumn) left).getColumn();
                    right = ValueExpression.get(r.convertTo(resType, MathUtils.convertLongToInt(left.getPrecision()), session.getDatabase().getMode(), column, column.getEnumerators()));
                }
            } else if (right instanceof Parameter) {
                ((Parameter) right).setColumn(((ExpressionColumn) left).getColumn());
            }
        }
    }
    if (compareType == IS_NULL || compareType == IS_NOT_NULL) {
        if (left.isConstant()) {
            return ValueExpression.get(getValue(session));
        }
    } else {
        if (SysProperties.CHECK && (left == null || right == null)) {
            DbException.throwInternalError(left + " " + right);
        }
        if (left == ValueExpression.getNull() || right == ValueExpression.getNull()) {
            // a NULL constants
            if ((compareType & NULL_SAFE) == 0) {
                return ValueExpression.getNull();
            }
        }
        if (left.isConstant() && right.isConstant()) {
            return ValueExpression.get(getValue(session));
        }
    }
    return this;
}
Also used : Column(org.h2.table.Column)

Example 24 with Right

use of org.h2.engine.Right in project h2database by h2database.

the class Comparison method getAdditional.

/**
 * Get an additional condition if possible. Example: given two conditions
 * A=B AND B=C, the new condition A=C is returned. Given the two conditions
 * A=1 OR A=2, the new condition A IN(1, 2) is returned.
 *
 * @param session the session
 * @param other the second condition
 * @param and true for AND, false for OR
 * @return null or the third condition
 */
Expression getAdditional(Session session, Comparison other, boolean and) {
    if (compareType == other.compareType && compareType == EQUAL) {
        boolean lc = left.isConstant();
        boolean rc = right.isConstant();
        boolean l2c = other.left.isConstant();
        boolean r2c = other.right.isConstant();
        String l = left.getSQL();
        String l2 = other.left.getSQL();
        String r = right.getSQL();
        String r2 = other.right.getSQL();
        if (and) {
            // must not compare constants. example: NOT(B=2 AND B=3)
            if (!(rc && r2c) && l.equals(l2)) {
                return new Comparison(session, EQUAL, right, other.right);
            } else if (!(rc && l2c) && l.equals(r2)) {
                return new Comparison(session, EQUAL, right, other.left);
            } else if (!(lc && r2c) && r.equals(l2)) {
                return new Comparison(session, EQUAL, left, other.right);
            } else if (!(lc && l2c) && r.equals(r2)) {
                return new Comparison(session, EQUAL, left, other.left);
            }
        } else {
            // a=b OR a=c
            Database db = session.getDatabase();
            if (rc && r2c && l.equals(l2)) {
                return new ConditionIn(db, left, new ArrayList<>(Arrays.asList(right, other.right)));
            } else if (rc && l2c && l.equals(r2)) {
                return new ConditionIn(db, left, new ArrayList<>(Arrays.asList(right, other.left)));
            } else if (lc && r2c && r.equals(l2)) {
                return new ConditionIn(db, right, new ArrayList<>(Arrays.asList(left, other.right)));
            } else if (lc && l2c && r.equals(r2)) {
                return new ConditionIn(db, right, new ArrayList<>(Arrays.asList(left, other.left)));
            }
        }
    }
    return null;
}
Also used : Database(org.h2.engine.Database) ArrayList(java.util.ArrayList)

Example 25 with Right

use of org.h2.engine.Right in project h2database by h2database.

the class Table method removeChildrenAndResources.

@Override
public void removeChildrenAndResources(Session session) {
    while (!dependentViews.isEmpty()) {
        TableView view = dependentViews.get(0);
        dependentViews.remove(0);
        database.removeSchemaObject(session, view);
    }
    while (synonyms != null && !synonyms.isEmpty()) {
        TableSynonym synonym = synonyms.remove(0);
        database.removeSchemaObject(session, synonym);
    }
    while (triggers != null && !triggers.isEmpty()) {
        TriggerObject trigger = triggers.remove(0);
        database.removeSchemaObject(session, trigger);
    }
    while (constraints != null && !constraints.isEmpty()) {
        Constraint constraint = constraints.remove(0);
        database.removeSchemaObject(session, constraint);
    }
    for (Right right : database.getAllRights()) {
        if (right.getGrantedObject() == this) {
            database.removeDatabaseObject(session, right);
        }
    }
    database.removeMeta(session, getId());
    // before removing the table object)
    while (sequences != null && !sequences.isEmpty()) {
        Sequence sequence = sequences.remove(0);
        // this is possible when calling ALTER TABLE ALTER COLUMN
        if (database.getDependentTable(sequence, this) == null) {
            database.removeSchemaObject(session, sequence);
        }
    }
}
Also used : Constraint(org.h2.constraint.Constraint) Right(org.h2.engine.Right) TriggerObject(org.h2.schema.TriggerObject) Sequence(org.h2.schema.Sequence)

Aggregations

Right (org.h2.engine.Right)9 Database (org.h2.engine.Database)7 Expression (org.h2.expression.Expression)7 ValueExpression (org.h2.expression.ValueExpression)7 Value (org.h2.value.Value)7 Comparison (org.h2.expression.Comparison)6 ConditionAndOr (org.h2.expression.ConditionAndOr)6 ExpressionColumn (org.h2.expression.ExpressionColumn)6 ValueString (org.h2.value.ValueString)6 Column (org.h2.table.Column)5 IOException (java.io.IOException)4 Constraint (org.h2.constraint.Constraint)4 IndexColumn (org.h2.table.IndexColumn)4 ArrayList (java.util.ArrayList)3 DbObject (org.h2.engine.DbObject)3 Index (org.h2.index.Index)3 Sequence (org.h2.schema.Sequence)3 InputStreamReader (java.io.InputStreamReader)2 Reader (java.io.Reader)2 ResultSet (java.sql.ResultSet)2