22 #include <drizzled/current_session.h>
23 #include <drizzled/gettext.h>
24 #include <drizzled/charset.h>
25 #include <drizzled/plugin/table_function.h>
26 #include <drizzled/session.h>
28 #include <drizzled/table_function_container.h>
29 #include <drizzled/sql_lex.h>
30 #include <drizzled/internal/my_sys.h>
36 static int wild_case_compare(
const charset_info_st *
const cs,
const char *str,
const char *wildstr)
42 while (*wildstr && *wildstr != internal::wild_many && *wildstr != internal::wild_one)
44 if (*wildstr == internal::wild_prefix && wildstr[1])
49 if (cs->toupper(*wildstr++) != cs->toupper(*str++))
58 if (*wildstr++ == internal::wild_one)
72 flag=(*wildstr != internal::wild_many && *wildstr != internal::wild_one);
78 if ((cmp= *wildstr) == internal::wild_prefix && wildstr[1])
83 cmp= cs->toupper(cmp);
85 while (*str && cs->toupper(*str) != cmp)
96 if (wild_case_compare(cs, str, wildstr) == 0)
107 return (*str !=
'\0');
110 static TableFunctionContainer table_functions;
112 void plugin::TableFunction::init()
114 drizzled::message::table::init(proto, getTableLabel(), identifier.getSchemaName(),
"FunctionEngine");
115 proto.set_type(drizzled::message::Table::FUNCTION);
116 proto.set_creation_timestamp(0);
117 proto.set_update_timestamp(0);
118 message::set_is_replicated(proto,
false);
119 message::set_definer(proto, SYSTEM_USER);
122 bool plugin::TableFunction::addPlugin(plugin::TableFunction *tool)
124 assert(tool != NULL);
125 table_functions.addFunction(tool);
129 plugin::TableFunction *plugin::TableFunction::getFunction(
const std::string &arg)
131 return table_functions.getFunction(arg);
134 void plugin::TableFunction::getNames(
const std::string &arg,
135 std::set<std::string> &set_of_names)
137 table_functions.getNames(arg, set_of_names);
140 LEX& plugin::TableFunction::Generator::lex()
142 return getSession().lex();
145 statement::Statement& plugin::TableFunction::Generator::statement()
147 return *lex().statement;
150 plugin::TableFunction::Generator *plugin::TableFunction::generator(Field **arg)
152 return new Generator(arg);
155 void plugin::TableFunction::add_field(
const char *label,
156 uint32_t field_length)
158 add_field(label, TableFunction::STRING, field_length);
161 void plugin::TableFunction::add_field(
const char *label,
162 TableFunction::ColumnType type,
163 bool is_default_null)
165 add_field(label, type, 5, is_default_null);
168 void plugin::TableFunction::add_field(
const char *label,
169 TableFunction::ColumnType type,
170 uint32_t field_length,
171 bool is_default_null)
177 field= proto.add_field();
178 field->set_name(label);
180 field_options= field->mutable_options();
181 field_constraints= field->mutable_constraints();
182 field_options->set_default_null(is_default_null);
183 field_constraints->set_is_notnull(not is_default_null);
187 case TableFunction::STRING:
190 if (field_length >= TABLE_FUNCTION_BLOB_SIZE)
192 field->set_type(drizzled::message::Table::Field::BLOB);
193 string_field_options= field->mutable_string_options();
194 string_field_options->set_collation_id(default_charset_info->number);
195 string_field_options->set_collation(default_charset_info->name);
199 field->set_type(drizzled::message::Table::Field::VARCHAR);
200 string_field_options= field->mutable_string_options();
201 string_field_options->set_length(field_length);
205 case TableFunction::VARBINARY:
208 field->set_type(drizzled::message::Table::Field::VARCHAR);
210 string_field_options= field->mutable_string_options();
211 string_field_options->set_length(field_length);
212 string_field_options->set_collation(my_charset_bin.csname);
213 string_field_options->set_collation_id(my_charset_bin.number);
216 case TableFunction::NUMBER:
217 field->set_type(drizzled::message::Table::Field::BIGINT);
219 case TableFunction::SIZE:
220 field->set_type(drizzled::message::Table::Field::BIGINT);
221 field_constraints->set_is_unsigned(
true);
223 case TableFunction::BOOLEAN:
224 field->set_type(drizzled::message::Table::Field::BOOLEAN);
225 field_constraints->set_is_unsigned(
true);
230 plugin::TableFunction::Generator::Generator(Field **arg) :
232 session(current_session)
234 scs= system_charset_info;
237 bool plugin::TableFunction::Generator::sub_populate(uint32_t field_size)
239 columns_iterator= columns;
240 bool ret= populate();
242 assert(columns_iterator == columns + field_size);
246 void plugin::TableFunction::Generator::push(uint64_t arg)
248 (*columns_iterator)->store(static_cast<int64_t>(arg),
true);
249 (*columns_iterator)->set_notnull();
253 void plugin::TableFunction::Generator::push(int64_t arg)
255 (*columns_iterator)->store(arg,
false);
256 (*columns_iterator)->set_notnull();
260 void plugin::TableFunction::Generator::push(
const char *arg, uint32_t length)
262 assert(columns_iterator);
263 assert(*columns_iterator);
264 if (arg and length == 0)
269 if ((*columns_iterator)->char_length() < length)
271 length= (*columns_iterator)->char_length();
274 (*columns_iterator)->store(arg, length, scs);
275 (*columns_iterator)->set_notnull();
279 void plugin::TableFunction::Generator::push()
282 assert((*columns_iterator)->maybe_null());
283 (*columns_iterator)->set_null();
287 void plugin::TableFunction::Generator::push(
str_ref arg)
289 push(arg.data(), arg.size());
292 void plugin::TableFunction::Generator::push(
bool arg)
296 (*columns_iterator)->store(
"YES", 3, scs);
300 (*columns_iterator)->store(
"NO", 2, scs);
305 bool plugin::TableFunction::Generator::isWild(
const std::string &predicate)
307 return lex().wild ? wild_case_compare(system_charset_info, predicate.c_str(), lex().wild->ptr()) :
false;
TODO: Rename this file - func.h is stupid.