Commit c2a655f0 authored by Marc Alff's avatar Marc Alff

Local merge

parents b1f25ee9 4b86f399
This diff is collapsed.
...@@ -100,16 +100,16 @@ create trigger performance_schema.bi_file_instances ...@@ -100,16 +100,16 @@ create trigger performance_schema.bi_file_instances
before insert on performance_schema.file_instances before insert on performance_schema.file_instances
for each row begin end; for each row begin end;
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1(a int) engine=PERFORMANCE_SCHEMA; create table test.t1(a int) engine=PERFORMANCE_SCHEMA;
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1 like performance_schema.setup_instruments; create table test.t1 like performance_schema.setup_instruments;
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1 like performance_schema.file_instances; create table test.t1 like performance_schema.file_instances;
--error ER_TABLEACCESS_DENIED_ERROR --error ER_TABLEACCESS_DENIED_ERROR
......
...@@ -6,9 +6,9 @@ AND EVENT_NAME IN ...@@ -6,9 +6,9 @@ AND EVENT_NAME IN
WHERE NAME LIKE "wait/synch/%") WHERE NAME LIKE "wait/synch/%")
LIMIT 1; LIMIT 1;
create table test.t1(a int) engine=performance_schema; create table test.t1(a int) engine=performance_schema;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table performance_schema.t1(a int); create table performance_schema.t1(a int);
ERROR 42000: CREATE command denied to user 'root'@'localhost' for table 't1' ERROR 42000: CREATE command denied to user 'root'@'localhost' for table 't1'
drop table if exists test.ghost; drop table if exists test.ghost;
......
...@@ -16,6 +16,7 @@ operation, number_of_bytes, ...@@ -16,6 +16,7 @@ operation, number_of_bytes,
substring(object_name, locate("no_index_tab", object_name)) as short_name substring(object_name, locate("no_index_tab", object_name)) as short_name
from performance_schema.events_waits_history_long from performance_schema.events_waits_history_long
where operation not like "tell" where operation not like "tell"
and event_name like "wait/io/file/myisam/%"
order by thread_id, event_id; order by thread_id, event_id;
event_name short_source operation number_of_bytes short_name event_name short_source operation number_of_bytes short_name
wait/io/file/myisam/kfile mi_create.c: create NULL no_index_tab.MYI wait/io/file/myisam/kfile mi_create.c: create NULL no_index_tab.MYI
......
...@@ -152,13 +152,13 @@ before insert on performance_schema.file_instances ...@@ -152,13 +152,13 @@ before insert on performance_schema.file_instances
for each row begin end; for each row begin end;
ERROR 42000: Access denied for user 'root'@'localhost' to database 'performance_schema' ERROR 42000: Access denied for user 'root'@'localhost' to database 'performance_schema'
create table test.t1(a int) engine=PERFORMANCE_SCHEMA; create table test.t1(a int) engine=PERFORMANCE_SCHEMA;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.setup_instruments; create table test.t1 like performance_schema.setup_instruments;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.file_instances; create table test.t1 like performance_schema.file_instances;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
insert into performance_schema.setup_instruments insert into performance_schema.setup_instruments
set name="foo"; set name="foo";
ERROR 42000: INSERT command denied to user 'root'@'localhost' for table 'setup_instruments' ERROR 42000: INSERT command denied to user 'root'@'localhost' for table 'setup_instruments'
...@@ -250,13 +250,13 @@ before insert on performance_schema.file_instances ...@@ -250,13 +250,13 @@ before insert on performance_schema.file_instances
for each row begin end; for each row begin end;
ERROR 42000: Access denied for user 'pfs_user_1'@'localhost' to database 'performance_schema' ERROR 42000: Access denied for user 'pfs_user_1'@'localhost' to database 'performance_schema'
create table test.t1(a int) engine=PERFORMANCE_SCHEMA; create table test.t1(a int) engine=PERFORMANCE_SCHEMA;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.setup_instruments; create table test.t1 like performance_schema.setup_instruments;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.file_instances; create table test.t1 like performance_schema.file_instances;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
insert into performance_schema.setup_instruments insert into performance_schema.setup_instruments
set name="foo"; set name="foo";
ERROR 42000: INSERT command denied to user 'pfs_user_1'@'localhost' for table 'setup_instruments' ERROR 42000: INSERT command denied to user 'pfs_user_1'@'localhost' for table 'setup_instruments'
...@@ -348,13 +348,13 @@ before insert on performance_schema.file_instances ...@@ -348,13 +348,13 @@ before insert on performance_schema.file_instances
for each row begin end; for each row begin end;
ERROR 42000: Access denied for user 'pfs_user_2'@'localhost' to database 'performance_schema' ERROR 42000: Access denied for user 'pfs_user_2'@'localhost' to database 'performance_schema'
create table test.t1(a int) engine=PERFORMANCE_SCHEMA; create table test.t1(a int) engine=PERFORMANCE_SCHEMA;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.setup_instruments; create table test.t1 like performance_schema.setup_instruments;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.file_instances; create table test.t1 like performance_schema.file_instances;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
insert into performance_schema.setup_instruments insert into performance_schema.setup_instruments
set name="foo"; set name="foo";
ERROR 42000: INSERT command denied to user 'pfs_user_2'@'localhost' for table 'setup_instruments' ERROR 42000: INSERT command denied to user 'pfs_user_2'@'localhost' for table 'setup_instruments'
...@@ -446,13 +446,13 @@ before insert on performance_schema.file_instances ...@@ -446,13 +446,13 @@ before insert on performance_schema.file_instances
for each row begin end; for each row begin end;
ERROR 42000: Access denied for user 'pfs_user_3'@'localhost' to database 'performance_schema' ERROR 42000: Access denied for user 'pfs_user_3'@'localhost' to database 'performance_schema'
create table test.t1(a int) engine=PERFORMANCE_SCHEMA; create table test.t1(a int) engine=PERFORMANCE_SCHEMA;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.setup_instruments; create table test.t1 like performance_schema.setup_instruments;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
create table test.t1 like performance_schema.file_instances; create table test.t1 like performance_schema.file_instances;
ERROR HY000: Invalid performance_schema usage. ERROR HY000: Can't create table 'test.t1' (errno: 131)
insert into performance_schema.setup_instruments insert into performance_schema.setup_instruments
set name="foo"; set name="foo";
ERROR 42000: INSERT command denied to user 'pfs_user_3'@'localhost' for table 'setup_instruments' ERROR 42000: INSERT command denied to user 'pfs_user_3'@'localhost' for table 'setup_instruments'
......
flush status;
SET @saved_thread_cache_size = @@global.thread_cache_size; SET @saved_thread_cache_size = @@global.thread_cache_size;
set global thread_cache_size = 0; set global thread_cache_size = 0;
show variables like "thread_cache_size"; show variables like "thread_cache_size";
...@@ -32,3 +33,7 @@ select @thread_id_increment; ...@@ -32,3 +33,7 @@ select @thread_id_increment;
@thread_id_increment @thread_id_increment
1 1
set global thread_cache_size = @saved_thread_cache_size; set global thread_cache_size = @saved_thread_cache_size;
show status like "performance_schema_thread%";
Variable_name Value
Performance_schema_thread_classes_lost 0
Performance_schema_thread_instances_lost 0
...@@ -38,14 +38,14 @@ LIMIT 1; ...@@ -38,14 +38,14 @@ LIMIT 1;
# Bug#45088 Should not be able to create tables of engine PERFORMANCE_SCHEMA # Bug#45088 Should not be able to create tables of engine PERFORMANCE_SCHEMA
# #
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1(a int) engine=performance_schema; create table test.t1(a int) engine=performance_schema;
# #
# Bug#44897 Performance Schema: can create a ghost table in another database # Bug#44897 Performance Schema: can create a ghost table in another database
# #
--error ER_WRONG_PERFSCHEMA_USAGE --error ER_CANT_CREATE_TABLE
create table test.t1 like performance_schema.events_waits_current; create table test.t1 like performance_schema.events_waits_current;
# #
......
...@@ -46,6 +46,13 @@ insert into no_index_tab set a = 'foo', b = 1; ...@@ -46,6 +46,13 @@ insert into no_index_tab set a = 'foo', b = 1;
# Verification # Verification
# Note that mi_create.c contains mysql_file_tell() calls in debug only, # Note that mi_create.c contains mysql_file_tell() calls in debug only,
# so the result are filtered to remove 'tell'. # so the result are filtered to remove 'tell'.
# Note that even after setting other instruments to enabled='NO'
# and truncating the events_waits_history_long table,
# some events -- that were already started but not completed --
# for other instruments could still be added in the history.
# To protect against that, an extra where clause
# "and event_name like "wait/io/file/myisam/%"
# is added to the select to filter out the result.
select event_name, select event_name,
left(source, locate(":", source)) as short_source, left(source, locate(":", source)) as short_source,
...@@ -53,6 +60,7 @@ select event_name, ...@@ -53,6 +60,7 @@ select event_name,
substring(object_name, locate("no_index_tab", object_name)) as short_name substring(object_name, locate("no_index_tab", object_name)) as short_name
from performance_schema.events_waits_history_long from performance_schema.events_waits_history_long
where operation not like "tell" where operation not like "tell"
and event_name like "wait/io/file/myisam/%"
order by thread_id, event_id; order by thread_id, event_id;
# In case of failures, this will tell if file io are lost. # In case of failures, this will tell if file io are lost.
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
# Setup # Setup
flush status;
SET @saved_thread_cache_size = @@global.thread_cache_size; SET @saved_thread_cache_size = @@global.thread_cache_size;
set global thread_cache_size = 0; set global thread_cache_size = 0;
...@@ -40,7 +42,7 @@ let $con2_ID=`select connection_id()`; ...@@ -40,7 +42,7 @@ let $con2_ID=`select connection_id()`;
let $con2_THREAD_ID=`select thread_id from performance_schema.threads let $con2_THREAD_ID=`select thread_id from performance_schema.threads
where PROCESSLIST_ID = connection_id()`; where PROCESSLIST_ID = connection_id()`;
connection default; --connection default
--disable_query_log --disable_query_log
eval select ($con2_ID - $con1_ID) into @id_increment; eval select ($con2_ID - $con1_ID) into @id_increment;
...@@ -52,7 +54,15 @@ select @id_increment; ...@@ -52,7 +54,15 @@ select @id_increment;
# Expect 1, THREAD_ID is incremented for each new connection # Expect 1, THREAD_ID is incremented for each new connection
select @thread_id_increment; select @thread_id_increment;
disconnect con2; --disconnect con2
--connection default
# Wait for the disconnect con2 to complete
let $wait_condition=
select count(*) = 2 from performance_schema.threads
where name like "thread/sql/one_connection";
--source include/wait_condition.inc
connect (con3, localhost, root, , ); connect (con3, localhost, root, , );
...@@ -61,10 +71,16 @@ let $con3_ID=`select connection_id()`; ...@@ -61,10 +71,16 @@ let $con3_ID=`select connection_id()`;
let $con3_THREAD_ID=`select thread_id from performance_schema.threads let $con3_THREAD_ID=`select thread_id from performance_schema.threads
where PROCESSLIST_ID = connection_id()`; where PROCESSLIST_ID = connection_id()`;
disconnect con3; --disconnect con3
disconnect con1; --disconnect con1
--connection default
connection default; # Wait for the disconnect con1 and con3 to complete
let $wait_condition=
select count(*) = 1 from performance_schema.threads
where name like "thread/sql/one_connection";
--source include/wait_condition.inc
--disable_query_log --disable_query_log
eval select ($con3_ID - $con2_ID) into @id_increment; eval select ($con3_ID - $con2_ID) into @id_increment;
...@@ -92,7 +108,7 @@ let $con2_ID=`select connection_id()`; ...@@ -92,7 +108,7 @@ let $con2_ID=`select connection_id()`;
let $con2_THREAD_ID=`select thread_id from performance_schema.threads let $con2_THREAD_ID=`select thread_id from performance_schema.threads
where PROCESSLIST_ID = connection_id()`; where PROCESSLIST_ID = connection_id()`;
connection default; --connection default
--disable_query_log --disable_query_log
eval select ($con2_ID - $con1_ID) into @id_increment; eval select ($con2_ID - $con1_ID) into @id_increment;
...@@ -102,7 +118,15 @@ eval select ($con2_THREAD_ID - $con1_THREAD_ID) into @thread_id_increment; ...@@ -102,7 +118,15 @@ eval select ($con2_THREAD_ID - $con1_THREAD_ID) into @thread_id_increment;
select @id_increment; select @id_increment;
select @thread_id_increment; select @thread_id_increment;
disconnect con2; --disconnect con2
--connection default
# Wait for the disconnect con2 to complete
let $wait_condition=
select count(*) = 2 from performance_schema.threads
where name like "thread/sql/one_connection";
--source include/wait_condition.inc
connect (con3, localhost, root, , ); connect (con3, localhost, root, , );
...@@ -111,10 +135,16 @@ let $con3_ID=`select connection_id()`; ...@@ -111,10 +135,16 @@ let $con3_ID=`select connection_id()`;
let $con3_THREAD_ID=`select thread_id from performance_schema.threads let $con3_THREAD_ID=`select thread_id from performance_schema.threads
where PROCESSLIST_ID = connection_id()`; where PROCESSLIST_ID = connection_id()`;
disconnect con3; --disconnect con3
disconnect con1; --disconnect con1
connection default; --connection default
# Wait for the disconnect con1 and con3 to complete
let $wait_condition=
select count(*) = 1 from performance_schema.threads
where name like "thread/sql/one_connection";
--source include/wait_condition.inc
--disable_query_log --disable_query_log
eval select ($con3_ID - $con2_ID) into @id_increment; eval select ($con3_ID - $con2_ID) into @id_increment;
...@@ -132,3 +162,5 @@ select @thread_id_increment; ...@@ -132,3 +162,5 @@ select @thread_id_increment;
set global thread_cache_size = @saved_thread_cache_size; set global thread_cache_size = @saved_thread_cache_size;
show status like "performance_schema_thread%";
...@@ -228,7 +228,6 @@ int ha_perfschema::write_row(uchar *buf) ...@@ -228,7 +228,6 @@ int ha_perfschema::write_row(uchar *buf)
result= m_table_share->m_write_row(table, buf, table->field); result= m_table_share->m_write_row(table, buf, table->field);
else else
{ {
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
result= HA_ERR_WRONG_COMMAND; result= HA_ERR_WRONG_COMMAND;
} }
...@@ -339,7 +338,6 @@ int ha_perfschema::delete_all_rows(void) ...@@ -339,7 +338,6 @@ int ha_perfschema::delete_all_rows(void)
result= m_table_share->m_delete_all_rows(); result= m_table_share->m_delete_all_rows();
else else
{ {
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
result= HA_ERR_WRONG_COMMAND; result= HA_ERR_WRONG_COMMAND;
} }
DBUG_RETURN(result); DBUG_RETURN(result);
...@@ -370,7 +368,6 @@ int ha_perfschema::delete_table(const char *name) ...@@ -370,7 +368,6 @@ int ha_perfschema::delete_table(const char *name)
int ha_perfschema::rename_table(const char * from, const char * to) int ha_perfschema::rename_table(const char * from, const char * to)
{ {
DBUG_ENTER("ha_perfschema::rename_table "); DBUG_ENTER("ha_perfschema::rename_table ");
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
DBUG_RETURN(HA_ERR_WRONG_COMMAND); DBUG_RETURN(HA_ERR_WRONG_COMMAND);
} }
...@@ -395,7 +392,37 @@ int ha_perfschema::create(const char *name, TABLE *table_arg, ...@@ -395,7 +392,37 @@ int ha_perfschema::create(const char *name, TABLE *table_arg,
This is not a general purpose engine. This is not a general purpose engine.
Failure to CREATE TABLE is the expected result. Failure to CREATE TABLE is the expected result.
*/ */
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
DBUG_RETURN(HA_ERR_WRONG_COMMAND); DBUG_RETURN(HA_ERR_WRONG_COMMAND);
} }
void ha_perfschema::print_error(int error, myf errflag)
{
switch (error)
{
case HA_ERR_TABLE_NEEDS_UPGRADE:
/*
The error message for ER_TABLE_NEEDS_UPGRADE refers to REPAIR table,
which does not apply to performance schema tables.
*/
my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0),
table_share->db.str, table_share->table_name.str);
break;
case HA_ERR_WRONG_COMMAND:
/*
The performance schema is not a general purpose storage engine,
some operations are not supported, by design.
We do not want to print "Command not supported",
which gives the impression that a command implementation is missing,
and that the failure should be considered a bug.
We print "Invalid performance_schema usage." instead,
to emphasise that the operation attempted is not meant to be legal,
and that the failure returned is indeed the expected result.
*/
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
break;
default:
handler::print_error(error, errflag);
break;
}
}
...@@ -100,9 +100,6 @@ class ha_perfschema : public handler ...@@ -100,9 +100,6 @@ class ha_perfschema : public handler
double scan_time(void) double scan_time(void)
{ return 1.0; } { return 1.0; }
double read_time(ha_rows)
{ return 1.0; }
int open(const char *name, int mode, uint test_if_locked); int open(const char *name, int mode, uint test_if_locked);
int close(void); int close(void);
...@@ -149,6 +146,8 @@ class ha_perfschema : public handler ...@@ -149,6 +146,8 @@ class ha_perfschema : public handler
return FALSE; return FALSE;
} }
virtual void print_error(int error, myf errflags);
private: private:
/** MySQL lock */ /** MySQL lock */
THR_LOCK_DATA m_thr_lock; THR_LOCK_DATA m_thr_lock;
......
...@@ -232,8 +232,6 @@ int PFS_engine_table::read_row(TABLE *table, ...@@ -232,8 +232,6 @@ int PFS_engine_table::read_row(TABLE *table,
*/ */
if (! m_share_ptr->m_checked) if (! m_share_ptr->m_checked)
{ {
my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0),
PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name.str);
return HA_ERR_TABLE_NEEDS_UPGRADE; return HA_ERR_TABLE_NEEDS_UPGRADE;
} }
...@@ -279,8 +277,6 @@ int PFS_engine_table::update_row(TABLE *table, ...@@ -279,8 +277,6 @@ int PFS_engine_table::update_row(TABLE *table,
*/ */
if (! m_share_ptr->m_checked) if (! m_share_ptr->m_checked)
{ {
my_error(ER_WRONG_NATIVE_TABLE_STRUCTURE, MYF(0),
PERFORMANCE_SCHEMA_str.str, m_share_ptr->m_name.str);
return HA_ERR_TABLE_NEEDS_UPGRADE; return HA_ERR_TABLE_NEEDS_UPGRADE;
} }
...@@ -351,7 +347,6 @@ int PFS_engine_table::update_row_values(TABLE *, ...@@ -351,7 +347,6 @@ int PFS_engine_table::update_row_values(TABLE *,
unsigned char *, unsigned char *,
Field **) Field **)
{ {
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
return HA_ERR_WRONG_COMMAND; return HA_ERR_WRONG_COMMAND;
} }
......
...@@ -192,7 +192,6 @@ int table_setup_consumers::update_row_values(TABLE *table, ...@@ -192,7 +192,6 @@ int table_setup_consumers::update_row_values(TABLE *table,
switch(f->field_index) switch(f->field_index)
{ {
case 0: /* NAME */ case 0: /* NAME */
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
return HA_ERR_WRONG_COMMAND; return HA_ERR_WRONG_COMMAND;
case 1: /* ENABLED */ case 1: /* ENABLED */
{ {
......
...@@ -253,7 +253,6 @@ int table_setup_instruments::update_row_values(TABLE *table, ...@@ -253,7 +253,6 @@ int table_setup_instruments::update_row_values(TABLE *table,
switch(f->field_index) switch(f->field_index)
{ {
case 0: /* NAME */ case 0: /* NAME */
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
return HA_ERR_WRONG_COMMAND; return HA_ERR_WRONG_COMMAND;
case 1: /* ENABLED */ case 1: /* ENABLED */
value= (enum_yes_no) get_field_enum(f); value= (enum_yes_no) get_field_enum(f);
......
...@@ -164,7 +164,6 @@ int table_setup_timers::update_row_values(TABLE *table, ...@@ -164,7 +164,6 @@ int table_setup_timers::update_row_values(TABLE *table,
switch(f->field_index) switch(f->field_index)
{ {
case 0: /* NAME */ case 0: /* NAME */
my_error(ER_WRONG_PERFSCHEMA_USAGE, MYF(0));
return HA_ERR_WRONG_COMMAND; return HA_ERR_WRONG_COMMAND;
case 1: /* TIMER_NAME */ case 1: /* TIMER_NAME */
value= get_field_enum(f); value= get_field_enum(f);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment