提交 73c1cc8c authored 作者: Thomas Mueller's avatar Thomas Mueller

--no commit message

--no commit message
上级 e756cf88
......@@ -4174,16 +4174,20 @@ public class Parser {
}
if (readIf("PRIMARY")) {
read("KEY");
CreateIndex command = new CreateIndex(session, schema);
AlterTableAddConstraint command = new AlterTableAddConstraint(session, schema);
command.setType(AlterTableAddConstraint.PRIMARY_KEY);
command.setComment(comment);
command.setConstraintName(constraintName);
command.setTableName(tableName);
command.setPrimaryKey(true);
if (readIf("HASH")) {
command.setHash(true);
command.setPrimaryKeyHash(true);
}
read("(");
command.setIndexColumns(parseIndexColumnList());
if (readIf("INDEX")) {
String indexName = readIdentifierWithSchema();
command.setIndex(getSchema().findIndex(indexName));
}
return command;
} else if (database.getMode().indexDefinitionInCreateTable && (readIf("INDEX") || readIf("KEY"))) {
// MySQL
......@@ -4335,7 +4339,11 @@ public class Parser {
if (column.getAutoIncrement()) {
IndexColumn[] cols = new IndexColumn[]{new IndexColumn()};
cols[0].columnName = column.getName();
command.setPrimaryKeyColumns(cols);
AlterTableAddConstraint pk = new AlterTableAddConstraint(session, schema);
pk.setType(AlterTableAddConstraint.PRIMARY_KEY);
pk.setTableName(tableName);
pk.setIndexColumns(cols);
command.addConstraintCommand(pk);
}
command.addColumn(column);
String constraintName = null;
......@@ -4344,12 +4352,15 @@ public class Parser {
}
if (readIf("PRIMARY")) {
read("KEY");
if (readIf("HASH")) {
command.setHashPrimaryKey(true);
}
boolean hash = readIf("HASH");
IndexColumn[] cols = new IndexColumn[]{new IndexColumn()};
cols[0].columnName = column.getName();
command.setPrimaryKeyColumns(cols);
AlterTableAddConstraint pk = new AlterTableAddConstraint(session, schema);
pk.setPrimaryKeyHash(hash);
pk.setType(AlterTableAddConstraint.PRIMARY_KEY);
pk.setTableName(tableName);
pk.setIndexColumns(cols);
command.addConstraintCommand(pk);
} else if (readIf("UNIQUE")) {
AlterTableAddConstraint unique = new AlterTableAddConstraint(session, schema);
unique.setConstraintName(constraintName);
......
......@@ -5,7 +5,6 @@
package org.h2.command.ddl;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashSet;
import org.h2.constant.ErrorCode;
......@@ -13,6 +12,7 @@ import org.h2.constraint.Constraint;
import org.h2.constraint.ConstraintCheck;
import org.h2.constraint.ConstraintReferential;
import org.h2.constraint.ConstraintUnique;
import org.h2.engine.Constants;
import org.h2.engine.Database;
import org.h2.engine.DbObject;
import org.h2.engine.Right;
......@@ -48,6 +48,7 @@ public class AlterTableAddConstraint extends SchemaCommand {
private Index index, refIndex;
private String comment;
private boolean checkExisting;
private boolean primaryKeyKash;
public AlterTableAddConstraint(Session session, Schema schema) {
super(session, schema);
......@@ -61,29 +62,64 @@ public class AlterTableAddConstraint extends SchemaCommand {
}
public int update() throws SQLException {
try {
return tryUpdate();
} finally {
getSchema().freeUniqueName(constraintName);
}
}
public int tryUpdate() throws SQLException {
session.commit(true);
Database db = session.getDatabase();
Table table = getSchema().getTableOrView(session, tableName);
if (getSchema().findConstraint(constraintName) != null) {
throw Message.getSQLException(ErrorCode.CONSTRAINT_ALREADY_EXISTS_1, constraintName);
}
Constraint constraint;
session.getUser().checkRight(table, Right.ALL);
table.lock(session, true, true);
Constraint constraint;
switch (type) {
case CHECK: {
int id = getObjectId(true, true);
String name = generateConstraintName(table, id);
ConstraintCheck check = new ConstraintCheck(getSchema(), id, name, table);
TableFilter filter = new TableFilter(session, table, null, false, null);
checkExpression.mapColumns(filter, 0);
checkExpression = checkExpression.optimize(session);
check.setExpression(checkExpression);
check.setTableFilter(filter);
constraint = check;
if (checkExisting) {
check.checkExistingData(session);
case PRIMARY_KEY: {
IndexColumn.mapColumns(indexColumns, table);
index = table.findPrimaryKey();
ObjectArray constraints = table.getConstraints();
for (int i = 0; constraints != null && i < constraints.size(); i++) {
Constraint c = (Constraint) constraints.get(i);
if (Constraint.PRIMARY_KEY.equals(c.getConstraintType())) {
throw Message.getSQLException(ErrorCode.SECOND_PRIMARY_KEY);
}
}
if (index != null) {
// if there is an index, it must match with the one declared
// we don't test ascending / descending
IndexColumn[] pkCols = index.getIndexColumns();
if (pkCols.length != indexColumns.length) {
throw Message.getSQLException(ErrorCode.SECOND_PRIMARY_KEY);
}
for (int i = 0; i < pkCols.length; i++) {
if (pkCols[i].column != indexColumns[i].column) {
throw Message.getSQLException(ErrorCode.SECOND_PRIMARY_KEY);
}
}
}
if (index == null) {
IndexType indexType = IndexType.createPrimaryKey(table.isPersistent(), primaryKeyKash);
String indexName = getSchema().getUniqueIndexName(table, Constants.PREFIX_PRIMARY_KEY);
int id = getObjectId(true, false);
try {
index = table.addIndex(session, indexName, id, indexColumns, indexType, Index.EMPTY_HEAD, null);
} finally {
getSchema().freeUniqueName(indexName);
}
}
index.getIndexType().setBelongsToConstraint(true);
int constraintId = getObjectId(true, true);
String name = generateConstraintName(table, constraintId);
ConstraintUnique pk = new ConstraintUnique(getSchema(), constraintId, name, table, true);
pk.setColumns(indexColumns);
pk.setIndex(index, true);
constraint = pk;
break;
}
case UNIQUE: {
......@@ -107,6 +143,21 @@ public class AlterTableAddConstraint extends SchemaCommand {
constraint = unique;
break;
}
case CHECK: {
int id = getObjectId(true, true);
String name = generateConstraintName(table, id);
ConstraintCheck check = new ConstraintCheck(getSchema(), id, name, table);
TableFilter filter = new TableFilter(session, table, null, false, null);
checkExpression.mapColumns(filter, 0);
checkExpression = checkExpression.optimize(session);
check.setExpression(checkExpression);
check.setTableFilter(filter);
constraint = check;
if (checkExisting) {
check.checkExistingData(session);
}
break;
}
case REFERENTIAL: {
Table refTable = refSchema.getTableOrView(session, refTableName);
session.getUser().checkRight(refTable, Right.ALL);
......@@ -187,7 +238,13 @@ public class AlterTableAddConstraint extends SchemaCommand {
indexType.setBelongsToConstraint(true);
String prefix = constraintName == null ? "CONSTRAINT" : constraintName;
String indexName = getSchema().getUniqueIndexName(t, prefix + "_INDEX_");
return t.addIndex(session, indexName, indexId, cols, indexType, Index.EMPTY_HEAD, null);
Index idx;
try {
idx = t.addIndex(session, indexName, indexId, cols, indexType, Index.EMPTY_HEAD, null);
} finally {
getSchema().freeUniqueName(indexName);
}
return idx;
}
public void setDeleteAction(int action) {
......@@ -282,6 +339,10 @@ public class AlterTableAddConstraint extends SchemaCommand {
this.type = type;
}
public int getType() {
return type;
}
public void setCheckExpression(Expression expression) {
this.checkExpression = expression;
}
......@@ -294,6 +355,10 @@ public class AlterTableAddConstraint extends SchemaCommand {
this.indexColumns = indexColumns;
}
public IndexColumn[] getIndexColumns() {
return indexColumns;
}
public void setRefTableName(Schema refSchema, String ref) {
this.refSchema = refSchema;
this.refTableName = ref;
......@@ -319,4 +384,12 @@ public class AlterTableAddConstraint extends SchemaCommand {
this.checkExisting = b;
}
public void setPrimaryKeyHash(boolean b) {
this.primaryKeyKash = b;
}
public boolean getPrimaryKeyHash() {
return primaryKeyKash;
}
}
......@@ -7,12 +7,10 @@ package org.h2.command.ddl;
import java.sql.SQLException;
import org.h2.constant.ErrorCode;
import org.h2.constraint.ConstraintUnique;
import org.h2.engine.Constants;
import org.h2.engine.Database;
import org.h2.engine.DbObject;
import org.h2.engine.Right;
import org.h2.engine.Session;
import org.h2.index.Index;
import org.h2.index.IndexType;
import org.h2.message.Message;
import org.h2.schema.Schema;
......@@ -31,7 +29,6 @@ public class CreateIndex extends SchemaCommand {
private boolean primaryKey, unique, hash;
private boolean ifNotExists;
private String comment;
private String constraintName;
public CreateIndex(Session session, Schema schema) {
super(session, schema);
......@@ -61,13 +58,6 @@ public class CreateIndex extends SchemaCommand {
return indexColumns;
}
private String generateConstraintName(DbObject obj, int id) throws SQLException {
if (constraintName == null) {
constraintName = getSchema().getUniqueConstraintName(obj);
}
return constraintName;
}
public int update() throws SQLException {
// TODO cancel: may support for index creation
session.commit(true);
......@@ -80,8 +70,10 @@ public class CreateIndex extends SchemaCommand {
persistent = false;
}
int id = getObjectId(true, false);
if (indexName == null) {
indexName = getSchema().getUniqueIndexName(table, "INDEX_");
if (primaryKey) {
indexName = getSchema().getUniqueIndexName(table, Constants.PREFIX_PRIMARY_KEY);
} else if (indexName == null) {
indexName = getSchema().getUniqueIndexName(table, Constants.PREFIX_INDEX);
}
if (getSchema().findIndex(indexName) != null) {
if (ifNotExists) {
......@@ -101,20 +93,7 @@ public class CreateIndex extends SchemaCommand {
indexType = IndexType.createNonUnique(persistent);
}
IndexColumn.mapColumns(indexColumns, table);
Index index = table.addIndex(session, indexName, id, indexColumns, indexType, headPos, comment);
int todo;
// if (primaryKey) {
// // TODO this code is a copy of CreateTable (primaryKey creation)
// // for primary keys, create a constraint as well
// String name = generateConstraintName(table, id);
// int constraintId = getObjectId(true, true);
// ConstraintUnique pk = new ConstraintUnique(getSchema(), constraintId, name, table, true);
// pk.setColumns(index.getIndexColumns());
// pk.setIndex(index, true);
// pk.setComment(comment);
// db.addSchemaObject(session, pk);
// table.addConstraint(pk);
// }
table.addIndex(session, indexName, id, indexColumns, indexType, headPos, comment);
return 0;
}
......@@ -138,8 +117,4 @@ public class CreateIndex extends SchemaCommand {
this.comment = comment;
}
public void setConstraintName(String constraintName) {
this.constraintName = constraintName;
}
}
......@@ -10,12 +10,9 @@ import org.h2.command.Prepared;
import org.h2.command.dml.Insert;
import org.h2.command.dml.Query;
import org.h2.constant.ErrorCode;
import org.h2.constraint.ConstraintUnique;
import org.h2.engine.Database;
import org.h2.engine.Session;
import org.h2.expression.Expression;
import org.h2.index.Index;
import org.h2.index.IndexType;
import org.h2.message.Message;
import org.h2.schema.Schema;
import org.h2.schema.Sequence;
......@@ -37,7 +34,6 @@ public class CreateTable extends SchemaCommand {
private IndexColumn[] pkColumns;
private boolean ifNotExists;
private boolean persistent = true;
private boolean hashPrimaryKey;
private boolean temporary;
private boolean globalTemporary;
private boolean onCommitDrop;
......@@ -68,15 +64,18 @@ public class CreateTable extends SchemaCommand {
public void addConstraintCommand(Prepared command) throws SQLException {
if (command instanceof CreateIndex) {
CreateIndex create = (CreateIndex) command;
if (create.getPrimaryKey()) {
setPrimaryKeyColumns(create.getIndexColumns());
setHashPrimaryKey(create.getHash());
constraintCommands.add(command);
} else {
AlterTableAddConstraint con = (AlterTableAddConstraint) command;
boolean alreadySet;
if (con.getType() == AlterTableAddConstraint.PRIMARY_KEY) {
alreadySet = setPrimaryKeyColumns(con.getIndexColumns());
} else {
alreadySet = false;
}
if (!alreadySet) {
constraintCommands.add(command);
}
} else {
constraintCommands.add(command);
}
}
......@@ -144,22 +143,6 @@ public class CreateTable extends SchemaCommand {
Column c = (Column) columns.get(i);
c.prepareExpression(session);
}
if (pkColumns != null) {
IndexColumn.mapColumns(pkColumns, table);
int indexId = getObjectId(true, false);
Index index = table.addIndex(session, null, indexId, pkColumns, IndexType.createPrimaryKey(persistent, hashPrimaryKey),
Index.EMPTY_HEAD, null);
// TODO this code is a copy of CreateIndex (if primaryKey)
int todo;
// String name = getSchema().getUniqueConstraintName(table);
// int constraintId = getObjectId(true, true);
// ConstraintUnique pk = new ConstraintUnique(getSchema(), constraintId, name, table, true);
// pk.setColumns(index.getIndexColumns());
// pk.setIndex(index, true);
// pk.setComment(comment);
// db.addSchemaObject(session, pk);
// table.addConstraint(pk);
}
for (int i = 0; i < sequences.size(); i++) {
Sequence sequence = (Sequence) sequences.get(i);
table.addSequence(sequence);
......@@ -214,7 +197,13 @@ public class CreateTable extends SchemaCommand {
}
}
public void setPrimaryKeyColumns(IndexColumn[] columns) throws SQLException {
/**
* Sets the primary key columns, but also check if an primary key with different columns is already defined.
*
* @param columns the primary key columns
* @return true if the same primary key columns where already set
*/
private boolean setPrimaryKeyColumns(IndexColumn[] columns) throws SQLException {
if (pkColumns != null) {
if (columns.length != pkColumns.length) {
throw Message.getSQLException(ErrorCode.SECOND_PRIMARY_KEY);
......@@ -224,18 +213,16 @@ public class CreateTable extends SchemaCommand {
throw Message.getSQLException(ErrorCode.SECOND_PRIMARY_KEY);
}
}
return true;
}
this.pkColumns = columns;
return false;
}
public void setPersistent(boolean persistent) {
this.persistent = persistent;
}
public void setHashPrimaryKey(boolean b) {
this.hashPrimaryKey = b;
}
public void setGlobalTemporary(boolean globalTemporary) {
this.globalTemporary = globalTemporary;
}
......
......@@ -47,16 +47,26 @@ public class DropIndex extends SchemaCommand {
}
} else {
Table table = index.getTable();
session.getUser().checkRight(index.getTable(), Right.ALL);
Constraint pkConstraint = null;
ObjectArray constraints = table.getConstraints();
for (int i = 0; constraints != null && i < constraints.size(); i++) {
Constraint cons = (Constraint) constraints.get(i);
if (cons.usesIndex(index)) {
throw Message.getSQLException(ErrorCode.INDEX_BELONGS_TO_CONSTRAINT_1, indexName);
// can drop primary key index (for compatibility)
if (Constraint.PRIMARY_KEY.equals(cons.getConstraintType())) {
pkConstraint = cons;
} else {
throw Message.getSQLException(ErrorCode.INDEX_BELONGS_TO_CONSTRAINT_1, indexName);
}
}
}
session.getUser().checkRight(index.getTable(), Right.ALL);
index.getTable().setModified();
db.removeSchemaObject(session, index);
if (pkConstraint != null) {
db.removeSchemaObject(session, pkConstraint);
} else {
db.removeSchemaObject(session, index);
}
}
return 0;
}
......
......@@ -116,7 +116,8 @@ public class Constants {
public static final int DEFAULT_MAX_LENGTH_CLIENTSIDE_LOB = 65536;
public static final int SALT_LEN = 8;
public static final int DEFAULT_DATA_PAGE_SIZE = 512;
public static final String PRIMARY_KEY_PREFIX = "PRIMARY_KEY_";
public static final String PREFIX_PRIMARY_KEY = "PRIMARY_KEY_";
public static final String PREFIX_INDEX = "INDEX_";
public static final int LOCK_SLEEP = 1000;
// TODO for testing, the lock timeout is smaller than for interactive use cases
......
......@@ -2644,7 +2644,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements DatabaseMetaDat
//#ifdef JDK16
/*
public <T> T unwrap(Class<T> iface) throws SQLException {
debugCodeCall("unwrap");
debugCodeCall("unwrap");
throw Message.getUnsupportedException();
}
*/
......@@ -2656,7 +2656,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements DatabaseMetaDat
//#ifdef JDK16
/*
public boolean isWrapperFor(Class< ? > iface) throws SQLException {
debugCodeCall("isWrapperFor");
debugCodeCall("isWrapperFor");
throw Message.getUnsupportedException();
}
*/
......@@ -2666,7 +2666,7 @@ public class JdbcDatabaseMetaData extends TraceObject implements DatabaseMetaDat
* [Not supported] Gets the list of function columns.
*/
public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException {
debugCodeCall("getFunctionColumns");
debugCodeCall("getFunctionColumns");
throw Message.getUnsupportedException();
}
......@@ -2674,10 +2674,10 @@ public class JdbcDatabaseMetaData extends TraceObject implements DatabaseMetaDat
* [Not supported] Gets the list of functions.
*/
public ResultSet getFunctions(String arg0, String arg1, String arg2) throws SQLException {
debugCodeCall("getFunctions");
debugCodeCall("getFunctions");
throw Message.getUnsupportedException();
}
/**
* INTERNAL
*/
......@@ -2686,4 +2686,3 @@ public class JdbcDatabaseMetaData extends TraceObject implements DatabaseMetaDat
}
}
......@@ -6,6 +6,7 @@ package org.h2.schema;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import org.h2.constant.ErrorCode;
import org.h2.constant.SysProperties;
......@@ -40,6 +41,13 @@ public class Schema extends DbObjectBase {
private HashMap constraints = new HashMap();
private HashMap constants = new HashMap();
/*
* Set of returned unique names that are not yet stored
* (to avoid returning the same unique name twice when multiple threads
* concurrently create objects).
*/
private HashSet temporaryUniqueNames = new HashSet();
public Schema(Database database, int id, String schemaName, User owner, boolean system) {
super(database, id, schemaName, Trace.SCHEMA);
this.owner = owner;
......@@ -139,6 +147,7 @@ public class Schema extends DbObjectBase {
throw Message.getInternalError("object already exists");
}
map.put(name, obj);
freeUniqueName(name);
}
public void rename(SchemaObject obj, String newName) throws SQLException {
......@@ -153,8 +162,10 @@ public class Schema extends DbObjectBase {
}
}
map.remove(obj.getName());
freeUniqueName(obj.getName());
obj.rename(newName);
map.put(newName, obj);
freeUniqueName(newName);
}
public Table findTableOrView(Session session, String name) {
......@@ -185,21 +196,33 @@ public class Schema extends DbObjectBase {
return (Constant) constants.get(constantName);
}
public void freeUniqueName(String name) {
if (name != null) {
temporaryUniqueNames.remove(name);
}
}
private String getUniqueName(DbObject obj, HashMap map, String prefix) {
String hash = Integer.toHexString(obj.getName().hashCode()).toUpperCase();
String name = null;
for (int i = 1; i < hash.length(); i++) {
String name = prefix + hash.substring(0, i);
if (map.get(name) == null) {
return name;
name = prefix + hash.substring(0, i);
if (!map.containsKey(name) && !temporaryUniqueNames.contains(name)) {
break;
}
name = null;
}
prefix = prefix + hash + "_";
for (int i = 0;; i++) {
String name = prefix + i;
if (map.get(name) == null) {
return name;
if (name == null) {
prefix = prefix + hash + "_";
for (int i = 0;; i++) {
name = prefix + i;
if (!map.containsKey(name) && !temporaryUniqueNames.contains(name)) {
break;
}
}
}
temporaryUniqueNames.add(name);
return name;
}
public String getUniqueConstraintName(DbObject obj) {
......@@ -265,6 +288,7 @@ public class Schema extends DbObjectBase {
throw Message.getInternalError("not found: " + objName);
}
map.remove(objName);
freeUniqueName(objName);
}
public TableData createTable(String tempName, int id, ObjectArray newColumns, boolean persistent, boolean clustered)
......
......@@ -819,6 +819,9 @@ class WebThread extends Thread implements DatabaseEventListener {
e.printStackTrace(new PrintWriter(writer));
String stackTrace = writer.toString();
stackTrace = PageParser.escapeHtml(stackTrace);
if (isH2) {
stackTrace = linkToSource(stackTrace);
}
stackTrace = StringUtils.replaceAll(stackTrace, "\t", "&nbsp;&nbsp;&nbsp;&nbsp;");
String message = PageParser.escapeHtml(e.getMessage());
String error = "<a class=\"error\" href=\"#\" onclick=\"var x=document.getElementById('st" + id
......@@ -837,6 +840,49 @@ class WebThread extends Thread implements DatabaseEventListener {
}
}
private String linkToSource(String s) {
try {
StringBuffer result = new StringBuffer(s.length());
int idx = s.indexOf("<br />");
result.append(s.substring(0, idx));
while (true) {
int start = s.indexOf("org.h2.", idx);
if (start < 0) {
result.append(s.substring(idx));
break;
}
result.append(s.substring(idx, start));
int end = s.indexOf(')', start);
if (end < 0) {
result.append(s.substring(idx));
break;
}
String element = s.substring(start, end);
int open = element.lastIndexOf('(');
int dotMethod = element.lastIndexOf('.', open - 1);
int dotClass = element.lastIndexOf('.', dotMethod - 1);
String packageName = element.substring(0, dotClass);
int colon = element.lastIndexOf(':');
String file = element.substring(open + 1, colon);
String lineNumber = element.substring(colon + 1, element.length());
String fullFileName = packageName.replace('.', '/') + "/" + file;
result.append("<a href=\"http://h2database.com/html/source.html?file=");
result.append(fullFileName);
result.append("&line=");
result.append(lineNumber);
result.append("&build=");
result.append(Constants.BUILD_ID);
result.append("\">");
result.append(element);
result.append("</a>");
idx = end;
}
return result.toString();
} catch (Throwable t) {
return s;
}
}
private String formatAsError(String s) {
return "<div class=\"error\">"+s+"</div>";
}
......
......@@ -31,7 +31,6 @@ public class IndexColumn {
}
public static IndexColumn[] wrap(Column[] columns) {
int testDelete_;
IndexColumn[] list = new IndexColumn[columns.length];
for (int i = 0; i < list.length; i++) {
list[i] = new IndexColumn();
......
......@@ -447,7 +447,7 @@ public abstract class Table extends SchemaObjectBase {
if (index != null) {
return index;
}
throw Message.getSQLException(ErrorCode.INDEX_NOT_FOUND_1, Constants.PRIMARY_KEY_PREFIX);
throw Message.getSQLException(ErrorCode.INDEX_NOT_FOUND_1, Constants.PREFIX_PRIMARY_KEY);
}
public void validateConvertUpdateSequence(Session session, Row row) throws SQLException {
......
......@@ -151,7 +151,6 @@ public class TableData extends Table implements RecordReader {
public Index addIndex(Session session, String indexName, int indexId, IndexColumn[] cols, IndexType indexType,
int headPos, String indexComment) throws SQLException {
if (indexType.isPrimaryKey()) {
indexName = getSchema().getUniqueIndexName(this, Constants.PRIMARY_KEY_PREFIX);
for (int i = 0; i < cols.length; i++) {
Column column = cols[i].column;
if (column.getNullable()) {
......@@ -202,6 +201,7 @@ public class TableData extends Table implements RecordReader {
throw Message.getInternalError("rowcount remaining=" + remaining + " " + getName());
}
} catch (SQLException e) {
getSchema().freeUniqueName(indexName);
try {
index.remove(session);
} catch (SQLException e2) {
......
......@@ -151,17 +151,23 @@ java org.h2.test.TestAll timer
/*
create table bla (id integer not null);
alter table bla add constraint pk primary key (id);
-- doesn't create a constraint!
alter table bla drop constraint pk;
alter table bla drop primary key;
drop table bla;
-- PostgreSQL, Derby, HSQLDB: works
-- MySQL: does not work
implement max_query_time and use it for TestCrashAPI
Value too long for column DESC. But which value?
org.h2.jdbc.JdbcSQLException: Value too long for column DESC
[90005-64]
at org.h2.message.Message.getSQLException(Message.java:89)
at org.h2.message.Message.getSQLException(Message.java:93)
at org.h2.message.Message.getSQLException(Message.java:71)
at org.h2.table.Column.validateConvertUpdateSequence(Column.java:226)
at org.h2.table.Table.validateConvertUpdateSequence(Table.java:331)
at org.h2.command.dml.Insert.update(Insert.java:111)
at org.h2.command.CommandContainer.update(CommandContainer.java:68)
CREATE {[UNIQUE [HASH]] INDEX [[IF NOT EXISTS] newIndexName]
| PRIMARY KEY [HASH]} ON (columnName [,...])
There is missing name of table
adjust cache memory usage
simple pure java config file (interpreted)
......@@ -182,6 +188,8 @@ Roadmap:
Move Maven 2 repository from hsql.sf.net to h2database.sf.net
History:
Primary keys are now considered constraints and can have a constraint name.
H2 Console: stack traces are now links to the source code in the source repository (H2 database only)
Test Recovery with MAX_LOG_FILE_SIZE=1; test with various log file sizes
......
......@@ -318,10 +318,10 @@ public abstract class TestBase {
error("a: " + a + " is not smaller than b: " + b);
}
}
protected void checkContains(String result, String contains) throws Exception {
if(result.indexOf(contains) < 0) {
error(result + " does not contain: " + contains);
protected void checkContains(String result, String contains) throws Exception {
if (result.indexOf(contains) < 0) {
error(result + " does not contain: " + contains);
}
}
......
......@@ -495,7 +495,7 @@ public class TestCases extends TestBase {
conn.createStatement().execute("CREATE TABLE TEST_SEQ(ID INT IDENTITY, NAME VARCHAR(255))");
conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY)");
conn.createStatement().execute("ALTER TABLE TEST RENAME TO TEST2");
conn.createStatement().execute("CREATE TABLE TEST_B(ID INT PRIMARY KEY, NAME VARCHAR, UNIQUE(NAME));");
conn.createStatement().execute("CREATE TABLE TEST_B(ID INT PRIMARY KEY, NAME VARCHAR, UNIQUE(NAME))");
conn.close();
conn = getConnection("cases");
conn.createStatement().execute("INSERT INTO TEST_SEQ(NAME) VALUES('Hi')");
......
......@@ -743,21 +743,21 @@ public class TestMetaData extends TestBase {
* null,
* null
*/},
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_146",
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_14",
"" + DatabaseMetaData.tableIndexOther, "1", "C", "A" /*
* ,
* null,
* null,
* null
*/},
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_146",
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_14",
"" + DatabaseMetaData.tableIndexOther, "2", "A", "A" /*
* ,
* null,
* null,
* null
*/},
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_146",
{ catalog, Constants.SCHEMA_MAIN, "TX2", "FALSE", catalog, "PRIMARY_KEY_14",
"" + DatabaseMetaData.tableIndexOther, "3", "B", "A"/*
* ,
* null,
......@@ -787,9 +787,10 @@ public class TestMetaData extends TestBase {
*/}, });
trace("getPrimaryKeys");
rs = meta.getPrimaryKeys(null, null, "T_2");
testResultSetOrdered(rs, new String[][] { { catalog, Constants.SCHEMA_MAIN, "T_2", "A", "2", "PRIMARY_KEY_14" },
{ catalog, Constants.SCHEMA_MAIN, "T_2", "B", "3", "PRIMARY_KEY_14" },
{ catalog, Constants.SCHEMA_MAIN, "T_2", "C", "1", "PRIMARY_KEY_14" }, });
testResultSetOrdered(rs, new String[][] {
{ catalog, Constants.SCHEMA_MAIN, "T_2", "A", "2", "PRIMARY_KEY_1" },
{ catalog, Constants.SCHEMA_MAIN, "T_2", "B", "3", "PRIMARY_KEY_1" },
{ catalog, Constants.SCHEMA_MAIN, "T_2", "C", "1", "PRIMARY_KEY_1" }, });
stat.executeUpdate("DROP TABLE TX2");
stat.executeUpdate("DROP TABLE T_2");
stat.executeUpdate("CREATE TABLE PARENT(ID INT PRIMARY KEY)");
......
......@@ -1000,11 +1000,11 @@ script nopasswords nosettings blocksize 10;
> SCRIPT
> -------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CALL SYSTEM_COMBINE_BLOB(-1);
> CREATE ALIAS IF NOT EXISTS SYSTEM_COMBINE_BLOB FOR "org.h2.command.dml.ScriptCommand.combineBlob";
> CREATE ALIAS IF NOT EXISTS SYSTEM_COMBINE_CLOB FOR "org.h2.command.dml.ScriptCommand.combineClob";
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, DATA CLOB );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE TABLE IF NOT EXISTS SYSTEM_LOB_STREAM(ID INT, PART INT, CDATA VARCHAR, BDATA BINARY, PRIMARY KEY(ID, PART));
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> DROP ALIAS IF EXISTS SYSTEM_COMBINE_BLOB;
......@@ -1480,6 +1480,7 @@ script nodata nopasswords nosettings;
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.ADDRESS;
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.ADDRESS ADD CONSTRAINT PUBLIC.CONSTRAINT_E PRIMARY KEY(ID);
> CREATE DOMAIN EMAIL AS VARCHAR(200) CHECK (POSITION('@', VALUE) > 1);
> CREATE DOMAIN GMAIL AS VARCHAR(200) DEFAULT '@gmail.com' CHECK ((POSITION('@', VALUE) > 1) AND (POSITION('gmail', VALUE) > 1));
> CREATE DOMAIN STRING AS VARCHAR(255) DEFAULT '' NOT NULL;
......@@ -1489,7 +1490,6 @@ script nodata nopasswords nosettings;
> CREATE DOMAIN STRING_X AS VARCHAR DEFAULT '<empty>';
> CREATE MEMORY TABLE PUBLIC.ADDRESS( ID INT NOT NULL, NAME VARCHAR(200) CHECK (POSITION('@', NAME) > 1), NAME2 VARCHAR(200) DEFAULT '@gmail.com' CHECK ((POSITION('@', NAME2) > 1) AND (POSITION('gmail', NAME2) > 1)) );
> CREATE MEMORY TABLE PUBLIC.TEST( A VARCHAR(255) DEFAULT '', B VARCHAR, C VARCHAR, D VARCHAR DEFAULT '<empty>' );
> CREATE PRIMARY KEY ON PUBLIC.ADDRESS(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> rows: 13
......@@ -2113,8 +2113,8 @@ explain select * from one natural join two left join two three on
one.id=three.id left join one four on two.id=four.id where three.val
is null or three.val>=DATE'2006-07-01';
> PLAN
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> SELECT ONE.ID, TWO.ID, TWO.VAL, THREE.ID, THREE.VAL, FOUR.ID FROM PUBLIC.ONE /* PUBLIC.ONE_TABLE_SCAN */ INNER JOIN PUBLIC.TWO /* PUBLIC.PRIMARY_KEY_14: ID = PUBLIC.ONE.ID AND ID = PUBLIC.ONE.ID */ /* WHERE PUBLIC.ONE.ID = PUBLIC.TWO.ID */ LEFT OUTER JOIN PUBLIC.TWO THREE /* PUBLIC.PRIMARY_KEY_14: ID = ONE.ID */ ON ONE.ID = THREE.ID LEFT OUTER JOIN PUBLIC.ONE FOUR /* PUBLIC.PRIMARY_KEY_13: ID = TWO.ID */ ON TWO.ID = FOUR.ID WHERE (PUBLIC.ONE.ID = PUBLIC.TWO.ID) AND ((THREE.VAL IS NULL) OR (THREE.VAL >= DATE '2006-07-01'))
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> SELECT ONE.ID, TWO.ID, TWO.VAL, THREE.ID, THREE.VAL, FOUR.ID FROM PUBLIC.ONE /* PUBLIC.ONE_TABLE_SCAN */ INNER JOIN PUBLIC.TWO /* PUBLIC.PRIMARY_KEY_14: ID = PUBLIC.ONE.ID AND ID = PUBLIC.ONE.ID */ /* WHERE PUBLIC.ONE.ID = PUBLIC.TWO.ID */ LEFT OUTER JOIN PUBLIC.TWO THREE /* PUBLIC.PRIMARY_KEY_14: ID = ONE.ID */ ON ONE.ID = THREE.ID LEFT OUTER JOIN PUBLIC.ONE FOUR /* PUBLIC.PRIMARY_KEY_1: ID = TWO.ID */ ON TWO.ID = FOUR.ID WHERE (PUBLIC.ONE.ID = PUBLIC.TWO.ID) AND ((THREE.VAL IS NULL) OR (THREE.VAL >= DATE '2006-07-01'))
> rows: 1
-- Query #4: same as #3, but the joins have been manually re-ordered
......@@ -2401,10 +2401,11 @@ alter table test add constraint fk foreign key(parent) references(id);
select TABLE_NAME, NON_UNIQUE, INDEX_NAME, ORDINAL_POSITION, COLUMN_NAME, CARDINALITY, PRIMARY_KEY from INFORMATION_SCHEMA.INDEXES;
> TABLE_NAME NON_UNIQUE INDEX_NAME ORDINAL_POSITION COLUMN_NAME CARDINALITY PRIMARY_KEY
> ---------- ---------- ------------- ---------------- ----------- ----------- -----------
> TEST FALSE FK_INDEX_2 1 ID 0 FALSE
> TEST FALSE NU_INDEX_2 1 PARENT 0 FALSE
> TEST FALSE PRIMARY_KEY_2 1 ID 0 TRUE
> TEST TRUE NI 1 PARENT 0 FALSE
> rows: 3
> rows: 4
select SEQUENCE_NAME, CURRENT_VALUE, INCREMENT, IS_GENERATED, REMARKS from INFORMATION_SCHEMA.SEQUENCES;
> SEQUENCE_NAME CURRENT_VALUE INCREMENT IS_GENERATED REMARKS
......@@ -2537,26 +2538,26 @@ CREATE memory TABLE sp2(S_NO VARCHAR(5), p_no VARCHAR(5), qty INT, constraint c1
script NOPASSWORDS NOSETTINGS;
> SCRIPT
> ------------------------------------------------------------------------------------------------------------------
> -------------------------------------------------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.P;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.S;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.SP1;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.SP2;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.P ADD CONSTRAINT PUBLIC.CONSTRAINT_50_0 PRIMARY KEY(P_NO);
> ALTER TABLE PUBLIC.S ADD CONSTRAINT PUBLIC.CONSTRAINT_5 PRIMARY KEY(S_NO);
> ALTER TABLE PUBLIC.SP1 ADD CONSTRAINT PUBLIC.CONSTRAINT_1 FOREIGN KEY(S_NO) REFERENCES PUBLIC.S(S_NO) NOCHECK;
> ALTER TABLE PUBLIC.SP1 ADD CONSTRAINT PUBLIC.CONSTRAINT_14 FOREIGN KEY(P_NO) REFERENCES PUBLIC.P(P_NO) NOCHECK;
> ALTER TABLE PUBLIC.SP1 ADD CONSTRAINT PUBLIC.CONSTRAINT_141 PRIMARY KEY(S_NO, P_NO);
> ALTER TABLE PUBLIC.SP2 ADD CONSTRAINT PUBLIC.C1 FOREIGN KEY(S_NO) REFERENCES PUBLIC.S(S_NO) NOCHECK;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 FOREIGN KEY(PARENT) REFERENCES PUBLIC.TEST(ID) NOCHECK;
> ALTER TABLE PUBLIC.SP2 ADD CONSTRAINT PUBLIC.CONSTRAINT_1417 PRIMARY KEY(S_NO, P_NO);
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_27 FOREIGN KEY(PARENT) REFERENCES PUBLIC.TEST(ID) NOCHECK;
> CREATE MEMORY TABLE PUBLIC.P( P_NO VARCHAR(5) NOT NULL, DESCR VARCHAR(16), COLOR VARCHAR(8) );
> CREATE MEMORY TABLE PUBLIC.S( S_NO VARCHAR(5) NOT NULL, NAME VARCHAR(16), CITY VARCHAR(16) );
> CREATE MEMORY TABLE PUBLIC.SP1( S_NO VARCHAR(5) NOT NULL, P_NO VARCHAR(5) NOT NULL, QTY INT );
> CREATE MEMORY TABLE PUBLIC.SP2( S_NO VARCHAR(5) NOT NULL, P_NO VARCHAR(5) NOT NULL, QTY INT );
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, PARENT INT );
> CREATE PRIMARY KEY ON PUBLIC.P(P_NO);
> CREATE PRIMARY KEY ON PUBLIC.S(S_NO);
> CREATE PRIMARY KEY ON PUBLIC.SP1(S_NO, P_NO);
> CREATE PRIMARY KEY ON PUBLIC.SP2(S_NO, P_NO);
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> rows: 20
......@@ -2873,9 +2874,9 @@ script NOPASSWORDS NOSETTINGS drop;
> ---------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.ABC FOREIGN KEY(I) REFERENCES PUBLIC.TEST(I) NOCHECK;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(I);
> CREATE INDEX PUBLIC.IDX_N_ID ON PUBLIC.TEST(NAME, I);
> CREATE MEMORY TABLE PUBLIC.TEST( I INT NOT NULL, NAME VARCHAR(255), Y INT AS (I + 1) );
> CREATE PRIMARY KEY ON PUBLIC.TEST(I);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> DROP TABLE IF EXISTS PUBLIC.TEST;
> INSERT INTO PUBLIC.TEST(I, NAME, Y) VALUES (1, 'Hello', 2);
......@@ -3220,8 +3221,8 @@ script NODATA NOPASSWORDS NOSETTINGS drop;
> SCRIPT
> ------------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, IM_IE VARCHAR(10) );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE SEQUENCE PUBLIC.TEST_SEQ START WITH 1;
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> DROP SEQUENCE IF EXISTS PUBLIC.TEST_SEQ;
......@@ -3908,8 +3909,8 @@ script simple nopasswords nosettings;
> SCRIPT
> -------------------------------------------------------------------------------
> -- 3 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, C CLOB, B BLOB );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, C, B) VALUES(0, NULL, NULL);
> INSERT INTO PUBLIC.TEST(ID, C, B) VALUES(1, '', X'');
......@@ -4356,10 +4357,10 @@ CREATE MEMORY TABLE TEST(ID INT PRIMARY KEY);
SCRIPT NOPASSWORDS NOSETTINGS;
> SCRIPT
> -------------------------------------------------------
> ---------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> rows: 4
......@@ -4443,10 +4444,10 @@ SCRIPT SIMPLE NOPASSWORDS NOSETTINGS;
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> -- 4 = SELECT COUNT(*) FROM PUBLIC.TEST_SEQ;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE INDEX PUBLIC.IDXNAME ON PUBLIC.TEST(NAME);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255) DEFAULT 1, CREATEDATE VARCHAR(255) DEFAULT '2001-01-01' NOT NULL, MODIFY_DATE TIMESTAMP );
> CREATE MEMORY TABLE PUBLIC.TEST_SEQ( ID INT DEFAULT 20, DATA VARCHAR );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, NAME, CREATEDATE, MODIFY_DATE) VALUES(1, 'Hi', '2001-01-01', NULL);
> INSERT INTO PUBLIC.TEST_SEQ(ID, DATA) VALUES(-1, '-1');
......@@ -4477,8 +4478,8 @@ SCRIPT NOPASSWORDS NOSETTINGS;
> SCRIPT
> ---------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, CREATEDATE VARCHAR(255) DEFAULT '2001-01-01' NOT NULL, MODIFY_DATE TIMESTAMP );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, CREATEDATE, MODIFY_DATE) VALUES (1, '2001-01-01', NULL);
> rows: 5
......@@ -4490,8 +4491,8 @@ SCRIPT NOPASSWORDS NOSETTINGS;
> SCRIPT
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255), CREATEDATE VARCHAR(255) DEFAULT '2001-01-01' NOT NULL, MODIFY_DATE TIMESTAMP );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, NAME, CREATEDATE, MODIFY_DATE) VALUES (1, NULL, '2001-01-01', NULL);
> rows: 5
......@@ -4518,10 +4519,10 @@ CREATE MEMORY TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR);
SCRIPT NOPASSWORDS NOSETTINGS;
> SCRIPT
> -------------------------------------------------------------------------
> ---------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> rows: 4
......@@ -6948,9 +6949,9 @@ SCRIPT NOPASSWORDS NOSETTINGS;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.CHILD;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.PARENT;
> ALTER TABLE PUBLIC.CHILD ADD CONSTRAINT PUBLIC.CONSTRAINT_3 FOREIGN KEY(PARENT_ID) REFERENCES PUBLIC.PARENT(ID) NOCHECK;
> ALTER TABLE PUBLIC.PARENT ADD CONSTRAINT PUBLIC.CONSTRAINT_8 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.CHILD( ID INT, PARENT_ID INT );
> CREATE MEMORY TABLE PUBLIC.PARENT( ID INT NOT NULL );
> CREATE PRIMARY KEY ON PUBLIC.PARENT(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> rows: 7
......@@ -6964,7 +6965,7 @@ CREATE TABLE TEST(ID INT PRIMARY KEY, NAME VARCHAR, PARENT INT, CONSTRAINT P FOR
> ok
ALTER TABLE TEST DROP PRIMARY KEY;
> exception
> ok
INSERT INTO TEST VALUES(1, 'Frank', 1);
> update count: 1
......@@ -7151,16 +7152,16 @@ SCRIPT NOPASSWORDS NOSETTINGS;
> ----------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.A_TEST;
> -- 1 = SELECT COUNT(*) FROM PUBLIC.B_TEST;
> ALTER TABLE PUBLIC.A_TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_7 PRIMARY KEY(A_INT);
> ALTER TABLE PUBLIC.A_TEST ADD CONSTRAINT PUBLIC.DATE_UNIQUE UNIQUE(A_DATE);
> ALTER TABLE PUBLIC.A_TEST ADD CONSTRAINT PUBLIC.DATE_UNIQUE_2 UNIQUE(A_DATE);
> ALTER TABLE PUBLIC.A_TEST ADD CONSTRAINT PUBLIC.MIN_LENGTH CHECK(LENGTH(A_VARCHAR) > 1) NOCHECK;
> ALTER TABLE PUBLIC.B_TEST ADD CONSTRAINT PUBLIC.B_UNIQUE UNIQUE(B_INT);
> ALTER TABLE PUBLIC.B_TEST ADD CONSTRAINT PUBLIC.C3 FOREIGN KEY(B_INT) REFERENCES PUBLIC.A_TEST(A_INT) ON DELETE SET DEFAULT ON UPDATE SET DEFAULT NOCHECK;
> ALTER TABLE PUBLIC.B_TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_7 CHECK(LENGTH(B_VARCHAR) > 1) NOCHECK;
> ALTER TABLE PUBLIC.B_TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_76 CHECK(LENGTH(B_VARCHAR) > 1) NOCHECK;
> ALTER TABLE PUBLIC.B_TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_760 PRIMARY KEY(B_INT);
> CREATE MEMORY TABLE PUBLIC.A_TEST( A_INT INT NOT NULL, A_VARCHAR VARCHAR(255) DEFAULT 'x', A_DATE DATE, A_DECIMAL DECIMAL(10, 2) );
> CREATE MEMORY TABLE PUBLIC.B_TEST( B_INT INT DEFAULT -1 NOT NULL, B_VARCHAR VARCHAR(255) DEFAULT NULL );
> CREATE PRIMARY KEY ON PUBLIC.A_TEST(A_INT);
> CREATE PRIMARY KEY ON PUBLIC.B_TEST(B_INT);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.B_TEST(B_INT, B_VARCHAR) VALUES (-1, 'XX');
> rows: 14
......@@ -7408,10 +7409,10 @@ SCRIPT NOPASSWORDS NOSETTINGS;
> ------------------------------------------------------------------------------
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST2;
> -- 0 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE INDEX PUBLIC.IDX_ID2 ON PUBLIC.TEST2(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255) );
> CREATE MEMORY TABLE PUBLIC.TEST2( ID INT );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> CREATE USER IF NOT EXISTS TEST PASSWORD '';
> CREATE USER IF NOT EXISTS TEST2 PASSWORD '';
......@@ -7586,8 +7587,8 @@ script nopasswords nosettings;
> SCRIPT
> -------------------------------------------------------------------------------------------------------------------------------------------------------------
> -- 1 = SELECT COUNT(*) FROM PUBLIC.TEST;
> ALTER TABLE PUBLIC.TEST ADD CONSTRAINT PUBLIC.CONSTRAINT_2 PRIMARY KEY(ID);
> CREATE MEMORY TABLE PUBLIC.TEST( ID INT NOT NULL, NAME VARCHAR(255) );
> CREATE PRIMARY KEY ON PUBLIC.TEST(ID);
> CREATE USER IF NOT EXISTS SA PASSWORD '' ADMIN;
> INSERT INTO PUBLIC.TEST(ID, NAME) VALUES (2, STRINGDECODE('abcsond\u00e4rzeich\u00e4 \u56ce \u00f6\u00e4\u00fc\u00d6\u00c4\u00dc\u00e9\u00e8\u00e0\u00f1!'));
> rows: 5
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论