mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
MDEV-4022 table attributes with sysvar as a default value
This commit is contained in:
@ -7,7 +7,7 @@ show create table t1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) NOT NULL
|
`a` int(11) NOT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='5'
|
||||||
/*!50100 PARTITION BY LIST (a)
|
/*!50100 PARTITION BY LIST (a)
|
||||||
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
|
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
|
||||||
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
|
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
|
||||||
@ -20,7 +20,7 @@ show create table t1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) NOT NULL
|
`a` int(11) NOT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ull`=12340
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ull`=12340 `VAROPT`='5'
|
||||||
/*!50100 PARTITION BY LIST (a)
|
/*!50100 PARTITION BY LIST (a)
|
||||||
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
|
(PARTITION p0 VALUES IN (1) ENGINE = EXAMPLE,
|
||||||
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
|
PARTITION p1 VALUES IN (2) ENGINE = EXAMPLE) */
|
||||||
|
@ -49,6 +49,7 @@ show variables like 'example%';
|
|||||||
Variable_name Value
|
Variable_name Value
|
||||||
example_enum_var e1
|
example_enum_var e1
|
||||||
example_ulong_var 500
|
example_ulong_var 500
|
||||||
|
example_varopt_default 5
|
||||||
UNINSTALL SONAME 'ha_example';
|
UNINSTALL SONAME 'ha_example';
|
||||||
Warnings:
|
Warnings:
|
||||||
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
Warning 1620 Plugin is busy and will be uninstalled on shutdown
|
||||||
@ -119,7 +120,7 @@ show create table t1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL `complex`='c,f,f,f'
|
`a` int(11) DEFAULT NULL `complex`='c,f,f,f'
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000 `STR`='dskj' `one_or_two`='one' `YESNO`=0
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000 `STR`='dskj' `one_or_two`='one' `YESNO`=0 `VAROPT`='5'
|
||||||
drop table t1;
|
drop table t1;
|
||||||
SET @OLD_SQL_MODE=@@SQL_MODE;
|
SET @OLD_SQL_MODE=@@SQL_MODE;
|
||||||
SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS';
|
SET SQL_MODE='IGNORE_BAD_TABLE_OPTIONS';
|
||||||
@ -133,20 +134,20 @@ show create table t1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000000000000000000 `one_or_two`='ttt' `YESNO`=SSS
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=10000000000000000000 `one_or_two`='ttt' `YESNO`=SSS `VAROPT`='5'
|
||||||
#alter table
|
#alter table
|
||||||
alter table t1 ULL=10000000;
|
alter table t1 ULL=10000000;
|
||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `ULL`=10000000
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `VAROPT`='5' `ULL`=10000000
|
||||||
alter table t1 change a a int complex='c,c,c';
|
alter table t1 change a a int complex='c,c,c';
|
||||||
show create table t1;
|
show create table t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL `complex`='c,c,c'
|
`a` int(11) DEFAULT NULL `complex`='c,c,c'
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `ULL`=10000000
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `one_or_two`='ttt' `YESNO`=SSS `VAROPT`='5' `ULL`=10000000
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#illegal value error
|
#illegal value error
|
||||||
SET SQL_MODE='';
|
SET SQL_MODE='';
|
||||||
@ -161,17 +162,38 @@ SHOW CREATE TABLE t1;
|
|||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=4660
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `ULL`=4660 `VAROPT`='5'
|
||||||
|
SET example_varopt_default=33;
|
||||||
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
|
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
|
||||||
create_options
|
create_options
|
||||||
`ULL`=4660
|
`ULL`=4660 `VAROPT`='5'
|
||||||
ALTER TABLE t1 ULL=DEFAULT;
|
ALTER TABLE t1 ULL=DEFAULT;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(11) DEFAULT NULL
|
`a` int(11) DEFAULT NULL
|
||||||
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='5'
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
create table t1 (a int) engine=example;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='33'
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (a int) engine=example varopt=15;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `varopt`=15
|
||||||
|
alter table t1 varopt=default;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` int(11) DEFAULT NULL
|
||||||
|
) ENGINE=EXAMPLE DEFAULT CHARSET=latin1 `VAROPT`='33'
|
||||||
|
drop table t1;
|
||||||
SET @@SQL_MODE=@OLD_SQL_MODE;
|
SET @@SQL_MODE=@OLD_SQL_MODE;
|
||||||
select 1;
|
select 1;
|
||||||
1
|
1
|
||||||
|
@ -144,6 +144,7 @@ CREATE TABLE t1 (a int) ENGINE=example ULL=1e2;
|
|||||||
|
|
||||||
CREATE TABLE t1 (a int) ENGINE=example ULL=0x1234;
|
CREATE TABLE t1 (a int) ENGINE=example ULL=0x1234;
|
||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
|
SET example_varopt_default=33; # does not affect varopt of t1
|
||||||
|
|
||||||
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
|
select create_options from information_schema.tables where table_schema='test' and table_name='t1';
|
||||||
|
|
||||||
@ -152,6 +153,16 @@ SHOW CREATE TABLE t1;
|
|||||||
|
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
create table t1 (a int) engine=example; # varopt is 10
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (a int) engine=example varopt=15;
|
||||||
|
show create table t1;
|
||||||
|
alter table t1 varopt=default;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
SET @@SQL_MODE=@OLD_SQL_MODE;
|
SET @@SQL_MODE=@OLD_SQL_MODE;
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "create_options.h"
|
#include "create_options.h"
|
||||||
#include <my_getopt.h>
|
#include <my_getopt.h>
|
||||||
|
#include "set_var.h"
|
||||||
|
|
||||||
#define FRM_QUOTED_VALUE 0x8000
|
#define FRM_QUOTED_VALUE 0x8000
|
||||||
|
|
||||||
@ -115,7 +116,7 @@ static bool report_unknown_option(THD *thd, engine_option_value *val,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool set_one_value(ha_create_table_option *opt,
|
static bool set_one_value(ha_create_table_option *opt,
|
||||||
THD *thd, LEX_STRING *value, void *base,
|
THD *thd, const LEX_STRING *value, void *base,
|
||||||
bool suppress_warning,
|
bool suppress_warning,
|
||||||
MEM_ROOT *root)
|
MEM_ROOT *root)
|
||||||
{
|
{
|
||||||
@ -126,6 +127,8 @@ static bool set_one_value(ha_create_table_option *opt,
|
|||||||
(value->str ? value->str : "<DEFAULT>")));
|
(value->str ? value->str : "<DEFAULT>")));
|
||||||
switch (opt->type)
|
switch (opt->type)
|
||||||
{
|
{
|
||||||
|
case HA_OPTION_TYPE_SYSVAR:
|
||||||
|
DBUG_ASSERT(0); // HA_OPTION_TYPE_SYSVAR's are replaced in resolve_sysvars()
|
||||||
case HA_OPTION_TYPE_ULL:
|
case HA_OPTION_TYPE_ULL:
|
||||||
{
|
{
|
||||||
ulonglong *val= (ulonglong*)((char*)base + opt->offset);
|
ulonglong *val= (ulonglong*)((char*)base + opt->offset);
|
||||||
@ -257,51 +260,92 @@ static const size_t ha_option_type_sizeof[]=
|
|||||||
@retval FALSE OK
|
@retval FALSE OK
|
||||||
*/
|
*/
|
||||||
|
|
||||||
bool parse_option_list(THD* thd, void *option_struct_arg,
|
bool parse_option_list(THD* thd, handlerton *hton, void *option_struct_arg,
|
||||||
engine_option_value *option_list,
|
engine_option_value **option_list,
|
||||||
ha_create_table_option *rules,
|
ha_create_table_option *rules,
|
||||||
bool suppress_warning, MEM_ROOT *root)
|
bool suppress_warning, MEM_ROOT *root)
|
||||||
{
|
{
|
||||||
ha_create_table_option *opt;
|
ha_create_table_option *opt;
|
||||||
size_t option_struct_size= 0;
|
size_t option_struct_size= 0;
|
||||||
engine_option_value *val= option_list;
|
engine_option_value *val, *last;
|
||||||
void **option_struct= (void**)option_struct_arg;
|
void **option_struct= (void**)option_struct_arg;
|
||||||
DBUG_ENTER("parse_option_list");
|
DBUG_ENTER("parse_option_list");
|
||||||
DBUG_PRINT("enter",
|
DBUG_PRINT("enter",
|
||||||
("struct: %p list: %p rules: %p suppress_warning: %u root: %p",
|
("struct: %p list: %p rules: %p suppress_warning: %u root: %p",
|
||||||
*option_struct, option_list, rules,
|
*option_struct, *option_list, rules,
|
||||||
(uint) suppress_warning, root));
|
(uint) suppress_warning, root));
|
||||||
|
|
||||||
if (rules)
|
if (rules)
|
||||||
{
|
{
|
||||||
LEX_STRING default_val= null_lex_str;
|
|
||||||
for (opt= rules; opt->name; opt++)
|
for (opt= rules; opt->name; opt++)
|
||||||
set_if_bigger(option_struct_size, opt->offset +
|
set_if_bigger(option_struct_size, opt->offset +
|
||||||
ha_option_type_sizeof[opt->type]);
|
ha_option_type_sizeof[opt->type]);
|
||||||
|
|
||||||
*option_struct= alloc_root(root, option_struct_size);
|
*option_struct= alloc_root(root, option_struct_size);
|
||||||
|
|
||||||
/* set all values to default */
|
|
||||||
for (opt= rules; opt->name; opt++)
|
|
||||||
set_one_value(opt, thd, &default_val, *option_struct,
|
|
||||||
suppress_warning, root);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; val; val= val->next)
|
for (opt= rules; opt && opt->name; opt++)
|
||||||
{
|
{
|
||||||
for (opt= rules; opt && opt->name; opt++)
|
bool seen=false;
|
||||||
|
for (val= *option_list; val; val= val->next)
|
||||||
{
|
{
|
||||||
|
last= val;
|
||||||
if (my_strnncoll(system_charset_info,
|
if (my_strnncoll(system_charset_info,
|
||||||
(uchar*)opt->name, opt->name_length,
|
(uchar*)opt->name, opt->name_length,
|
||||||
(uchar*)val->name.str, val->name.length))
|
(uchar*)val->name.str, val->name.length))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
seen=true;
|
||||||
|
|
||||||
|
if (val->parsed && !val->value.str)
|
||||||
|
continue;
|
||||||
|
|
||||||
if (set_one_value(opt, thd, &val->value,
|
if (set_one_value(opt, thd, &val->value,
|
||||||
*option_struct, suppress_warning || val->parsed, root))
|
*option_struct, suppress_warning || val->parsed, root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
val->parsed= true;
|
val->parsed= true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!seen)
|
||||||
|
{
|
||||||
|
LEX_STRING default_val= null_lex_str;
|
||||||
|
|
||||||
|
/*
|
||||||
|
If it's CREATE/ALTER TABLE parsing mode (options are created in the
|
||||||
|
transient thd->mem_root, not in the long living TABLE_SHARE::mem_root),
|
||||||
|
and variable-backed option was not explicitly set.
|
||||||
|
|
||||||
|
If it's not create, but opening of the existing frm (that was,
|
||||||
|
probably, created with the older version of the storage engine and
|
||||||
|
does not have this option stored), we take the *default* value of the
|
||||||
|
sysvar, not the *current* value. Because we don't want to have
|
||||||
|
different option values for the same table if it's opened many times.
|
||||||
|
*/
|
||||||
|
if (root == thd->mem_root && opt->var)
|
||||||
|
{
|
||||||
|
// take a value from the variable and add it to the list
|
||||||
|
sys_var *sysvar= find_hton_sysvar(hton, opt->var);
|
||||||
|
DBUG_ASSERT(sysvar);
|
||||||
|
|
||||||
|
char buf[256];
|
||||||
|
String sbuf(buf, sizeof(buf), system_charset_info), *str;
|
||||||
|
if ((str= sysvar->val_str(&sbuf, thd, OPT_SESSION, 0)))
|
||||||
|
{
|
||||||
|
LEX_STRING name= { const_cast<char*>(opt->name), opt->name_length };
|
||||||
|
default_val.str= strmake_root(root, str->ptr(), str->length());
|
||||||
|
default_val.length= str->length();
|
||||||
|
val= new (root) engine_option_value(name, default_val, true,
|
||||||
|
option_list, &last);
|
||||||
|
val->parsed= true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set_one_value(opt, thd, &default_val, *option_struct,
|
||||||
|
suppress_warning, root);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (val= *option_list; val; val= val->next)
|
||||||
|
{
|
||||||
if (report_unknown_option(thd, val, suppress_warning))
|
if (report_unknown_option(thd, val, suppress_warning))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
val->parsed= true;
|
val->parsed= true;
|
||||||
@ -311,6 +355,102 @@ bool parse_option_list(THD* thd, void *option_struct_arg,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Resolves all HA_OPTION_TYPE_SYSVAR elements.
|
||||||
|
|
||||||
|
This is done when an engine is loaded.
|
||||||
|
*/
|
||||||
|
static bool resolve_sysvars(handlerton *hton, ha_create_table_option *rules)
|
||||||
|
{
|
||||||
|
for (ha_create_table_option *opt= rules; opt && opt->name; opt++)
|
||||||
|
{
|
||||||
|
if (opt->type == HA_OPTION_TYPE_SYSVAR)
|
||||||
|
{
|
||||||
|
struct my_option optp;
|
||||||
|
plugin_opt_set_limits(&optp, opt->var);
|
||||||
|
switch(optp.var_type) {
|
||||||
|
case GET_ULL:
|
||||||
|
case GET_ULONG:
|
||||||
|
case GET_UINT:
|
||||||
|
opt->type= HA_OPTION_TYPE_ULL;
|
||||||
|
opt->def_value= (ulonglong)optp.def_value;
|
||||||
|
opt->min_value= (ulonglong)optp.min_value;
|
||||||
|
opt->max_value= (ulonglong)optp.max_value;
|
||||||
|
opt->block_size= (ulonglong)optp.block_size;
|
||||||
|
break;
|
||||||
|
case GET_STR:
|
||||||
|
case GET_STR_ALLOC:
|
||||||
|
opt->type= HA_OPTION_TYPE_STRING;
|
||||||
|
break;
|
||||||
|
case GET_BOOL:
|
||||||
|
opt->type= HA_OPTION_TYPE_BOOL;
|
||||||
|
opt->def_value= optp.def_value;
|
||||||
|
break;
|
||||||
|
case GET_ENUM:
|
||||||
|
{
|
||||||
|
opt->type= HA_OPTION_TYPE_ENUM;
|
||||||
|
opt->def_value= optp.def_value;
|
||||||
|
|
||||||
|
char buf[256];
|
||||||
|
String str(buf, sizeof(buf), system_charset_info);
|
||||||
|
for (const char **s= optp.typelib->type_names; *s; s++)
|
||||||
|
{
|
||||||
|
if (str.append(*s) || str.append(','))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
DBUG_ASSERT(str.length());
|
||||||
|
opt->values= my_strndup(str.ptr(), str.length()-1, MYF(MY_WME));
|
||||||
|
if (!opt->values)
|
||||||
|
return 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool resolve_sysvar_table_options(handlerton *hton)
|
||||||
|
{
|
||||||
|
return resolve_sysvars(hton, hton->table_options) ||
|
||||||
|
resolve_sysvars(hton, hton->field_options) ||
|
||||||
|
resolve_sysvars(hton, hton->index_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Restore HA_OPTION_TYPE_SYSVAR options back as they were
|
||||||
|
before resolve_sysvars().
|
||||||
|
|
||||||
|
This is done when the engine is unloaded, so that we could
|
||||||
|
call resolve_sysvars() if the engine is installed again.
|
||||||
|
*/
|
||||||
|
static void free_sysvars(handlerton *hton, ha_create_table_option *rules)
|
||||||
|
{
|
||||||
|
for (ha_create_table_option *opt= rules; opt && opt->name; opt++)
|
||||||
|
{
|
||||||
|
if (opt->var)
|
||||||
|
{
|
||||||
|
my_free(const_cast<char*>(opt->values));
|
||||||
|
opt->type= HA_OPTION_TYPE_SYSVAR;
|
||||||
|
opt->def_value= 0;
|
||||||
|
opt->min_value= 0;
|
||||||
|
opt->max_value= 0;
|
||||||
|
opt->block_size= 0;
|
||||||
|
opt->values= 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_sysvar_table_options(handlerton *hton)
|
||||||
|
{
|
||||||
|
free_sysvars(hton, hton->table_options);
|
||||||
|
free_sysvars(hton, hton->field_options);
|
||||||
|
free_sysvars(hton, hton->index_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parses all table/fields/keys options
|
Parses all table/fields/keys options
|
||||||
|
|
||||||
@ -327,21 +467,22 @@ bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share)
|
|||||||
MEM_ROOT *root= &share->mem_root;
|
MEM_ROOT *root= &share->mem_root;
|
||||||
DBUG_ENTER("parse_engine_table_options");
|
DBUG_ENTER("parse_engine_table_options");
|
||||||
|
|
||||||
if (parse_option_list(thd, &share->option_struct, share->option_list,
|
if (parse_option_list(thd, ht, &share->option_struct, & share->option_list,
|
||||||
ht->table_options, TRUE, root))
|
ht->table_options, TRUE, root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
|
||||||
for (Field **field= share->field; *field; field++)
|
for (Field **field= share->field; *field; field++)
|
||||||
{
|
{
|
||||||
if (parse_option_list(thd, &(*field)->option_struct, (*field)->option_list,
|
if (parse_option_list(thd, ht, &(*field)->option_struct,
|
||||||
|
& (*field)->option_list,
|
||||||
ht->field_options, TRUE, root))
|
ht->field_options, TRUE, root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint index= 0; index < share->keys; index ++)
|
for (uint index= 0; index < share->keys; index ++)
|
||||||
{
|
{
|
||||||
if (parse_option_list(thd, &share->key_info[index].option_struct,
|
if (parse_option_list(thd, ht, &share->key_info[index].option_struct,
|
||||||
share->key_info[index].option_list,
|
& share->key_info[index].option_list,
|
||||||
ht->index_options, TRUE, root))
|
ht->index_options, TRUE, root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
}
|
}
|
||||||
|
@ -69,9 +69,11 @@ class engine_option_value: public Sql_alloc
|
|||||||
typedef struct st_key KEY;
|
typedef struct st_key KEY;
|
||||||
class Create_field;
|
class Create_field;
|
||||||
|
|
||||||
|
bool resolve_sysvar_table_options(handlerton *hton);
|
||||||
|
void free_sysvar_table_options(handlerton *hton);
|
||||||
bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share);
|
bool parse_engine_table_options(THD *thd, handlerton *ht, TABLE_SHARE *share);
|
||||||
bool parse_option_list(THD* thd, void *option_struct,
|
bool parse_option_list(THD* thd, handlerton *hton, void *option_struct,
|
||||||
engine_option_value *option_list,
|
engine_option_value **option_list,
|
||||||
ha_create_table_option *rules,
|
ha_create_table_option *rules,
|
||||||
bool suppress_warning, MEM_ROOT *root);
|
bool suppress_warning, MEM_ROOT *root);
|
||||||
bool engine_table_options_frm_read(const uchar *buff, uint length,
|
bool engine_table_options_frm_read(const uchar *buff, uint length,
|
||||||
|
@ -448,6 +448,9 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free_sysvar_table_options(hton);
|
||||||
|
update_discovery_counters(hton, -1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
In case a plugin is uninstalled and re-installed later, it should
|
In case a plugin is uninstalled and re-installed later, it should
|
||||||
reuse an array slot. Otherwise the number of uninstall/install
|
reuse an array slot. Otherwise the number of uninstall/install
|
||||||
@ -461,8 +464,6 @@ int ha_finalize_handlerton(st_plugin_int *plugin)
|
|||||||
hton2plugin[hton->slot]= NULL;
|
hton2plugin[hton->slot]= NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_discovery_counters(hton, -1);
|
|
||||||
|
|
||||||
my_free(hton);
|
my_free(hton);
|
||||||
|
|
||||||
end:
|
end:
|
||||||
@ -603,6 +604,7 @@ int ha_initialize_handlerton(st_plugin_int *plugin)
|
|||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
resolve_sysvar_table_options(hton);
|
||||||
update_discovery_counters(hton, 1);
|
update_discovery_counters(hton, 1);
|
||||||
|
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
|
@ -714,22 +714,26 @@ struct ha_index_option_struct;
|
|||||||
enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
|
enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
|
||||||
HA_OPTION_TYPE_STRING, /* char * */
|
HA_OPTION_TYPE_STRING, /* char * */
|
||||||
HA_OPTION_TYPE_ENUM, /* uint */
|
HA_OPTION_TYPE_ENUM, /* uint */
|
||||||
HA_OPTION_TYPE_BOOL}; /* bool */
|
HA_OPTION_TYPE_BOOL, /* bool */
|
||||||
|
HA_OPTION_TYPE_SYSVAR};/* type of the sysval */
|
||||||
|
|
||||||
#define HA_xOPTION_NUMBER(name, struc, field, def, min, max, blk_siz) \
|
#define HA_xOPTION_NUMBER(name, struc, field, def, min, max, blk_siz) \
|
||||||
{ HA_OPTION_TYPE_ULL, name, sizeof(name)-1, \
|
{ HA_OPTION_TYPE_ULL, name, sizeof(name)-1, \
|
||||||
offsetof(struc, field), def, min, max, blk_siz, 0 }
|
offsetof(struc, field), def, min, max, blk_siz, 0, 0 }
|
||||||
#define HA_xOPTION_STRING(name, struc, field) \
|
#define HA_xOPTION_STRING(name, struc, field) \
|
||||||
{ HA_OPTION_TYPE_STRING, name, sizeof(name)-1, \
|
{ HA_OPTION_TYPE_STRING, name, sizeof(name)-1, \
|
||||||
offsetof(struc, field), 0, 0, 0, 0, 0 }
|
offsetof(struc, field), 0, 0, 0, 0, 0, 0}
|
||||||
#define HA_xOPTION_ENUM(name, struc, field, values, def) \
|
#define HA_xOPTION_ENUM(name, struc, field, values, def) \
|
||||||
{ HA_OPTION_TYPE_ENUM, name, sizeof(name)-1, \
|
{ HA_OPTION_TYPE_ENUM, name, sizeof(name)-1, \
|
||||||
offsetof(struc, field), def, 0, \
|
offsetof(struc, field), def, 0, \
|
||||||
sizeof(values)-1, 0, values }
|
sizeof(values)-1, 0, values, 0 }
|
||||||
#define HA_xOPTION_BOOL(name, struc, field, def) \
|
#define HA_xOPTION_BOOL(name, struc, field, def) \
|
||||||
{ HA_OPTION_TYPE_BOOL, name, sizeof(name)-1, \
|
{ HA_OPTION_TYPE_BOOL, name, sizeof(name)-1, \
|
||||||
offsetof(struc, field), def, 0, 1, 0, 0 }
|
offsetof(struc, field), def, 0, 1, 0, 0, 0 }
|
||||||
#define HA_xOPTION_END { HA_OPTION_TYPE_ULL, 0, 0, 0, 0, 0, 0, 0, 0 }
|
#define HA_xOPTION_SYSVAR(name, struc, field, sysvar) \
|
||||||
|
{ HA_OPTION_TYPE_SYSVAR, name, sizeof(name)-1, \
|
||||||
|
offsetof(struc, field), 0, 0, 0, 0, 0, MYSQL_SYSVAR(sysvar) }
|
||||||
|
#define HA_xOPTION_END { HA_OPTION_TYPE_ULL, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||||
|
|
||||||
#define HA_TOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
#define HA_TOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
||||||
HA_xOPTION_NUMBER(name, ha_table_option_struct, field, def, min, max, blk_siz)
|
HA_xOPTION_NUMBER(name, ha_table_option_struct, field, def, min, max, blk_siz)
|
||||||
@ -739,6 +743,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
|
|||||||
HA_xOPTION_ENUM(name, ha_table_option_struct, field, values, def)
|
HA_xOPTION_ENUM(name, ha_table_option_struct, field, values, def)
|
||||||
#define HA_TOPTION_BOOL(name, field, def) \
|
#define HA_TOPTION_BOOL(name, field, def) \
|
||||||
HA_xOPTION_BOOL(name, ha_table_option_struct, field, def)
|
HA_xOPTION_BOOL(name, ha_table_option_struct, field, def)
|
||||||
|
#define HA_TOPTION_SYSVAR(name, field, sysvar) \
|
||||||
|
HA_xOPTION_SYSVAR(name, ha_table_option_struct, field, sysvar)
|
||||||
#define HA_TOPTION_END HA_xOPTION_END
|
#define HA_TOPTION_END HA_xOPTION_END
|
||||||
|
|
||||||
#define HA_FOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
#define HA_FOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
||||||
@ -749,6 +755,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
|
|||||||
HA_xOPTION_ENUM(name, ha_field_option_struct, field, values, def)
|
HA_xOPTION_ENUM(name, ha_field_option_struct, field, values, def)
|
||||||
#define HA_FOPTION_BOOL(name, field, def) \
|
#define HA_FOPTION_BOOL(name, field, def) \
|
||||||
HA_xOPTION_BOOL(name, ha_field_option_struct, field, def)
|
HA_xOPTION_BOOL(name, ha_field_option_struct, field, def)
|
||||||
|
#define HA_FOPTION_SYSVAR(name, field, sysvar) \
|
||||||
|
HA_xOPTION_SYSVAR(name, ha_field_option_struct, field, sysvar)
|
||||||
#define HA_FOPTION_END HA_xOPTION_END
|
#define HA_FOPTION_END HA_xOPTION_END
|
||||||
|
|
||||||
#define HA_IOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
#define HA_IOPTION_NUMBER(name, field, def, min, max, blk_siz) \
|
||||||
@ -759,6 +767,8 @@ enum ha_option_type { HA_OPTION_TYPE_ULL, /* unsigned long long */
|
|||||||
HA_xOPTION_ENUM(name, ha_index_option_struct, field, values, def)
|
HA_xOPTION_ENUM(name, ha_index_option_struct, field, values, def)
|
||||||
#define HA_IOPTION_BOOL(name, field, values, def) \
|
#define HA_IOPTION_BOOL(name, field, values, def) \
|
||||||
HA_xOPTION_BOOL(name, ha_index_option_struct, field, values, def)
|
HA_xOPTION_BOOL(name, ha_index_option_struct, field, values, def)
|
||||||
|
#define HA_IOPTION_SYSVAR(name, field, sysvar) \
|
||||||
|
HA_xOPTION_SYSVAR(name, ha_index_option_struct, field, sysvar)
|
||||||
#define HA_IOPTION_END HA_xOPTION_END
|
#define HA_IOPTION_END HA_xOPTION_END
|
||||||
|
|
||||||
typedef struct st_ha_create_table_option {
|
typedef struct st_ha_create_table_option {
|
||||||
@ -769,6 +779,7 @@ typedef struct st_ha_create_table_option {
|
|||||||
ulonglong def_value;
|
ulonglong def_value;
|
||||||
ulonglong min_value, max_value, block_size;
|
ulonglong min_value, max_value, block_size;
|
||||||
const char *values;
|
const char *values;
|
||||||
|
struct st_mysql_sys_var *var;
|
||||||
} ha_create_table_option;
|
} ha_create_table_option;
|
||||||
|
|
||||||
enum handler_iterator_type
|
enum handler_iterator_type
|
||||||
@ -1197,6 +1208,11 @@ static inline LEX_STRING *hton_name(const handlerton *hton)
|
|||||||
return &(hton2plugin[hton->slot]->name);
|
return &(hton2plugin[hton->slot]->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline sys_var *find_hton_sysvar(handlerton *hton, st_mysql_sys_var *var)
|
||||||
|
{
|
||||||
|
return find_plugin_sysvar(hton2plugin[hton->slot], var);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Possible flags of a handlerton (there can be 32 of them) */
|
/* Possible flags of a handlerton (there can be 32 of them) */
|
||||||
#define HTON_NO_FLAGS 0
|
#define HTON_NO_FLAGS 0
|
||||||
|
@ -308,8 +308,6 @@ static void unlock_variables(THD *thd, struct system_variables *vars);
|
|||||||
static void cleanup_variables(THD *thd, struct system_variables *vars);
|
static void cleanup_variables(THD *thd, struct system_variables *vars);
|
||||||
static void plugin_vars_free_values(sys_var *vars);
|
static void plugin_vars_free_values(sys_var *vars);
|
||||||
static void restore_pluginvar_names(sys_var *first);
|
static void restore_pluginvar_names(sys_var *first);
|
||||||
static void plugin_opt_set_limits(struct my_option *,
|
|
||||||
const struct st_mysql_sys_var *);
|
|
||||||
static plugin_ref intern_plugin_lock(LEX *lex, plugin_ref plugin);
|
static plugin_ref intern_plugin_lock(LEX *lex, plugin_ref plugin);
|
||||||
static void intern_plugin_unlock(LEX *lex, plugin_ref plugin);
|
static void intern_plugin_unlock(LEX *lex, plugin_ref plugin);
|
||||||
static void reap_plugins(void);
|
static void reap_plugins(void);
|
||||||
@ -3286,8 +3284,8 @@ bool sys_var_pluginvar::global_update(THD *thd, set_var *var)
|
|||||||
options->block_size= (long) (opt)->blk_sz
|
options->block_size= (long) (opt)->blk_sz
|
||||||
|
|
||||||
|
|
||||||
static void plugin_opt_set_limits(struct my_option *options,
|
void plugin_opt_set_limits(struct my_option *options,
|
||||||
const struct st_mysql_sys_var *opt)
|
const struct st_mysql_sys_var *opt)
|
||||||
{
|
{
|
||||||
options->sub_size= 0;
|
options->sub_size= 0;
|
||||||
|
|
||||||
@ -3866,3 +3864,18 @@ void add_plugin_options(DYNAMIC_ARRAY *options, MEM_ROOT *mem_root)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a sys_var corresponding to a particular MYSQL_SYSVAR(...)
|
||||||
|
*/
|
||||||
|
sys_var *find_plugin_sysvar(st_plugin_int *plugin, st_mysql_sys_var *plugin_var)
|
||||||
|
{
|
||||||
|
for (sys_var *var= plugin->system_vars; var; var= var->next)
|
||||||
|
{
|
||||||
|
sys_var_pluginvar *pvar=var->cast_pluginvar();
|
||||||
|
if (pvar->plugin_var == plugin_var)
|
||||||
|
return var;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -163,6 +163,8 @@ extern bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name,
|
|||||||
extern bool plugin_register_builtin(struct st_mysql_plugin *plugin);
|
extern bool plugin_register_builtin(struct st_mysql_plugin *plugin);
|
||||||
extern void plugin_thdvar_init(THD *thd);
|
extern void plugin_thdvar_init(THD *thd);
|
||||||
extern void plugin_thdvar_cleanup(THD *thd);
|
extern void plugin_thdvar_cleanup(THD *thd);
|
||||||
|
sys_var *find_plugin_sysvar(st_plugin_int *plugin, st_mysql_sys_var *var);
|
||||||
|
void plugin_opt_set_limits(struct my_option *, const struct st_mysql_sys_var *);
|
||||||
extern SHOW_COMP_OPTION plugin_status(const char *name, size_t len, int type);
|
extern SHOW_COMP_OPTION plugin_status(const char *name, size_t len, int type);
|
||||||
extern bool check_valid_path(const char *path, size_t length);
|
extern bool check_valid_path(const char *path, size_t length);
|
||||||
|
|
||||||
|
@ -3224,8 +3224,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
sql_field->offset= record_offset;
|
sql_field->offset= record_offset;
|
||||||
if (MTYP_TYPENR(sql_field->unireg_check) == Field::NEXT_NUMBER)
|
if (MTYP_TYPENR(sql_field->unireg_check) == Field::NEXT_NUMBER)
|
||||||
auto_increment++;
|
auto_increment++;
|
||||||
if (parse_option_list(thd, &sql_field->option_struct,
|
if (parse_option_list(thd, create_info->db_type, &sql_field->option_struct,
|
||||||
sql_field->option_list,
|
&sql_field->option_list,
|
||||||
create_info->db_type->field_options, FALSE,
|
create_info->db_type->field_options, FALSE,
|
||||||
thd->mem_root))
|
thd->mem_root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
@ -3427,8 +3427,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
key_info->usable_key_parts= key_number;
|
key_info->usable_key_parts= key_number;
|
||||||
key_info->algorithm= key->key_create_info.algorithm;
|
key_info->algorithm= key->key_create_info.algorithm;
|
||||||
key_info->option_list= key->option_list;
|
key_info->option_list= key->option_list;
|
||||||
if (parse_option_list(thd, &key_info->option_struct,
|
if (parse_option_list(thd, create_info->db_type, &key_info->option_struct,
|
||||||
key_info->option_list,
|
&key_info->option_list,
|
||||||
create_info->db_type->index_options, FALSE,
|
create_info->db_type->index_options, FALSE,
|
||||||
thd->mem_root))
|
thd->mem_root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
@ -3874,8 +3874,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
file->engine_name()->str,
|
file->engine_name()->str,
|
||||||
"TRANSACTIONAL=1");
|
"TRANSACTIONAL=1");
|
||||||
|
|
||||||
if (parse_option_list(thd, &create_info->option_struct,
|
if (parse_option_list(thd, file->partition_ht(), &create_info->option_struct,
|
||||||
create_info->option_list,
|
&create_info->option_list,
|
||||||
file->partition_ht()->table_options, FALSE,
|
file->partition_ht()->table_options, FALSE,
|
||||||
thd->mem_root))
|
thd->mem_root))
|
||||||
DBUG_RETURN(TRUE);
|
DBUG_RETURN(TRUE);
|
||||||
|
@ -118,6 +118,8 @@ static HASH example_open_tables;
|
|||||||
/* The mutex used to init the hash; variable for example share methods */
|
/* The mutex used to init the hash; variable for example share methods */
|
||||||
mysql_mutex_t example_mutex;
|
mysql_mutex_t example_mutex;
|
||||||
|
|
||||||
|
static MYSQL_THDVAR_ULONG(varopt_default, PLUGIN_VAR_RQCMDARG,
|
||||||
|
"default value of the VAROPT table option", NULL, NULL, 5, 0, 100, 0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Structure for CREATE TABLE options (table options).
|
Structure for CREATE TABLE options (table options).
|
||||||
@ -133,6 +135,7 @@ struct ha_table_option_struct
|
|||||||
ulonglong ullparam;
|
ulonglong ullparam;
|
||||||
uint enumparam;
|
uint enumparam;
|
||||||
bool boolparam;
|
bool boolparam;
|
||||||
|
ulonglong varparam;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -179,6 +182,12 @@ ha_create_table_option example_table_option_list[]=
|
|||||||
The default is 1, that is true, yes, on.
|
The default is 1, that is true, yes, on.
|
||||||
*/
|
*/
|
||||||
HA_TOPTION_BOOL("YESNO", boolparam, 1),
|
HA_TOPTION_BOOL("YESNO", boolparam, 1),
|
||||||
|
/*
|
||||||
|
one option defined by the system variable. The type, the range, or
|
||||||
|
a list of allowed values is the same as for the system variable.
|
||||||
|
*/
|
||||||
|
HA_TOPTION_SYSVAR("VAROPT", varparam, varopt_default),
|
||||||
|
|
||||||
HA_TOPTION_END
|
HA_TOPTION_END
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1089,6 +1098,7 @@ static MYSQL_SYSVAR_ULONG(
|
|||||||
static struct st_mysql_sys_var* example_system_variables[]= {
|
static struct st_mysql_sys_var* example_system_variables[]= {
|
||||||
MYSQL_SYSVAR(enum_var),
|
MYSQL_SYSVAR(enum_var),
|
||||||
MYSQL_SYSVAR(ulong_var),
|
MYSQL_SYSVAR(ulong_var),
|
||||||
|
MYSQL_SYSVAR(varopt_default),
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user