EMMA Coverage Report (generated Sun Mar 01 22:06:14 CET 2015)
[all classes][org.h2.constraint]

COVERAGE SUMMARY FOR SOURCE FILE [ConstraintCheck.java]

nameclass, %method, %block, %line, %
ConstraintCheck.java100% (1/1)84%  (16/19)84%  (194/230)82%  (47/57)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ConstraintCheck100% (1/1)84%  (16/19)84%  (194/230)82%  (47/57)
getExpression (): Expression 0%   (0/1)0%   (0/3)0%   (0/1)
getUniqueIndex (): Index 0%   (0/1)0%   (0/2)0%   (0/1)
setIndexOwner (Index): void 0%   (0/1)0%   (0/3)0%   (0/2)
checkRow (Session, Table, Row, Row): void 100% (1/1)67%  (24/36)80%  (8/10)
getCreateSQLForCopy (Table, String): String 100% (1/1)75%  (36/48)78%  (7/9)
getReferencedColumns (Table): HashSet 100% (1/1)88%  (22/25)83%  (5/6)
checkExistingData (Session): void 100% (1/1)98%  (39/40)86%  (6/7)
ConstraintCheck (Schema, int, String, Table): void 100% (1/1)100% (7/7)100% (2/2)
getConstraintType (): String 100% (1/1)100% (2/2)100% (1/1)
getCreateSQL (): String 100% (1/1)100% (7/7)100% (1/1)
getCreateSQLWithoutIndexes (): String 100% (1/1)100% (3/3)100% (1/1)
getShortDescription (): String 100% (1/1)100% (14/14)100% (1/1)
isBefore (): boolean 100% (1/1)100% (2/2)100% (1/1)
isEverything (ExpressionVisitor): boolean 100% (1/1)100% (5/5)100% (1/1)
rebuild (): void 100% (1/1)100% (1/1)100% (1/1)
removeChildrenAndResources (Session): void 100% (1/1)100% (22/22)100% (7/7)
setExpression (Expression): void 100% (1/1)100% (4/4)100% (2/2)
setTableFilter (TableFilter): void 100% (1/1)100% (4/4)100% (2/2)
usesIndex (Index): boolean 100% (1/1)100% (2/2)100% (1/1)

1/*
2 * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0,
3 * and the EPL 1.0 (http://h2database.com/html/license.html).
4 * Initial Developer: H2 Group
5 */
6package org.h2.constraint;
7 
8import java.util.HashSet;
9import java.util.Iterator;
10 
11import org.h2.api.ErrorCode;
12import org.h2.engine.Session;
13import org.h2.expression.Expression;
14import org.h2.expression.ExpressionVisitor;
15import org.h2.index.Index;
16import org.h2.message.DbException;
17import org.h2.result.ResultInterface;
18import org.h2.result.Row;
19import org.h2.schema.Schema;
20import org.h2.table.Column;
21import org.h2.table.Table;
22import org.h2.table.TableFilter;
23import org.h2.util.New;
24import org.h2.util.StringUtils;
25 
26/**
27 * A check constraint.
28 */
29public class ConstraintCheck extends Constraint {
30 
31    private TableFilter filter;
32    private Expression expr;
33 
34    public ConstraintCheck(Schema schema, int id, String name, Table table) {
35        super(schema, id, name, table);
36    }
37 
38    @Override
39    public String getConstraintType() {
40        return Constraint.CHECK;
41    }
42 
43    public void setTableFilter(TableFilter filter) {
44        this.filter = filter;
45    }
46 
47    public void setExpression(Expression expr) {
48        this.expr = expr;
49    }
50 
51    @Override
52    public String getCreateSQLForCopy(Table forTable, String quotedName) {
53        StringBuilder buff = new StringBuilder("ALTER TABLE ");
54        buff.append(forTable.getSQL()).append(" ADD CONSTRAINT ");
55        if (forTable.isHidden()) {
56            buff.append("IF NOT EXISTS ");
57        }
58        buff.append(quotedName);
59        if (comment != null) {
60            buff.append(" COMMENT ").append(StringUtils.quoteStringSQL(comment));
61        }
62        buff.append(" CHECK").append(StringUtils.enclose(expr.getSQL()))
63                .append(" NOCHECK");
64        return buff.toString();
65    }
66 
67    private String getShortDescription() {
68        return getName() + ": " + expr.getSQL();
69    }
70 
71    @Override
72    public String  getCreateSQLWithoutIndexes() {
73        return getCreateSQL();
74    }
75 
76    @Override
77    public String getCreateSQL() {
78        return getCreateSQLForCopy(table, getSQL());
79    }
80 
81    @Override
82    public void removeChildrenAndResources(Session session) {
83        table.removeConstraint(this);
84        database.removeMeta(session, getId());
85        filter = null;
86        expr = null;
87        table = null;
88        invalidate();
89    }
90 
91    @Override
92    public void checkRow(Session session, Table t, Row oldRow, Row newRow) {
93        if (newRow == null) {
94            return;
95        }
96        filter.set(newRow);
97        Boolean b;
98        try {
99            b = expr.getValue(session).getBoolean();
100        } catch (DbException ex) {
101            throw DbException.get(ErrorCode.CHECK_CONSTRAINT_INVALID, ex,
102                    getShortDescription());
103        }
104        // Both TRUE and NULL are ok
105        if (Boolean.FALSE.equals(b)) {
106            throw DbException.get(ErrorCode.CHECK_CONSTRAINT_VIOLATED_1,
107                    getShortDescription());
108        }
109    }
110 
111    @Override
112    public boolean usesIndex(Index index) {
113        return false;
114    }
115 
116    @Override
117    public void setIndexOwner(Index index) {
118        DbException.throwInternalError();
119    }
120 
121    @Override
122    public HashSet<Column> getReferencedColumns(Table table) {
123        HashSet<Column> columns = New.hashSet();
124        expr.isEverything(ExpressionVisitor.getColumnsVisitor(columns));
125        for (Iterator<Column> it = columns.iterator(); it.hasNext();) {
126            if (it.next().getTable() != table) {
127                it.remove();
128            }
129        }
130        return columns;
131    }
132 
133    public Expression getExpression() {
134        return expr;
135    }
136 
137    @Override
138    public boolean isBefore() {
139        return true;
140    }
141 
142    @Override
143    public void checkExistingData(Session session) {
144        if (session.getDatabase().isStarting()) {
145            // don't check at startup
146            return;
147        }
148        String sql = "SELECT 1 FROM " + filter.getTable().getSQL() +
149                " WHERE NOT(" + expr.getSQL() + ")";
150        ResultInterface r = session.prepare(sql).query(1);
151        if (r.next()) {
152            throw DbException.get(ErrorCode.CHECK_CONSTRAINT_VIOLATED_1, getName());
153        }
154    }
155 
156    @Override
157    public Index getUniqueIndex() {
158        return null;
159    }
160 
161    @Override
162    public void rebuild() {
163        // nothing to do
164    }
165 
166    @Override
167    public boolean isEverything(ExpressionVisitor visitor) {
168        return expr.isEverything(visitor);
169    }
170 
171}

[all classes][org.h2.constraint]
EMMA 2.0.5312 (C) Vladimir Roubtsov