/*
 * Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.constraint;

import java.util.HashSet;
import org.h2.engine.DbObject;
import org.h2.engine.Session;
import org.h2.expression.ExpressionVisitor;
import org.h2.index.Index;
import org.h2.message.Trace;
import org.h2.result.Row;
import org.h2.schema.Schema;
import org.h2.schema.SchemaObjectBase;
import org.h2.table.Column;
import org.h2.table.Table;

The base class for constraint checking.
/** * The base class for constraint checking. */
public abstract class Constraint extends SchemaObjectBase implements Comparable<Constraint> { public enum Type {
The constraint type for check constraints.
/** * The constraint type for check constraints. */
CHECK,
The constraint type for primary key constraints.
/** * The constraint type for primary key constraints. */
PRIMARY_KEY,
The constraint type for unique constraints.
/** * The constraint type for unique constraints. */
UNIQUE,
The constraint type for referential constraints.
/** * The constraint type for referential constraints. */
REFERENTIAL;
Get standard SQL type name.
Returns:standard SQL type name
/** * Get standard SQL type name. * * @return standard SQL type name */
public String getSqlName() { if (this == Constraint.Type.PRIMARY_KEY) { return "PRIMARY KEY"; } if (this == Constraint.Type.REFERENTIAL) { return "FOREIGN KEY"; } return name(); } }
The table for which this constraint is defined.
/** * The table for which this constraint is defined. */
protected Table table; Constraint(Schema schema, int id, String name, Table table) { super(schema, id, name, Trace.CONSTRAINT); this.table = table; this.setTemporary(table.isTemporary()); }
The constraint type name
Returns:the name
/** * The constraint type name * * @return the name */
public abstract Type getConstraintType();
Check if this row fulfils the constraint. This method throws an exception if not.
Params:
  • session – the session
  • t – the table
  • oldRow – the old row
  • newRow – the new row
/** * Check if this row fulfils the constraint. * This method throws an exception if not. * * @param session the session * @param t the table * @param oldRow the old row * @param newRow the new row */
public abstract void checkRow(Session session, Table t, Row oldRow, Row newRow);
Check if this constraint needs the specified index.
Params:
  • index – the index
Returns:true if the index is used
/** * Check if this constraint needs the specified index. * * @param index the index * @return true if the index is used */
public abstract boolean usesIndex(Index index);
This index is now the owner of the specified index.
Params:
  • index – the index
/** * This index is now the owner of the specified index. * * @param index the index */
public abstract void setIndexOwner(Index index);
Get all referenced columns.
Params:
  • table – the table
Returns:the set of referenced columns
/** * Get all referenced columns. * * @param table the table * @return the set of referenced columns */
public abstract HashSet<Column> getReferencedColumns(Table table);
Get the SQL statement to create this constraint.
Returns:the SQL statement
/** * Get the SQL statement to create this constraint. * * @return the SQL statement */
public abstract String getCreateSQLWithoutIndexes();
Check if this constraint needs to be checked before updating the data.
Returns:true if it must be checked before updating
/** * Check if this constraint needs to be checked before updating the data. * * @return true if it must be checked before updating */
public abstract boolean isBefore();
Check the existing data. This method is called if the constraint is added after data has been inserted into the table.
Params:
  • session – the session
/** * Check the existing data. This method is called if the constraint is added * after data has been inserted into the table. * * @param session the session */
public abstract void checkExistingData(Session session);
This method is called after a related table has changed (the table was renamed, or columns have been renamed).
/** * This method is called after a related table has changed * (the table was renamed, or columns have been renamed). */
public abstract void rebuild();
Get the unique index used to enforce this constraint, or null if no index is used.
Returns:the index
/** * Get the unique index used to enforce this constraint, or null if no index * is used. * * @return the index */
public abstract Index getUniqueIndex(); @Override public void checkRename() { // ok } @Override public int getType() { return DbObject.CONSTRAINT; } public Table getTable() { return table; } public Table getRefTable() { return table; } @Override public String getDropSQL() { return null; } @Override public int compareTo(Constraint other) { if (this == other) { return 0; } return Integer.compare(getConstraintType().ordinal(), other.getConstraintType().ordinal()); } @Override public boolean isHidden() { return table.isHidden(); }
Visit all elements in the constraint.
Params:
  • visitor – the visitor
Returns:true if every visited expression returned true, or if there are no expressions
/** * Visit all elements in the constraint. * * @param visitor the visitor * @return true if every visited expression returned true, or if there are * no expressions */
public boolean isEverything(@SuppressWarnings("unused") ExpressionVisitor visitor) { return true; } }