/* Copyright (C) 2019 MariaDB Corporation 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, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #pragma once int is_columnstore_extents_plugin_init(void* p); int is_columnstore_files_plugin_init(void* p); int is_columnstore_tables_plugin_init(void* p); int is_columnstore_columns_plugin_init(void* p); class InformationSchemaCond { StringBuffer mBufferTableName; StringBuffer mBufferTableSchema; String *mTableName; String *mTableSchema; public: InformationSchemaCond() :mBufferTableName(system_charset_info), mBufferTableSchema(system_charset_info), mTableName(nullptr), mTableSchema(nullptr) { } const String *tableName() const { return mTableName; } const String *tableSchema() const { return mTableSchema; } static bool eqName(const String &a, const std::string &b) { return a.length() == b.length() && !memcmp(a.ptr(), b.data(), a.length()); } static bool eqName(const String *a, const std::string &b) { return !a || eqName(*a, b); } bool match(const std::string &schema, const std::string &table) const { return eqName(mTableName, table) && eqName(mTableSchema, schema); } void getCondItem(Item_field *item_field, Item *item_const) { if (strcasecmp(item_field->field_name.str, "table_name") == 0) { mTableName = item_const->val_str(&mBufferTableName); } else if (strcasecmp(item_field->field_name.str, "table_schema") == 0) { mTableSchema = item_const->val_str(&mBufferTableSchema); } } void getCondItemBoolFunc2(Item_bool_func2 *func) { Item_field *field = dynamic_cast(func->arguments()[0]->real_item()); if (field && func->arguments()[1]->const_item()) getCondItem(field, func->arguments()[1]); } void getCondItems(COND* cond) { if (Item_bool_func2 *func = dynamic_cast(cond)) { getCondItemBoolFunc2(func); } else if (Item_cond_and *subcond = dynamic_cast(cond)) { List_iterator li(*(subcond)->argument_list()); for (Item *item = li++; item ; item = li++ ) getCondItems(item); } } };