content: /*
   * 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 2012-8-13)
   */
  package com.alibaba.cobar.parser.ast.fragment.ddl.datatype;
  
  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.visitor.SQLASTVisitor;
  
  /**
   * <code>spatial data type</code> for MyISAM is not supported
   * 
   * @author <a href="mailto:shuo.qius@alibaba-inc.com">QIU Shuo</a>
   */
  public class DataType implements ASTNode {
      public static enum DataTypeName {
          BIT,
          TINYINT,
          SMALLINT,
          MEDIUMINT,
          INT,
          BIGINT,
          REAL,
          DOUBLE,
          FLOAT,
          DECIMAL,
          DATE,
          TIME,
          TIMESTAMP,
          DATETIME,
          YEAR,
          CHAR,
          VARCHAR,
          BINARY,
          VARBINARY,
          TINYBLOB,
          BLOB,
          MEDIUMBLOB,
          LONGBLOB,
          TINYTEXT,
          TEXT,
          MEDIUMTEXT,
          LONGTEXT,
          ENUM,
          SET
      }
  
      // BIT[(length)]
      // | TINYINT[(length)] [UNSIGNED] [ZEROFILL]
      // | SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
      // | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
      // | INT[(length)] [UNSIGNED] [ZEROFILL]
      // | INTEGER[(length)] [UNSIGNED] [ZEROFILL]
      // | BIGINT[(length)] [UNSIGNED] [ZEROFILL]
      // | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
      // | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
      // | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
      // | DECIMAL[(length[,decimals])] [UNSIGNED] [ZEROFILL]
      // | NUMERIC[(length[,decimals])] [UNSIGNED] [ZEROFILL] 同上
      // | DATE
      // | TIME
      // | TIMESTAMP
      // | DATETIME
      // | YEAR
      // | CHAR[(length)][CHARACTER SET charset_name] [COLLATE collation_name]
      // | VARCHAR(length)[CHARACTER SET charset_name] [COLLATE collation_name]
      // | BINARY[(length)]
      // | VARBINARY(length)
      // | TINYBLOB
      // | BLOB
      // | MEDIUMBLOB
      // | LONGBLOB
      // | TINYTEXT [BINARY][CHARACTER SET charset_name] [COLLATE collation_name]
      // | TEXT [BINARY][CHARACTER SET charset_name] [COLLATE collation_name]
      // | MEDIUMTEXT [BINARY][CHARACTER SET charset_name] [COLLATE
      // collation_name]
      // | LONGTEXT [BINARY][CHARACTER SET charset_name] [COLLATE collation_name]
      // | ENUM(value1,value2,value3,...)[CHARACTER SET charset_name] [COLLATE
      // collation_name]
      // | SET(value1,value2,value3,...)[CHARACTER SET charset_name] [COLLATE
      // collation_name]
      // | spatial_type 不支持
  
      private final DataTypeName typeName;
      private final boolean unsigned;
      private final boolean zerofill;
      /** for text only */
      private final boolean binary;
      private final Expression length;
      private final Expression decimals;
      private final Identifier charSet;
      private final Identifier collation;
      private final List<Expression> collectionVals;
  
      public DataType(DataTypeName typeName, boolean unsigned, boolean zerofill, boolean binary, Expression length,
                      Expression decimals, Identifier charSet, Identifier collation, List<Expression> collectionVals) {
          if (typeName == null)
              throw new IllegalArgumentException("typeName is null");
          this.typeName = typeName;
          this.unsigned = unsigned;
          this.zerofill = zerofill;
          this.binary = binary;
          this.length = length;
          this.decimals = decimals;
          this.charSet = charSet;
          this.collation = collation;
          this.collectionVals = collectionVals;
      }
  
      public DataTypeName getTypeName() {
          return typeName;
      }
  
      public boolean isUnsigned() {
          return unsigned;
      }
  
      public boolean isZerofill() {
          return zerofill;
      }
  
      public boolean isBinary() {
          return binary;
      }
  
      public Expression getLength() {
          return length;
      }
  
      public Expression getDecimals() {
          return decimals;
      }
  
      public Identifier getCharSet() {
          return charSet;
      }
  
      public Identifier getCollation() {
          return collation;
      }
  
      public List<Expression> getCollectionVals() {
          return collectionVals;
      }
  
      @Override
      public void accept(SQLASTVisitor visitor) {
          visitor.visit(this);
      }
  }
  