SchemaTable.java

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.

package org.apache.doris.catalog;

import org.apache.doris.analysis.SchemaTableType;
import org.apache.doris.common.SystemIdGenerator;
import org.apache.doris.thrift.TSchemaTable;
import org.apache.doris.thrift.TTableDescriptor;
import org.apache.doris.thrift.TTableType;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * Doris's representation of MySQL information schema table metadata.
 */
public class SchemaTable extends Table {
    private static final int FN_REFLEN = 512;
    private static final int NAME_CHAR_LEN = 64;
    private static final int MY_CS_NAME_SIZE = 32;
    private static final int GRANTEE_len = 81;
    private static final int PRIVILEGE_TYPE_LEN = 64;
    private static final int IS_GRANTABLE_LEN = 3;

    // Now we just mock tables, table_privileges, referential_constraints, key_column_usage and routines table
    // Because in MySQL ODBC, these tables are used.
    // TODO(zhaochun): Review some commercial BI to check if we need support where clause in show statement
    // like 'show table where_clause'. If we decide to support it, we must mock these related table here.
    public static Map<String, Table> TABLE_MAP = ImmutableMap.<String, Table>builder().put("tables",
                    new SchemaTable(SystemIdGenerator.getNextId(), "tables", TableType.SCHEMA,
                            builder().column("TABLE_CATALOG", ScalarType.createVarchar(FN_REFLEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_TYPE", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("ENGINE", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("ROW_FORMAT", ScalarType.createVarchar(10))
                                    .column("TABLE_ROWS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("AVG_ROW_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DATA_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("MAX_DATA_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("INDEX_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DATA_FREE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("AUTO_INCREMENT", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CREATE_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("UPDATE_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("CHECK_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("TABLE_COLLATION", ScalarType.createVarchar(MY_CS_NAME_SIZE))
                                    .column("CHECKSUM", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CREATE_OPTIONS", ScalarType.createVarchar(255))
                                    .column("TABLE_COMMENT", ScalarType.createVarchar(2048)).build()))
            .put("table_privileges",
                    new SchemaTable(SystemIdGenerator.getNextId(), "table_privileges", TableType.SCHEMA,
                            builder().column("GRANTEE", ScalarType.createVarchar(GRANTEE_len))
                                    .column("TABLE_CATALOG", ScalarType.createVarchar(FN_REFLEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("PRIVILEGE_TYPE", ScalarType.createVarchar(PRIVILEGE_TYPE_LEN))
                                    .column("IS_GRANTABLE", ScalarType.createVarchar(IS_GRANTABLE_LEN)).build()))
            .put("schema_privileges",
                    new SchemaTable(SystemIdGenerator.getNextId(), "schema_privileges", TableType.SCHEMA,
                            builder().column("GRANTEE", ScalarType.createVarchar(GRANTEE_len))
                                    .column("TABLE_CATALOG", ScalarType.createVarchar(FN_REFLEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("PRIVILEGE_TYPE", ScalarType.createVarchar(PRIVILEGE_TYPE_LEN))
                                    .column("IS_GRANTABLE", ScalarType.createVarchar(IS_GRANTABLE_LEN)).build()))
            .put("user_privileges", new SchemaTable(SystemIdGenerator.getNextId(), "user_privileges", TableType.SCHEMA,
                    builder().column("GRANTEE", ScalarType.createVarchar(GRANTEE_len))
                            .column("TABLE_CATALOG", ScalarType.createVarchar(FN_REFLEN))
                            .column("PRIVILEGE_TYPE", ScalarType.createVarchar(PRIVILEGE_TYPE_LEN))
                            .column("IS_GRANTABLE", ScalarType.createVarchar(IS_GRANTABLE_LEN)).build()))
            .put("referential_constraints",
                    new SchemaTable(SystemIdGenerator.getNextId(), "referential_constraints", TableType.SCHEMA,
                            builder().column("CONSTRAINT_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("CONSTRAINT_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("CONSTRAINT_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("UNIQUE_CONSTRAINT_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("UNIQUE_CONSTRAINT_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("UNIQUE_CONSTRAINT_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("MATCH_OPTION", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("UPDATE_RULE", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("DELETE_RULE", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("REFERENCED_TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN)).build()))
            .put("key_column_usage",
                    new SchemaTable(SystemIdGenerator.getNextId(), "key_column_usage", TableType.SCHEMA,
                            builder().column("CONSTRAINT_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("CONSTRAINT_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("CONSTRAINT_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("COLUMN_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("ORDINAL_POSITION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("POSITION_IN_UNIQUE_CONSTRAINT",
                                            ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("REFERENCED_TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("REFERENCED_TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("REFERENCED_COLUMN_NAME", ScalarType.createVarchar(64)).build()))
            .put("routines", new SchemaTable(SystemIdGenerator.getNextId(), "routines", TableType.SCHEMA,
                    builder().column("SPECIFIC_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_TYPE", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("DTD_IDENTIFIER", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_BODY", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_DEFINITION", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("EXTERNAL_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("EXTERNAL_LANGUAGE", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("PARAMETER_STYLE", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("IS_DETERMINISTIC", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("SQL_DATA_ACCESS", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("SQL_PATH", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("SECURITY_TYPE", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("CREATED", ScalarType.createType(PrimitiveType.DATETIME))
                            .column("LAST_ALTERED", ScalarType.createType(PrimitiveType.DATETIME))
                            .column("SQL_MODE", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("ROUTINE_COMMENT", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("DEFINER", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("CHARACTER_SET_CLIENT", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("COLLATION_CONNECTION", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("DATABASE_COLLATION", ScalarType.createVarchar(NAME_CHAR_LEN)).build()))
            .put("schemata", new SchemaTable(SystemIdGenerator.getNextId(), "schemata", TableType.SCHEMA,
                    builder().column("CATALOG_NAME", ScalarType.createVarchar(512))
                            .column("SCHEMA_NAME", ScalarType.createVarchar(32))
                            .column("DEFAULT_CHARACTER_SET_NAME", ScalarType.createVarchar(32))
                            .column("DEFAULT_COLLATION_NAME", ScalarType.createVarchar(32))
                            .column("SQL_PATH", ScalarType.createVarchar(512))
                            .column("DEFAULT_ENCRYPTION", ScalarType.createVarchar(3)).build()))
            .put("session_variables",
                    new SchemaTable(SystemIdGenerator.getNextId(), "session_variables", TableType.SCHEMA,
                            builder().column("VARIABLE_NAME", ScalarType.createVarchar(64))
                                    .column("VARIABLE_VALUE", ScalarType.createVarchar(1024))
                                    .column("DEFAULT_VALUE", ScalarType.createVarchar(1024))
                                    .column("CHANGED", ScalarType.createVarchar(4))
                                    .build()))
            .put("global_variables",
                    new SchemaTable(SystemIdGenerator.getNextId(), "global_variables", TableType.SCHEMA,
                            builder().column("VARIABLE_NAME", ScalarType.createVarchar(64))
                                    .column("VARIABLE_VALUE", ScalarType.createVarchar(1024))
                                    .column("DEFAULT_VALUE", ScalarType.createVarchar(1024))
                                    .column("CHANGED", ScalarType.createVarchar(4)).build()))
            .put("columns",
                    new SchemaTable(SystemIdGenerator.getNextId(), "columns", TableType.SCHEMA,
                            builder().column("TABLE_CATALOG", ScalarType.createVarchar(512))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("COLUMN_NAME", ScalarType.createVarchar(64))
                                    .column("ORDINAL_POSITION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("COLUMN_DEFAULT", ScalarType.createVarchar(1024))
                                    .column("IS_NULLABLE", ScalarType.createVarchar(3))
                                    .column("DATA_TYPE", ScalarType.createVarchar(64))
                                    .column("CHARACTER_MAXIMUM_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CHARACTER_OCTET_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("NUMERIC_PRECISION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("NUMERIC_SCALE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DATETIME_PRECISION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CHARACTER_SET_NAME", ScalarType.createVarchar(32))
                                    .column("COLLATION_NAME", ScalarType.createVarchar(32))
                                    .column("COLUMN_TYPE", ScalarType.createVarchar(32))
                                    .column("COLUMN_KEY", ScalarType.createVarchar(3))
                                    .column("EXTRA", ScalarType.createVarchar(27))
                                    .column("PRIVILEGES", ScalarType.createVarchar(80))
                                    .column("COLUMN_COMMENT", ScalarType.createVarchar(1024))
                                    .column("COLUMN_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DECIMAL_DIGITS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("GENERATION_EXPRESSION", ScalarType.createVarchar(64))
                                    .column("SRS_ID", ScalarType.createType(PrimitiveType.BIGINT)).build()))
            .put("character_sets", new SchemaTable(SystemIdGenerator.getNextId(), "character_sets", TableType.SCHEMA,
                    builder().column("CHARACTER_SET_NAME", ScalarType.createVarchar(512))
                            .column("DEFAULT_COLLATE_NAME", ScalarType.createVarchar(64))
                            .column("DESCRIPTION", ScalarType.createVarchar(64))
                            .column("MAXLEN", ScalarType.createType(PrimitiveType.BIGINT)).build()))
            .put("collations",
                    new SchemaTable(SystemIdGenerator.getNextId(), "collations", TableType.SCHEMA,
                            builder().column("COLLATION_NAME", ScalarType.createVarchar(512))
                                    .column("CHARACTER_SET_NAME", ScalarType.createVarchar(64))
                                    .column("ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("IS_DEFAULT", ScalarType.createVarchar(64))
                                    .column("IS_COMPILED", ScalarType.createVarchar(64))
                                    .column("SORTLEN", ScalarType.createType(PrimitiveType.BIGINT)).build()))
            .put("table_constraints",
                    new SchemaTable(SystemIdGenerator.getNextId(), "table_constraints", TableType.SCHEMA,
                            builder().column("CONSTRAINT_CATALOG", ScalarType.createVarchar(512))
                                    .column("CONSTRAINT_SCHEMA", ScalarType.createVarchar(64))
                                    .column("CONSTRAINT_NAME", ScalarType.createVarchar(64))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("CONSTRAINT_TYPE", ScalarType.createVarchar(64)).build()))
            .put("engines",
                    new SchemaTable(SystemIdGenerator.getNextId(), "engines", TableType.SCHEMA,
                            builder().column("ENGINE", ScalarType.createVarchar(64))
                                    .column("SUPPORT", ScalarType.createVarchar(8))
                                    .column("COMMENT", ScalarType.createVarchar(80))
                                    .column("TRANSACTIONS", ScalarType.createVarchar(3))
                                    .column("XA", ScalarType.createVarchar(3))
                                    .column("SAVEPOINTS", ScalarType.createVarchar(3)).build()))
            .put("views",
                    new SchemaTable(SystemIdGenerator.getNextId(), "views", TableType.SCHEMA,
                            builder().column("TABLE_CATALOG", ScalarType.createVarchar(512))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("VIEW_DEFINITION", ScalarType.createVarchar(8096))
                                    .column("CHECK_OPTION", ScalarType.createVarchar(8))
                                    .column("IS_UPDATABLE", ScalarType.createVarchar(3))
                                    .column("DEFINER", ScalarType.createVarchar(77))
                                    .column("SECURITY_TYPE", ScalarType.createVarchar(7))
                                    .column("CHARACTER_SET_CLIENT", ScalarType.createVarchar(32))
                                    .column("COLLATION_CONNECTION", ScalarType.createVarchar(32)).build()))
            // statistics is table provides information about table indexes in mysql: 5.7
            .put("statistics", new SchemaTable(SystemIdGenerator.getNextId(), "statistics", TableType.SCHEMA,
                    builder().column("TABLE_CATALOG", ScalarType.createVarchar(512))
                            .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                            .column("TABLE_NAME", ScalarType.createVarchar(64))
                            .column("NON_UNIQUE", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("INDEX_SCHEMA", ScalarType.createVarchar(64))
                            .column("INDEX_NAME", ScalarType.createVarchar(64))
                            .column("SEQ_IN_INDEX", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("COLUMN_NAME", ScalarType.createVarchar(64))
                            .column("COLLATION", ScalarType.createVarchar(1))
                            .column("CARDINALITY", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("SUB_PART", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("PACKED", ScalarType.createVarchar(10))
                            .column("NULLABLE", ScalarType.createVarchar(3))
                            .column("INDEX_TYPE", ScalarType.createVarchar(16))
                            .column("COMMENT", ScalarType.createVarchar(16))
                            // for datagrip
                            .column("INDEX_COMMENT", ScalarType.createVarchar(1024)).build()))
            // Compatible with mysql for mysqldump
            .put("column_statistics",
                    new SchemaTable(SystemIdGenerator.getNextId(), "column_statistics", TableType.SCHEMA,
                            builder().column("SCHEMA_NAME", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("COLUMN_NAME", ScalarType.createVarchar(64))
                                    .column("HISTOGRAM", ScalarType.createJsonbType()).build()))
            .put("files",
                    new SchemaTable(SystemIdGenerator.getNextId(), "files", TableType.SCHEMA,
                            builder().column("FILE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("FILE_NAME", ScalarType.createStringType())
                                    .column("FILE_TYPE", ScalarType.createVarchar(256))
                                    .column("TABLESPACE_NAME", ScalarType.createVarchar(256))
                                    .column("TABLE_CATALOG", ScalarType.createCharType(16))
                                    .column("TABLE_SCHEMA", ScalarType.createStringType())
                                    .column("TABLE_NAME", ScalarType.createStringType())
                                    .column("LOGFILE_GROUP_NAME", ScalarType.createVarchar(256))
                                    .column("LOGFILE_GROUP_NUMBER", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("ENGINE", ScalarType.createVarchar(64))
                                    .column("FULLTEXT_KEYS", ScalarType.createStringType())
                                    .column("DELETED_ROWS", ScalarType.createStringType())
                                    .column("UPDATE_COUNT", ScalarType.createStringType())
                                    .column("FREE_EXTENTS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("TOTAL_EXTENTS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("EXTENT_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("INITIAL_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("MAXIMUM_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("AUTOEXTEND_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CREATION_TIME", ScalarType.createStringType())
                                    .column("LAST_UPDATE_TIME", ScalarType.createStringType())
                                    .column("LAST_ACCESS_TIME", ScalarType.createStringType())
                                    .column("RECOVER_TIME", ScalarType.createStringType())
                                    .column("TRANSACTION_COUNTER", ScalarType.createStringType())
                                    .column("VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("ROW_FORMAT", ScalarType.createVarchar(256))
                                    .column("TABLE_ROWS", ScalarType.createStringType())
                                    .column("AVG_ROW_LENGTH", ScalarType.createStringType())
                                    .column("DATA_LENGTH", ScalarType.createStringType())
                                    .column("MAX_DATA_LENGTH", ScalarType.createStringType())
                                    .column("INDEX_LENGTH", ScalarType.createStringType())
                                    .column("DATA_FREE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CREATE_TIME", ScalarType.createStringType())
                                    .column("UPDATE_TIME", ScalarType.createStringType())
                                    .column("CHECK_TIME", ScalarType.createStringType())
                                    .column("CHECKSUM", ScalarType.createStringType())
                                    .column("STATUS", ScalarType.createVarchar(256))
                                    .column("EXTRA", ScalarType.createVarchar(256)).build()))
            .put("partitions",
                    new SchemaTable(SystemIdGenerator.getNextId(), "partitions", TableType.SCHEMA,
                            builder().column("PARTITION_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("TABLE_CATALOG", ScalarType.createVarchar(64))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("PARTITION_NAME", ScalarType.createVarchar(64))
                                    .column("SUBPARTITION_NAME", ScalarType.createVarchar(64))
                                    .column("PARTITION_ORDINAL_POSITION", ScalarType.createType(PrimitiveType.INT))
                                    .column("SUBPARTITION_ORDINAL_POSITION",
                                            ScalarType.createType(PrimitiveType.INT))
                                    .column("PARTITION_METHOD", ScalarType.createVarchar(13))
                                    .column("SUBPARTITION_METHOD", ScalarType.createVarchar(13))
                                    .column("PARTITION_EXPRESSION", ScalarType.createVarchar(2048))
                                    .column("SUBPARTITION_EXPRESSION", ScalarType.createVarchar(2048))
                                    .column("PARTITION_DESCRIPTION", ScalarType.createStringType())
                                    .column("TABLE_ROWS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("AVG_ROW_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DATA_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("MAX_DATA_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("INDEX_LENGTH", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("DATA_FREE", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CREATE_TIME", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("UPDATE_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("CHECK_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("CHECKSUM", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("PARTITION_COMMENT", ScalarType.createStringType())
                                    .column("NODEGROUP", ScalarType.createVarchar(256))
                                    .column("TABLESPACE_NAME", ScalarType.createVarchar(268))
                                    .column("DATA_SIZE", ScalarType.createStringType())
                                    .column("STATE", ScalarType.createStringType())
                                    .column("REPLICA_ALLOCATION", ScalarType.createStringType())
                                    .column("REPLICA_NUM", ScalarType.createType(PrimitiveType.INT))
                                    .column("STORAGE_POLICY", ScalarType.createStringType())
                                    .column("STORAGE_MEDIUM", ScalarType.createStringType())
                                    .column("COOLDOWN_TIME_MS", ScalarType.createStringType())
                                    .column("LAST_CONSISTENCY_CHECK_TIME", ScalarType.createStringType())
                                    .column("BUCKET_NUM", ScalarType.createType(PrimitiveType.INT))
                                    .column("COMMITTED_VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("VISIBLE_VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("PARTITION_KEY", ScalarType.createStringType())
                                    .column("RANGE", ScalarType.createStringType())
                                    .column("DISTRIBUTION", ScalarType.createStringType())
                                    .build()))
            // Compatible with Datagrip
            .put("column_privileges",
                    new SchemaTable(SystemIdGenerator.getNextId(), "column_privileges", TableType.SCHEMA,
                            builder().column("GRANTEE", ScalarType.createVarchar(128))
                                    .column("TABLE_CATALOG", ScalarType.createVarchar(512))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TABLE_NAME", ScalarType.createVarchar(64))
                                    .column("COLUMN_NAME", ScalarType.createVarchar(64))
                                    .column("PRIVILEGE_TYPE", ScalarType.createVarchar(64))
                                    .column("IS_GRANTABLE", ScalarType.createVarchar(3)).build()))
            // Compatible with Datagrip
            .put("triggers",
                    new SchemaTable(SystemIdGenerator.getNextId(), "triggers", TableType.SCHEMA,
                            builder().column("TRIGGER_CATALOG", ScalarType.createVarchar(512))
                                    .column("TRIGGER_SCHEMA", ScalarType.createVarchar(64))
                                    .column("TRIGGER_NAME", ScalarType.createVarchar(64))
                                    .column("EVENT_MANIPULATION", ScalarType.createVarchar(6))
                                    .column("EVENT_OBJECT_CATALOG", ScalarType.createVarchar(512))
                                    .column("EVENT_OBJECT_SCHEMA", ScalarType.createVarchar(64))
                                    .column("EVENT_OBJECT_TABLE", ScalarType.createVarchar(64))
                                    .column("ACTION_ORDER", ScalarType.createVarchar(4))
                                    .column("ACTION_CONDITION", ScalarType.createVarchar(512))
                                    .column("ACTION_STATEMENT", ScalarType.createVarchar(512))
                                    .column("ACTION_ORIENTATION", ScalarType.createVarchar(9))
                                    .column("ACTION_TIMING", ScalarType.createVarchar(6))
                                    .column("ACTION_REFERENCE_OLD_TABLE", ScalarType.createVarchar(64))
                                    .column("ACTION_REFERENCE_NEW_TABLE", ScalarType.createVarchar(64))
                                    .column("ACTION_REFERENCE_OLD_ROW", ScalarType.createVarchar(3))
                                    .column("ACTION_REFERENCE_NEW_ROW", ScalarType.createVarchar(3))
                                    .column("CREATED", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("SQL_MODE", ScalarType.createVarchar(8192))
                                    .column("DEFINER", ScalarType.createVarchar(77))
                                    .column("CHARACTER_SET_CLIENT", ScalarType.createVarchar(32))
                                    .column("COLLATION_CONNECTION", ScalarType.createVarchar(32))
                                    .column("DATABASE_COLLATION", ScalarType.createVarchar(32)).build()))
            // Compatible with Datagrip
            .put("events",
                    new SchemaTable(SystemIdGenerator.getNextId(), "events", TableType.SCHEMA,
                            builder().column("EVENT_CATALOG", ScalarType.createVarchar(64))
                                    .column("EVENT_SCHEMA", ScalarType.createVarchar(64))
                                    .column("EVENT_NAME", ScalarType.createVarchar(64))
                                    .column("DEFINER", ScalarType.createVarchar(77))
                                    .column("TIME_ZONE", ScalarType.createVarchar(64))
                                    .column("EVENT_BODY", ScalarType.createVarchar(8))
                                    .column("EVENT_DEFINITION", ScalarType.createVarchar(512))
                                    .column("EVENT_TYPE", ScalarType.createVarchar(9))
                                    .column("EXECUTE_AT", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("INTERVAL_VALUE", ScalarType.createVarchar(256))
                                    .column("INTERVAL_FIELD", ScalarType.createVarchar(18))
                                    .column("SQL_MODE", ScalarType.createVarchar(8192))
                                    .column("STARTS", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("ENDS", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("STATUS", ScalarType.createVarchar(18))
                                    .column("ON_COMPLETION", ScalarType.createVarchar(12))
                                    .column("CREATED", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("LAST_ALTERED", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("LAST_EXECUTED", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("EVENT_COMMENT", ScalarType.createVarchar(64))
                                    .column("ORIGINATOR", ScalarType.createType(PrimitiveType.INT))
                                    .column("CHARACTER_SET_CLIENT", ScalarType.createVarchar(32))
                                    .column("COLLATION_CONNECTION", ScalarType.createVarchar(32))
                                    .column("DATABASE_COLLATION", ScalarType.createVarchar(32)).build()))
            .put("rowsets", new SchemaTable(SystemIdGenerator.getNextId(), "rowsets", TableType.SCHEMA,
                    builder().column("BACKEND_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("ROWSET_ID", ScalarType.createVarchar(64))
                            .column("TABLET_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("ROWSET_NUM_ROWS", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("TXN_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("NUM_SEGMENTS", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("START_VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("END_VERSION", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("INDEX_DISK_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("DATA_DISK_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("CREATION_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                            .column("NEWEST_WRITE_TIMESTAMP", ScalarType.createType(PrimitiveType.DATETIME))
                            .column("SCHEMA_VERSION", ScalarType.createType(PrimitiveType.INT))
                            .build()))
            .put("parameters", new SchemaTable(SystemIdGenerator.getNextId(), "parameters", TableType.SCHEMA,
                    builder().column("SPECIFIC_CATALOG", ScalarType.createVarchar(64))
                            .column("SPECIFIC_SCHEMA", ScalarType.createVarchar(64))
                            .column("SPECIFIC_NAME", ScalarType.createVarchar(64))
                            .column("ORDINAL_POSITION", ScalarType.createVarchar(77))
                            .column("PARAMETER_MODE", ScalarType.createVarchar(77))
                            .column("PARAMETER_NAME", ScalarType.createVarchar(77))
                            .column("DATA_TYPE", ScalarType.createVarchar(64))
                            .column("CHARACTER_OCTET_LENGTH", ScalarType.createVarchar(64))
                            .column("NUMERIC_PRECISION", ScalarType.createVarchar(512))
                            .column("NUMERIC_SCALE", ScalarType.createVarchar(64))
                            .column("DATETIME_PRECISION", ScalarType.createVarchar(64))
                            .column("CHARACTER_SET_NAME", ScalarType.createVarchar(256))
                            .column("COLLATION_NAME", ScalarType.createVarchar(64))
                            .column("DTD_IDENTIFIER", ScalarType.createVarchar(64))
                            .column("ROUTINE_TYPE", ScalarType.createVarchar(64))
                            .column("DATA_TYPEDTD_IDENDS", ScalarType.createVarchar(64))
                            .build()))
            .put("metadata_name_ids", new SchemaTable(SystemIdGenerator.getNextId(),
                    "metadata_name_ids", TableType.SCHEMA,
                    builder().column("CATALOG_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("CATALOG_NAME", ScalarType.createVarchar(FN_REFLEN))
                            .column("DATABASE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("DATABASE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .column("TABLE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                            .build()))
            .put("profiling", new SchemaTable(SystemIdGenerator.getNextId(), "profiling", TableType.SCHEMA,
                    builder().column("QUERY_ID", ScalarType.createType(PrimitiveType.INT))
                            .column("SEQ", ScalarType.createType(PrimitiveType.INT))
                            .column("STATE", ScalarType.createVarchar(30))
                            .column("DURATION", ScalarType.createType(PrimitiveType.DOUBLE))
                            .column("CPU_USER", ScalarType.createType(PrimitiveType.DOUBLE))
                            .column("CPU_SYSTEM", ScalarType.createType(PrimitiveType.DOUBLE))
                            .column("CONTEXT_VOLUNTARY", ScalarType.createType(PrimitiveType.INT))
                            .column("CONTEXT_INVOLUNTARY", ScalarType.createType(PrimitiveType.INT))
                            .column("BLOCK_OPS_IN", ScalarType.createType(PrimitiveType.INT))
                            .column("BLOCK_OPS_OUT", ScalarType.createType(PrimitiveType.INT))
                            .column("MESSAGES_SENT", ScalarType.createType(PrimitiveType.INT))
                            .column("MESSAGES_RECEIVED", ScalarType.createType(PrimitiveType.INT))
                            .column("PAGE_FAULTS_MAJOR", ScalarType.createType(PrimitiveType.INT))
                            .column("PAGE_FAULTS_MINOR", ScalarType.createType(PrimitiveType.INT))
                            .column("SWAPS", ScalarType.createType(PrimitiveType.INT))
                            .column("SOURCE_FUNCTION", ScalarType.createVarchar(30))
                            .column("SOURCE_FILE", ScalarType.createVarchar(20))
                            .column("SOURCE_LINE", ScalarType.createType(PrimitiveType.INT))
                            .build()))
            .put("backend_active_tasks",
                    new SchemaTable(SystemIdGenerator.getNextId(), "backend_active_tasks", TableType.SCHEMA,
                            builder().column("BE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("FE_HOST", ScalarType.createVarchar(256))
                                    .column("WORKLOAD_GROUP_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("QUERY_ID", ScalarType.createVarchar(256))
                                    .column("TASK_TIME_MS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("TASK_CPU_TIME_MS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("SCAN_ROWS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("SCAN_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("BE_PEAK_MEMORY_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CURRENT_USED_MEMORY_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("SHUFFLE_SEND_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("SHUFFLE_SEND_ROWS", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("QUERY_TYPE",  ScalarType.createVarchar(256))
                                    .column("SPILL_WRITE_BYTES_TO_LOCAL_STORAGE",
                                            ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("SPILL_READ_BYTES_FROM_LOCAL_STORAGE",
                                            ScalarType.createType(PrimitiveType.BIGINT))
                                    .build()))
            .put("active_queries", new SchemaTable(SystemIdGenerator.getNextId(), "active_queries", TableType.SCHEMA,
                    builder().column("QUERY_ID", ScalarType.createVarchar(256))
                            .column("QUERY_START_TIME", ScalarType.createVarchar(256))
                            .column("QUERY_TIME_MS", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("WORKLOAD_GROUP_ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("DATABASE", ScalarType.createVarchar(256))
                            .column("FRONTEND_INSTANCE", ScalarType.createVarchar(256))
                            .column("QUEUE_START_TIME", ScalarType.createVarchar(256))
                            .column("QUEUE_END_TIME", ScalarType.createVarchar(256))
                            .column("QUERY_STATUS", ScalarType.createVarchar(256))
                            .column("SQL", ScalarType.createStringType())
                            .build()))
            .put("workload_groups", new SchemaTable(SystemIdGenerator.getNextId(), "workload_groups", TableType.SCHEMA,
                    builder().column("ID", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("NAME", ScalarType.createVarchar(256))
                            .column("CPU_SHARE", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("MEMORY_LIMIT", ScalarType.createVarchar(256))
                            .column("ENABLE_MEMORY_OVERCOMMIT", ScalarType.createVarchar(256))
                            .column("MAX_CONCURRENCY", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("MAX_QUEUE_SIZE", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("QUEUE_TIMEOUT", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("CPU_HARD_LIMIT", ScalarType.createVarchar(256))
                            .column("SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("MAX_REMOTE_SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("MIN_REMOTE_SCAN_THREAD_NUM", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("MEMORY_LOW_WATERMARK", ScalarType.createVarchar(256))
                            .column("MEMORY_HIGH_WATERMARK", ScalarType.createVarchar(256))
                            .column("COMPUTE_GROUP", ScalarType.createVarchar(256))
                            .column("READ_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT))
                            .column("REMOTE_READ_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT))
                            .build()))
            .put("backend_configuration",
                    new SchemaTable(SystemIdGenerator.getNextId(), "backend_configuration", TableType.SCHEMA,
                            builder().column("BE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CONFIG_NAME", ScalarType.createStringType())
                                    .column("CONFIG_TYPE", ScalarType.createStringType())
                                    .column("CONFIG_VALUE", ScalarType.createStringType())
                                    .column("IS_MUTABLE", ScalarType.createType(PrimitiveType.BOOLEAN))
                                    .build()))
            .put("processlist",
                    new SchemaTable(SystemIdGenerator.getNextId(), "processlist", TableType.SCHEMA,
                            builder().column("CURRENT_CONNECTED", ScalarType.createVarchar(16))
                                    .column("ID", ScalarType.createType(PrimitiveType.LARGEINT))
                                    .column("USER", ScalarType.createVarchar(32))
                                    .column("HOST", ScalarType.createVarchar(261))
                                    .column("LOGIN_TIME", ScalarType.createType(PrimitiveType.DATETIMEV2))
                                    .column("CATALOG", ScalarType.createVarchar(64))
                                    .column("DB", ScalarType.createVarchar(64))
                                    .column("COMMAND", ScalarType.createVarchar(16))
                                    .column("TIME", ScalarType.createType(PrimitiveType.INT))
                                    .column("STATE", ScalarType.createVarchar(64))
                                    .column("QUERY_ID", ScalarType.createVarchar(256))
                                    .column("INFO", ScalarType.createVarchar(ScalarType.MAX_VARCHAR_LENGTH))
                                    .column("FE",
                                            ScalarType.createVarchar(64))
                                    .column("CLOUD_CLUSTER", ScalarType.createVarchar(64)).build(), true))
            .put("workload_policy",
                    new SchemaTable(SystemIdGenerator.getNextId(), "workload_policy", TableType.SCHEMA,
                            builder().column("ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("NAME", ScalarType.createVarchar(256))
                                    .column("CONDITION", ScalarType.createStringType())
                                    .column("ACTION", ScalarType.createStringType())
                                    .column("PRIORITY", ScalarType.createType(PrimitiveType.INT))
                                    .column("ENABLED", ScalarType.createType(PrimitiveType.BOOLEAN))
                                    .column("VERSION", ScalarType.createType(PrimitiveType.INT))
                                    .column("WORKLOAD_GROUP", ScalarType.createStringType()).build()))
            .put("table_options",
                    new SchemaTable(SystemIdGenerator.getNextId(), "table_options", TableType.SCHEMA,
                            builder().column("TABLE_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_MODEL", ScalarType.createStringType())
                                    .column("TABLE_MODEL_KEY", ScalarType.createStringType())
                                    .column("DISTRIBUTE_KEY", ScalarType.createStringType())
                                    .column("DISTRIBUTE_TYPE", ScalarType.createStringType())
                                    .column("BUCKETS_NUM", ScalarType.createType(PrimitiveType.INT))
                                    .column("PARTITION_NUM", ScalarType.createType(PrimitiveType.INT))
                                    .build()))
            .put("workload_group_privileges",
                    new SchemaTable(SystemIdGenerator.getNextId(), "workload_group_privileges", TableType.SCHEMA,
                            builder().column("GRANTEE", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("WORKLOAD_GROUP_NAME", ScalarType.createVarchar(256))
                                    .column("PRIVILEGE_TYPE", ScalarType.createVarchar(PRIVILEGE_TYPE_LEN))
                                    .column("IS_GRANTABLE", ScalarType.createVarchar(IS_GRANTABLE_LEN))
                                    .build()))
            .put("table_properties",
                    new SchemaTable(SystemIdGenerator.getNextId(), "table_properties", TableType.SCHEMA,
                            builder().column("TABLE_CATALOG", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_SCHEMA", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("TABLE_NAME", ScalarType.createVarchar(NAME_CHAR_LEN))
                                    .column("PROPERTY_NAME", ScalarType.createStringType())
                                    .column("PROPERTY_VALUE", ScalarType.createStringType())
                                    .build())
            )
            .put("workload_group_resource_usage",
                    new SchemaTable(SystemIdGenerator.getNextId(), "workload_group_resource_usage", TableType.SCHEMA,
                            builder().column("BE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("WORKLOAD_GROUP_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("MEMORY_USAGE_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("CPU_USAGE_PERCENT", ScalarType.createType(PrimitiveType.DOUBLE))
                                    .column("LOCAL_SCAN_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("REMOTE_SCAN_BYTES_PER_SECOND", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("WRITE_BUFFER_USAGE_BYTES", ScalarType.createType(PrimitiveType.BIGINT))
                                    .build())
            )
            .put("file_cache_statistics",
                    new SchemaTable(SystemIdGenerator.getNextId(), "file_cache_statistics", TableType.SCHEMA,
                            builder().column("BE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("BE_IP", ScalarType.createStringType())
                                    .column("CACHE_PATH", ScalarType.createStringType())
                                    .column("METRIC_NAME", ScalarType.createStringType())
                                    .column("METRIC_VALUE", ScalarType.createStringType())
                                    .build())
            )
            .put("catalog_meta_cache_statistics",
                    new SchemaTable(SystemIdGenerator.getNextId(), "catalog_meta_cache_statistics", TableType.SCHEMA,
                            builder().column("CATALOG_NAME", ScalarType.createStringType())
                                    .column("CACHE_NAME", ScalarType.createStringType())
                                    .column("METRIC_NAME", ScalarType.createStringType())
                                    .column("METRIC_VALUE", ScalarType.createStringType())
                                    .build())
            )
            .put("backend_kerberos_ticket_cache",
                    new SchemaTable(SystemIdGenerator.getNextId(), "backend_kerberos_ticket_cache", TableType.SCHEMA,
                            builder().column("BE_ID", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("BE_IP", ScalarType.createStringType())
                                    .column("PRINCIPAL", ScalarType.createStringType())
                                    .column("KEYTAB", ScalarType.createStringType())
                                    .column("SERVICE_PRINCIPAL", ScalarType.createStringType())
                                    .column("TICKET_CACHE_PATH", ScalarType.createStringType())
                                    .column("HASH_CODE", ScalarType.createStringType())
                                    .column("START_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("EXPIRE_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("AUTH_TIME", ScalarType.createType(PrimitiveType.DATETIME))
                                    .column("REF_COUNT", ScalarType.createType(PrimitiveType.BIGINT))
                                    .column("REFRESH_INTERVAL_SECOND", ScalarType.createType(PrimitiveType.BIGINT))
                                    .build())
            )
            .put("routine_load_jobs",
                    new SchemaTable(SystemIdGenerator.getNextId(), "routine_load_jobs", TableType.SCHEMA,
                            builder().column("JOB_ID", ScalarType.createStringType())
                                    .column("JOB_NAME", ScalarType.createStringType())
                                    .column("CREATE_TIME", ScalarType.createStringType())
                                    .column("PAUSE_TIME", ScalarType.createStringType())
                                    .column("END_TIME", ScalarType.createStringType())
                                    .column("DB_NAME", ScalarType.createStringType())
                                    .column("TABLE_NAME", ScalarType.createStringType())
                                    .column("STATE", ScalarType.createStringType())
                                    .column("CURRENT_TASK_NUM", ScalarType.createStringType())
                                    .column("JOB_PROPERTIES", ScalarType.createStringType())
                                    .column("DATA_SOURCE_PROPERTIES", ScalarType.createStringType())
                                    .column("CUSTOM_PROPERTIES", ScalarType.createStringType())
                                    .column("STATISTIC", ScalarType.createStringType())
                                    .column("PROGRESS", ScalarType.createStringType())
                                    .column("LAG", ScalarType.createStringType())
                                    .column("REASON_OF_STATE_CHANGED", ScalarType.createStringType())
                                    .column("ERROR_LOG_URLS", ScalarType.createStringType())
                                    .column("USER_NAME", ScalarType.createStringType())
                                    .column("CURRENT_ABORT_TASK_NUM", ScalarType.createType(PrimitiveType.INT))
                                    .column("IS_ABNORMAL_PAUSE", ScalarType.createType(PrimitiveType.BOOLEAN))
                                    .build())
            )
            .build();

    private boolean fetchAllFe = false;

    protected SchemaTable(long id, String name, TableType type, List<Column> baseSchema) {
        super(id, name, type, baseSchema);
    }

    protected SchemaTable(long id, String name, TableType type, List<Column> baseSchema, boolean fetchAllFe) {
        this(id, name, type, baseSchema);
        this.fetchAllFe = fetchAllFe;
    }

    @Override
    public void write(DataOutput out) throws IOException {
        throw new UnsupportedOperationException("Do not allow to write SchemaTable to image.");
    }

    public void readFields(DataInput in) throws IOException {
        throw new UnsupportedOperationException("Do not allow read SchemaTable from image.");
    }

    public static Builder builder() {
        return new Builder();
    }

    public static boolean isShouldFetchAllFe(String schemaTableName) {
        Table table = TABLE_MAP.get(schemaTableName);
        if (table != null && table instanceof SchemaTable) {
            return ((SchemaTable) table).fetchAllFe;
        }
        return false;
    }

    /**
     * For TABLE_MAP.
     **/
    public static class Builder {
        List<Column> columns;

        public Builder() {
            columns = Lists.newArrayList();
        }

        public Builder column(String name, ScalarType type) {
            columns.add(new Column(name, type, true));
            return this;
        }

        public List<Column> build() {
            return columns;
        }
    }

    @Override
    public TTableDescriptor toThrift() {
        TSchemaTable tSchemaTable = new TSchemaTable(SchemaTableType.getThriftType(this.name));
        TTableDescriptor tTableDescriptor = new TTableDescriptor(getId(), TTableType.SCHEMA_TABLE,
                TABLE_MAP.get(this.name).getBaseSchema().size(), 0, this.name, "");
        tTableDescriptor.setSchemaTable(tSchemaTable);
        return tTableDescriptor;
    }
}