org.h2.mode.Regclass Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of h2-mvstore Show documentation
Show all versions of h2-mvstore Show documentation
Fork of h2database to maintain Java 8 compatibility
The newest version!
/*
* Copyright 2004-2023 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (https://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.mode;
import org.h2.api.ErrorCode;
import org.h2.engine.SessionLocal;
import org.h2.expression.Expression;
import org.h2.expression.Operation1;
import org.h2.expression.ValueExpression;
import org.h2.index.Index;
import org.h2.message.DbException;
import org.h2.schema.Schema;
import org.h2.table.Table;
import org.h2.value.TypeInfo;
import org.h2.value.Value;
import org.h2.value.ValueInteger;
import org.h2.value.ValueNull;
/**
* A ::regclass expression.
*/
public final class Regclass extends Operation1 {
public Regclass(Expression arg) {
super(arg);
}
@Override
public Value getValue(SessionLocal session) {
Value value = arg.getValue(session);
if (value == ValueNull.INSTANCE) {
return ValueNull.INSTANCE;
}
int valueType = value.getValueType();
if (valueType >= Value.TINYINT && valueType <= Value.INTEGER) {
return value.convertToInt(null);
}
if (valueType == Value.BIGINT) {
return ValueInteger.get((int) value.getLong());
}
String name = value.getString();
for (Schema schema : session.getDatabase().getAllSchemas()) {
Table table = schema.findTableOrView(session, name);
if (table != null && !table.isHidden()) {
return ValueInteger.get(table.getId());
}
Index index = schema.findIndex(session, name);
if (index != null && index.getCreateSQL() != null) {
return ValueInteger.get(index.getId());
}
}
throw DbException.get(ErrorCode.TABLE_OR_VIEW_NOT_FOUND_1, name);
}
@Override
public TypeInfo getType() {
return TypeInfo.TYPE_INTEGER;
}
@Override
public Expression optimize(SessionLocal session) {
arg = arg.optimize(session);
if (arg.isConstant()) {
return ValueExpression.get(getValue(session));
}
return this;
}
@Override
public StringBuilder getUnenclosedSQL(StringBuilder builder, int sqlFlags) {
return arg.getSQL(builder, sqlFlags, AUTO_PARENTHESES).append("::REGCLASS");
}
@Override
public int getCost() {
return arg.getCost() + 100;
}
}