Skip to content

File schema_information_schema_install.cpp

File List > cubrid > src > object > schema_information_schema_install.cpp

Go to the documentation of this file

/*
 *
 * Copyright 2016 CUBRID Corporation
 *
 *  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.
 *
 */

#include "schema_information_schema_install.hpp"

#include "authenticate.h"
#include "dbtype_def.h"
#include "schema_information_schema_builder.hpp"
#include "schema_information_schema_constants.h"
#include "schema_information_schema_definition.hpp"
#include "schema_system_catalog_install.hpp"

/*
 * Column order policy for information_schema views
 * Goal: make SELECT * predictable and keep the layout close to PostgreSQL information_schema.
 * Reference: https://www.postgresql.org/docs/current/information-schema.html
 */

static std::vector<cubschema::info_schema_function> info_schema_list;

void
info_schema_init (void)
{
  using namespace cubschema;

  info_schema_list.emplace_back (INFO_SCHEMA_COLUMN_PRIVILEGES_NAME,
                 information_schema_initializer::get_view_column_privileges ());
  info_schema_list.emplace_back (INFO_SCHEMA_COLUMNS_NAME, information_schema_initializer::get_view_columns ());
  info_schema_list.emplace_back (INFO_SCHEMA_DOMAINS_NAME, information_schema_initializer::get_view_domains ());
  info_schema_list.emplace_back (INFO_SCHEMA_FOREIGN_SERVERS_NAME,
                 information_schema_initializer::get_view_foreign_servers ());
  info_schema_list.emplace_back (INFO_SCHEMA_KEY_COLUMN_USAGE_NAME,
                 information_schema_initializer::get_view_key_column_usage ());
  info_schema_list.emplace_back (INFO_SCHEMA_PARAMETERS_NAME, information_schema_initializer::get_view_parameters ());
  info_schema_list.emplace_back (INFO_SCHEMA_PARTITIONS_NAME, information_schema_initializer::get_view_partitions ());
  info_schema_list.emplace_back (INFO_SCHEMA_REFERENTIAL_CONS_NAME,
                 information_schema_initializer::get_view_referential_constraints ());
  info_schema_list.emplace_back (INFO_SCHEMA_ROUTINE_PRIVILEGES_NAME,
                 information_schema_initializer::get_view_routine_privileges ());
  info_schema_list.emplace_back (INFO_SCHEMA_ROUTINES_NAME, information_schema_initializer::get_view_routines ());
  info_schema_list.emplace_back (INFO_SCHEMA_SCHEMATA_NAME, information_schema_initializer::get_view_schemata ());
  info_schema_list.emplace_back (INFO_SCHEMA_SEQUENCES_NAME, information_schema_initializer::get_view_sequences ());
  info_schema_list.emplace_back (INFO_SCHEMA_STATISTICS_NAME, information_schema_initializer::get_view_statistics ());
  info_schema_list.emplace_back (INFO_SCHEMA_SYNONYMS_NAME, information_schema_initializer::get_view_synonyms ());
  info_schema_list.emplace_back (INFO_SCHEMA_TABLE_CONSTRAINTS_NAME,
                 information_schema_initializer::get_view_table_constraints ());
  info_schema_list.emplace_back (INFO_SCHEMA_TABLE_PRIVILEGES_NAME,
                 information_schema_initializer::get_view_table_privileges ());
  info_schema_list.emplace_back (INFO_SCHEMA_TABLES_NAME, information_schema_initializer::get_view_tables ());
  info_schema_list.emplace_back (INFO_SCHEMA_TRIGGERS_NAME, information_schema_initializer::get_view_triggers ());
  info_schema_list.emplace_back (INFO_SCHEMA_VIEWS_NAME, information_schema_initializer::get_view_views ());
}

int
info_schema_install (void)
{
  int error_code = NO_ERROR;
  const size_t num_vclasses = info_schema_list.size ();
  int save;

  AU_DISABLE (save);
  au_set_user (Au_dba_user);

  using info_builder = cubschema::information_schema_builder;

  for (size_t i = 0; i < num_vclasses; i++)
    {
      MOP class_mop = info_builder::create_and_mark_system_class (info_schema_list[i].name);
      if (class_mop == nullptr)
    {
      assert (false);
      error_code = er_errid();
      goto end;
    }

      error_code = info_builder::build_vclass (class_mop, info_schema_list[i].definition);
      if (error_code != NO_ERROR)
    {
      goto end;
    }
    }

end:
  AU_ENABLE (save);
  info_schema_list.clear ();

  return error_code;
}

namespace cubschema
{
  information_schema_definition
  information_schema_initializer::get_view_column_privileges ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_COLUMN_PRIVILEGES_NAME,
           // columns
    {
      {"grantor", format_varchar (DB_MAX_USER_LENGTH)},
      {"grantee", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"column_name", format_varchar (255)},
      {"privilege_type", format_varchar (7)},
      {"is_grantable", format_varchar (3)},
      {attribute_kind::QUERY_SPEC, sm_define_view_column_privileges_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_columns ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_COLUMNS_NAME,
           // columns
    {
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"column_name", format_varchar (255)},
      {"ordinal_position", "integer"},
      {"column_default", format_varchar (255)},
      {"is_nullable", format_varchar (3)},
      {"data_type", format_varchar (16)},
      {"character_maximum_length", "bigint"},
      {"character_octet_length", "bigint"},
      {"numeric_precision", "integer"},
      {"numeric_scale", "integer"},
      {"datetime_precision", "integer"},
      {"character_set_name", format_varchar (32)},
      {"collation_name", format_varchar (32)},
      {"domain_catalog", format_varchar (255)},
      {"domain_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"domain_name", format_varchar (255)},
      {"udt_catalog", format_varchar (255)},
      {"udt_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"udt_name", format_varchar (255)},
      {"extra", format_varchar (255)},
      {"privileges", format_varchar (512)},
      {"column_comment", format_varchar (2048)},
      {"is_generated", format_varchar (3)},
      {"generation_expression", "string"},
      {"is_updatable", format_varchar (3)},
      {"is_visible", format_varchar (3)},
      {attribute_kind::QUERY_SPEC, sm_define_view_columns_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_domains ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_DOMAINS_NAME,
           // columns
    {
      {"domain_catalog", format_varchar (255)},
      {"domain_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"domain_name", format_varchar (255)},
      {"data_type", format_varchar (16)},
      {"character_maximum_length", "bigint"},
      {"character_octet_length", "bigint"},
      {"character_set_catalog", format_varchar (255)},
      {"character_set_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"character_set_name", format_varchar (32)},
      {"collation_catalog", format_varchar (255)},
      {"collation_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"collation_name", format_varchar (32)},
      {"numeric_precision", "integer"},
      {"numeric_precision_radix", "integer"},
      {"numeric_scale", "integer"},
      {"datetime_precision", "integer"},
      {"domain_default", format_varchar (255)},
      {"udt_catalog", format_varchar (255)},
      {"udt_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"udt_name", format_varchar (255)},
      {"domain_comment", format_varchar (2048)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_domains_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_foreign_servers ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_FOREIGN_SERVERS_NAME,
           // columns
    {
      {"foreign_server_catalog", format_varchar (255)},
      {"foreign_server_name", format_varchar (255)},
      {"foreign_data_wrapper_catalog", format_varchar (255)},
      {"foreign_data_wrapper_name", format_varchar (255)},
      {"foreign_server_type", "string"},
      {"foreign_server_version", "string"},
      {"authorization_identifier", format_varchar (DB_MAX_USER_LENGTH)},
      {"server_host", format_varchar (255)},
      {"server_port", "integer"},
      {"server_database", format_varchar (255)},
      {"server_user", format_varchar (255)},
      {"server_properties", format_varchar (2048)},
      {"server_comment", format_varchar (1024)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_foreign_servers_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_key_column_usage ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_KEY_COLUMN_USAGE_NAME,
           // columns
    {
      {"constraint_catalog", format_varchar (255)},
      {"constraint_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"constraint_name", format_varchar (255)},
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"column_name", format_varchar (255)},
      {"ordinal_position", "integer"},
      {"position_in_unique_constraint", "integer"},
      {attribute_kind::QUERY_SPEC, sm_define_view_key_column_usage_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_parameters ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_PARAMETERS_NAME,
           // columns
    {
      {"specific_catalog", format_varchar (255)},
      {"specific_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"specific_name", format_varchar (255)},
      {"ordinal_position", "integer"},
      {"parameter_mode", format_varchar (5)},
      {"is_result", format_varchar (3)},
      {"parameter_name", format_varchar (255)},
      {"data_type", format_varchar (16)},
      {"character_maximum_length", "bigint"},
      {"character_octet_length", "bigint"},
      {"character_set_name", format_varchar (32)},
      {"collation_name", format_varchar (32)},
      {"numeric_precision", "integer"},
      {"numeric_scale", "integer"},
      {"datetime_precision", "integer"},
      {"dtd_identifier", format_varchar (1024)},
      {"routine_type", format_varchar (9)},
      {"parameter_default", format_varchar (255)},
      {"parameter_comment", format_varchar (1024)},
      {attribute_kind::QUERY_SPEC, sm_define_view_parameters_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_partitions ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_PARTITIONS_NAME,
           // columns
    {
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"partition_name", format_varchar (255)},
      {"partition_ordinal_position", "integer"},
      {"partition_method", format_varchar (5)},
      {"partition_expression", format_varchar (2048)},
      {"partition_description", "string"},
      {"subpartition_name", format_varchar (255)},
      {"subpartition_ordinal_position", "integer"},
      {"subpartition_method", format_varchar (5)},
      {"subpartition_expression", format_varchar (2048)},
      {"table_rows", "bigint"},
      {"avg_row_length", "bigint"},
      {"data_length", "bigint"},
      {"data_free", "bigint"},
      {"tablespace_name", format_varchar (255)},
      {"partition_comment", format_varchar (1024)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_partitions_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_referential_constraints ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_REFERENTIAL_CONS_NAME,
           // columns
    {
      {"constraint_catalog", format_varchar (255)},
      {"constraint_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"constraint_name", format_varchar (255)},
      {"unique_constraint_catalog", format_varchar (255)},
      {"unique_constraint_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"unique_constraint_name", format_varchar (255)},
      {"match_option", format_varchar (7)},
      {"update_rule", format_varchar (9)},
      {"delete_rule", format_varchar (9)},
      {"table_name", format_varchar (255)},
      {"referenced_table_name", format_varchar (255)},
      {attribute_kind::QUERY_SPEC, sm_define_view_referential_constraints_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_routine_privileges ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_ROUTINE_PRIVILEGES_NAME,
           // columns
    {
      {"grantor", format_varchar (DB_MAX_USER_LENGTH)},
      {"grantee", format_varchar (DB_MAX_USER_LENGTH)},
      {"specific_catalog", format_varchar (255)},
      {"specific_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"specific_name", format_varchar (255)},
      {"routine_catalog", format_varchar (255)},
      {"routine_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"routine_name", format_varchar (255)},
      {"privilege_type", format_varchar (7)},
      {"is_grantable", format_varchar (3)},
      {attribute_kind::QUERY_SPEC, sm_define_view_routine_privileges_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_routines ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_ROUTINES_NAME,
           // columns
    {
      {"specific_name", format_varchar (255)},
      {"routine_catalog", format_varchar (255)},
      {"routine_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"routine_name", format_varchar (255)},
      {"routine_type", format_varchar (9)},
      {"data_type", format_varchar (16)},
      {"character_maximum_length", "bigint"},
      {"character_octet_length", "bigint"},
      {"character_set_name", format_varchar (32)},
      {"collation_name", format_varchar (32)},
      {"numeric_precision", "integer"},
      {"numeric_scale", "integer"},
      {"datetime_precision", "integer"},
      {"dtd_identifier", format_varchar (255)},
      {"routine_body", format_varchar (8)},
      {"routine_definition", "string"},
      {"external_name", "string"},
      {"external_language", format_varchar (64)},
      {"parameter_style", format_varchar (3)},
      {"is_deterministic", format_varchar (3)},
      {"sql_data_access", format_varchar (17)},
      {"sql_path", "string"},
      {"security_type", format_varchar (7)},
      {"routine_comment", format_varchar (1024)},
      /* SQL:2016 standard names (other views use create_time/update_time) */
      {"created", "datetime"},
      {"last_altered", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_routines_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_schemata ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_SCHEMATA_NAME,
           // columns
    {
      {"catalog_name", format_varchar (255)},
      {"schema_name", format_varchar (DB_MAX_USER_LENGTH)},
      {"schema_owner", format_varchar (DB_MAX_USER_LENGTH)},
      {"default_character_set_catalog", format_varchar (255)},
      {"default_character_set_schema", format_varchar (255)},
      {"default_character_set_name", format_varchar (32)},
      {"sql_path", "string"},
      {"schema_comment", format_varchar (1024)},
      {"create_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_schemata_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_sequences ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_SEQUENCES_NAME,
           // columns
    {
      {"sequence_catalog", format_varchar (255)},
      {"sequence_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"sequence_name", format_varchar (255)},
      {"data_type", format_varchar (16)},
      {"numeric_precision", "integer"},
      {"numeric_precision_radix", "integer"},
      {"numeric_scale", "integer"},
      {"start_value", format_numeric (38, 0)},
      {"minimum_value", format_numeric (38, 0)},
      {"maximum_value", format_numeric (38, 0)},
      {"increment", format_numeric (38, 0)},
      {"cycle_option", format_varchar (3)},
      {"is_cached", format_varchar (3)},
      {"sequence_comment", format_varchar (1024)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_sequences_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_statistics ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_STATISTICS_NAME,
           // columns
    {
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"is_unique", "integer"},
      {"index_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"index_name", format_varchar (255)},
      {"seq_in_index", "integer"},
      {"column_name", format_varchar (255)},
      {"collation", format_varchar (1)},
      {"cardinality", "integer"},
      {"sub_part", "integer"},
      {"nullable", format_varchar (3)},
      {"index_type", format_varchar (32)},
      {"comment", format_varchar (1024)},
      {"index_comment", format_varchar (1024)},
      {"is_visible", format_varchar (3)},
      {"expression", format_varchar (1023)},
      {"deduplicate_level", "integer"},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {"access_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_statistics_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_synonyms ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_SYNONYMS_NAME,
           // columns
    {
      {"synonym_catalog", format_varchar (255)},
      {"synonym_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"synonym_name", format_varchar (255)},
      {"is_public_synonym", format_varchar (3)},
      {"target_catalog", format_varchar (255)},
      {"target_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"target_name", format_varchar (255)},
      {"synonym_comment", format_varchar (2048)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_synonyms_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }
  information_schema_definition
  information_schema_initializer::get_view_table_constraints ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_TABLE_CONSTRAINTS_NAME,
           // columns
    {
      {"constraint_catalog", format_varchar (255)},
      {"constraint_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"constraint_name", format_varchar (255)},
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"constraint_type", format_varchar (11)},
      {"is_deferrable", format_varchar (3)},
      {"initially_deferred", format_varchar (3)},
      {"enforced", format_varchar (3)},
      {attribute_kind::QUERY_SPEC, sm_define_view_table_constraints_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_table_privileges ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_TABLE_PRIVILEGES_NAME,
           // columns
    {
      {"grantor", format_varchar (DB_MAX_USER_LENGTH)},
      {"grantee", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"privilege_type", format_varchar (7)},
      {"is_grantable", format_varchar (3)},
      {attribute_kind::QUERY_SPEC, sm_define_view_table_privileges_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_tables ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_TABLES_NAME,
           // columns
    {
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"table_type", format_varchar (12)},
      {"table_rows", "bigint"},
      {"avg_row_length", "bigint"},
      {"data_length", "bigint"},
      {"data_free", "bigint"},
      {"auto_increment", format_numeric (38, 0)},
      {"table_collation", format_varchar (32)},
      {"create_options", format_varchar (255)},
      {"is_temporary", format_varchar (3)},
      {"table_comment", format_varchar (2048)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {"statistics_strategy", format_varchar (8)},
      {"last_analyzed", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_tables_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_triggers ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_TRIGGERS_NAME,
           // columns
    {
      {"trigger_catalog", format_varchar (255)},
      {"trigger_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"trigger_name", format_varchar (255)},
      {"event_manipulation", format_varchar (8)},
      {"event_object_catalog", format_varchar (255)},
      {"event_object_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"event_object_table", format_varchar (255)},
      {"event_object_column", format_varchar (255)},
      {"action_order", "integer"},
      {"action_condition", "string"},
      {"action_statement", "string"},
      {"action_orientation", format_varchar (9)},
      {"action_timing", format_varchar (8)},
      {"action_reference_old_table", format_varchar (3)},
      {"action_reference_new_table", format_varchar (3)},
      {"action_reference_old_row", format_varchar (3)},
      {"action_reference_new_row", format_varchar (3)},
      {"trigger_comment", format_varchar (1024)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_triggers_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }

  information_schema_definition
  information_schema_initializer::get_view_views ()
  {
    return information_schema_definition (
           // name
           INFO_SCHEMA_VIEWS_NAME,
           // columns
    {
      {"table_catalog", format_varchar (255)},
      {"table_schema", format_varchar (DB_MAX_USER_LENGTH)},
      {"table_name", format_varchar (255)},
      {"view_definition", "string"},
      {"check_option", format_varchar (8)},
      {"is_updatable", format_varchar (3)},
      {"view_comment", format_varchar (2048)},
      {"create_time", "datetime"},
      {"update_time", "datetime"},
      {attribute_kind::QUERY_SPEC, sm_define_view_views_spec ()}
    },
    // constraint
    {},
    // authorization
    {
      // owner
      Au_information_schema_user,
      // grants
      {
    {Au_public_user, AU_SELECT, false}
      }
    },
    // initializer
    nullptr
       );
  }
}