📄 table.java
字号:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.table;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import org.h2.command.Prepared;
import org.h2.constant.ErrorCode;
import org.h2.constraint.Constraint;
import org.h2.engine.Constants;
import org.h2.engine.DbObject;
import org.h2.engine.Right;
import org.h2.engine.Session;
import org.h2.expression.ExpressionVisitor;
import org.h2.index.Index;
import org.h2.index.IndexType;
import org.h2.log.UndoLogRecord;
import org.h2.message.Message;
import org.h2.message.Trace;
import org.h2.result.Row;
import org.h2.result.RowList;
import org.h2.result.SearchRow;
import org.h2.result.SimpleRow;
import org.h2.result.SimpleRowValue;
import org.h2.result.SortOrder;
import org.h2.schema.Schema;
import org.h2.schema.SchemaObjectBase;
import org.h2.schema.Sequence;
import org.h2.schema.TriggerObject;
import org.h2.util.ObjectArray;
import org.h2.value.DataType;
import org.h2.value.Value;
import org.h2.value.ValueNull;
/**
* This is the base class for most tables.
* A table contains a list of columns and a list of rows.
*/
public abstract class Table extends SchemaObjectBase {
public static final int TYPE_CACHED = 0, TYPE_MEMORY = 1;
public static final String TABLE_LINK = "TABLE LINK";
public static final String SYSTEM_TABLE = "SYSTEM TABLE";
public static final String TABLE = "TABLE";
public static final String VIEW = "VIEW";
/**
* The columns of this table.
*/
protected Column[] columns;
/**
* The amount of memory required for a row if all values would be very small.
*/
protected int memoryPerRow;
private final HashMap columnMap = new HashMap();
private final boolean persistent;
private ObjectArray triggers;
private ObjectArray constraints;
private ObjectArray sequences;
private ObjectArray views;
private boolean checkForeignKeyConstraints = true;
private boolean onCommitDrop, onCommitTruncate;
private Row nullRow;
/**
* Lock the table for the given session.
* This method waits until the lock is granted.
*
* @param session the session
* @param exclusive true for write locks, false for read locks
* @param force lock even in the MVCC mode
* @throws SQLException if a lock timeout occured
*/
public abstract void lock(Session session, boolean exclusive, boolean force) throws SQLException;
/**
* Close the table object and flush changes.
*
* @param session the session
*/
public abstract void close(Session session) throws SQLException;
/**
* Release the lock for this session.
*
* @param s the session
*/
public abstract void unlock(Session s);
/**
* Create an index for this table
*
* @param session the session
* @param indexName the name of the index
* @param indexId the id
* @param cols the index columns
* @param indexType the index type
* @param headPos the position of the head (if the index already exists)
* @param comment the comment
* @return the index
*/
public abstract Index addIndex(Session session, String indexName, int indexId, IndexColumn[] cols, IndexType indexType,
int headPos, String comment) throws SQLException;
/**
* Remove a row from the table and all indexes.
*
* @param session the session
* @param row the row
*/
public abstract void removeRow(Session session, Row row) throws SQLException;
/**
* Remove all rows from the table and indexes.
*
* @param session the session
*/
public abstract void truncate(Session session) throws SQLException;
/**
* Add a row to the table and all indexes.
*
* @param session the session
* @param row the row
* @throws SQLException if a constraint was violated
*/
public abstract void addRow(Session session, Row row) throws SQLException;
/**
* Check if this table supports ALTER TABLE.
*
* @throws SQLException if it is not supported
*/
public abstract void checkSupportAlter() throws SQLException;
/**
* Get the table type name
*
* @return the table type name
*/
public abstract String getTableType();
/**
* Get the scan index to iterate through all rows.
*
* @param session the session
* @return the index
*/
public abstract Index getScanIndex(Session session) throws SQLException;
/**
* Get any unique index for this table if one exists.
*
* @return a unique index
*/
public abstract Index getUniqueIndex();
/**
* Get all indexes for this table.
*
* @return the list of indexes
*/
public abstract ObjectArray getIndexes();
/**
* Check if this table is locked exclusively.
*
* @return true if it is.
*/
public abstract boolean isLockedExclusively();
/**
* Get the last data modification id.
*
* @return the modification id
*/
public abstract long getMaxDataModificationId();
/**
* Check if the row count can be retrieved quickly.
*
* @return true if it can
*/
public abstract boolean canGetRowCount();
/**
* Check if this table can be dropped.
*
* @return true if it can
*/
public abstract boolean canDrop();
/**
* Get the row count for this table.
*
* @param session the session
* @return the row count
*/
public abstract long getRowCount(Session session) throws SQLException;
public Table(Schema schema, int id, String name, boolean persistent) {
super(schema, id, name, Trace.TABLE);
this.persistent = persistent;
}
public String getCreateSQLForCopy(Table table, String quotedName) {
throw Message.getInternalError();
}
public void addDependencies(HashSet dependencies) {
if (sequences != null) {
for (int i = 0; i < sequences.size(); i++) {
dependencies.add(sequences.get(i));
}
}
ExpressionVisitor visitor = ExpressionVisitor.get(ExpressionVisitor.GET_DEPENDENCIES);
visitor.setDependencies(dependencies);
for (int i = 0; i < columns.length; i++) {
columns[i].isEverything(visitor);
}
}
public ObjectArray getChildren() {
ObjectArray children = new ObjectArray();
ObjectArray indexes = getIndexes();
if (indexes != null) {
children.addAll(indexes);
}
if (constraints != null) {
children.addAll(constraints);
}
if (triggers != null) {
children.addAll(triggers);
}
if (sequences != null) {
children.addAll(sequences);
}
if (views != null) {
children.addAll(views);
}
ObjectArray rights = database.getAllRights();
for (int i = 0; i < rights.size(); i++) {
Right right = (Right) rights.get(i);
if (right.getGrantedTable() == this) {
children.add(right);
}
}
return children;
}
protected void setColumns(Column[] columns) throws SQLException {
this.columns = columns;
if (columnMap.size() > 0) {
columnMap.clear();
}
int memory = 0;
for (int i = 0; i < columns.length; i++) {
Column col = columns[i];
int dataType = col.getType();
if (dataType == Value.UNKNOWN) {
throw Message.getSQLException(ErrorCode.UNKNOWN_DATA_TYPE_1, col.getSQL());
}
memory += DataType.getDataType(dataType).memory;
col.setTable(this, i);
String columnName = col.getName();
if (columnMap.get(columnName) != null) {
throw Message.getSQLException(ErrorCode.DUPLICATE_COLUMN_NAME_1, columnName);
}
columnMap.put(columnName, col);
}
memoryPerRow = memory;
}
public void renameColumn(Column column, String newName) throws SQLException {
for (int i = 0; i < columns.length; i++) {
Column c = columns[i];
if (c == column) {
continue;
}
if (c.getName().equals(newName)) {
throw Message.getSQLException(ErrorCode.DUPLICATE_COLUMN_NAME_1, newName);
}
}
columnMap.remove(column.getName());
column.rename(newName);
columnMap.put(newName, column);
}
public boolean isLockExclusive(Session s) {
return false;
}
public void updateRows(Prepared prepared, Session session, RowList rows)
throws SQLException {
// remove the old rows
for (rows.reset(); rows.hasNext();) {
prepared.checkCancelled();
Row o = rows.next();
rows.next();
removeRow(session, o);
session.log(this, UndoLogRecord.DELETE, o);
}
// add the new rows
for (rows.reset(); rows.hasNext();) {
prepared.checkCancelled();
rows.next();
Row n = rows.next();
addRow(session, n);
session.log(this, UndoLogRecord.INSERT, n);
}
}
public void removeChildrenAndResources(Session session) throws SQLException {
while (views != null && views.size() > 0) {
TableView view = (TableView) views.get(0);
views.remove(0);
database.removeSchemaObject(session, view);
}
while (triggers != null && triggers.size() > 0) {
TriggerObject trigger = (TriggerObject) triggers.get(0);
triggers.remove(0);
database.removeSchemaObject(session, trigger);
}
while (constraints != null && constraints.size() > 0) {
Constraint constraint = (Constraint) constraints.get(0);
constraints.remove(0);
database.removeSchemaObject(session, constraint);
}
ObjectArray rights = database.getAllRights();
for (int i = 0; i < rights.size(); i++) {
Right right = (Right) rights.get(i);
if (right.getGrantedTable() == this) {
database.removeDatabaseObject(session, right);
}
}
database.removeMeta(session, getId());
// must delete sequences later (in case there is a power failure
// before removing the table object)
while (sequences != null && sequences.size() > 0) {
Sequence sequence = (Sequence) sequences.get(0);
sequences.remove(0);
if (!getTemporary()) {
database.removeSchemaObject(session, sequence);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -