Skip to content

File schema_system_catalog_install_query_spec.cpp

File List > cubrid > src > object > schema_system_catalog_install_query_spec.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.
 *
 */


/*
 * schema_system_catalog_install_query_spec.cpp
 */

#include "schema_system_catalog_install.hpp"

#include "authenticate.h"
#include "deduplicate_key.h"
#include "schema_system_catalog_constants.h"
#include "trigger_manager.h"

// TODO: Add checking the following rules in compile time (@hgryoo)
/*
 * Please follow the rules below when writing query specifications for system virtual classes.
 *
 *  1. First indent 1 tab, then 2 spaces.
 *     - The CASE statement indents 2 spaces until the END.
 *  2. All lines do not start with a space.
 *  3. All lines end with a space. However, the following case does not end with a space.
 *     - If the current line ends with "(", it ends without a space.
 *     - If the next line starts with ")", the current line ends without a space.
 *  4. Add a space before "(" and after ")". Remove spaces after "(" and before ")".
 *  5. Add a space before "{" and after "}". Remove spaces after "{" and before "}".
 *  6. Add a space before and after "+" and "=" operators.
 *  7. Change the line.
 *     - In the SELECT, FROM, WHERE, and ORDER BY clauses, change the line.
 *     - After the SELECT, FROM, WHERE, and ORDER BY keywords, change the line.
 *     - In the AND and OR clauses, change the line.
 *     - In more than one TABLE expression, change the line.
 *  8. Do not change the line.
 *     - If the expression length is less than 120 characters, write it on one line.
 *     - In the CASE statement, write the WHEN and THEN clauses on one line.
 *     - In the FROM clause, write a TABLE expression and related tables on one line.
 *  9. In the SELECT and FROM clauses, use the AS keyword before alias.
 * 10. If the CAST function is used, write a comment about the data type being changed.
 * 11. If column are compared without changing in the CASE statement, write the column name after the CASE keyword.
 * 12. If %s (Format Specifier) is used in the FROM clause, write a comment about the value to be used.
 * 13. Because path expression cannot be used in ANSI style, write a join condition in the WHERE clause.
 *
 */

const char *
sm_define_view_class_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[c].[class_name] AS [class_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [c].[class_type] WHEN 0 THEN 'CLASS' WHEN 1 THEN 'VCLASS' ELSE 'UNKNOWN' END AS [class_type], "
      "CASE WHEN [c].[is_system_class] = 1 THEN 'YES' ELSE 'NO' END AS [is_system_class], "
      "CASE [c].[tde_algorithm] WHEN 0 THEN 'NONE' WHEN 1 THEN 'AES' WHEN 2 THEN 'ARIA' END AS [tde_algorithm], "
      "CASE [c].[statistics_strategy] "
            "WHEN 0 THEN 'SAMPLING' "
            "WHEN 1 THEN 'FULLSCAN' "
            "ELSE NULL "
            "END AS [statistics_strategy], "
      "CASE "
        "WHEN [c].[sub_classes] IS NULL THEN 'NO' "
        /* CT_PARTITION_NAME */
        "ELSE NVL ((SELECT 'YES' FROM [%s] AS [p] WHERE [p].[class_of] = [c] AND [p].[pname] IS NULL), 'NO') "
        "END AS [partitioned], "
          /* SM_CLASSFLAG_REUSE_OID */
      "CASE WHEN ([c].[flags] & %d) <> 0 THEN 'YES' ELSE 'NO' END AS [is_reuse_oid_class], "
      "[coll].[coll_name] AS [collation], "
      "[c].[comment] AS [comment], "
          "[c].[created_time] AS [created_time], "
          "[c].[updated_time] AS [updated_time], "
          "[c].[checked_time] AS [checked_time] "
    "FROM "
      /* CT_CLASS_NAME */
      "[%s] AS [c], "
      /* CT_COLLATION_NAME */
      "[%s] AS [coll] "
    "WHERE "
      "[c].[collation_id] = [coll].[coll_id] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_PARTITION_NAME,
        SM_CLASSFLAG_REUSE_OID,
    CT_CLASS_NAME,
    CT_COLLATION_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_direct_super_class_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[c].[class_name] AS [class_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[s].[class_name] AS [super_class_name], "
      "CAST ([s].[owner].[name] AS VARCHAR(255)) AS [super_owner_name] " /* string -> varchar(255) */
    "FROM "
      /* CT_CLASS_NAME */
      "[%s] AS [c], TABLE ([c].[super_classes]) AS [t] ([s]) "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[c].[owner].[name]} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[c].[class_of]} SUBSETEQ ("
          "SELECT "
        "SUM (SET {[au].[object_of]}) "
          "FROM "
        /* CT_CLASSAUTH_NAME */
        "[%s] AS [au] "
          "WHERE "
        "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
          ") "
        "AND [au].[auth_type] = 'SELECT'"
        ")",
    CT_CLASS_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_vclass_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[q].[class_of].[class_name] AS [vclass_name], "
      "CAST ([q].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[q].[spec] AS [vclass_def], "
      "[c].[comment] AS [comment] "
    "FROM "
      /* CT_QUERYSPEC_NAME */
      "[%s] AS [q], "
      /* CT_CLASS_NAME */
      "[%s] AS [c] "
    "WHERE "
      "[q].[class_of] = [c] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[q].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[q].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_QUERYSPEC_NAME,
    CT_CLASS_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_attribute_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[a].[attr_name] AS [attr_name], "
      "[c].[class_name] AS [class_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [a].[attr_type] WHEN 0 THEN 'INSTANCE' WHEN 1 THEN 'CLASS' ELSE 'SHARED' END AS [attr_type], "
      "[a].[def_order] AS [def_order], "
      "[a].[from_class_of].[class_name] AS [from_class_name], "
      "CAST ([a].[from_class_of].[owner].[name] AS VARCHAR(255)) AS [from_owner_name], " /* string -> varchar(255) */
      "[a].[from_attr_name] AS [from_attr_name], "
      "[t].[type_name] AS [data_type], "
      "[d].[prec] AS [prec], "
      "[d].[scale] AS [scale], "
      "IF ("
          "[a].[data_type] IN (4, 25, 26, 27, 35), "
          /* CT_CHARSET_NAME */
          "(SELECT [ch].[charset_name] FROM [%s] AS [ch] WHERE [d].[code_set] = [ch].[charset_id]), "
          "'Not applicable'"
        ") AS [charset], "
      "IF ("
          "[a].[data_type] IN (4, 25, 26, 27, 35), "
          /* CT_COLLATION_NAME */
          "(SELECT [coll].[coll_name] FROM [%s] AS [coll] WHERE [d].[collation_id] = [coll].[coll_id]), "
          "'Not applicable'"
        ") AS [collation], "
      "[d].[class_of].[class_name] AS [domain_class_name], "
      "CAST ([d].[class_of].[owner].[name] AS VARCHAR(255)) AS [domain_owner_name], " /* string -> varchar(255) */
      "[a].[default_value] AS [default_value], "
      "CASE WHEN [a].[is_nullable] = 1 THEN 'YES' ELSE 'NO' END AS [is_nullable], "
      "[a].[comment] AS [comment] "
    "FROM "
      /* CT_CLASS_NAME */
      "[%s] AS [c], "
      /* CT_ATTRIBUTE_NAME */
      "[%s] AS [a], "
      /* CT_DOMAIN_NAME */
      "[%s] AS [d], "
      /* CT_DATATYPE_NAME */
      "[%s] AS [t] "
    "WHERE "
      "[a].[class_of] = [c] "
      "AND [d].[object_of] = [a] "
      "AND [d].[data_type] = [t].[type_id] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_CHARSET_NAME,
    CT_COLLATION_NAME,
    CT_CLASS_NAME,
    CT_ATTRIBUTE_NAME,
    CT_DOMAIN_NAME,
    CT_DATATYPE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_attr_setdomain_elm_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[a].[attr_name] AS [attr_name], "
      "[c].[class_name] AS [class_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [a].[attr_type] WHEN 0 THEN 'INSTANCE' WHEN 1 THEN 'CLASS' ELSE 'SHARED' END AS [attr_type], "
      "[et].[type_name] AS [data_type], "
      "[e].[prec] AS [prec], "
      "[e].[scale] AS [scale], "
      "[e].[code_set] AS [code_set], "
      "[e].[class_of].[class_name] AS [domain_class_name], "
      "CAST ([e].[class_of].[owner].[name] AS VARCHAR(255)) AS [domain_owner_name] " /* string -> varchar(255) */
    "FROM "
      /* CT_CLASS_NAME */
      "[%s] AS [c], "
      /* CT_ATTRIBUTE_NAME */
      "[%s] AS [a], "
      /* CT_DOMAIN_NAME */
      "[%s] AS [d], TABLE ([d].[set_domains]) AS [t] ([e]), "
      /* CT_DATATYPE_NAME */
      "[%s] AS [et] "
    "WHERE "
      "[a].[class_of] = [c] "
      "AND [d].[object_of] = [a] "
      "AND [e].[data_type] = [et].[type_id] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[c].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_CLASS_NAME,
    CT_ATTRIBUTE_NAME,
    CT_DOMAIN_NAME,
    CT_DATATYPE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_method_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[m].[meth_name] AS [meth_name], "
      "[m].[class_of].[class_name] AS [class_name], "
      "CAST ([m].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [m].[meth_type] WHEN 0 THEN 'INSTANCE' ELSE 'CLASS' END AS [meth_type], "
      "[m].[from_class_of].[class_name] AS [from_class_name], "
      "CAST ([m].[from_class_of].[owner].[name] AS VARCHAR(255)) AS [from_owner_name], " /* string -> varchar(255) */
      "[m].[from_meth_name] AS [from_meth_name], "
      "[s].[func_name] AS [func_name] "
    "FROM "
      /* CT_METHOD_NAME */
      "[%s] AS [m], "
      /* CT_METHSIG_NAME */
      "[%s] AS [s] "
    "WHERE "
      "[s].[meth_of] = [m] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[m].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[m].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_METHOD_NAME,
    CT_METHSIG_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_method_arg_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[s].[meth_of].[meth_name] AS [meth_name], "
      "[s].[meth_of].[class_of].[class_name] AS [class_name], "
      "CAST ([s].[meth_of].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [s].[meth_of].[meth_type] WHEN 0 THEN 'INSTANCE' ELSE 'CLASS' END AS [meth_type], "
      "[a].[index_of] AS [index_of], "
      "[t].[type_name] AS [data_type], "
      "[d].[prec] AS [prec], "
      "[d].[scale] AS [scale], "
      "[d].[code_set] AS [code_set], "
      "[d].[class_of].[class_name] AS [domain_class_name], "
      "CAST ([d].[class_of].[owner].[name] AS VARCHAR(255)) AS [domain_owner_name] " /* string -> varchar(255) */
    "FROM "
      /* CT_METHSIG_NAME */
      "[%s] AS [s], "
      /* CT_METHARG_NAME */
      "[%s] AS [a], "
      /* CT_DOMAIN_NAME */
      "[%s] AS [d], "
      /* CT_DATATYPE_NAME */
      "[%s] AS [t] "
    "WHERE "
      "[a].[meth_sig_of] = [s] "
      "AND [d].[object_of] = [a] "
      "AND [d].[data_type] = [t].[type_id] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[s].[meth_of].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[s].[meth_of].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_METHSIG_NAME,
    CT_METHARG_NAME,
    CT_DOMAIN_NAME,
    CT_DATATYPE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_meth_arg_setdomain_elm_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[s].[meth_of].[meth_name] AS [meth_name], "
      "[s].[meth_of].[class_of].[class_name] AS [class_name], "
      "CAST ([s].[meth_of].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "CASE [s].[meth_of].[meth_type] WHEN 0 THEN 'INSTANCE' ELSE 'CLASS' END AS [meth_type], "
      "[a].[index_of] AS [index_of], "
      "[et].[type_name] AS [data_type], "
      "[e].[prec] AS [prec], "
      "[e].[scale] AS [scale], "
      "[e].[code_set] AS [code_set], "
      "[e].[class_of].[class_name] AS [domain_class_name], "
      "CAST ([e].[class_of].[owner].[name] AS VARCHAR(255)) AS [domain_owner_name] " /* string -> varchar(255) */
    "FROM "
      /* CT_METHSIG_NAME */
      "[%s] AS [s], "
      /* CT_METHARG_NAME */
      "[%s] AS [a], "
      /* CT_DOMAIN_NAME */
      "[%s] AS [d], TABLE ([d].[set_domains]) AS [t] ([e]), "
      /* CT_DATATYPE_NAME */
      "[%s] AS [et] "
    "WHERE "
      "[a].[meth_sig_of] = [s] "
      "AND [d].[object_of] = [a] "
      "AND [e].[data_type] = [et].[type_id] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[s].[meth_of].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[s].[meth_of].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_METHSIG_NAME,
    CT_METHARG_NAME,
    CT_DOMAIN_NAME,
    CT_DATATYPE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_meth_file_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[f].[class_of].[class_name] AS [class_name], "
      "CAST ([f].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[f].[path_name] AS [path_name], "
      "[f].[from_class_of].[class_name] AS [from_class_name], "
      "CAST ([f].[from_class_of].[owner].[name] AS VARCHAR(255)) AS [from_owner_name] " /* string -> varchar(255) */
    "FROM "
      /* CT_METHFILE_NAME */
      "[%s] AS [f] "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[f].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[f].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
        "SUM (SET {[au].[object_of]}) "
          "FROM "
        /* CT_CLASSAUTH_NAME */
        "[%s] AS [au] "
          "WHERE "
        "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
          ") "
        "AND [au].[auth_type] = 'SELECT'"
        ")",
    CT_METHFILE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_index_spec (void)
{
  static char stmt [4096];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[i].[index_name] AS [index_name], "
      "CASE [i].[is_unique] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_unique], "
      "CASE [i].[is_reverse] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_reverse], "
      "[i].[class_of].[class_name] AS [class_name], "
      "CAST ([i].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "NVL2 ("
          "("
        "SELECT 1 "
        "FROM "
          /* CT_INDEXKEY_NAME */
          "[%s] [k] "
        "WHERE "
          "[k].index_of.class_of = [i].class_of "
          "AND [k].index_of.index_name = [i].[index_name] "
          "AND [k].key_attr_name LIKE " DEDUPLICATE_KEY_ATTR_NAME_LIKE_PATTERN
          "), "
          "([i].[key_count] - 1), "
          "[i].[key_count]"
        ") AS [key_count], "        
      "CASE [i].[is_primary_key] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_primary_key], "
      "CASE [i].[is_foreign_key] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_foreign_key], "
      "[i].[filter_expression] AS [filter_expression], "
      "CASE [i].[have_function] WHEN 0 THEN 'NO' ELSE 'YES' END AS [have_function], "
      "CASE [i].[status] "
        "WHEN 0 THEN 'NO_INDEX' "
        "WHEN 1 THEN 'NORMAL INDEX' "
        "WHEN 2 THEN 'INVISIBLE INDEX' "
        "WHEN 3 THEN 'INDEX IS IN ONLINE BUILDING' "
        "ELSE 'NULL' "
        "END AS [status], "
          "CASE "
            "WHEN [i].[referential_index] IS NOT NULL THEN [i].[referential_index].[class_of].[owner].[name] "
            "ELSE NULL "
            "END AS [referential_index_class_owner_name], "
          "CASE "
            "WHEN [i].[referential_index] IS NOT NULL THEN [i].[referential_index].[class_of].[class_name] "
            "ELSE NULL "
            "END AS [referential_index_class_name], "
          "CASE "
            "WHEN [i].[referential_index] IS NOT NULL THEN [i].[referential_index].[index_name] "
            "ELSE NULL "
            "END AS [referential_index_name], "
          "CASE [i].[delete_rule] "
            "WHEN 0 THEN 'CASCADE' "
            "WHEN 1 THEN 'RESTRICT' "
            "WHEN 2 THEN 'NO ACTION' "
            "WHEN 3 THEN 'SET NULL' "
            "ELSE NULL "
            "END AS [delete_rule], "
          "CASE [i].[update_rule] "
            "WHEN 0 THEN 'CASCADE' "
            "WHEN 1 THEN 'RESTRICT' "
            "WHEN 2 THEN 'NO ACTION' "
            "WHEN 3 THEN 'SET NULL' "
            "ELSE NULL "
            "END AS [update_rule], "
          "CASE [i].[referential_match_option] "
            "WHEN 0 THEN 'NONE' "
            "WHEN 1 THEN 'PARTIAL' "
            "WHEN 2 THEN 'FULL' "
            "ELSE NULL "
            "END AS [referential_match_option], "
          "CASE [i].[index_type] "
            "WHEN 0 THEN 'BTREE' "
            "ELSE NULL "
            "END AS [index_type], "
          "[i].[options] & %d AS [deduplicate_key_level], "
      "[i].[comment] AS [comment], "
          "[i].[created_time] AS [created_time], "
          "[i].[updated_time] AS [updated_time] "
    "FROM "
      /* CT_INDEX_NAME */
      "[%s] AS [i] "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[i].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[i].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
        "SUM (SET {[au].[object_of]}) "
          "FROM "
        /* CT_CLASSAUTH_NAME */
        "[%s] AS [au] "
          "WHERE "
        "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
          ") "
        "AND [au].[auth_type] = 'SELECT'"
        ")",            
    CT_INDEXKEY_NAME,
        OPTION_DEDUPLICATE_MASK,
    CT_INDEX_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_index_key_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[k].[index_of].[index_name] AS [index_name], "
      "[k].[index_of].[class_of].[class_name] AS [class_name], "
      "CAST ([k].[index_of].[class_of].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[k].[key_attr_name] AS [key_attr_name], "
      "[k].[key_order] AS [key_order], "
      "CASE [k].[asc_desc] WHEN 0 THEN 'ASC' WHEN 1 THEN 'DESC' ELSE 'UNKN' END AS [asc_desc], "
      "[k].[key_prefix_length] AS [key_prefix_length], "
      "[k].[func] AS [func] "
    "FROM "
      /* CT_INDEXKEY_NAME */
      "[%s] AS [k] "
    "WHERE "
          "("
              "[k].[key_attr_name] IS NULL " 
              "OR [k].[key_attr_name] NOT LIKE " DEDUPLICATE_KEY_ATTR_NAME_LIKE_PATTERN
          ")"
          " AND ("       
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[k].[index_of].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[k].[index_of].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_INDEXKEY_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_auth_spec (void)
{
  static char stmt [4096];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "CAST ([a].[grantor].[name] AS VARCHAR(255)) AS [grantor_name], " /* string -> varchar(255) */
      "CAST ([a].[grantee].[name] AS VARCHAR(255)) AS [grantee_name], " /* string -> varchar(255) */
          "CASE [c].[class_type] WHEN 0 THEN 'CLASS' WHEN 1 THEN 'VCLASS' ELSE 'UNKNOWN' END AS [object_type], "
      "[c].[class_name] AS [object_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[a].[auth_type] AS [auth_type], "
      "CASE [a].[is_grantable] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_grantable] "
    "FROM "
      /* CT_CLASSAUTH_NAME, CT_CLASS_NAME */
      "[%s] AS [a], [%s] AS [c] "
    "WHERE "
          "[a].[object_of] = [c].[class_of] "
          "AND [a].[object_type] = 0 "
          "AND ( "
      "{'DBA', [c].[owner].[name], [a].[grantee].[name], [a].[grantor].[name]} * ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") SETNEQ {}"
      ") "
   "UNION ALL "
        "SELECT "
      "CAST ([a].[grantor].[name] AS VARCHAR(255)) AS [grantor_name], " /* string -> varchar(255) */
      "CAST ([a].[grantee].[name] AS VARCHAR(255)) AS [grantee_name], " /* string -> varchar(255) */
          "CASE [s].[sp_type] WHEN 1 THEN 'PROCEDURE' ELSE 'FUNCTION' END AS [object_type], "
          "[s].[sp_name] AS [object_name], "
          "CAST ([s].[owner].[name] AS VARCHAR(255)) AS [owner_name], "
          "[a].[auth_type] AS [auth_type], "
          "CASE [a].[is_grantable] WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_grantable] "
        "FROM "
          /* CT_CLASSAUTH_NAME, CT_STORED_PROC_NAME */
      "[%s] AS [a], [%s] AS [s] "
    "WHERE "
          "[a].[object_of] = [s] "
          "AND [a].[object_type] = 5 "
          "AND ( "
      "{'DBA', [s].[owner].[name], [a].[grantee].[name], [a].[grantor].[name]} * ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") SETNEQ {}"
      ") ",
    CT_CLASSAUTH_NAME,
        CT_CLASS_NAME,
    AU_USER_CLASS_NAME,

        CT_CLASSAUTH_NAME,
        CT_STORED_PROC_NAME,
    AU_USER_CLASS_NAME
        );
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_trigger_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "CAST ([t].[name] AS VARCHAR (255)) AS [trigger_name], " /* string -> varchar(255) */
      "CAST ([t].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[c].[class_name] AS [target_class_name], "
      "CAST ([c].[owner].[name] AS VARCHAR(255)) AS [target_owner_name], " /* string -> varchar(255) */
      "CAST ([t].[target_attribute] AS VARCHAR (255)) AS [target_attr_name], " /* string -> varchar(255) */
      "CASE [t].[target_class_attribute] WHEN 0 THEN 'INSTANCE' ELSE 'CLASS' END AS [target_attr_type], "
      "[t].[action_type] AS [action_type], "
      "[t].[action_time] AS [action_time], "
      "[t].[comment] AS [comment], "
      "[t].[created_time] AS [created_time], "
      "[t].[updated_time] AS [updated_time] "
    "FROM "
      /* TR_CLASS_NAME */
      "[%s] AS [t] "
      /* CT_CLASS_NAME */
      "LEFT OUTER JOIN [%s] AS [c] ON [t].[target_class] = [c].[class_of] "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[t].[owner].[name]} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[c].[class_of]} SUBSETEQ (" /* Why [c] and not [t].[target_class]? */
          "SELECT "
        "SUM (SET {[au].[object_of]}) "
          "FROM "
        /* CT_CLASSAUTH_NAME */
        "[%s] AS [au] "
          "WHERE "
        "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
          ") "
        "AND [au].[auth_type] = 'SELECT'"
        ")",
    TR_CLASS_NAME,
    CT_CLASS_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_partition_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[s].[class_name] AS [class_name], "
      "CAST ([s].[owner].[name] AS VARCHAR(255)) AS [owner_name], " /* string -> varchar(255) */
      "[p].[pname] AS [partition_name], "
      "CONCAT ([s].[class_name], '__p__', [p].[pname]) AS [partition_class_name], " /* It can exceed varchar(255). */
      "CASE [p].[ptype] WHEN 0 THEN 'HASH' WHEN 1 THEN 'RANGE' ELSE 'LIST' END AS [partition_type], "
      "TRIM (SUBSTRING ([pp].[pexpr] FROM 8 FOR (POSITION (' FROM ' IN [pp].[pexpr]) - 8))) AS [partition_expr], "
      "[p].[pvalues] AS [partition_values], "
          "CASE [p].[class_partition_type] WHEN 2 THEN 'PARTITION CLASS' ELSE NULL END AS [class_partition_type], "
      "[p].[comment] AS [comment] "
    "FROM "
      /* CT_PARTITION_NAME */
      "[%s] AS [p], "
      /* CT_CLASS_NAME */
      "[%s] AS [c], TABLE ([c].[super_classes]) AS [t] ([s]), "
      /* CT_CLASS_NAME */
      "[%s] AS [cc], TABLE ([cc].[partition]) AS [tt] ([pp]) "
    "WHERE "
      "[p].[class_of] = [c] "
      "AND [s] = [cc] "
      "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[p].[class_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[p].[class_of].[class_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'SELECT'"
        ")"
        ")",
    CT_PARTITION_NAME,
    CT_CLASS_NAME,
    CT_CLASS_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_stored_procedure_spec (void)
{
  static char stmt [4096];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[sp].[sp_name] AS [sp_name], "
          "[sp].[pkg_name] AS [pkg_name], "
      "CASE [sp].[sp_type] WHEN 1 THEN 'PROCEDURE' ELSE 'FUNCTION' END AS [sp_type], "
      "CASE [sp].[return_type] "
        "WHEN 0 THEN 'void' "
        "WHEN 28 THEN 'CURSOR' "
        /* CT_DATATYPE_NAME */
        "ELSE (SELECT [t].[type_name] FROM [%s] AS [t] WHERE [sp].[return_type] = [t].[type_id]) "
        "END AS [return_type], "
      "[sp].[arg_count] AS [arg_count], "
      "CASE [sp].[lang] WHEN 0 THEN 'PLCSQL' WHEN 1 THEN 'JAVA' ELSE 'UNKNOWN' END AS [lang], "
          "CASE [sp].[directive] & 1 WHEN 0 THEN 'DEFINER' ELSE 'CURRENT_USER' END AS [authid], "
      "CASE [sp].[directive] & 2 WHEN 0 THEN 'NO' ELSE 'YES' END AS [is_deterministic], "
      "CASE [sp].[lang] "
        "WHEN 0 THEN NULL "
        "ELSE CONCAT ([sp].[target_class], '.', [sp].[target_method]) "
        "END AS [target], "
      "CAST ([sp].[owner].[name] AS VARCHAR(255)) AS [owner], " /* string -> varchar(255) */
          "CASE "
        "WHEN {'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") THEN [sp_code].[scode] "
        "WHEN {[sp].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") THEN [sp_code].[scode] "
        "ELSE NULL "
        "END AS [code], "
        // TODO: implement sql_data_access
        //   "CASE [sp].[sql_data_access] "
        //     "WHEN 0 THEN 'NO SQL' "
        //     "WHEN 1 THEN 'CONTAINS SQL' "
        //     "WHEN 2 THEN 'READS SQL DATA' "
        //     "WHEN 3 THEN 'MODIFIES SQL DATA' "
        //     "ELSE NULL "
        //   "END AS [sql_data_access], "
      "[sp].[comment] AS [comment], "
      "[sp].[created_time] AS [created_time], "
      "[sp].[updated_time] AS [updated_time] "
    "FROM "
      /* CT_STORED_PROC_NAME */
      "[%s] AS [sp] "
      /* CT_STORED_PROC_CODE_NAME */
          "LEFT OUTER JOIN [%s] AS [sp_code] ON [sp].[target_class] = [sp_code].[name] "
        "WHERE "
          "[sp].[is_system_generated] = 0"
          "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[sp].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[sp]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'EXECUTE'"
        ")"
        ")",
    CT_DATATYPE_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_STORED_PROC_NAME,
        CT_STORED_PROC_CODE_NAME,
        AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_stored_procedure_args_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[sp].[sp_of].[sp_name] AS [sp_name], "
      "CAST ([sp].[sp_of].[owner].[name] AS VARCHAR(255)) AS [sp_owner_name], " /* string -> varchar(255) */
          "CAST ([sp].[sp_of].[pkg_name] AS VARCHAR(255)) AS [pkg_name], " /* string -> varchar(255) */
      "[sp].[index_of] AS [index_of], "
      "[sp].[arg_name] AS [arg_name], "
      "CASE [sp].[data_type] "
        "WHEN 28 THEN 'CURSOR' "
        /* CT_DATATYPE_NAME */
        "ELSE (SELECT [t].[type_name] FROM [%s] AS [t] WHERE [sp].[data_type] = [t].[type_id]) "
        "END AS [data_type], "
      "CASE [sp].[mode] WHEN 1 THEN 'IN' WHEN 2 THEN 'OUT' ELSE 'INOUT' END AS [mode], "
          "CASE [sp].[is_optional] WHEN 1 THEN 'YES' ELSE 'NO' END AS [is_optional], "
          "[sp].[default_value] AS [default_value], "
      "[sp].[comment] AS [comment] "
    "FROM "
      /* CT_STORED_PROC_ARGS_NAME */
      "[%s] AS [sp] "
        "WHERE "
          "[sp].[is_system_generated] = 0 "
          "AND ("
          "{'DBA'} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[sp].[sp_of].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ") "
          "OR {[sp].[sp_of]} SUBSETEQ ("
          "SELECT "
            "SUM (SET {[au].[object_of]}) "
          "FROM "
            /* CT_CLASSAUTH_NAME */
            "[%s] AS [au] "
          "WHERE "
            "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
              ") "
            "AND [au].[auth_type] = 'EXECUTE'"
        ")"
        ")"
    "ORDER BY " /* Is it possible to remove ORDER BY? */
      "[sp].[sp_of].[sp_name], "
      "[sp].[index_of]",
    CT_DATATYPE_NAME,
    CT_STORED_PROC_ARGS_NAME,
        AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_serial_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
        "SELECT "
          "[serial].[name] AS [name], "
          "CAST ([serial].[owner].[name] AS VARCHAR(255)) AS [owner], "
          "[serial].[current_val] AS [current_val], "
          "[serial].[increment_val] AS [increment_val], "
          "[serial].[max_val] AS [max_val], "
          "[serial].[min_val] AS [min_val], "
          "[serial].[start_val] AS [start_val], "
          "[serial].[cyclic] AS [cyclic], "
          "[serial].[started] AS [started], "
          "[serial].[class_name] AS [class_name], "
          "[serial].[attr_name] AS [attr_name], "
          "[serial].[cached_num] AS [cached_num], "
          "[serial].[comment] AS [comment], "
          "[serial].[created_time] AS [created_time], "
          "[serial].[updated_time] AS [updated_time] "
        "FROM "
      /* CT_SERIAL_NAME */
          "[%s] AS [serial] "
        "WHERE "
          "[serial].[class_name] IS NULL",
        CT_SERIAL_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_ha_apply_info_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
        "SELECT "
          "[log_stat].[db_name] AS [db_name], "
          "[log_stat].[db_creation_time] AS [db_creation_time], "
          "[log_stat].[copied_log_path] AS [copied_log_path], "
          "[log_stat].[committed_lsa_pageid] AS [committed_lsa_pageid], "
          "[log_stat].[committed_lsa_offset] AS [committed_lsa_offset], "
          "[log_stat].[committed_rep_pageid] AS [committed_rep_pageid], "
          "[log_stat].[committed_rep_offset] AS [committed_rep_offset], "
          "[log_stat].[append_lsa_pageid] AS [append_lsa_pageid], "
          "[log_stat].[append_lsa_offset] AS [append_lsa_offset], "
          "[log_stat].[eof_lsa_pageid] AS [eof_lsa_pageid], "
          "[log_stat].[eof_lsa_offset] AS [eof_lsa_offset], "
          "[log_stat].[final_lsa_pageid] AS [final_lsa_pageid], "
          "[log_stat].[final_lsa_offset] AS [final_lsa_offset], "
          "[log_stat].[required_lsa_pageid] AS [required_lsa_pageid], "
          "[log_stat].[required_lsa_offset] AS [required_lsa_offset], "
          "[log_stat].[log_record_time] AS [log_record_time], "
          "[log_stat].[log_commit_time] AS [log_commit_time], "
          "[log_stat].[last_access_time] AS [last_access_time], "
          "[log_stat].[status] AS [status], "
          "[log_stat].[insert_counter] AS [insert_counter], "
          "[log_stat].[update_counter] AS [update_counter], "
          "[log_stat].[delete_counter] AS [delete_counter], "
          "[log_stat].[schema_counter] AS [schema_counter], "
          "[log_stat].[commit_counter] AS [commit_counter], "
          "[log_stat].[fail_counter] AS [fail_counter], "
          "[log_stat].[start_time] AS [start_time] "
        "FROM "
      /* CT_HA_APPLY_INFO_NAME */
          "[%s] AS [log_stat] ",
        CT_HA_APPLY_INFO_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_collation_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[coll].[coll_id] AS [coll_id], "
      "[coll].[coll_name] AS [coll_name], "
      "[ch].[charset_name] AS [charset_name], "
      "CASE [coll].[built_in] WHEN 0 THEN 'No' WHEN 1 THEN 'Yes' ELSE 'ERROR' END AS [is_builtin], "
      "CASE [coll].[expansions] WHEN 0 THEN 'No' WHEN 1 THEN 'Yes' ELSE 'ERROR' END AS [has_expansions], "
      "[coll].[contractions] AS [contractions], "
      "CASE [coll].[uca_strength] "
        "WHEN 0 THEN 'Not applicable' "
        "WHEN 1 THEN 'Primary' "
        "WHEN 2 THEN 'Secondary' "
        "WHEN 3 THEN 'Tertiary' "
        "WHEN 4 THEN 'Quaternary' "
        "WHEN 5 THEN 'Identity' "
        "ELSE 'Unknown' "
        "END AS [uca_strength] "
    "FROM "
      /* CT_COLLATION_NAME */
      "[%s] AS [coll] "
      /* CT_CHARSET_NAME */
      "INNER JOIN [%s] AS [ch] ON [coll].[charset_id] = [ch].[charset_id] "
    "ORDER BY " /* Is it possible to remove ORDER BY? */
      "[coll].[coll_id]",
    CT_COLLATION_NAME,
    CT_CHARSET_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_charset_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[ch].[charset_id] AS [charset_id], "
      "[ch].[charset_name] AS [charset_name], "
      "[coll].[coll_name] AS [default_collation], "
      "[ch].[char_size] AS [char_size] " 
    "FROM "
      /* CT_CHARSET_NAME */
      "[%s] AS [ch], "
      /* CT_COLLATION_NAME */
      "[%s] AS [coll] "
    "WHERE "
      "[ch].[default_collation] = [coll].[coll_id] "
    "ORDER BY " /* Is it possible to remove ORDER BY? */
      "[ch].[charset_id]",
    CT_CHARSET_NAME,
    CT_COLLATION_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_synonym_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[s].[name] AS [synonym_name], "
      "CAST ([s].[owner].[name] AS VARCHAR(255)) AS [synonym_owner_name], " /* string -> varchar(255) */
      "CASE [s].[is_public] WHEN 1 THEN 'YES' ELSE 'NO' END AS [is_public_synonym], "
      "[s].[target_name] AS [target_name], "
      "CAST ([s].[target_owner].[name] AS VARCHAR(255)) AS [target_owner_name], " /* string -> varchar(255) */
      "[s].[comment] AS [comment], "
          "[s].[created_time] AS [created_time], "
          "[s].[updated_time] AS [updated_time] "
    "FROM "
      /* CT_SYNONYM_NAME */
      "[%s] AS [s] "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR [s].[is_public] = 1 "
      "OR ("
          "[s].[is_public] = 0 "
          "AND {[s].[owner].[name]} SUBSETEQ ("
          "SELECT "
            "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
            /* AU_USER_CLASS_NAME */
            "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
            "[u].[name] = CURRENT_USER"
        ")"
        ")",
    CT_SYNONYM_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}

const char *
sm_define_view_server_spec (void)
{
  static char stmt [2048];

  // *INDENT-OFF*
  sprintf (stmt,
    "SELECT "
      "[ds].[link_name] AS [link_name], "
      "[ds].[host] AS [host], "
      "[ds].[port] AS [port], "
      "[ds].[db_name] AS [db_name], "
      "[ds].[user_name] AS [user_name], "
      "[ds].[properties] AS [properties], "
      "CAST ([ds].[owner].[name] AS VARCHAR(255)) AS [owner], " /* string -> varchar(255) */
      "[ds].[comment] AS [comment], "
          "[ds].[created_time] AS [created_time], "
          "[ds].[updated_time] AS [updated_time] "
    "FROM "
      /* CT_SERVER_NAME */
      "[%s] AS [ds] "
    "WHERE "
      "{'DBA'} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[ds].[owner].[name]} SUBSETEQ ("
          "SELECT "
        "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
          "FROM "
        /* AU_USER_CLASS_NAME */
        "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
          "WHERE "
        "[u].[name] = CURRENT_USER"
        ") "
      "OR {[ds]} SUBSETEQ ("
          "SELECT "
        "SUM (SET {[au].[object_of]}) "
          "FROM "
        /* CT_CLASSAUTH_NAME */
        "[%s] AS [au] "
          "WHERE "
        "{[au].[grantee].[name]} SUBSETEQ ("
            "SELECT "
              "SET {CURRENT_USER} + COALESCE (SUM (SET {[t].[g].[name]}), SET {}) "
            "FROM "
              /* AU_USER_CLASS_NAME */
              "[%s] AS [u], TABLE ([u].[groups]) AS [t] ([g]) "
            "WHERE "
              "[u].[name] = CURRENT_USER"
          ") "
        "AND [au].[auth_type] = 'SELECT'"
        ")",
    CT_SERVER_NAME,
    AU_USER_CLASS_NAME,
    AU_USER_CLASS_NAME,
    CT_CLASSAUTH_NAME,
    AU_USER_CLASS_NAME);
  // *INDENT-ON*

  return stmt;
}