use of io.dingodb.common.table.ColumnDefinition in project dingo by dingodb.
the class DingoDdlExecutor method execute.
@SuppressWarnings({ "unused", "MethodMayBeStatic" })
public void execute(SqlCreateTable create, CalcitePrepare.Context context) {
log.info("DDL execute: {}", create);
final String tableName = getTableName(create.name, context);
TableDefinition td = new TableDefinition(tableName);
List<String> keyList = null;
SqlNodeList columnList = create.columnList;
if (columnList == null) {
throw SqlUtil.newContextException(create.name.getParserPosition(), RESOURCE.createTableRequiresColumnList());
}
for (SqlNode sqlNode : create.columnList) {
if (sqlNode instanceof SqlKeyConstraint) {
SqlKeyConstraint constraint = (SqlKeyConstraint) sqlNode;
if (constraint.getOperator().getKind() == SqlKind.PRIMARY_KEY) {
// The 0th element is the name of the constraint
keyList = ((SqlNodeList) constraint.getOperandList().get(1)).getList().stream().map(t -> ((SqlIdentifier) Objects.requireNonNull(t)).getSimple()).collect(Collectors.toList());
break;
}
}
}
SqlValidator validator = new ContextSqlValidator(context, true);
for (SqlNode sqlNode : create.columnList) {
if (sqlNode.getKind() == SqlKind.COLUMN_DECL) {
SqlColumnDeclaration scd = (SqlColumnDeclaration) sqlNode;
ColumnDefinition cd = fromSqlColumnDeclaration(scd, validator, keyList);
td.addColumn(cd);
}
}
if (td.getColumns().stream().noneMatch(ColumnDefinition::isPrimary)) {
throw new RuntimeException("Not have primary key!");
}
final MutableSchema schema = getSchema(context);
if (schema.getTable(tableName) != null) {
if (!create.ifNotExists) {
// They did not specify IF NOT EXISTS, so give error.
throw SqlUtil.newContextException(create.name.getParserPosition(), RESOURCE.tableExists(tableName));
}
}
schema.createTable(tableName, td);
}
Aggregations