unittest/gunit/dd_info_schema_native_func-t.cc (126 lines of code) (raw):
/* Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved.
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; version 2 of the License.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation,
   51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA */
// First include (the generated) my_config.h, to get correct platform defines.
#include "my_config.h"
#include <gtest/gtest.h>
#include "test_utils.h"
#include "item_func.h"
#include "item_timefunc.h"
#include "parse_tree_helpers.h"
namespace dd_info_schema_native_func {
using my_testing::Server_initializer;
/*
  Test fixture for testing native functions introduced for the
  INFORMATION_SCHEMA.
*/
class ISNativeFuncTest : public ::testing::Test
{
protected:
  virtual void SetUp()
  {
    initializer.SetUp();
  }
  virtual void TearDown() { initializer.TearDown(); }
  THD *thd() { return initializer.thd(); }
  Server_initializer initializer;
};
// Test case to verify native functions with all NULL arguments.
TEST_F(ISNativeFuncTest, AllNullArguments)
{
  Item *item= nullptr;
  Item_null *null= new (thd()->mem_root)Item_null();
  PT_item_list *null_list= new (thd()->mem_root)PT_item_list;
  auto prepare_null_list= [](PT_item_list *null_list, Item_null *null, int cnt)
                          {
                            for(int i= 0; i < cnt; i++)
                              null_list->push_front(null);
                            return null_list;
                          };
#define NULL_ARG        null
#define TWO_NULL_ARGS   NULL_ARG, NULL_ARG
#define THREE_NULL_ARGS TWO_NULL_ARGS, NULL_ARG
#define FOUR_NULL_ARGS  THREE_NULL_ARGS, NULL_ARG
#define FIVE_NULL_ARGS  FOUR_NULL_ARGS, NULL_ARG
#define CREATE_ITEM(X, ARGS) item= new (thd()->mem_root)X(POS(), ARGS)
  // INTERNAL_TABLE_ROWS(NULL, NULL, NULL, NULL, NULL);
  CREATE_ITEM(Item_func_internal_table_rows,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_AVG_ROW_LENGTH(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_avg_row_length,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_DATA_LENGTH(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_data_length,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_MAX_DATA_LENGTH(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_max_data_length,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_INDEX_LENGTH(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_index_length,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_DATA_FREE(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_data_free,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_AUTO_INCREMENT(NULL, NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_auto_increment,
              prepare_null_list(null_list, null, 6));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_UPDATE_TIME(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_update_time,
              prepare_null_list(null_list, null, 5));
  MYSQL_TIME ldate;
  item->get_date(&ldate, 0);
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_CHECK_TIME(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_check_time,
              prepare_null_list(null_list, null, 5));
  item->get_date(&ldate, 0);
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_CHECKSUM(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_checksum,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_DD_CHAR_LENGTH(NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_dd_char_length, FOUR_NULL_ARGS);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_GET_VIEW_WARNING_OR_ERROR(NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_get_view_warning_or_error,
              prepare_null_list(null_list, null, 4));
  // null_value is not set in this function. So verifying only val_int() return
  // value.
  EXPECT_EQ(0, item->val_int());
  // INTERNAL_GET_COMMENT_OR_ERROR(NULL, NULL, NULL, NULL, NULL)
  String str;
  CREATE_ITEM(Item_func_internal_get_comment_or_error,
              prepare_null_list(null_list, null, 5));
  item->val_str(&str);
  EXPECT_EQ(1, item->null_value);
  // INTERNAL_INDEX_COLUMN_CARDINALITY(NULL, NULL, NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_internal_index_column_cardinality,
              prepare_null_list(null_list, null, 8));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // GET_DD_INDEX_SUB_PART_LENGTH(NULL, NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_get_dd_index_sub_part_length,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // GET_DD_COLUMN_PRIVILEGES(NULL, NULL, NULL)
  CREATE_ITEM(Item_func_get_dd_column_privileges, THREE_NULL_ARGS);
  // Empty string value is returned in this case.
  EXPECT_EQ(static_cast<size_t>(0), (item->val_str(&str))->length());
  // INTERNAL_KEYS_DISABLED(NULL)
  CREATE_ITEM(Item_func_internal_keys_disabled, NULL_ARG);
  EXPECT_EQ(0, item->val_int());
  // CAN_ACCESS_DATABASE(NULL)
  CREATE_ITEM(Item_func_can_access_database, NULL_ARG);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_TABLE(NULL, NULL)
  CREATE_ITEM(Item_func_can_access_table, TWO_NULL_ARGS);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_VIEW(NULL, NULL, NULL, NULL)
  CREATE_ITEM(Item_func_can_access_view, FOUR_NULL_ARGS);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_COLUMN(NULL, NULL, NULL)
  CREATE_ITEM(Item_func_can_access_column, THREE_NULL_ARGS);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_TRIGGER(NULL, NULL, NULL)
  CREATE_ITEM(Item_func_can_access_trigger, TWO_NULL_ARGS);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_ROUTINE(NULL, NULL, NULL)
  CREATE_ITEM(Item_func_can_access_routine,
              prepare_null_list(null_list, null, 5));
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // CAN_ACCESS_EVENT(NULL, NULL, NULL)
  CREATE_ITEM(Item_func_can_access_event, NULL_ARG);
  item->val_int();
  EXPECT_EQ(1, item->null_value);
  // GET_DD_CREATE_OPTIONS(NULL, NULL)
  CREATE_ITEM(Item_func_get_dd_create_options, TWO_NULL_ARGS);
  // Empty string value is returned in this case.
  EXPECT_EQ(static_cast<size_t>(0), (item->val_str(&str))->length());
}
} //namespace