in HSQL/src/org/hsqldb1/DatabaseScript.java [444:616]
static void getTableDDL(Database database, Table t, int i,
HsqlArrayList forwardFK, boolean useSchema,
StringBuffer a) {
a.append(Token.T_CREATE).append(' ');
if (t.isTemp) {
a.append(Token.T_GLOBAL).append(' ');
a.append(Token.T_TEMPORARY).append(' ');
}
if (t.isText()) {
a.append(Token.T_TEXT).append(' ');
} else if (t.isCached()) {
a.append(Token.T_CACHED).append(' ');
} else {
a.append(Token.T_MEMORY).append(' ');
}
a.append(Token.T_TABLE).append(' ');
if (useSchema) {
a.append(t.getName().schema.statementName).append('.');
}
a.append(t.getName().statementName);
a.append('(');
int columns = t.getColumnCount();
int[] pk = t.getPrimaryKey();
HsqlName pkName = null;
Constraint pkConst = t.getPrimaryConstraint();
if (pkConst != null && !pkConst.getName().isReservedName()) {
pkName = pkConst.getName();
}
for (int j = 0; j < columns; j++) {
Column column = t.getColumn(j);
String colname = column.columnName.statementName;
a.append(colname);
a.append(' ');
String sType = Types.getTypeString(column.getType());
a.append(sType);
// append the size and scale if > 0
boolean hasSize = false;
if (column.getType() == Types.TIMESTAMP) {
if (column.getSize() != 6) {
hasSize = true;
}
} else {
hasSize = column.getSize() > 0;
}
if (hasSize) {
a.append('(');
a.append(column.getSize());
if (column.getScale() > 0) {
a.append(',');
a.append(column.getScale());
}
a.append(')');
}
String defaultString = column.getDefaultDDL();
if (defaultString != null) {
a.append(' ').append(Token.T_DEFAULT).append(' ');
a.append(defaultString);
}
if (j == t.getIdentityColumn()) {
a.append(" GENERATED BY DEFAULT AS IDENTITY(START WITH ");
a.append(column.identityStart);
if (column.identityIncrement != 1) {
a.append(Token.T_COMMA).append(Token.T_INCREMENT).append(
' ').append(Token.T_BY).append(' ');
a.append(column.identityIncrement);
}
a.append(")");
}
if (!column.isNullable()) {
a.append(' ').append(Token.T_NOT).append(' ').append(
Token.T_NULL);
}
if ((pk.length == 1) && (j == pk[0]) && pkName == null) {
a.append(' ').append(Token.T_PRIMARY).append(' ').append(
Token.T_KEY);
}
if (j < columns - 1) {
a.append(',');
}
}
if (pk.length > 1 || (pk.length == 1 && pkName != null)) {
a.append(',');
if (pkName != null) {
a.append(Token.T_CONSTRAINT).append(' ');
a.append(pkName.statementName).append(' ');
}
a.append(Token.T_PRIMARY).append(' ').append(Token.T_KEY);
getColumnList(t, pk, pk.length, a);
}
Constraint[] v = t.getConstraints();
for (int j = 0, vSize = v.length; j < vSize; j++) {
Constraint c = v[j];
switch (c.getType()) {
case Constraint.UNIQUE :
a.append(',').append(Token.T_CONSTRAINT).append(' ');
a.append(c.getName().statementName);
a.append(' ').append(Token.T_UNIQUE);
int[] col = c.getMainColumns();
getColumnList(c.getMain(), col, col.length, a);
break;
case Constraint.FOREIGN_KEY :
// forward referencing FK
Table maintable = c.getMain();
int maintableindex =
database.schemaManager.getTableIndex(maintable);
if (maintableindex > i) {
forwardFK.add(c);
} else {
a.append(',');
getFKStatement(c, a);
}
break;
case Constraint.CHECK :
try {
a.append(',').append(Token.T_CONSTRAINT).append(' ');
a.append(c.getName().statementName);
a.append(' ').append(Token.T_CHECK).append('(');
a.append(c.core.check.getDDL());
a.append(')');
} catch (HsqlException e) {
// should not throw as it is already tested OK
}
break;
}
}
a.append(')');
if (t.onCommitPreserve) {
a.append(' ').append(Token.T_ON).append(' ');
a.append(Token.T_COMMIT).append(' ').append(Token.T_PRESERVE);
a.append(' ').append(Token.T_ROWS);
}
}