Search in sources :

Example 1 with ExpressionVisitor

use of org.h2.expression.ExpressionVisitor in project h2database by h2database.

the class AlterTableAlterColumn method checkDefaultReferencesTable.

private static void checkDefaultReferencesTable(Table table, Expression defaultExpression) {
    if (defaultExpression == null) {
        return;
    }
    HashSet<DbObject> dependencies = new HashSet<>();
    ExpressionVisitor visitor = ExpressionVisitor.getDependenciesVisitor(dependencies);
    defaultExpression.isEverything(visitor);
    if (dependencies.contains(table)) {
        throw DbException.get(ErrorCode.COLUMN_IS_REFERENCED_1, defaultExpression.getSQL());
    }
}
Also used : DbObject(org.h2.engine.DbObject) ExpressionVisitor(org.h2.expression.ExpressionVisitor) HashSet(java.util.HashSet)

Example 2 with ExpressionVisitor

use of org.h2.expression.ExpressionVisitor in project h2database by h2database.

the class MergeUsing method buildColumnListFromOnCondition.

private HashSet<Column> buildColumnListFromOnCondition(TableFilter anyTableFilter) {
    HashSet<Column> filteredColumns = new HashSet<>();
    HashSet<Column> columns = new HashSet<>();
    ExpressionVisitor visitor = ExpressionVisitor.getColumnsVisitor(columns);
    onCondition.isEverything(visitor);
    for (Column c : columns) {
        if (c != null && c.getTable() == anyTableFilter.getTable()) {
            filteredColumns.add(c);
        }
    }
    return filteredColumns;
}
Also used : Column(org.h2.table.Column) ExpressionVisitor(org.h2.expression.ExpressionVisitor) HashSet(java.util.HashSet)

Example 3 with ExpressionVisitor

use of org.h2.expression.ExpressionVisitor in project h2database by h2database.

the class Select method prepare.

@Override
public void prepare() {
    if (isPrepared) {
        // sometimes a subquery is prepared twice (CREATE TABLE AS SELECT)
        return;
    }
    if (SysProperties.CHECK && !checkInit) {
        DbException.throwInternalError("not initialized");
    }
    if (orderList != null) {
        sort = prepareOrder(orderList, expressions.size());
        orderList = null;
    }
    ColumnNamer columnNamer = new ColumnNamer(session);
    for (int i = 0; i < expressions.size(); i++) {
        Expression e = expressions.get(i);
        String proposedColumnName = e.getAlias();
        String columnName = columnNamer.getColumnName(e, i, proposedColumnName);
        // if the name changed, create an alias
        if (!columnName.equals(proposedColumnName)) {
            e = new Alias(e, columnName, true);
        }
        expressions.set(i, e.optimize(session));
    }
    if (condition != null) {
        condition = condition.optimize(session);
        for (TableFilter f : filters) {
            // left outer join child on p = pc where c is null;
            if (!f.isJoinOuter() && !f.isJoinOuterIndirect()) {
                condition.createIndexConditions(session, f);
            }
        }
    }
    if (isGroupQuery && groupIndex == null && havingIndex < 0 && filters.size() == 1) {
        if (condition == null) {
            Table t = filters.get(0).getTable();
            ExpressionVisitor optimizable = ExpressionVisitor.getOptimizableVisitor(t);
            isQuickAggregateQuery = isEverything(optimizable);
        }
    }
    cost = preparePlan(session.isParsingCreateView());
    if (distinct && session.getDatabase().getSettings().optimizeDistinct && !isGroupQuery && filters.size() == 1 && expressions.size() == 1 && condition == null) {
        Expression expr = expressions.get(0);
        expr = expr.getNonAliasExpression();
        if (expr instanceof ExpressionColumn) {
            Column column = ((ExpressionColumn) expr).getColumn();
            int selectivity = column.getSelectivity();
            Index columnIndex = topTableFilter.getTable().getIndexForColumn(column, false, true);
            if (columnIndex != null && selectivity != Constants.SELECTIVITY_DEFAULT && selectivity < 20) {
                // the first column must be ascending
                boolean ascending = columnIndex.getIndexColumns()[0].sortType == SortOrder.ASCENDING;
                Index current = topTableFilter.getIndex();
                // if another index is faster
                if (columnIndex.canFindNext() && ascending && (current == null || current.getIndexType().isScan() || columnIndex == current)) {
                    IndexType type = columnIndex.getIndexType();
                    // indexes don't work
                    if (!type.isHash() && (!type.isUnique() || columnIndex.getColumns().length > 1)) {
                        topTableFilter.setIndex(columnIndex);
                        isDistinctQuery = true;
                    }
                }
            }
        }
    }
    if (sort != null && !isQuickAggregateQuery && !isGroupQuery) {
        Index index = getSortIndex();
        Index current = topTableFilter.getIndex();
        if (index != null && current != null) {
            if (current.getIndexType().isScan() || current == index) {
                topTableFilter.setIndex(index);
                if (!topTableFilter.hasInComparisons()) {
                    // in(select ...) and in(1,2,3) may return the key in
                    // another order
                    sortUsingIndex = true;
                }
            } else if (index.getIndexColumns() != null && index.getIndexColumns().length >= current.getIndexColumns().length) {
                IndexColumn[] sortColumns = index.getIndexColumns();
                IndexColumn[] currentColumns = current.getIndexColumns();
                boolean swapIndex = false;
                for (int i = 0; i < currentColumns.length; i++) {
                    if (sortColumns[i].column != currentColumns[i].column) {
                        swapIndex = false;
                        break;
                    }
                    if (sortColumns[i].sortType != currentColumns[i].sortType) {
                        swapIndex = true;
                    }
                }
                if (swapIndex) {
                    topTableFilter.setIndex(index);
                    sortUsingIndex = true;
                }
            }
        }
    }
    if (!isQuickAggregateQuery && isGroupQuery && getGroupByExpressionCount() > 0) {
        Index index = getGroupSortedIndex();
        Index current = topTableFilter.getIndex();
        if (index != null && current != null && (current.getIndexType().isScan() || current == index)) {
            topTableFilter.setIndex(index);
            isGroupSortedQuery = true;
        }
    }
    expressionArray = expressions.toArray(new Expression[0]);
    isPrepared = true;
}
Also used : Index(org.h2.index.Index) IndexType(org.h2.index.IndexType)

Example 4 with ExpressionVisitor

use of org.h2.expression.ExpressionVisitor in project h2database by h2database.

the class Table method addDependencies.

/**
 * Add all objects that this table depends on to the hash set.
 *
 * @param dependencies the current set of dependencies
 */
public void addDependencies(HashSet<DbObject> dependencies) {
    if (dependencies.contains(this)) {
        // avoid endless recursion
        return;
    }
    if (sequences != null) {
        dependencies.addAll(sequences);
    }
    ExpressionVisitor visitor = ExpressionVisitor.getDependenciesVisitor(dependencies);
    for (Column col : columns) {
        col.isEverything(visitor);
    }
    if (constraints != null) {
        for (Constraint c : constraints) {
            c.isEverything(visitor);
        }
    }
    dependencies.add(this);
}
Also used : Constraint(org.h2.constraint.Constraint) ExpressionVisitor(org.h2.expression.ExpressionVisitor)

Example 5 with ExpressionVisitor

use of org.h2.expression.ExpressionVisitor in project h2database by h2database.

the class Query method getMaxDataModificationId.

public final long getMaxDataModificationId() {
    ExpressionVisitor visitor = ExpressionVisitor.getMaxModificationIdVisitor();
    isEverything(visitor);
    return visitor.getMaxDataModificationId();
}
Also used : ExpressionVisitor(org.h2.expression.ExpressionVisitor)

Aggregations

ExpressionVisitor (org.h2.expression.ExpressionVisitor)4 HashSet (java.util.HashSet)2 Constraint (org.h2.constraint.Constraint)1 DbObject (org.h2.engine.DbObject)1 Index (org.h2.index.Index)1 IndexType (org.h2.index.IndexType)1 Column (org.h2.table.Column)1