/*
* Copyright 1999-2012 Alibaba Group.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* (created at 2011-7-4)
*/
package com.alibaba.cobar.parser.ast.stmt.ddl;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.cobar.parser.ast.ASTNode;
import com.alibaba.cobar.parser.ast.expression.Expression;
import com.alibaba.cobar.parser.ast.expression.primary.Identifier;
import com.alibaba.cobar.parser.ast.fragment.ddl.ColumnDefinition;
import com.alibaba.cobar.parser.ast.fragment.ddl.TableOptions;
import com.alibaba.cobar.parser.ast.fragment.ddl.index.IndexDefinition;
import com.alibaba.cobar.parser.util.Pair;
import com.alibaba.cobar.parser.visitor.SQLASTVisitor;
/**
* NOT FULL AST: partition options, foreign key, ORDER BY not supported
*
* @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a>
*/
public class DDLAlterTableStatement implements DDLStatement {
public static interface AlterSpecification extends ASTNode {
}
// | ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name ]
public static class AddColumn implements AlterSpecification {
private final Identifier columnName;
private final ColumnDefinition columnDefine;
private final boolean first;
private final Identifier afterColumn;
/**
* @param columnName
* @param columnDefine
* @param afterColumn null means fisrt
*/
public AddColumn(Identifier columnName, ColumnDefinition columnDefine, Identifier afterColumn) {
this.columnName = columnName;
this.columnDefine = columnDefine;
this.afterColumn = afterColumn;
this.first = afterColumn == null;
}
/**
* @param columnName
* @param columnDefine
* @param afterColumn null means fisrt
*/
public AddColumn(Identifier columnName, ColumnDefinition columnDefine) {
this.columnName = columnName;
this.columnDefine = columnDefine;
this.afterColumn = null;
this.first = false;
}
public Identifier getColumnName() {
return columnName;
}
public ColumnDefinition getColumnDefine() {
return columnDefine;
}
public boolean isFirst() {
return first;
}
public Identifier getAfterColumn() {
return afterColumn;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD [COLUMN] (col_name column_definition,...)
public static class AddColumns implements AlterSpecification {
private final List<Pair<Identifier, ColumnDefinition>> columns;
public AddColumns() {
this.columns = new ArrayList<Pair<Identifier, ColumnDefinition>>(2);
}
public AddColumns addColumn(Identifier name, ColumnDefinition colDef) {
this.columns.add(new Pair<Identifier, ColumnDefinition>(name, colDef));
return this;
}
public List<Pair<Identifier, ColumnDefinition>> getColumns() {
return columns;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
// [index_option] ...
public static class AddIndex implements AlterSpecification {
private final Identifier indexName;
private final IndexDefinition indexDef;
/**
* @param indexName
* @param indexType
*/
public AddIndex(Identifier indexName, IndexDefinition indexDef) {
this.indexName = indexName;
this.indexDef = indexDef;
}
public Identifier getIndexName() {
return indexName;
}
public IndexDefinition getIndexDef() {
return indexDef;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
// [index_option] ...
public static class AddPrimaryKey implements AlterSpecification {
private final IndexDefinition indexDef;
public AddPrimaryKey(IndexDefinition indexDef) {
this.indexDef = indexDef;
}
public IndexDefinition getIndexDef() {
return indexDef;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY] [index_name] [index_type]
// (index_col_name,...) [index_option] ...
public static class AddUniqueKey implements AlterSpecification {
private final Identifier indexName;
private final IndexDefinition indexDef;
public AddUniqueKey(Identifier indexName, IndexDefinition indexDef) {
this.indexDef = indexDef;
this.indexName = indexName;
}
public Identifier getIndexName() {
return indexName;
}
public IndexDefinition getIndexDef() {
return indexDef;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD FULLTEXT [INDEX|KEY] [index_name] (index_col_name,...)
// [index_option] ...
public static class AddFullTextIndex implements AlterSpecification {
private final Identifier indexName;
private final IndexDefinition indexDef;
public AddFullTextIndex(Identifier indexName, IndexDefinition indexDef) {
this.indexDef = indexDef;
this.indexName = indexName;
}
public Identifier getIndexName() {
return indexName;
}
public IndexDefinition getIndexDef() {
return indexDef;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ADD SPATIAL [INDEX|KEY] [index_name] (index_col_name,...)
// [index_option] ...
public static class AddSpatialIndex implements AlterSpecification {
private final Identifier indexName;
private final IndexDefinition indexDef;
public AddSpatialIndex(Identifier indexName, IndexDefinition indexDef) {
this.indexDef = indexDef;
this.indexName = indexName;
}
public Identifier getIndexName() {
return indexName;
}
public IndexDefinition getIndexDef() {
return indexDef;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
public static class AlterColumnDefaultVal implements AlterSpecification {
private final Identifier columnName;
private final Expression defaultValue;
private final boolean dropDefault;
/**
* @param columnName
* @param defaultValue
*/
public AlterColumnDefaultVal(Identifier columnName, Expression defaultValue) {
this.columnName = columnName;
this.defaultValue = defaultValue;
this.dropDefault = false;
}
/**
* DROP DEFAULT
*
* @param columnName
*/
public AlterColumnDefaultVal(Identifier columnName) {
this.columnName = columnName;
this.defaultValue = null;
this.dropDefault = true;
}
public Identifier getColumnName() {
return columnName;
}
public Expression getDefaultValue() {
return defaultValue;
}
public boolean isDropDefault() {
return dropDefault;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | CHANGE [COLUMN] old_col_name new_col_name column_definition
// [FIRST|AFTER col_name]
public static class ChangeColumn implements AlterSpecification {
private final Identifier oldName;
private final Identifier newName;
private final ColumnDefinition colDef;
private final boolean first;
private final Identifier afterColumn;
public ChangeColumn(Identifier oldName, Identifier newName, ColumnDefinition colDef, Identifier afterColumn) {
this.oldName = oldName;
this.newName = newName;
this.colDef = colDef;
this.first = afterColumn == null;
this.afterColumn = afterColumn;
}
/**
* without column position specification
*/
public ChangeColumn(Identifier oldName, Identifier newName, ColumnDefinition colDef) {
this.oldName = oldName;
this.newName = newName;
this.colDef = colDef;
this.first = false;
this.afterColumn = null;
}
public Identifier getOldName() {
return oldName;
}
public Identifier getNewName() {
return newName;
}
public ColumnDefinition getColDef() {
return colDef;
}
public boolean isFirst() {
return first;
}
public Identifier getAfterColumn() {
return afterColumn;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name]
public static class ModifyColumn implements AlterSpecification {
private final Identifier colName;
private final ColumnDefinition colDef;
private final boolean first;
private final Identifier afterColumn;
public ModifyColumn(Identifier colName, ColumnDefinition colDef, Identifier afterColumn) {
this.colName = colName;
this.colDef = colDef;
this.first = afterColumn == null;
this.afterColumn = afterColumn;
}
/**
* without column position specification
*/
public ModifyColumn(Identifier colName, ColumnDefinition colDef) {
this.colName = colName;
this.colDef = colDef;
this.first = false;
this.afterColumn = null;
}
public Identifier getColName() {
return colName;
}
public ColumnDefinition getColDef() {
return colDef;
}
public boolean isFirst() {
return first;
}
public Identifier getAfterColumn() {
return afterColumn;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | DROP [COLUMN] col_name
public static class DropColumn implements AlterSpecification {
private final Identifier colName;
public DropColumn(Identifier colName) {
this.colName = colName;
}
public Identifier getColName() {
return colName;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | DROP PRIMARY KEY
public static class DropPrimaryKey implements AlterSpecification {
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | DROP {INDEX|KEY} index_name
public static class DropIndex implements AlterSpecification {
private final Identifier indexName;
public DropIndex(Identifier indexName) {
this.indexName = indexName;
}
public Identifier getIndexName() {
return indexName;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}
// | DISABLE KEYS
// | ENABLE KEYS
// | RENAME [TO] new_tbl_name
// | ORDER BY col_name [, col_name] ...
// | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
// | DISCARD TABLESPACE
// | IMPORT TABLESPACE
// /// | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name]
// (index_col_name,...) reference_definition
// /// | DROP FOREIGN KEY fk_symbol
// /// | ADD PARTITION (partition_definition)
// /// | DROP PARTITION partition_names
// /// | TRUNCATE PARTITION {partition_names | ALL }
// /// | COALESCE PARTITION number
// /// | REORGANIZE PARTITION partition_names INTO (partition_definitions)
// /// | ANALYZE PARTITION {partition_names | ALL }
// /// | CHECK PARTITION {partition_names | ALL }
// /// | OPTIMIZE PARTITION {partition_names | ALL }
// /// | REBUILD PARTITION {partition_names | ALL }
// /// | REPAIR PARTITION {partition_names | ALL }
// /// | REMOVE PARTITIONING
// ADD, ALTER, DROP, and CHANGE can be multiple
private final boolean ignore;
private final Identifier table;
private TableOptions tableOptions;
private final List<AlterSpecification> alters;
private boolean disableKeys;
private boolean enableKeys;
private boolean discardTableSpace;
private boolean importTableSpace;
private Identifier renameTo;
/** charsetName -> collate */
private Pair<Identifier, Identifier> convertCharset;
public DDLAlterTableStatement(boolean ignore, Identifier table) {
this.ignore = ignore;
this.table = table;
this.alters = new ArrayList<DDLAlterTableStatement.AlterSpecification>(1);
}
public DDLAlterTableStatement addAlterSpecification(AlterSpecification alter) {
alters.add(alter);
return this;
}
public boolean isDisableKeys() {
return disableKeys;
}
public void setDisableKeys(boolean disableKeys) {
this.disableKeys = disableKeys;
}
public boolean isEnableKeys() {
return enableKeys;
}
public void setEnableKeys(boolean enableKeys) {
this.enableKeys = enableKeys;
}
public boolean isDiscardTableSpace() {
return discardTableSpace;
}
public void setDiscardTableSpace(boolean discardTableSpace) {
this.discardTableSpace = discardTableSpace;
}
public boolean isImportTableSpace() {
return importTableSpace;
}
public void setImportTableSpace(boolean importTableSpace) {
this.importTableSpace = importTableSpace;
}
public Identifier getRenameTo() {
return renameTo;
}
public void setRenameTo(Identifier renameTo) {
this.renameTo = renameTo;
}
public Pair<Identifier, Identifier> getConvertCharset() {
return convertCharset;
}
public void setConvertCharset(Pair<Identifier, Identifier> convertCharset) {
this.convertCharset = convertCharset;
}
public List<AlterSpecification> getAlters() {
return alters;
}
public void setTableOptions(TableOptions tableOptions) {
this.tableOptions = tableOptions;
}
public TableOptions getTableOptions() {
return tableOptions;
}
public boolean isIgnore() {
return ignore;
}
public Identifier getTable() {
return table;
}
@Override
public void accept(SQLASTVisitor visitor) {
visitor.visit(this);
}
}