Merge branch '10.5' into 10.6

This commit is contained in:
Oleksandr Byelkin 2024-10-09 08:38:48 +02:00
commit 1d0e94c55f
45 changed files with 491 additions and 171 deletions

View File

@ -7911,6 +7911,20 @@ static const char *trking_info_desc[SESSION_TRACK_END + 1]=
/** /**
@brief Append state change information (received through Ok packet) to the output. @brief Append state change information (received through Ok packet) to the output.
@details The appended string is lines prefixed with "-- ". Only
tracking types with info sent from the server are displayed. For
each tracking type, the first line is the type name e.g.
"-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES".
The subsequent lines are the actual tracking info. When type is
SESSION_TRACK_SYSTEM_VARIABLES, the actual tracking info is a list
of name-value pairs of lines, sorted by name, e.g. if the info
received from the server is "autocommit=ON;time_zone=SYSTEM", the
corresponding string is
-- autocommit: ON
-- time_zone: SYSTEM
@param [in,out] ds Dynamic string to hold the content to be printed. @param [in,out] ds Dynamic string to hold the content to be printed.
@param [in] mysql Connection handle. @param [in] mysql Connection handle.
*/ */
@ -7918,11 +7932,16 @@ static const char *trking_info_desc[SESSION_TRACK_END + 1]=
static void append_session_track_info(DYNAMIC_STRING *ds, MYSQL *mysql) static void append_session_track_info(DYNAMIC_STRING *ds, MYSQL *mysql)
{ {
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
DYNAMIC_STRING ds_sort, *ds_type= NULL;
for (unsigned int type= SESSION_TRACK_BEGIN; type <= SESSION_TRACK_END; type++) for (unsigned int type= SESSION_TRACK_BEGIN; type <= SESSION_TRACK_END; type++)
{ {
const char *data; const char *data;
size_t data_length; size_t data_length;
/*
Append the tracking type line, if any corresponding tracking
info is received.
*/
if (!mysql_session_track_get_first(mysql, if (!mysql_session_track_get_first(mysql,
(enum_session_state_type) type, (enum_session_state_type) type,
&data, &data_length)) &data, &data_length))
@ -7938,26 +7957,56 @@ static void append_session_track_info(DYNAMIC_STRING *ds, MYSQL *mysql)
DBUG_ASSERT(0); DBUG_ASSERT(0);
dynstr_append_mem(ds, STRING_WITH_LEN("Tracker???\n")); dynstr_append_mem(ds, STRING_WITH_LEN("Tracker???\n"));
} }
dynstr_append_mem(ds, STRING_WITH_LEN("-- "));
dynstr_append_mem(ds, data, data_length);
} }
else else
continue; continue;
/*
The remaining of this function: format and append the actual
tracking info.
*/
if (type == SESSION_TRACK_SYSTEM_VARIABLES)
{
/* Prepare a string to be sorted before being appended. */
if (init_dynamic_string(&ds_sort, "", 1024, 1024))
die("Out of memory");
ds_type= &ds_sort;
}
else
ds_type= ds;
/* Append the first piece of info */
dynstr_append_mem(ds_type, STRING_WITH_LEN("-- "));
dynstr_append_mem(ds_type, data, data_length);
/* Whether we are appending the value of a variable */
bool appending_value= type == SESSION_TRACK_SYSTEM_VARIABLES;
/* Append remaining pieces */
while (!mysql_session_track_get_next(mysql, while (!mysql_session_track_get_next(mysql,
(enum_session_state_type) type, (enum_session_state_type) type,
&data, &data_length)) &data, &data_length))
{ {
dynstr_append_mem(ds, STRING_WITH_LEN("\n-- ")); if (appending_value)
dynstr_append_mem(ds_type, STRING_WITH_LEN(": "));
else
dynstr_append_mem(ds_type, STRING_WITH_LEN("\n-- "));
appending_value= !appending_value && type == SESSION_TRACK_SYSTEM_VARIABLES;
if (data == NULL) if (data == NULL)
{ {
DBUG_ASSERT(data_length == 0); DBUG_ASSERT(data_length == 0);
dynstr_append_mem(ds, STRING_WITH_LEN("<NULL>")); dynstr_append_mem(ds_type, STRING_WITH_LEN("<NULL>"));
} }
else else
dynstr_append_mem(ds, data, data_length); dynstr_append_mem(ds_type, data, data_length);
} }
dynstr_append_mem(ds, STRING_WITH_LEN("\n\n")); DBUG_ASSERT(!appending_value);
if (type == SESSION_TRACK_SYSTEM_VARIABLES)
{
dynstr_append_mem(ds_type, STRING_WITH_LEN("\n"));
dynstr_append_sorted(ds, ds_type, false);
dynstr_append_mem(ds, STRING_WITH_LEN("\n"));
dynstr_free(&ds_sort);
}
else
dynstr_append_mem(ds, STRING_WITH_LEN("\n\n"));
} }
#endif /* EMBEDDED_LIBRARY */ #endif /* EMBEDDED_LIBRARY */
} }
@ -12115,7 +12164,8 @@ void replace_dynstr_append_uint(DYNAMIC_STRING *ds, uint val)
/* /*
Build a list of pointer to each line in ds_input, sort Build a list of pointer to each line in ds_input, sort
the list and use the sorted list to append the strings the list and use the sorted list to append the strings
sorted to the output ds sorted to the output ds. The string ds_input needs to
end with a newline.
SYNOPSIS SYNOPSIS
dynstr_append_sorted() dynstr_append_sorted()

View File

@ -2918,10 +2918,8 @@ CREATE TABLE t1 (a VARCHAR(500) COMPRESSED CHARACTER SET utf8mb3) ENGINE=InnoDB;
INSERT INTO t1 SET a=REPEAT('x',127); INSERT INTO t1 SET a=REPEAT('x',127);
ALTER TABLE t1 FORCE, ALGORITHM=COPY; ALTER TABLE t1 FORCE, ALGORITHM=COPY;
DROP TABLE t1; DROP TABLE t1;
#
# End of 10.4 tests # End of 10.4 tests
# #
#
# MDEV-19727 Add Type_handler::Key_part_spec_init_ft # MDEV-19727 Add Type_handler::Key_part_spec_init_ft
# #
CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED, FULLTEXT INDEX(a)); CREATE TABLE t1 (a VARCHAR(1000) COMPRESSED, FULLTEXT INDEX(a));
@ -2929,5 +2927,20 @@ ERROR HY000: Compressed column 'a' can't be used in key specification
CREATE TABLE t1 (a TEXT COMPRESSED, FULLTEXT INDEX(a)); CREATE TABLE t1 (a TEXT COMPRESSED, FULLTEXT INDEX(a));
ERROR HY000: Compressed column 'a' can't be used in key specification ERROR HY000: Compressed column 'a' can't be used in key specification
# #
# End of 10.5 tests # MDEV-16699 heap-use-after-free in group_concat with compressed or GIS columns
# #
create table t1 (c text compressed);
insert into t1 values ('foo'),(repeat('a',55000));
select length(group_concat(c order by 1)) from t1;
length(group_concat(c order by 1))
55004
create table t2 as select group_concat(c order by 1), concat(c), c from t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`group_concat(c order by 1)` mediumtext DEFAULT NULL,
`concat(c)` text DEFAULT NULL,
`c` text /*M!100301 COMPRESSED*/ DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
drop table t1, t2;
# End of 10.5 tests

View File

@ -453,10 +453,7 @@ INSERT INTO t1 SET a=REPEAT('x',127);
ALTER TABLE t1 FORCE, ALGORITHM=COPY; ALTER TABLE t1 FORCE, ALGORITHM=COPY;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo #
--echo # --echo #
--echo # MDEV-19727 Add Type_handler::Key_part_spec_init_ft --echo # MDEV-19727 Add Type_handler::Key_part_spec_init_ft
@ -476,5 +473,13 @@ CREATE TABLE t1 (a TEXT COMPRESSED, FULLTEXT INDEX(a));
--disable_prepare_warnings --disable_prepare_warnings
--echo # --echo #
--echo # End of 10.5 tests --echo # MDEV-16699 heap-use-after-free in group_concat with compressed or GIS columns
--echo # --echo #
create table t1 (c text compressed);
insert into t1 values ('foo'),(repeat('a',55000));
select length(group_concat(c order by 1)) from t1;
create table t2 as select group_concat(c order by 1), concat(c), c from t1;
show create table t2;
drop table t1, t2;
--echo # End of 10.5 tests

View File

@ -5435,5 +5435,22 @@ AsText(g)
POINT(1 1) POINT(1 1)
DROP TABLE t1; DROP TABLE t1;
# #
# End of 10.5 tests # MDEV-16699 heap-use-after-free in group_concat with compressed or GIS columns
# #
create table t1 (c polygon);
insert into t1 values
(PolygonFromText('POLYGON((1 2,1 2))')),
(PolygonFromText('POLYGON((0 0,1 1,0 0))'));
select length(group_concat(c, c order by 1,2)) from t1;
length(group_concat(c, c order by 1,2))
229
create table t2 as select group_concat(c, c order by 1,2), concat(c), c from t1;
show create table t2;
Table Create Table
t2 CREATE TABLE `t2` (
`group_concat(c, c order by 1,2)` mediumblob DEFAULT NULL,
`concat(c)` longblob DEFAULT NULL,
`c` polygon DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
drop table t1, t2;
# End of 10.5 tests

View File

@ -3445,5 +3445,15 @@ SELECT AsText(g) FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo # --echo #
--echo # End of 10.5 tests --echo # MDEV-16699 heap-use-after-free in group_concat with compressed or GIS columns
--echo # --echo #
create table t1 (c polygon);
insert into t1 values
(PolygonFromText('POLYGON((1 2,1 2))')),
(PolygonFromText('POLYGON((0 0,1 1,0 0))'));
select length(group_concat(c, c order by 1,2)) from t1;
create table t2 as select group_concat(c, c order by 1,2), concat(c), c from t1;
show create table t2;
drop table t1, t2;
--echo # End of 10.5 tests

View File

@ -6,26 +6,22 @@ SET @@session.session_track_system_variables='character_set_connection';
# tracking info on # tracking info on
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: utf8mb3
-- utf8mb3
SET NAMES 'big5'; SET NAMES 'big5';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: big5
-- big5
# tracking info on once # tracking info on once
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: utf8mb3
-- utf8mb3
SET NAMES 'big5'; SET NAMES 'big5';
# tracking info on # tracking info on
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: utf8mb3
-- utf8mb3
# tracking info off once # tracking info off once
SET NAMES 'big5'; SET NAMES 'big5';
@ -37,8 +33,7 @@ set @save_optimizer_switch=@@optimizer_switch;
SET @@session.session_track_system_variables='optimizer_switch'; SET @@session.session_track_system_variables='optimizer_switch';
set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off'; set optimizer_switch='index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- optimizer_switch -- optimizer_switch: index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off,split_materialized=on,condition_pushdown_for_subquery=on,rowid_filter=on,condition_pushdown_from_having=on,not_null_range_scan=off,hash_join_cardinality=off,cset_narrowing=off
-- index_merge=off,index_merge_union=off,index_merge_sort_union=off,index_merge_intersection=off,index_merge_sort_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=off,derived_merge=off,derived_with_keys=off,firstmatch=off,loosescan=off,materialization=on,in_to_exists=off,semijoin=off,partial_match_rowid_merge=off,partial_match_table_scan=off,subquery_cache=off,mrr=on,mrr_cost_based=on,mrr_sort_keys=on,outer_join_with_cache=off,semijoin_with_cache=off,join_cache_incremental=off,join_cache_hashed=off,join_cache_bka=off,optimize_join_buffer_size=on,table_elimination=off,extended_keys=off,exists_to_in=off,orderby_uses_equalities=off,condition_pushdown_for_derived=off,split_materialized=on,condition_pushdown_for_subquery=on,rowid_filter=on,condition_pushdown_from_having=on,not_null_range_scan=off,hash_join_cardinality=off,cset_narrowing=off
Warnings: Warnings:
Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release Warning 1681 'engine_condition_pushdown=on' is deprecated and will be removed in a future release
@ -71,13 +66,11 @@ ERROR HY000: Unknown system variable 'a'
connect con,localhost,root,,test; connect con,localhost,root,,test;
SET NAMES 'utf8'; SET NAMES 'utf8';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: utf8mb3
-- utf8mb3
SET NAMES 'big5'; SET NAMES 'big5';
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- character_set_connection -- character_set_connection: big5
-- big5
select @@session_track_system_variables; select @@session_track_system_variables;
@@session_track_system_variables @@session_track_system_variables

View File

@ -233,11 +233,13 @@ pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using where 1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using where
create temporary table opt_trace as
select * from information_schema.optimizer_trace;
# Must have a note that "multiplier is too high": # Must have a note that "multiplier is too high":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
[ [
@ -256,7 +258,7 @@ JS
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
{ {
@ -278,6 +280,7 @@ JS
} }
} }
] ]
drop table opt_trace;
# Disable the fix and try the same: # Disable the fix and try the same:
set @@optimizer_adjust_secondary_key_costs=''; set @@optimizer_adjust_secondary_key_costs='';
explain select * from t1 explain select * from t1
@ -286,12 +289,13 @@ pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using where 1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using where
drop table t1; create temporary table opt_trace as
select * from information_schema.optimizer_trace;
# Shows a high multiplier, without a "note": # Shows a high multiplier, without a "note":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
[ [
@ -310,7 +314,7 @@ JS
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
{ {
@ -332,7 +336,9 @@ JS
} }
} }
] ]
drop table opt_trace;
set optimizer_adjust_secondary_key_costs=default; set optimizer_adjust_secondary_key_costs=default;
drop table t1;
# #
# Clean up # Clean up
# #

View File

@ -228,11 +228,13 @@ pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using index condition; Using where 1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using index condition; Using where
create temporary table opt_trace as
select * from information_schema.optimizer_trace;
# Must have a note that "multiplier is too high": # Must have a note that "multiplier is too high":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
[ [
@ -251,7 +253,7 @@ JS
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
{ {
@ -273,6 +275,7 @@ JS
} }
} }
] ]
drop table opt_trace;
# Disable the fix and try the same: # Disable the fix and try the same:
set @@optimizer_adjust_secondary_key_costs=''; set @@optimizer_adjust_secondary_key_costs='';
explain select * from t1 explain select * from t1
@ -281,12 +284,13 @@ pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using index condition; Using where 1 SIMPLE t1 range PRIMARY,key1 PRIMARY 4 NULL 5 Using index condition; Using where
drop table t1; create temporary table opt_trace as
select * from information_schema.optimizer_trace;
# Shows a high multiplier, without a "note": # Shows a high multiplier, without a "note":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
[ [
@ -305,7 +309,7 @@ JS
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
JS JS
[ [
{ {
@ -327,7 +331,9 @@ JS
} }
} }
] ]
drop table opt_trace;
set optimizer_adjust_secondary_key_costs=default; set optimizer_adjust_secondary_key_costs=default;
drop table t1;
# #
# Clean up # Clean up
# #

View File

@ -245,17 +245,21 @@ where
pk in (1,2,3,4,5) and pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
create temporary table opt_trace as
select * from information_schema.optimizer_trace;
--echo # Must have a note that "multiplier is too high": --echo # Must have a note that "multiplier is too high":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
--echo # Must not include 1.79...e308 as cost: --echo # Must not include 1.79...e308 as cost:
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
drop table opt_trace;
--echo # Disable the fix and try the same: --echo # Disable the fix and try the same:
set @@optimizer_adjust_secondary_key_costs=''; set @@optimizer_adjust_secondary_key_costs='';
@ -263,20 +267,25 @@ explain select * from t1
where where
pk in (1,2,3,4,5) and pk in (1,2,3,4,5) and
key1 <= 4; key1 <= 4;
drop table t1;
create temporary table opt_trace as
select * from information_schema.optimizer_trace;
--echo # Shows a high multiplier, without a "note": --echo # Shows a high multiplier, without a "note":
select select
json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS json_detailed(json_extract(trace,'$**.selectivity_for_indexes')) as JS
from from
information_schema.optimizer_trace; opt_trace;
--echo # Includes 1.79...e308 as cost: --echo # Includes 1.79...e308 as cost:
select select
json_detailed(json_extract(trace,'$**.best_access_path')) as JS json_detailed(json_extract(trace,'$**.best_access_path')) as JS
from from
information_schema.optimizer_trace; opt_trace;
set optimizer_adjust_secondary_key_costs=default; drop table opt_trace;
set optimizer_adjust_secondary_key_costs=default;
drop table t1;
--echo # --echo #
--echo # Clean up --echo # Clean up
--echo # --echo #

View File

@ -5,31 +5,35 @@ SET gtid_seq_no=1000;
SET @@session.session_track_system_variables='last_gtid'; SET @@session.session_track_system_variables='last_gtid';
create table t1 (a int) engine=innodb; create table t1 (a int) engine=innodb;
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- last_gtid -- last_gtid: 0-1-1000
-- 0-1-1000
select @@last_gtid; select @@last_gtid;
@@last_gtid @@last_gtid
0-1-1000 0-1-1000
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- last_gtid -- last_gtid: 0-1-1000
-- 0-1-1000
insert into t1 values (1); insert into t1 values (1);
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- last_gtid -- last_gtid: 0-1-1001
-- 0-1-1001
select @@last_gtid; select @@last_gtid;
@@last_gtid @@last_gtid
0-1-1001 0-1-1001
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- last_gtid -- last_gtid: 0-1-1001
-- 0-1-1001
drop table t1; drop table t1;
-- Tracker : SESSION_TRACK_SYSTEM_VARIABLES -- Tracker : SESSION_TRACK_SYSTEM_VARIABLES
-- last_gtid -- last_gtid: 0-1-1002
-- 0-1-1002
reset master; reset master;
#
# MDEV-35086 Trying to lock mutex when the mutex was already locked (session_tracker.cc), server hangs
#
set session_track_system_variables='*';
alter table t1 nowait force;
ERROR 42S02: Table 'test.t1' doesn't exist
use mysql;
set session_track_system_variables=default;
# End of 10.5 tests

View File

@ -18,3 +18,14 @@ drop table t1;
--disable_session_track_info --disable_session_track_info
reset master; reset master;
--echo #
--echo # MDEV-35086 Trying to lock mutex when the mutex was already locked (session_tracker.cc), server hangs
--echo #
set session_track_system_variables='*';
--error ER_NO_SUCH_TABLE
alter table t1 nowait force;
use mysql;
set session_track_system_variables=default;
--echo # End of 10.5 tests

View File

@ -338,9 +338,9 @@ CREATE TABLE t1 (g GEOMETRY NOT NULL, SPATIAL gi(g));
INSERT INTO t1 VALUES (POINT(0,0)); INSERT INTO t1 VALUES (POINT(0,0));
HANDLER t1 OPEN AS h; HANDLER t1 OPEN AS h;
HANDLER h READ `gi`= (10); HANDLER h READ `gi`= (10);
ERROR HY000: SPATIAL index `gi` does not support this operation ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
HANDLER h READ `gi`> (10); HANDLER h READ `gi`> (10);
ERROR HY000: SPATIAL index `gi` does not support this operation ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
HANDLER h CLOSE; HANDLER h CLOSE;
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 (w VARCHAR(100), FULLTEXT fk(w)); CREATE TABLE t1 (w VARCHAR(100), FULLTEXT fk(w));
@ -352,3 +352,12 @@ HANDLER h READ `fk`> (10);
ERROR HY000: FULLTEXT index `fk` does not support this operation ERROR HY000: FULLTEXT index `fk` does not support this operation
HANDLER h CLOSE; HANDLER h CLOSE;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-35082 HANDLER with FULLTEXT keys is not always rejected
#
create table t (a int primary key, v text not null, fulltext(v));
handler t open;
handler t read v next;
ERROR HY000: FULLTEXT index `v` does not support this operation
drop table t;
# End of 10.5 tests

View File

@ -385,9 +385,9 @@ DROP TABLE t1;
CREATE TABLE t1 (g GEOMETRY NOT NULL, SPATIAL gi(g)); CREATE TABLE t1 (g GEOMETRY NOT NULL, SPATIAL gi(g));
INSERT INTO t1 VALUES (POINT(0,0)); INSERT INTO t1 VALUES (POINT(0,0));
HANDLER t1 OPEN AS h; HANDLER t1 OPEN AS h;
--error ER_KEY_DOESNT_SUPPORT --error ER_CANT_CREATE_GEOMETRY_OBJECT
HANDLER h READ `gi`= (10); HANDLER h READ `gi`= (10);
--error ER_KEY_DOESNT_SUPPORT --error ER_CANT_CREATE_GEOMETRY_OBJECT
HANDLER h READ `gi`> (10); HANDLER h READ `gi`> (10);
HANDLER h CLOSE; HANDLER h CLOSE;
DROP TABLE t1; DROP TABLE t1;
@ -401,3 +401,14 @@ HANDLER h READ `fk`= (10);
HANDLER h READ `fk`> (10); HANDLER h READ `fk`> (10);
HANDLER h CLOSE; HANDLER h CLOSE;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-35082 HANDLER with FULLTEXT keys is not always rejected
--echo #
create table t (a int primary key, v text not null, fulltext(v));
handler t open;
--error ER_KEY_DOESNT_SUPPORT
handler t read v next;
drop table t;
--echo # End of 10.5 tests

View File

@ -1188,9 +1188,9 @@ DROP TABLE t;
CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB;
HANDLER t OPEN; HANDLER t OPEN;
HANDLER t READ a NEXT; HANDLER t READ a NEXT;
a ERROR HY000: FULLTEXT index `a` does not support this operation
HANDLER t READ a PREV; HANDLER t READ a PREV;
a ERROR HY000: FULLTEXT index `a` does not support this operation
DROP TABLE t; DROP TABLE t;
CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB;
CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB;

View File

@ -1183,9 +1183,9 @@ DROP TABLE t;
CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB;
HANDLER t OPEN; HANDLER t OPEN;
HANDLER t READ a NEXT; HANDLER t READ a NEXT;
a ERROR HY000: FULLTEXT index `a` does not support this operation
HANDLER t READ a PREV; HANDLER t READ a PREV;
a ERROR HY000: FULLTEXT index `a` does not support this operation
DROP TABLE t; DROP TABLE t;
CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; CREATE TABLE `%`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB;
CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB; CREATE TABLE `A B`(a TEXT, FULLTEXT INDEX(a)) ENGINE=INNODB;

View File

@ -1155,7 +1155,9 @@ DROP TABLE t;
# InnoDB FTS does not support index scan from handler # InnoDB FTS does not support index scan from handler
CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB;
HANDLER t OPEN; HANDLER t OPEN;
--error ER_KEY_DOESNT_SUPPORT
HANDLER t READ a NEXT; HANDLER t READ a NEXT;
--error ER_KEY_DOESNT_SUPPORT
HANDLER t READ a PREV; HANDLER t READ a PREV;
DROP TABLE t; DROP TABLE t;

View File

@ -1148,7 +1148,9 @@ DROP TABLE t;
# InnoDB FTS does not support index scan from handler # InnoDB FTS does not support index scan from handler
CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB; CREATE TABLE t(a CHAR(1),FULLTEXT KEY(a)) ENGINE=INNODB;
HANDLER t OPEN; HANDLER t OPEN;
--error ER_KEY_DOESNT_SUPPORT
HANDLER t READ a NEXT; HANDLER t READ a NEXT;
--error ER_KEY_DOESNT_SUPPORT
HANDLER t READ a PREV; HANDLER t READ a PREV;
DROP TABLE t; DROP TABLE t;

View File

@ -0,0 +1,8 @@
#
# MDEV-35050 Found wrong usage of mutex upon setting plugin session variables
#
install soname 'mypluglib';
set session_track_system_variables="*";
set session simple_parser_simple_thdvar_one = 10;
uninstall soname 'mypluglib';
# End of 10.5 tests

View File

@ -8,11 +8,3 @@ DROP TABLE t1;
UNINSTALL PLUGIN simple_parser; UNINSTALL PLUGIN simple_parser;
show status like 'a%status'; show status like 'a%status';
Variable_name Value Variable_name Value
#
# MDEV-35050 Found wrong usage of mutex upon setting plugin session variables
#
install soname 'mypluglib';
set session_track_system_variables="*";
set session simple_parser_simple_thdvar_one = 10;
uninstall soname 'mypluglib';
# End of 10.5 tests

View File

@ -0,0 +1,12 @@
--source include/have_simple_parser.inc
--source include/not_embedded.inc
--echo #
--echo # MDEV-35050 Found wrong usage of mutex upon setting plugin session variables
--echo #
install soname 'mypluglib';
set session_track_system_variables="*";
set session simple_parser_simple_thdvar_one = 10;
uninstall soname 'mypluglib';
--echo # End of 10.5 tests

View File

@ -1,4 +1,3 @@
--source include/not_embedded.inc
--source include/have_simple_parser.inc --source include/have_simple_parser.inc
--echo # --echo #
@ -15,13 +14,3 @@ UNINSTALL PLUGIN simple_parser;
# Bug #69682 - mysqld crashes after uninstall of plugin with "first" status var # Bug #69682 - mysqld crashes after uninstall of plugin with "first" status var
# #
show status like 'a%status'; show status like 'a%status';
--echo #
--echo # MDEV-35050 Found wrong usage of mutex upon setting plugin session variables
--echo #
install soname 'mypluglib';
set session_track_system_variables="*";
set session simple_parser_simple_thdvar_one = 10;
uninstall soname 'mypluglib';
--echo # End of 10.5 tests

View File

@ -221,3 +221,14 @@ ERROR HY000: The target table v1 of the DELETE is not updatable
DROP VIEW v1; DROP VIEW v1;
DROP TABLE t1; DROP TABLE t1;
# End of 10.4 tests # End of 10.4 tests
#
# MDEV-33470 Unique hash index is broken on DML for system-versioned table
#
create or replace table t (
c int, unique (c) using hash)
with system versioning;
insert into t values (0);
delete from t;
delete history from t;
drop table t;
# End of 10.5 tests

View File

@ -49,4 +49,28 @@ x y
1 1 1 1
connection master; connection master;
drop table t1; drop table t1;
#
# MDEV-31297 Create table as select on system versioned tables do not work consistently on replication
#
connection master;
create table t engine=innodb with system versioning as select 1 as i;
show create table t;
Table Create Table
t CREATE TABLE `t` (
`i` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
select * from t;
i
1
connection slave;
show create table t;
Table Create Table
t CREATE TABLE `t` (
`i` int(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci WITH SYSTEM VERSIONING
select * from t;
i
1
connection master;
drop table t;
include/rpl_end.inc include/rpl_end.inc

View File

@ -227,4 +227,17 @@ DROP TABLE t1;
--echo # End of 10.4 tests --echo # End of 10.4 tests
--echo #
--echo # MDEV-33470 Unique hash index is broken on DML for system-versioned table
--echo #
create or replace table t (
c int, unique (c) using hash)
with system versioning;
insert into t values (0);
delete from t;
delete history from t;
drop table t;
--echo # End of 10.5 tests
--source suite/versioning/common_finish.inc --source suite/versioning/common_finish.inc

View File

@ -56,4 +56,19 @@ drop table t1;
--remove_files_wildcard $TMP *.txt --remove_files_wildcard $TMP *.txt
--remove_files_wildcard $TMP *.sql --remove_files_wildcard $TMP *.sql
--echo #
--echo # MDEV-31297 Create table as select on system versioned tables do not work consistently on replication
--echo #
--connection master
create table t engine=innodb with system versioning as select 1 as i;
show create table t;
select * from t;
--sync_slave_with_master
show create table t;
select * from t;
--connection master
drop table t;
--source include/rpl_end.inc --source include/rpl_end.inc

View File

@ -8966,6 +8966,24 @@ int Field_blob::key_cmp(const uchar *a,const uchar *b) const
} }
#ifndef DBUG_OFF
/* helper to assert that new_table->blob_storage is NULL */
static struct blob_storage_check
{
union { bool b; intptr p; } val;
blob_storage_check() { val.p= -1; val.b= false; }
} blob_storage_check;
#endif
Field *Field_blob::make_new_field(MEM_ROOT *root, TABLE *newt, bool keep_type)
{
DBUG_ASSERT((intptr(newt->blob_storage) & blob_storage_check.val.p) == 0);
if (newt->group_concat)
return new (root) Field_blob(field_length, maybe_null(), &field_name,
charset());
return Field::make_new_field(root, newt, keep_type);
}
Field *Field_blob::new_key_field(MEM_ROOT *root, TABLE *new_table, Field *Field_blob::new_key_field(MEM_ROOT *root, TABLE *new_table,
uchar *new_ptr, uint32 length, uchar *new_ptr, uint32 length,
uchar *new_null_ptr, uint new_null_bit) uchar *new_null_ptr, uint new_null_bit)

View File

@ -4593,6 +4593,7 @@ public:
return get_key_image_itRAW(ptr_arg, buff, length); return get_key_image_itRAW(ptr_arg, buff, length);
} }
void set_key_image(const uchar *buff,uint length) override; void set_key_image(const uchar *buff,uint length) override;
Field *make_new_field(MEM_ROOT *, TABLE *new_table, bool keep_type) override;
Field *new_key_field(MEM_ROOT *root, TABLE *new_table, Field *new_key_field(MEM_ROOT *root, TABLE *new_table,
uchar *new_ptr, uint32 length, uchar *new_ptr, uint32 length,
uchar *new_null_ptr, uint new_null_bit) override; uchar *new_null_ptr, uint new_null_bit) override;

View File

@ -8400,6 +8400,21 @@ bool Table_scope_and_contents_source_st::vers_fix_system_fields(
} }
int get_select_field_pos(Alter_info *alter_info, int select_field_count,
bool versioned)
{
int select_field_pos= alter_info->create_list.elements - select_field_count;
if (select_field_count && versioned &&
/*
ALTER_PARSER_ADD_COLUMN indicates system fields was created implicitly,
select_field_count guarantees it's not ALTER TABLE
*/
alter_info->flags & ALTER_PARSER_ADD_COLUMN)
select_field_pos-= 2;
return select_field_pos;
}
bool Table_scope_and_contents_source_st::vers_check_system_fields( bool Table_scope_and_contents_source_st::vers_check_system_fields(
THD *thd, Alter_info *alter_info, const Lex_table_name &table_name, THD *thd, Alter_info *alter_info, const Lex_table_name &table_name,
const Lex_table_name &db, int select_count) const Lex_table_name &db, int select_count)
@ -8413,6 +8428,8 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields(
{ {
uint fieldnr= 0; uint fieldnr= 0;
List_iterator<Create_field> field_it(alter_info->create_list); List_iterator<Create_field> field_it(alter_info->create_list);
uint select_field_pos= (uint) get_select_field_pos(alter_info, select_count,
true);
while (Create_field *f= field_it++) while (Create_field *f= field_it++)
{ {
/* /*
@ -8423,7 +8440,7 @@ bool Table_scope_and_contents_source_st::vers_check_system_fields(
SELECT go last there. SELECT go last there.
*/ */
bool is_dup= false; bool is_dup= false;
if (fieldnr >= alter_info->create_list.elements - select_count) if (fieldnr >= select_field_pos && f->invisible < INVISIBLE_SYSTEM)
{ {
List_iterator<Create_field> dup_it(alter_info->create_list); List_iterator<Create_field> dup_it(alter_info->create_list);
for (Create_field *dup= dup_it++; !is_dup && dup != f; dup= dup_it++) for (Create_field *dup= dup_it++; !is_dup && dup != f; dup= dup_it++)

View File

@ -5521,4 +5521,6 @@ uint ha_count_rw_2pc(THD *thd, bool all);
uint ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list, uint ha_check_and_coalesce_trx_read_only(THD *thd, Ha_trx_info *ha_list,
bool all); bool all);
int get_select_field_pos(Alter_info *alter_info, int select_field_count,
bool versioned);
#endif /* HANDLER_INCLUDED */ #endif /* HANDLER_INCLUDED */

View File

@ -4392,6 +4392,7 @@ bool Item_func_group_concat::setup(THD *thd)
count_field_types(select_lex, tmp_table_param, all_fields, 0); count_field_types(select_lex, tmp_table_param, all_fields, 0);
tmp_table_param->force_copy_fields= force_copy_fields; tmp_table_param->force_copy_fields= force_copy_fields;
tmp_table_param->hidden_field_count= (arg_count_order > 0); tmp_table_param->hidden_field_count= (arg_count_order > 0);
tmp_table_param->group_concat= true;
DBUG_ASSERT(table == 0); DBUG_ASSERT(table == 0);
if (order_or_distinct) if (order_or_distinct)
{ {
@ -4412,11 +4413,10 @@ bool Item_func_group_concat::setup(THD *thd)
Note that in the table, we first have the ORDER BY fields, then the Note that in the table, we first have the ORDER BY fields, then the
field list. field list.
*/ */
if (!(table= create_tmp_table(thd, tmp_table_param, all_fields, table= create_tmp_table(thd, tmp_table_param, all_fields, NULL, 0, TRUE,
(ORDER*) 0, 0, TRUE, (select_lex->options | thd->variables.option_bits),
(select_lex->options | HA_POS_ERROR, &empty_clex_str);
thd->variables.option_bits), if (!table)
HA_POS_ERROR, &empty_clex_str)))
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
table->file->extra(HA_EXTRA_NO_ROWS); table->file->extra(HA_EXTRA_NO_ROWS);
table->no_rows= 1; table->no_rows= 1;
@ -4427,6 +4427,8 @@ bool Item_func_group_concat::setup(THD *thd)
*/ */
if (order_or_distinct && table->s->blob_fields) if (order_or_distinct && table->s->blob_fields)
table->blob_storage= new (thd->mem_root) Blob_mem_storage(); table->blob_storage= new (thd->mem_root) Blob_mem_storage();
else
table->blob_storage= NULL;
/* /*
Need sorting or uniqueness: init tree and choose a function to sort. Need sorting or uniqueness: init tree and choose a function to sort.

View File

@ -433,6 +433,7 @@ bool Session_sysvars_tracker::vars_list::store(THD *thd, String *buf)
if (!*node->test_load) if (!*node->test_load)
{ {
mysql_mutex_unlock(&LOCK_plugin); mysql_mutex_unlock(&LOCK_plugin);
mysql_mutex_unlock(&LOCK_global_system_variables);
continue; continue;
} }
sys_var *svar= node->m_svar; sys_var *svar= node->m_svar;

View File

@ -6515,6 +6515,7 @@ public:
aggregate functions as normal functions. aggregate functions as normal functions.
*/ */
bool precomputed_group_by; bool precomputed_group_by;
bool group_concat;
bool force_copy_fields; bool force_copy_fields;
/* /*
If TRUE, create_tmp_field called from create_tmp_table will convert If TRUE, create_tmp_field called from create_tmp_table will convert
@ -6533,7 +6534,7 @@ public:
group_length(0), group_null_parts(0), group_length(0), group_null_parts(0),
using_outer_summary_function(0), using_outer_summary_function(0),
schema_table(0), materialized_subquery(0), force_not_null_cols(0), schema_table(0), materialized_subquery(0), force_not_null_cols(0),
precomputed_group_by(0), precomputed_group_by(0), group_concat(0),
force_copy_fields(0), bit_fields_as_long(0), skip_create_table(0) force_copy_fields(0), bit_fields_as_long(0), skip_create_table(0)
{ {
init(); init();

View File

@ -659,28 +659,26 @@ mysql_ha_fix_cond_and_key(SQL_HANDLER *handler,
} }
} }
const KEY *c_key= table->s->key_info + handler->keyno;
if (c_key->algorithm == HA_KEY_ALG_FULLTEXT ||
(ha_rkey_mode != HA_READ_KEY_EXACT &&
(table->file->index_flags(handler->keyno, 0, TRUE) &
(HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE)) == 0))
{
my_error(ER_KEY_DOESNT_SUPPORT, MYF(0),
table->file->index_type(handler->keyno), c_key->name.str);
return 1;
}
/* Check key parts */ /* Check key parts */
if (mode == RKEY) if (mode == RKEY)
{ {
TABLE *table= handler->table;
KEY *keyinfo= table->key_info + handler->keyno; KEY *keyinfo= table->key_info + handler->keyno;
KEY_PART_INFO *key_part= keyinfo->key_part; KEY_PART_INFO *key_part= keyinfo->key_part;
List_iterator<Item> it_ke(*key_expr); List_iterator<Item> it_ke(*key_expr);
Item *item; Item *item;
key_part_map keypart_map; key_part_map keypart_map;
uint key_len; uint key_len;
const KEY *c_key= table->s->key_info + handler->keyno;
if ((c_key->flags & HA_SPATIAL) ||
c_key->algorithm == HA_KEY_ALG_FULLTEXT ||
(ha_rkey_mode != HA_READ_KEY_EXACT &&
(table->file->index_flags(handler->keyno, 0, TRUE) &
(HA_READ_NEXT | HA_READ_PREV | HA_READ_RANGE)) == 0))
{
my_error(ER_KEY_DOESNT_SUPPORT, MYF(0),
table->file->index_type(handler->keyno), keyinfo->name.str);
return 1;
}
if (key_expr->elements > keyinfo->user_defined_key_parts) if (key_expr->elements > keyinfo->user_defined_key_parts)
{ {

View File

@ -1817,10 +1817,6 @@ int vers_insert_history_row(TABLE *table)
if (row_start->cmp(row_start->ptr, row_end->ptr) >= 0) if (row_start->cmp(row_start->ptr, row_end->ptr) >= 0)
return 0; return 0;
if (table->vfield &&
table->update_virtual_fields(table->file, VCOL_UPDATE_FOR_READ))
return HA_ERR_GENERIC;
return table->file->ha_write_row(table->record[0]); return table->file->ha_write_row(table->record[0]);
} }
@ -4529,20 +4525,14 @@ TABLE *select_create::create_table_from_items(THD *thd, List<Item> *items,
bool save_table_creation_was_logged; bool save_table_creation_was_logged;
DBUG_ENTER("select_create::create_table_from_items"); DBUG_ENTER("select_create::create_table_from_items");
tmp_table.reset();
tmp_table.s= &share; tmp_table.s= &share;
init_tmp_table_share(thd, &share, "", 0, "", ""); init_tmp_table_share(thd, &share, "", 0, "", "");
tmp_table.s->db_create_options=0;
tmp_table.null_row= 0;
tmp_table.maybe_null= 0;
tmp_table.in_use= thd; tmp_table.in_use= thd;
if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP)) if (!(thd->variables.option_bits & OPTION_EXPLICIT_DEF_TIMESTAMP))
promote_first_timestamp_column(&alter_info->create_list); promote_first_timestamp_column(&alter_info->create_list);
if (create_info->fix_create_fields(thd, alter_info, *create_table))
DBUG_RETURN(NULL);
while ((item=it++)) while ((item=it++))
{ {
Field *tmp_field= item->create_field_for_create_select(thd->mem_root, Field *tmp_field= item->create_field_for_create_select(thd->mem_root,
@ -4580,6 +4570,9 @@ TABLE *select_create::create_table_from_items(THD *thd, List<Item> *items,
alter_info->create_list.push_back(cr_field, thd->mem_root); alter_info->create_list.push_back(cr_field, thd->mem_root);
} }
if (create_info->fix_create_fields(thd, alter_info, *create_table))
DBUG_RETURN(NULL);
/* /*
Item*::type_handler() always returns pointers to Item*::type_handler() always returns pointers to
type_handler_{time2|datetime2|timestamp2} no matter what type_handler_{time2|datetime2|timestamp2} no matter what

View File

@ -20043,6 +20043,7 @@ TABLE *Create_tmp_table::start(THD *thd,
table->copy_blobs= 1; table->copy_blobs= 1;
table->in_use= thd; table->in_use= thd;
table->no_rows_with_nulls= param->force_not_null_cols; table->no_rows_with_nulls= param->force_not_null_cols;
table->group_concat= param->group_concat;
table->expr_arena= thd; table->expr_arena= thd;
table->s= share; table->s= share;

View File

@ -2651,7 +2651,8 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
select_field_pos= alter_info->create_list.elements - select_field_count; select_field_pos= get_select_field_pos(alter_info, select_field_count,
create_info->versioned());
null_fields= 0; null_fields= 0;
create_info->varchar= 0; create_info->varchar= 0;
max_key_length= file->max_key_length(); max_key_length= file->max_key_length();
@ -2716,7 +2717,16 @@ mysql_prepare_create_table(THD *thd, HA_CREATE_INFO *create_info,
/* /*
If this was a CREATE ... SELECT statement, accept a field If this was a CREATE ... SELECT statement, accept a field
redefinition if we are changing a field in the SELECT part redefinition if we are changing a field in the SELECT part
The cases are:
field_no < select_field_pos: both field and dup are table fields;
dup_no >= select_field_pos: both field and dup are select fields or
field is implicit systrem field and dup is select field.
We are not allowed to put row_start/row_end into SELECT expression.
*/ */
DBUG_ASSERT(dup_no < field_no);
if (field_no < select_field_pos || dup_no >= select_field_pos || if (field_no < select_field_pos || dup_no >= select_field_pos ||
dup_field->invisible >= INVISIBLE_SYSTEM) dup_field->invisible >= INVISIBLE_SYSTEM)
{ {

View File

@ -9363,6 +9363,8 @@ void TABLE::vers_update_end()
in_use->query_start_sec_part())) in_use->query_start_sec_part()))
DBUG_ASSERT(0); DBUG_ASSERT(0);
vers_end_field()->set_has_explicit_value(); vers_end_field()->set_has_explicit_value();
if (vfield)
update_virtual_fields(file, VCOL_UPDATE_FOR_WRITE);
} }
/** /**

View File

@ -1495,7 +1495,6 @@ public:
Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode. Used only in the MODE_NO_AUTO_VALUE_ON_ZERO mode.
*/ */
bool auto_increment_field_not_null; bool auto_increment_field_not_null;
bool insert_or_update; /* Can be used by the handler */
/* /*
NOTE: alias_name_used is only a hint! It works only in need_correct_ident() NOTE: alias_name_used is only a hint! It works only in need_correct_ident()
condition. On other cases it is FALSE even if table_name is alias. condition. On other cases it is FALSE even if table_name is alias.
@ -1516,12 +1515,11 @@ public:
REGINFO reginfo; /* field connections */ REGINFO reginfo; /* field connections */
MEM_ROOT mem_root; MEM_ROOT mem_root;
/** /* this is for temporary tables created inside Item_func_group_concat */
Initialized in Item_func_group_concat::setup for appropriate union {
temporary table if GROUP_CONCAT is used with ORDER BY | DISTINCT bool group_concat; /* used during create_tmp_table() */
and BLOB field count > 0. Blob_mem_storage *blob_storage; /* used after create_tmp_table() */
*/ };
Blob_mem_storage *blob_storage;
GRANT_INFO grant; GRANT_INFO grant;
/* /*
The arena which the items for expressions from the table definition The arena which the items for expressions from the table definition
@ -1912,7 +1910,14 @@ public:
DBUG_ASSERT(fields_nullable); DBUG_ASSERT(fields_nullable);
DBUG_ASSERT(field < n_fields); DBUG_ASSERT(field < n_fields);
size_t bit= size_t{field} + referenced * n_fields; size_t bit= size_t{field} + referenced * n_fields;
fields_nullable[bit / 8]|= (unsigned char)(1 << (bit % 8)); #if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
#endif
fields_nullable[bit / 8]|= static_cast<unsigned char>(1 << (bit % 8));
#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic pop
#endif
} }
/** /**
@ -1929,7 +1934,7 @@ public:
unsigned n_field= get_n_fields(); unsigned n_field= get_n_fields();
DBUG_ASSERT(field < n_field); DBUG_ASSERT(field < n_field);
size_t bit= size_t{field} + referenced * n_field; size_t bit= size_t{field} + referenced * n_field;
return fields_nullable[bit / 8] & (1 << (bit % 8)); return fields_nullable[bit / 8] & (1U << (bit % 8));
} }
} FOREIGN_KEY_INFO; } FOREIGN_KEY_INFO;

View File

@ -6472,6 +6472,15 @@ int ha_connect::create(const char *name, TABLE *table_arg,
PGLOBAL g= xp->g; PGLOBAL g= xp->g;
DBUG_ENTER("ha_connect::create"); DBUG_ENTER("ha_connect::create");
if (table_arg->versioned())
{
/* Due to microseconds not supported by CONNECT (MDEV-15967) system versioning
cannot work as expected (MDEV-15968, MDEV-28288) */
my_error(ER_VERS_NOT_SUPPORTED, MYF(0), "CONNECT storage engine");
DBUG_RETURN(HA_ERR_UNSUPPORTED);
}
/* /*
This assignment fixes test failures if some This assignment fixes test failures if some
"ALTER TABLE t1 ADD KEY(a)" query exits on ER_ACCESS_DENIED_ERROR "ALTER TABLE t1 ADD KEY(a)" query exits on ER_ACCESS_DENIED_ERROR

View File

@ -141,3 +141,12 @@ DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t3; DROP TABLE t3;
DROP TABLE t4; DROP TABLE t4;
#
# MDEV-28288 System versioning doesn't support correct work for
# engine=connect and doesn't always give any warnings/errors
#
create table t2 (
x int,
y int
) engine=connect table_type=FIX file_name='test.txt' with system versioning;
ERROR HY000: System-versioned tables do not support CONNECT storage engine

View File

@ -51,3 +51,14 @@ DROP TABLE t1;
DROP TABLE t2; DROP TABLE t2;
DROP TABLE t3; DROP TABLE t3;
DROP TABLE t4; DROP TABLE t4;
--echo #
--echo # MDEV-28288 System versioning doesn't support correct work for
--echo # engine=connect and doesn't always give any warnings/errors
--echo #
--error ER_VERS_NOT_SUPPORTED
create table t2 (
x int,
y int
) engine=connect table_type=FIX file_name='test.txt' with system versioning;

View File

@ -12673,7 +12673,10 @@ create_table_info_t::create_foreign_keys()
} }
} }
} }
#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
#endif
switch (fk->delete_opt) { switch (fk->delete_opt) {
case FK_OPTION_UNDEF: case FK_OPTION_UNDEF:
case FK_OPTION_RESTRICT: case FK_OPTION_RESTRICT:
@ -12715,6 +12718,9 @@ create_table_info_t::create_foreign_keys()
ut_ad(0); ut_ad(0);
break; break;
} }
#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic pop
#endif
} }
if (dict_foreigns_has_s_base_col(local_fk_set, table)) { if (dict_foreigns_has_s_base_col(local_fk_set, table)) {

View File

@ -3010,6 +3010,10 @@ innobase_set_foreign_key_option(
break; break;
} }
#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wconversion"
#endif
switch (fk_key->update_opt) { switch (fk_key->update_opt) {
case FK_OPTION_NO_ACTION: case FK_OPTION_NO_ACTION:
case FK_OPTION_RESTRICT: case FK_OPTION_RESTRICT:
@ -3026,6 +3030,9 @@ innobase_set_foreign_key_option(
break; break;
} }
#if defined __GNUC__ && !defined __clang__ && __GNUC__ < 6
# pragma GCC diagnostic pop
#endif
return(innobase_check_fk_option(foreign)); return(innobase_check_fk_option(foreign));
} }

View File

@ -997,11 +997,11 @@ int ha_myisam::write_row(const uchar *buf)
return mi_write(file,buf); return mi_write(file,buf);
} }
void ha_myisam::setup_vcols_for_repair(HA_CHECK *param) int ha_myisam::setup_vcols_for_repair(HA_CHECK *param)
{ {
DBUG_ASSERT(file->s->base.reclength <= file->s->vreclength); DBUG_ASSERT(file->s->base.reclength <= file->s->vreclength);
if (!table->vfield) if (!table->vfield)
return; return 0;
if (file->s->base.reclength == file->s->vreclength) if (file->s->base.reclength == file->s->vreclength)
{ {
@ -1018,14 +1018,18 @@ void ha_myisam::setup_vcols_for_repair(HA_CHECK *param)
} }
} }
if (!indexed_vcols) if (!indexed_vcols)
return; return 0;
file->s->vreclength= new_vreclength; file->s->vreclength= new_vreclength;
if (!mi_alloc_rec_buff(file, -1, &file->rec_buff))
return HA_ERR_OUT_OF_MEM;
bzero(file->rec_buff, mi_get_rec_buff_len(file, file->rec_buff));
} }
DBUG_ASSERT(file->s->base.reclength < file->s->vreclength || DBUG_ASSERT(file->s->base.reclength < file->s->vreclength ||
!table->s->stored_fields); !table->s->stored_fields);
param->init_fix_record= init_compute_vcols; param->init_fix_record= init_compute_vcols;
param->fix_record= compute_vcols; param->fix_record= compute_vcols;
table->use_all_columns(); table->use_all_columns();
return 0;
} }
int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt) int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
@ -1061,7 +1065,11 @@ int ha_myisam::check(THD* thd, HA_CHECK_OPT* check_opt)
(uint) (share->global_changed ? 1 : 0))))) (uint) (share->global_changed ? 1 : 0)))))
return HA_ADMIN_ALREADY_DONE; return HA_ADMIN_ALREADY_DONE;
setup_vcols_for_repair(param); if ((error = setup_vcols_for_repair(param)))
{
thd_proc_info(thd, old_proc_info);
return error;
}
error = chk_status(param, file); // Not fatal error = chk_status(param, file); // Not fatal
error = chk_size(param, file); error = chk_size(param, file);
@ -1157,7 +1165,8 @@ int ha_myisam::analyze(THD *thd, HA_CHECK_OPT* check_opt)
if (!(share->state.changed & STATE_NOT_ANALYZED)) if (!(share->state.changed & STATE_NOT_ANALYZED))
return HA_ADMIN_ALREADY_DONE; return HA_ADMIN_ALREADY_DONE;
setup_vcols_for_repair(param); if ((error = setup_vcols_for_repair(param)))
return error;
error = chk_key(param, file); error = chk_key(param, file);
if (!error) if (!error)
@ -1192,7 +1201,8 @@ int ha_myisam::repair(THD* thd, HA_CHECK_OPT *check_opt)
param->backup_time= check_opt->start_time; param->backup_time= check_opt->start_time;
start_records=file->state->records; start_records=file->state->records;
setup_vcols_for_repair(param); if ((error = setup_vcols_for_repair(param)))
return error;
while ((error=repair(thd,*param,0)) && param->retry_repair) while ((error=repair(thd,*param,0)) && param->retry_repair)
{ {
@ -1245,7 +1255,8 @@ int ha_myisam::optimize(THD* thd, HA_CHECK_OPT *check_opt)
param->tmpfile_createflag= O_RDWR | O_TRUNC; param->tmpfile_createflag= O_RDWR | O_TRUNC;
param->sort_buffer_length= THDVAR(thd, sort_buffer_size); param->sort_buffer_length= THDVAR(thd, sort_buffer_size);
setup_vcols_for_repair(param); if ((error = setup_vcols_for_repair(param)))
return error;
if ((error= repair(thd,*param,1)) && param->retry_repair) if ((error= repair(thd,*param,1)) && param->retry_repair)
{ {
@ -1665,7 +1676,11 @@ int ha_myisam::enable_indexes(key_map map, bool persist)
param->stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method); param->stats_method= (enum_handler_stats_method)THDVAR(thd, stats_method);
param->tmpdir=&mysql_tmpdir_list; param->tmpdir=&mysql_tmpdir_list;
setup_vcols_for_repair(param); if ((error = setup_vcols_for_repair(param)))
{
thd_proc_info(thd, save_proc_info);
DBUG_RETURN(error);
}
if ((error= (repair(thd,*param,0) != HA_ADMIN_OK)) && param->retry_repair) if ((error= (repair(thd,*param,0) != HA_ADMIN_OK)) && param->retry_repair)
{ {

View File

@ -48,7 +48,7 @@ class ha_myisam final : public handler
char *data_file_name, *index_file_name; char *data_file_name, *index_file_name;
bool can_enable_indexes; bool can_enable_indexes;
int repair(THD *thd, HA_CHECK &param, bool optimize); int repair(THD *thd, HA_CHECK &param, bool optimize);
void setup_vcols_for_repair(HA_CHECK *param); int setup_vcols_for_repair(HA_CHECK *param);
public: public:
ha_myisam(handlerton *hton, TABLE_SHARE *table_arg); ha_myisam(handlerton *hton, TABLE_SHARE *table_arg);