Merge branch '10.2' into 10.3

This commit is contained in:
Sergei Golubchik 2021-07-21 20:11:07 +02:00
commit 6190a02f35
80 changed files with 2389 additions and 227 deletions

View File

@ -21,7 +21,7 @@ MACRO(EXTRACT_LINK_LIBRARIES target var)
FOREACH(lib ${${target}_LIB_DEPENDS}) FOREACH(lib ${${target}_LIB_DEPENDS})
# Filter out "general", it is not a library, just CMake hint # Filter out "general", it is not a library, just CMake hint
# Also, remove duplicates # Also, remove duplicates
IF(NOT lib STREQUAL "general" AND NOT ${var} MATCHES "-l${lib} ") IF(NOT lib STREQUAL "general" AND NOT ${var} MATCHES "-l${lib} " AND NOT lib STREQUAL "zlib")
IF (lib MATCHES "^\\-") IF (lib MATCHES "^\\-")
SET(${var} "${${var}} ${lib} ") SET(${var} "${${var}} ${lib} ")
ELSEIF(lib MATCHES "^/") ELSEIF(lib MATCHES "^/")

4
debian/control vendored
View File

@ -224,14 +224,14 @@ Architecture: all
Depends: mysql-common, Depends: mysql-common,
${misc:Depends}, ${misc:Depends},
${shlibs:Depends} ${shlibs:Depends}
Description: MariaDB database common files (e.g. /etc/mysql/conf.d/mariadb.cnf) Description: MariaDB database common files (e.g. /etc/mysql/mariadb.conf.d/)
MariaDB is a fast, stable and true multi-user, multi-threaded SQL database MariaDB is a fast, stable and true multi-user, multi-threaded SQL database
server. SQL (Structured Query Language) is the most popular database query server. SQL (Structured Query Language) is the most popular database query
language in the world. The main goals of MariaDB are speed, robustness and language in the world. The main goals of MariaDB are speed, robustness and
ease of use. ease of use.
. .
This package includes files needed by all versions of the client library This package includes files needed by all versions of the client library
(e.g. /etc/mysql/conf.d/mariadb.cnf). (e.g. /etc/mysql/mariadb.conf.d/ or /etc/mysql/mariadb.cnf).
Package: mariadb-client-core-10.3 Package: mariadb-client-core-10.3
Architecture: any Architecture: any

View File

@ -815,6 +815,16 @@ write_file(
return(true); return(true);
} }
// checks using current xdes page whether the page is free
static bool page_is_free(const byte *xdes, page_size_t page_size,
ulonglong page_no)
{
const byte *des=
xdes + XDES_ARR_OFFSET +
XDES_SIZE * ((page_no & (page_size.physical() - 1)) / FSP_EXTENT_SIZE);
return xdes_get_bit(des, XDES_FREE_BIT, page_no % FSP_EXTENT_SIZE);
}
/* /*
Parse the page and collect/dump the information about page type Parse the page and collect/dump the information about page type
@param [in] page buffer page @param [in] page buffer page
@ -900,17 +910,8 @@ parse_page(
} }
/* update per-index statistics */ /* update per-index statistics */
{ {
if (index_ids.count(id) == 0) { per_index_stats &index = index_ids[id];
index_ids[id] = per_index_stats(); if (page_is_free(xdes, page_size, page_no)) {
}
std::map<unsigned long long, per_index_stats>::iterator it;
it = index_ids.find(id);
per_index_stats &index = (it->second);
const byte* des = xdes + XDES_ARR_OFFSET
+ XDES_SIZE * ((page_no & (page_size.physical() - 1))
/ FSP_EXTENT_SIZE);
if (xdes_get_bit(des, XDES_FREE_BIT,
page_no % FSP_EXTENT_SIZE)) {
index.free_pages++; index.free_pages++;
return; return;
} }
@ -1048,7 +1049,6 @@ parse_page(
case FIL_PAGE_TYPE_FSP_HDR: case FIL_PAGE_TYPE_FSP_HDR:
page_type.n_fil_page_type_fsp_hdr++; page_type.n_fil_page_type_fsp_hdr++;
memcpy(xdes, page, page_size.physical());
if (page_type_dump) { if (page_type_dump) {
fprintf(file, "#::%llu\t\t|\t\tFile Space " fprintf(file, "#::%llu\t\t|\t\tFile Space "
"Header\t\t|\t%s\n", cur_page_num, str); "Header\t\t|\t%s\n", cur_page_num, str);
@ -1057,7 +1057,6 @@ parse_page(
case FIL_PAGE_TYPE_XDES: case FIL_PAGE_TYPE_XDES:
page_type.n_fil_page_type_xdes++; page_type.n_fil_page_type_xdes++;
memcpy(xdes, page, page_size.physical());
if (page_type_dump) { if (page_type_dump) {
fprintf(file, "#::%llu\t\t|\t\tExtent descriptor " fprintf(file, "#::%llu\t\t|\t\tExtent descriptor "
"page\t\t|\t%s\n", cur_page_num, str); "page\t\t|\t%s\n", cur_page_num, str);
@ -1784,6 +1783,8 @@ int main(
printf("page %llu ", cur_page_num); printf("page %llu ", cur_page_num);
} }
memcpy(xdes, buf, physical_page_size);
if (page_type_summary || page_type_dump) { if (page_type_summary || page_type_dump) {
parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); parse_page(buf, xdes, fil_page_type, page_size, is_encrypted);
} }
@ -1962,6 +1963,7 @@ first_non_zero:
/* If no-check is enabled, skip the /* If no-check is enabled, skip the
checksum verification.*/ checksum verification.*/
if (!no_check if (!no_check
&& !page_is_free(xdes, page_size, cur_page_num)
&& !skip_page && !skip_page
&& (exit_status = verify_checksum( && (exit_status = verify_checksum(
buf, page_size, buf, page_size,
@ -1984,6 +1986,10 @@ first_non_zero:
printf("page %llu ", cur_page_num); printf("page %llu ", cur_page_num);
} }
if (page_get_page_no(buf) % physical_page_size == 0) {
memcpy(xdes, buf, physical_page_size);
}
if (page_type_summary || page_type_dump) { if (page_type_summary || page_type_dump) {
parse_page(buf, xdes, fil_page_type, page_size, is_encrypted); parse_page(buf, xdes, fil_page_type, page_size, is_encrypted);
} }

View File

@ -307,7 +307,7 @@ static struct my_option ibx_long_options[] =
{"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This " {"force-non-empty-directories", OPT_FORCE_NON_EMPTY_DIRS, "This "
"option, when specified, makes --copy-back or --move-back transfer " "option, when specified, makes --copy-back or --move-back transfer "
"files to non-empty directories. Note that no existing files will be " "files to non-empty directories. Note that no existing files will be "
"overwritten. If --copy-back or --nove-back has to copy a file from " "overwritten. If --copy-back or --move-back has to copy a file from "
"the backup directory which already exists in the destination " "the backup directory which already exists in the destination "
"directory, it will still fail with an error.", "directory, it will still fail with an error.",
(uchar *) &opt_ibx_force_non_empty_dirs, (uchar *) &opt_ibx_force_non_empty_dirs,

View File

@ -1277,7 +1277,7 @@ struct my_option xb_client_options[]= {
"This " "This "
"option, when specified, makes --copy-back or --move-back transfer " "option, when specified, makes --copy-back or --move-back transfer "
"files to non-empty directories. Note that no existing files will be " "files to non-empty directories. Note that no existing files will be "
"overwritten. If --copy-back or --nove-back has to copy a file from " "overwritten. If --copy-back or --move-back has to copy a file from "
"the backup directory which already exists in the destination " "the backup directory which already exists in the destination "
"directory, it will still fail with an error.", "directory, it will still fail with an error.",
(uchar *) &opt_force_non_empty_dirs, (uchar *) &opt_force_non_empty_dirs, (uchar *) &opt_force_non_empty_dirs, (uchar *) &opt_force_non_empty_dirs,

@ -1 +1 @@
Subproject commit 802ce584a26fdc0ba67fcf35e277bf3c7440956a Subproject commit 7d3d7c5ff4a9772cf6c73901757d6e39c6a20e99

View File

@ -155,32 +155,34 @@ END
sub gcov_one_file { sub gcov_one_file {
return unless /\.gcda$/; return unless /\.gcda$/;
unless ($opt_skip_gcov) { unless ($opt_skip_gcov) {
$cmd= "gcov -i '$_' 2>/dev/null >/dev/null"; $cmd= "gcov -il '$_' 2>/dev/null >/dev/null";
print STDERR ++$file_no,"\r" if not $opt_verbose and -t STDERR; print STDERR ++$file_no,"\r" if not $opt_verbose and -t STDERR;
logv "Running: $cmd"; logv "Running: $cmd";
system($cmd)==0 or die "system($cmd): $? $!"; system($cmd)==0 or die "system($cmd): $? $!";
} }
# now, read the generated file # now, read the generated file
open FH, '<', "$_.gcov" or die "open(<$_.gcov): $!"; for my $gcov_file (<$_*.gcov>) {
my $fname; open FH, '<', "$gcov_file" or die "open(<$gcov_file): $!";
while (<FH>) { my $fname;
chomp; while (<FH>) {
if (/^function:/) { chomp;
next; if (/^function:/) {
next;
}
if (/^file:/) {
$fname=realpath(-f $' ? $' : $root.$');
next;
}
next if /^lcount:\d+,-\d+/; # whatever that means
unless (/^lcount:(\d+),(\d+)/ and $fname) {
warn "unknown line '$_' in $gcov_file";
next;
}
$cov{$fname}->{$1}+=$2;
} }
if (/^file:/) { close(FH);
$fname=realpath($');
next;
}
next if /^lcount:\d+,-\d+/; # whatever that means
unless (/^lcount:(\d+),(\d+)/ and $fname) {
warn "unknown line '$_' after running '$cmd'";
next;
}
$cov{$fname}->{$1}+=$2;
} }
close(FH);
} }
sub write_coverage { sub write_coverage {

View File

@ -395,10 +395,10 @@ sub _collect {
# 1 Still running # 1 Still running
# #
sub wait_one { sub wait_one {
my ($self, $timeout)= @_; my ($self, $timeout, $keep)= @_;
croak "usage: \$safe_proc->wait_one([timeout])" unless ref $self; croak "usage: \$safe_proc->wait_one([timeout] [, keep])" unless ref $self;
_verbose("wait_one $self, $timeout"); _verbose("wait_one $self, $timeout, $keep");
if ( ! defined($self->{SAFE_PID}) ) { if ( ! defined($self->{SAFE_PID}) ) {
# No pid => not running # No pid => not running
@ -472,16 +472,16 @@ sub wait_one {
return 1; return 1;
} }
if ( not $blocking and $retpid == -1 ) { #if ( not $blocking and $retpid == -1 ) {
# still running # # still running
_verbose("still running"); # _verbose("still running");
return 1; # return 1;
} #}
#warn "wait_one: expected pid $pid but got $retpid" #warn "wait_one: expected pid $pid but got $retpid"
# unless( $retpid == $pid ); # unless( $retpid == $pid );
$self->_collect($exit_code); $self->_collect($exit_code) unless $keep;
return 0; return 0;
} }

View File

@ -40,7 +40,7 @@ BEGIN
eval 'sub USE_NETPING { $use_netping }'; eval 'sub USE_NETPING { $use_netping }';
} }
sub sleep_until_file_created ($$$$); sub sleep_until_file_created ($$$$$);
sub mtr_ping_port ($); sub mtr_ping_port ($);
sub mtr_ping_port ($) { sub mtr_ping_port ($) {
@ -102,8 +102,9 @@ sub mtr_ping_port ($) {
# FIXME check that the pidfile contains the expected pid! # FIXME check that the pidfile contains the expected pid!
sub sleep_until_file_created ($$$$) { sub sleep_until_file_created ($$$$$) {
my $pidfile= shift; my $pidfile= shift;
my $expectfile = shift;
my $timeout= shift; my $timeout= shift;
my $proc= shift; my $proc= shift;
my $warn_seconds = shift; my $warn_seconds = shift;
@ -120,8 +121,9 @@ sub sleep_until_file_created ($$$$) {
my $seconds= ($loop * $sleeptime) / 1000; my $seconds= ($loop * $sleeptime) / 1000;
# Check if it died after the fork() was successful # Check if it died after the fork() was successful
if ( defined $proc and ! $proc->wait_one(0) ) if ( defined $proc and ! $proc->wait_one(0, 1) )
{ {
return 1 if -r $expectfile;
mtr_warning("Process $proc died after mysql-test-run waited $seconds " . mtr_warning("Process $proc died after mysql-test-run waited $seconds " .
"seconds for $pidfile to be created."); "seconds for $pidfile to be created.");
return 0; return 0;

View File

@ -2019,6 +2019,73 @@ drop procedure sp1;
drop procedure sp2; drop procedure sp2;
drop procedure sp3; drop procedure sp3;
drop table t1; drop table t1;
#
# MDEV-26095: missing RECURSIVE for the recursive definition of CTE
# embedded into another CTE definition
#
create table t1 (a int);
insert into t1 values (5), (7);
with cte_e as (
with recursive cte_r as (
select a from t1 union select a+1 as a from cte_r r where a < 10
) select * from cte_r
) select * from cte_e;
a
5
7
6
8
9
10
with cte_e as (
with cte_r as (
select a from t1 union select a+1 as a from cte_r r where a < 10
) select * from cte_r
) select * from cte_e;
ERROR 42S02: Table 'test.cte_r' doesn't exist
drop table t1;
#
# MDEV-26025: query with two usage of a CTE executing via PS /SP
#
create table t1 (a int, b int);
insert into t1 value (1,3), (3,2), (1,3), (4,1);
prepare stmt from "with
cte1 as ( select a,b from t1 where a = 1 AND b = 3 ),
cte2 as ( select a,b from cte1 ),
cte3 as ( select a,b from cte2 )
select * from cte3, cte2";
execute stmt;
a b a b
1 3 1 3
1 3 1 3
1 3 1 3
1 3 1 3
execute stmt;
a b a b
1 3 1 3
1 3 1 3
1 3 1 3
1 3 1 3
deallocate prepare stmt;
create procedure sp() with
cte1 as ( select a,b from t1 where a = 1 AND b = 3 ),
cte2 as ( select a,b from cte1 ),
cte3 as ( select a,b from cte2 )
select * from cte3, cte2;
call sp();
a b a b
1 3 1 3
1 3 1 3
1 3 1 3
1 3 1 3
call sp();
a b a b
1 3 1 3
1 3 1 3
1 3 1 3
1 3 1 3
drop procedure sp;
drop table t1;
# End of 10.2 tests # End of 10.2 tests
# #
# MDEV-21673: several references to CTE that uses # MDEV-21673: several references to CTE that uses

View File

@ -1492,6 +1492,56 @@ drop procedure sp3;
drop table t1; drop table t1;
--echo #
--echo # MDEV-26095: missing RECURSIVE for the recursive definition of CTE
--echo # embedded into another CTE definition
--echo #
create table t1 (a int);
insert into t1 values (5), (7);
with cte_e as (
with recursive cte_r as (
select a from t1 union select a+1 as a from cte_r r where a < 10
) select * from cte_r
) select * from cte_e;
--ERROR ER_NO_SUCH_TABLE
with cte_e as (
with cte_r as (
select a from t1 union select a+1 as a from cte_r r where a < 10
) select * from cte_r
) select * from cte_e;
drop table t1;
--echo #
--echo # MDEV-26025: query with two usage of a CTE executing via PS /SP
--echo #
create table t1 (a int, b int);
insert into t1 value (1,3), (3,2), (1,3), (4,1);
let $q=
with
cte1 as ( select a,b from t1 where a = 1 AND b = 3 ),
cte2 as ( select a,b from cte1 ),
cte3 as ( select a,b from cte2 )
select * from cte3, cte2;
eval prepare stmt from "$q";
execute stmt;
execute stmt;
deallocate prepare stmt;
eval create procedure sp() $q;
call sp();
call sp();
drop procedure sp;
drop table t1;
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View File

@ -4500,6 +4500,33 @@ deallocate prepare stmt;
drop table folks; drop table folks;
set big_tables=@save_big_tables; set big_tables=@save_big_tables;
# #
# MDEV-26135: execution of PS for query with hanging recursive CTE
#
create table t1 (a int);
insert into t1 values (5), (7);
create table t2 (b int);
insert into t2 values (3), (7), (1);
with recursive r as (select a from t1 union select a+1 from r where a < 10)
select * from t2;
b
3
7
1
prepare stmt from "with recursive r as (select a from t1 union select a+1 from r where a < 10)
select * from t2";
execute stmt;
b
3
7
1
execute stmt;
b
3
7
1
deallocate prepare stmt;
drop table t1,t2;
#
# End of 10.2 tests # End of 10.2 tests
# #
# #

View File

@ -2854,6 +2854,27 @@ drop table folks;
set big_tables=@save_big_tables; set big_tables=@save_big_tables;
--echo #
--echo # MDEV-26135: execution of PS for query with hanging recursive CTE
--echo #
create table t1 (a int);
insert into t1 values (5), (7);
create table t2 (b int);
insert into t2 values (3), (7), (1);
let $q=
with recursive r as (select a from t1 union select a+1 from r where a < 10)
select * from t2;
eval $q;
eval prepare stmt from "$q";
execute stmt;
execute stmt;
deallocate prepare stmt;
drop table t1,t2;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View File

@ -127,6 +127,11 @@ Data:
EOF EOF
mysql_stmt_next_result(): 0; field_count: 0 mysql_stmt_next_result(): 0; field_count: 0
# ------------------------------------ # ------------------------------------
# cat MYSQL_TMP_DIR/test_mdev26145.out.log
# ------------------------------------
Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr
def MAX(a) MAX(a) 3 11 0 Y 32768 0 63
# ------------------------------------
# cat MYSQL_TMP_DIR/test_explain_meta.out.log # cat MYSQL_TMP_DIR/test_explain_meta.out.log

View File

@ -36,6 +36,10 @@ echo ok;
--echo # ------------------------------------ --echo # ------------------------------------
--cat_file $MYSQL_TMP_DIR/test_wl4435.out.log --cat_file $MYSQL_TMP_DIR/test_wl4435.out.log
--echo # ------------------------------------ --echo # ------------------------------------
--echo # cat MYSQL_TMP_DIR/test_mdev26145.out.log
--echo # ------------------------------------
--cat_file $MYSQL_TMP_DIR/test_mdev26145.out.log
--echo # ------------------------------------
--echo --echo
--echo --echo

View File

@ -147,4 +147,56 @@ i n
656 eight 656 eight
set optimizer_switch= @save_optimizer_switch; set optimizer_switch= @save_optimizer_switch;
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
#
# MDEV-25858: Query results are incorrect when indexes are added
#
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb;
insert into t1 values (1),(2),(3);
CREATE TABLE t2 (
id int NOT NULL PRIMARY KEY,
id2 int NOT NULL,
d1 datetime,
d2 timestamp NOT NULL,
KEY id2 (id2)
) engine=innodb;
insert into t2 values
(1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
(2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
(3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00');
select
t1.id,t2.id
from
t1 left join
t2 on t2.id2 = t1.id and
t2.id = (select dd.id
from t2 dd
where
dd.id2 = t1.id and
d1 > '2019-02-06 00:00:00'
order by
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
id id
1 NULL
2 1
3 3
create index for_latest_sort on t2 (d1 desc, d2 desc, id desc);
select
t1.id,t2.id
from
t1 left join
t2 on t2.id2 = t1.id and
t2.id = (select dd.id
from t2 dd
where
dd.id2 = t1.id and
d1 > '2019-02-06 00:00:00'
order by
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
id id
1 NULL
2 1
3 3
drop table t1,t2;
# End of 10.2 tests # End of 10.2 tests

View File

@ -135,4 +135,55 @@ set optimizer_switch= @save_optimizer_switch;
DROP TABLE t1,t2,t3; DROP TABLE t1,t2,t3;
--echo #
--echo # MDEV-25858: Query results are incorrect when indexes are added
--echo #
CREATE TABLE t1 (id int NOT NULL PRIMARY KEY) engine=innodb;
insert into t1 values (1),(2),(3);
CREATE TABLE t2 (
id int NOT NULL PRIMARY KEY,
id2 int NOT NULL,
d1 datetime,
d2 timestamp NOT NULL,
KEY id2 (id2)
) engine=innodb;
insert into t2 values
(1,2,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
(2,3,'2019-03-05 00:00:00','2019-03-06 00:00:00'),
(3,3,'2019-03-06 00:00:00','2019-03-05 00:00:00');
select
t1.id,t2.id
from
t1 left join
t2 on t2.id2 = t1.id and
t2.id = (select dd.id
from t2 dd
where
dd.id2 = t1.id and
d1 > '2019-02-06 00:00:00'
order by
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
create index for_latest_sort on t2 (d1 desc, d2 desc, id desc);
select
t1.id,t2.id
from
t1 left join
t2 on t2.id2 = t1.id and
t2.id = (select dd.id
from t2 dd
where
dd.id2 = t1.id and
d1 > '2019-02-06 00:00:00'
order by
dd.d1 desc, dd.d2 desc, dd.id desc limit 1
);
drop table t1,t2;
--echo # End of 10.2 tests --echo # End of 10.2 tests

View File

@ -2103,6 +2103,57 @@ drop view v1;
# #
# End of 10.1 tests # End of 10.1 tests
# #
#
# MDEV-17783: AddressSanitizer: stack-buffer-overflow in table_cond_selectivity
#
set
@tmp_jcl=@@join_cache_level,
@tmp_sel=@@optimizer_use_condition_selectivity;
set
join_cache_level=3,
optimizer_use_condition_selectivity=2;
CREATE TABLE t1 (
c1 int, c2 int, c3 int, c4 int, c5 int, c6 int, c7 int, c8 int, c9 int, c10 int,
c11 int, c12 int, c13 int, c14 int, c15 int, c16 int, c17 int, c18 int, c19 int,
c20 int, c21 int, c22 int, c23 int, c24 int, c25 int, c26 int, c27 int, c28 int,
c29 int, c30 int, c31 int, c32 int, c33 int, c34 int
) ENGINE=InnoDB;
SELECT * FROM t1
WHERE
(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10,
c11, c12, c13, c14, c15, c16, c17, c18, c19,
c20, c21, c22, c23, c24, c25, c26, c27, c28, c29,
c30, c31, c32, c33, c34) IN (SELECT * FROM t1) ;
c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 c16 c17 c18 c19 c20 c21 c22 c23 c24 c25 c26 c27 c28 c29 c30 c31 c32 c33 c34
set
join_cache_level=@tmp_jcl,
optimizer_use_condition_selectivity=@tmp_sel;
drop table t1;
#
# MDEV-25013: SIGSEGV in best_extension_by_limited_search | SIGSEGV in restore_prev_nj_state
#
SET join_cache_level=3;
CREATE TABLE t1 (
TEXT1 TEXT, TEXT2 TEXT, TEXT3 TEXT, TEXT4 TEXT, TEXT5 TEXT,
TEXT6 TEXT, TEXT7 TEXT, TEXT8 TEXT, TEXT9 TEXT, TEXT10 TEXT,
TEXT11 TEXT, TEXT12 TEXT,TEXT13 TEXT,TEXT14 TEXT,TEXT15 TEXT,
TEXT16 TEXT,TEXT17 TEXT,TEXT18 TEXT,TEXT19 TEXT,TEXT20 TEXT,
TEXT21 TEXT,TEXT22 TEXT,TEXT23 TEXT,TEXT24 TEXT,TEXT25 TEXT,
TEXT26 TEXT,TEXT27 TEXT,TEXT28 TEXT,TEXT29 TEXT,TEXT30 TEXT,
TEXT31 TEXT,TEXT32 TEXT,TEXT33 TEXT,TEXT34 TEXT,TEXT35 TEXT,
TEXT36 TEXT,TEXT37 TEXT,TEXT38 TEXT,TEXT39 TEXT,TEXT40 TEXT,
TEXT41 TEXT,TEXT42 TEXT,TEXT43 TEXT,TEXT44 TEXT,TEXT45 TEXT,
TEXT46 TEXT,TEXT47 TEXT,TEXT48 TEXT,TEXT49 TEXT,TEXT50 TEXT
) ENGINE=InnoDB;
EXPLAIN SELECT 1 FROM t1 NATURAL JOIN t1 AS t2;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 1 Using where
1 SIMPLE t2 hash_ALL NULL #hash#$hj 150 test.t1.TEXT1,test.t1.TEXT2,test.t1.TEXT3,test.t1.TEXT4,test.t1.TEXT5,test.t1.TEXT6,test.t1.TEXT7,test.t1.TEXT8,test.t1.TEXT9,test.t1.TEXT10,test.t1.TEXT11,test.t1.TEXT12,test.t1.TEXT13,test.t1.TEXT14,test.t1.TEXT15,test.t1.TEXT16,test.t1.TEXT17,test.t1.TEXT18,test.t1.TEXT19,test.t1.TEXT20,test.t1.TEXT21,test.t1.TEXT22,test.t1.TEXT23,test.t1.TEXT24,test.t1.TEXT25,test.t1.TEXT26,test.t1.TEXT27,test.t1.TEXT28,test.t1.TEXT29,test.t1.TEXT30,test.t1.TEXT31,test.t1.TEXT32,test.t1.TEXT33,test.t1.TEXT34,test.t1.TEXT35,test.t1.TEXT36,test.t1.TEXT37,test.t1.TEXT38,test.t1.TEXT39,test.t1.TEXT40,test.t1.TEXT41,test.t1.TEXT42,test.t1.TEXT43,test.t1.TEXT44,test.t1.TEXT45,test.t1.TEXT46,test.t1.TEXT47,test.t1.TEXT48,test.t1.TEXT49,test.t1.TEXT50 1 Using where; Using join buffer (flat, BNLH join)
set join_cache_level=@tmp_jcl;
drop table t1;
#
# End of 10.1 tests
#
set use_stat_tables= @tmp_ust; set use_stat_tables= @tmp_ust;
set optimizer_use_condition_selectivity= @tmp_oucs; set optimizer_use_condition_selectivity= @tmp_oucs;
set @@global.histogram_size=@save_histogram_size; set @@global.histogram_size=@save_histogram_size;

View File

@ -174,6 +174,61 @@ drop view v1;
--echo # End of 10.1 tests --echo # End of 10.1 tests
--echo # --echo #
--echo #
--echo # MDEV-17783: AddressSanitizer: stack-buffer-overflow in table_cond_selectivity
--echo #
set
@tmp_jcl=@@join_cache_level,
@tmp_sel=@@optimizer_use_condition_selectivity;
set
join_cache_level=3,
optimizer_use_condition_selectivity=2;
CREATE TABLE t1 (
c1 int, c2 int, c3 int, c4 int, c5 int, c6 int, c7 int, c8 int, c9 int, c10 int,
c11 int, c12 int, c13 int, c14 int, c15 int, c16 int, c17 int, c18 int, c19 int,
c20 int, c21 int, c22 int, c23 int, c24 int, c25 int, c26 int, c27 int, c28 int,
c29 int, c30 int, c31 int, c32 int, c33 int, c34 int
) ENGINE=InnoDB;
SELECT * FROM t1
WHERE
(c1, c2, c3, c4, c5, c6, c7, c8, c9, c10,
c11, c12, c13, c14, c15, c16, c17, c18, c19,
c20, c21, c22, c23, c24, c25, c26, c27, c28, c29,
c30, c31, c32, c33, c34) IN (SELECT * FROM t1) ;
set
join_cache_level=@tmp_jcl,
optimizer_use_condition_selectivity=@tmp_sel;
drop table t1;
--echo #
--echo # MDEV-25013: SIGSEGV in best_extension_by_limited_search | SIGSEGV in restore_prev_nj_state
--echo #
SET join_cache_level=3;
CREATE TABLE t1 (
TEXT1 TEXT, TEXT2 TEXT, TEXT3 TEXT, TEXT4 TEXT, TEXT5 TEXT,
TEXT6 TEXT, TEXT7 TEXT, TEXT8 TEXT, TEXT9 TEXT, TEXT10 TEXT,
TEXT11 TEXT, TEXT12 TEXT,TEXT13 TEXT,TEXT14 TEXT,TEXT15 TEXT,
TEXT16 TEXT,TEXT17 TEXT,TEXT18 TEXT,TEXT19 TEXT,TEXT20 TEXT,
TEXT21 TEXT,TEXT22 TEXT,TEXT23 TEXT,TEXT24 TEXT,TEXT25 TEXT,
TEXT26 TEXT,TEXT27 TEXT,TEXT28 TEXT,TEXT29 TEXT,TEXT30 TEXT,
TEXT31 TEXT,TEXT32 TEXT,TEXT33 TEXT,TEXT34 TEXT,TEXT35 TEXT,
TEXT36 TEXT,TEXT37 TEXT,TEXT38 TEXT,TEXT39 TEXT,TEXT40 TEXT,
TEXT41 TEXT,TEXT42 TEXT,TEXT43 TEXT,TEXT44 TEXT,TEXT45 TEXT,
TEXT46 TEXT,TEXT47 TEXT,TEXT48 TEXT,TEXT49 TEXT,TEXT50 TEXT
) ENGINE=InnoDB;
EXPLAIN SELECT 1 FROM t1 NATURAL JOIN t1 AS t2;
set join_cache_level=@tmp_jcl;
drop table t1;
--echo #
--echo # End of 10.1 tests
--echo #
set use_stat_tables= @tmp_ust; set use_stat_tables= @tmp_ust;
set optimizer_use_condition_selectivity= @tmp_oucs; set optimizer_use_condition_selectivity= @tmp_oucs;
set @@global.histogram_size=@save_histogram_size; set @@global.histogram_size=@save_histogram_size;

View File

@ -293,6 +293,26 @@ SELECT * FROM t1 WHERE t1.d = 0 AND t1.p = '1' AND t1.i != '-1' AND t1.n = 'some
i n d p i n d p
set optimizer_use_condition_selectivity= @tmp_mdev8779; set optimizer_use_condition_selectivity= @tmp_mdev8779;
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-23937: SIGSEGV in looped best_extension_by_limited_search from greedy_search
# (Testcase only)
#
set
@tmp_jcl= @@join_cache_level,
@tmp_ucs= @@optimizer_use_condition_selectivity;
set
join_cache_level=3,
optimizer_use_condition_selectivity=2;
CREATE TABLE t1 AS SELECT * FROM mysql.user;
CREATE TABLE t3 (b VARCHAR (1));
CREATE TABLE t2 (c2 INT);
INSERT INTO t2 VALUES (1);
EXPLAIN
SELECT * FROM t1 AS a NATURAL JOIN t1 AS b;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ALL NULL NULL NULL NULL 4
1 SIMPLE b hash_ALL NULL #hash#$hj 828 test.a.Host,test.a.User,test.a.Password,test.a.Select_priv,test.a.Insert_priv,test.a.Update_priv,test.a.Delete_priv,test.a.Create_priv,test.a.Drop_priv,test.a.Reload_priv,test.a.Shutdown_priv,test.a.Process_priv,test.a.File_priv,test.a.Grant_priv,test.a.References_priv,test.a.Index_priv,test.a.Alter_priv,test.a.Show_db_priv,test.a.Super_priv,test.a.Create_tmp_table_priv,test.a.Lock_tables_priv,test.a.Execute_priv,test.a.Repl_slave_priv,test.a.Repl_client_priv,test.a.Create_view_priv,test.a.Show_view_priv,test.a.Create_routine_priv,test.a.Alter_routine_priv,test.a.Create_user_priv,test.a.Event_priv,test.a.Trigger_priv,test.a.Create_tablespace_priv,test.a.Delete_history_priv,test.a.ssl_type,test.a.ssl_cipher,test.a.x509_issuer,test.a.x509_subject,test.a.max_questions,test.a.max_updates,test.a.max_connections,test.a.max_user_connections,test.a.plugin,test.a.authentication_string,test.a.password_expired,test.a.is_role,test.a.default_role,test.a.max_statement_time 4 Using where; Using join buffer (flat, BNLH join)
DROP TABLE t1,t2,t3;
# #
# End of the test file # End of the test file
# #

View File

@ -228,6 +228,27 @@ SELECT * FROM t1 WHERE t1.d = 0 AND t1.p = '1' AND t1.i != '-1' AND t1.n = 'some
set optimizer_use_condition_selectivity= @tmp_mdev8779; set optimizer_use_condition_selectivity= @tmp_mdev8779;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-23937: SIGSEGV in looped best_extension_by_limited_search from greedy_search
--echo # (Testcase only)
--echo #
set
@tmp_jcl= @@join_cache_level,
@tmp_ucs= @@optimizer_use_condition_selectivity;
set
join_cache_level=3,
optimizer_use_condition_selectivity=2;
CREATE TABLE t1 AS SELECT * FROM mysql.user;
CREATE TABLE t3 (b VARCHAR (1));
CREATE TABLE t2 (c2 INT);
INSERT INTO t2 VALUES (1);
EXPLAIN
SELECT * FROM t1 AS a NATURAL JOIN t1 AS b;
DROP TABLE t1,t2,t3;
--echo # --echo #
--echo # End of the test file --echo # End of the test file
--echo # --echo #

View File

@ -39,4 +39,24 @@ SET @@LOCAL.skip_name_resolve=0;
ERROR HY000: Variable 'skip_name_resolve' is a read only variable ERROR HY000: Variable 'skip_name_resolve' is a read only variable
SET @@GLOBAL.skip_name_resolve=0; SET @@GLOBAL.skip_name_resolve=0;
ERROR HY000: Variable 'skip_name_resolve' is a read only variable ERROR HY000: Variable 'skip_name_resolve' is a read only variable
End of 5.1 tests #
# End of 5.1 tests
#
#
# MDEV-26081 set role crashes when a hostname cannot be resolved
#
create user u1@`%`;
create role r1;
create role r2;
grant r2 to r1;
grant r1 to u1@`%`;
connect u1,127.0.0.1,u1,,,$MASTER_MYPORT;
set role r2;
ERROR OP000: User `u1`@`%` has not been granted role `r2`
disconnect u1;
connection default;
drop user u1@`%`;
drop role r1, r2;
#
# End of 10.2 tests
#

View File

@ -50,4 +50,28 @@ SET @@LOCAL.skip_name_resolve=0;
--error ER_INCORRECT_GLOBAL_LOCAL_VAR --error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET @@GLOBAL.skip_name_resolve=0; SET @@GLOBAL.skip_name_resolve=0;
--echo End of 5.1 tests --echo #
--echo # End of 5.1 tests
--echo #
--echo #
--echo # MDEV-26081 set role crashes when a hostname cannot be resolved
--echo #
create user u1@`%`;
create role r1;
create role r2;
grant r2 to r1;
grant r1 to u1@`%`;
connect u1,127.0.0.1,u1,,,$MASTER_MYPORT;
error ER_INVALID_ROLE;
set role r2;
disconnect u1;
connection default;
drop user u1@`%`;
drop role r1, r2;
--echo #
--echo # End of 10.2 tests
--echo #

View File

@ -3911,6 +3911,293 @@ sum(i) over () IN ( SELECT 1 FROM t1 a)
0 0
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE
# returning the result of calculation of 2 window
# functions that use the same window specification
#
create table t1 (a int);
insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5);
create view v2 as select a from t1 group by a;
create view v1 as select * from v2;
create procedure sp1() select v1.a,
sum(v1.a) over (partition by v1.a order by v1.a) as k,
avg(v1.a) over (partition by v1.a order by v1.a) as m
from v1;
call sp1();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp1();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select v1.a,
sum(v1.a) over (partition by v1.a order by v1.a) as k,
avg(v1.a) over (partition by v1.a order by v1.a) as m
from v1";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp2() select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from (select * from v2) as dt1
) as dt;
call sp2();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp2();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from (select * from v2) as dt1
) as dt";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp3() select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from ( select * from (select * from t1 group by a) as dt2 ) as dt1
) as dt;
call sp3();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp3();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from ( select * from (select * from t1 group by a) as dt2 ) as dt1
) as dt";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp4() with cte1 as (select * from (select * from t1 group by a) as dt2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp4();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp4();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with cte1 as (select * from (select * from t1 group by a) as dt2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp5() with cte1 as (select * from v2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp5();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp5();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with cte1 as (select * from v2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp6() with
cte1 as (with cte2 as (select * from t1 group by a) select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp6();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp6();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with
cte1 as (with cte2 as (select * from t1 group by a) select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp7() with
cte2 as (select * from v1),
cte1 as (select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp7();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp7();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with
cte2 as (select * from v1),
cte1 as (select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
drop procedure sp1;
drop procedure sp2;
drop procedure sp3;
drop procedure sp4;
drop procedure sp5;
drop procedure sp6;
drop procedure sp7;
drop view v1,v2;
drop table t1;
#
# End of 10.2 tests # End of 10.2 tests
# #
# #

View File

@ -2556,6 +2556,153 @@ INSERT INTO t1 VALUES (1),(2),(3);
SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1; SELECT sum(i) over () IN ( SELECT 1 FROM t1 a) FROM t1;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE
--echo # returning the result of calculation of 2 window
--echo # functions that use the same window specification
--echo #
create table t1 (a int);
insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5);
create view v2 as select a from t1 group by a;
create view v1 as select * from v2;
let $q1=
select v1.a,
sum(v1.a) over (partition by v1.a order by v1.a) as k,
avg(v1.a) over (partition by v1.a order by v1.a) as m
from v1;
eval create procedure sp1() $q1;
call sp1();
call sp1();
eval prepare stmt from "$q1";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q2=
select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from (select * from v2) as dt1
) as dt;
eval create procedure sp2() $q2;
call sp2();
call sp2();
eval prepare stmt from "$q2";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q3=
select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from ( select * from (select * from t1 group by a) as dt2 ) as dt1
) as dt;
eval create procedure sp3() $q3;
call sp3();
call sp3();
eval prepare stmt from "$q3";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q4=
with cte1 as (select * from (select * from t1 group by a) as dt2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
eval create procedure sp4() $q4;
call sp4();
call sp4();
eval prepare stmt from "$q4";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q5=
with cte1 as (select * from v2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
eval create procedure sp5() $q5;
call sp5();
call sp5();
eval prepare stmt from "$q5";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q6=
with
cte1 as (with cte2 as (select * from t1 group by a) select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
eval create procedure sp6() $q6;
call sp6();
call sp6();
eval prepare stmt from "$q6";
execute stmt;
execute stmt;
deallocate prepare stmt;
let $q7=
with
cte2 as (select * from v1),
cte1 as (select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
eval create procedure sp7() $q7;
call sp7();
call sp7();
eval prepare stmt from "$q7";
execute stmt;
execute stmt;
deallocate prepare stmt;
drop procedure sp1;
drop procedure sp2;
drop procedure sp3;
drop procedure sp4;
drop procedure sp5;
drop procedure sp6;
drop procedure sp7;
drop view v1,v2;
drop table t1;
--echo # --echo #
--echo # End of 10.2 tests --echo # End of 10.2 tests
--echo # --echo #

View File

@ -2829,7 +2829,9 @@ sub mysql_server_start($) {
if (!$opt_embedded_server) if (!$opt_embedded_server)
{ {
mysqld_start($mysqld,$extra_opts); mysqld_start($mysqld, $extra_opts) or
mtr_error("Failed to start mysqld ".$mysqld->name()." with command "
. $ENV{MYSQLD_LAST_CMD});
# Save this test case information, so next can examine it # Save this test case information, so next can examine it
$mysqld->{'started_tinfo'}= $tinfo; $mysqld->{'started_tinfo'}= $tinfo;
@ -2852,11 +2854,11 @@ sub mysql_server_start($) {
sub mysql_server_wait { sub mysql_server_wait {
my ($mysqld, $tinfo) = @_; my ($mysqld, $tinfo) = @_;
my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect";
if (!sleep_until_file_created($mysqld->value('pid-file'), if (!sleep_until_file_created($mysqld->value('pid-file'), $expect_file,
$opt_start_timeout, $opt_start_timeout, $mysqld->{'proc'},
$mysqld->{'proc'}, $warn_seconds))
$warn_seconds))
{ {
$tinfo->{comment}= "Failed to start ".$mysqld->name() . "\n"; $tinfo->{comment}= "Failed to start ".$mysqld->name() . "\n";
return 1; return 1;
@ -4163,9 +4165,12 @@ sub run_testcase ($$) {
# ---------------------------------------------------- # ----------------------------------------------------
# Check if it was an expected crash # Check if it was an expected crash
# ---------------------------------------------------- # ----------------------------------------------------
my $check_crash = check_expected_crash_and_restart($wait_for_proc); my @mysqld = grep($wait_for_proc eq $_->{proc}, mysqlds());
goto SRVDIED unless @mysqld;
my $check_crash = check_expected_crash_and_restart($mysqld[0]);
if ($check_crash == 0) # unexpected exit/crash of $wait_for_proc if ($check_crash == 0) # unexpected exit/crash of $wait_for_proc
{ {
$proc= $mysqld[0]->{proc};
goto SRVDIED; goto SRVDIED;
} }
elsif ($check_crash == 1) # $wait_for_proc was started again by check_expected_crash_and_restart() elsif ($check_crash == 1) # $wait_for_proc was started again by check_expected_crash_and_restart()
@ -4723,61 +4728,52 @@ sub check_warnings_post_shutdown {
} }
# #
# Loop through our list of processes and look for and entry # Check for the file indicating expected crash and restart it.
# with the provided pid, if found check for the file indicating
# expected crash and restart it.
# #
sub check_expected_crash_and_restart { sub check_expected_crash_and_restart {
my ($proc)= @_; my $mysqld = shift;
foreach my $mysqld ( mysqlds() ) # Check if crash expected by looking at the .expect file
# in var/tmp
my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect";
if ( -f $expect_file )
{ {
next unless ( $mysqld->{proc} and $mysqld->{proc} eq $proc ); mtr_verbose("Crash was expected, file '$expect_file' exists");
# Check if crash expected by looking at the .expect file for (my $waits = 0; $waits < 50; mtr_milli_sleep(100), $waits++)
# in var/tmp
my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect";
if ( -f $expect_file )
{ {
mtr_verbose("Crash was expected, file '$expect_file' exists"); # Race condition seen on Windows: try again until file not empty
next if -z $expect_file;
for (my $waits = 0; $waits < 50; mtr_milli_sleep(100), $waits++) # If last line in expect file starts with "wait"
# sleep a little and try again, thus allowing the
# test script to control when the server should start
# up again. Keep trying for up to 5s at a time.
my $last_line= mtr_lastlinesfromfile($expect_file, 1);
if ($last_line =~ /^wait/ )
{ {
# Race condition seen on Windows: try again until file not empty mtr_verbose("Test says wait before restart") if $waits == 0;
next if -z $expect_file; next;
# If last line in expect file starts with "wait"
# sleep a little and try again, thus allowing the
# test script to control when the server should start
# up again. Keep trying for up to 5s at a time.
my $last_line= mtr_lastlinesfromfile($expect_file, 1);
if ($last_line =~ /^wait/ )
{
mtr_verbose("Test says wait before restart") if $waits == 0;
next;
}
# Ignore any partial or unknown command
next unless $last_line =~ /^restart/;
# If last line begins "restart:", the rest of the line is read as
# extra command line options to add to the restarted mysqld.
# Anything other than 'wait' or 'restart:' (with a colon) will
# result in a restart with original mysqld options.
if ($last_line =~ /restart:(.+)/) {
my @rest_opt= split(' ', $1);
$mysqld->{'restart_opts'}= \@rest_opt;
} else {
delete $mysqld->{'restart_opts'};
}
unlink($expect_file);
# Start server with same settings as last time
mysqld_start($mysqld, $mysqld->{'started_opts'});
return 1;
} }
# Loop ran through: we should keep waiting after a re-check
return 2; # Ignore any partial or unknown command
next unless $last_line =~ /^restart/;
# If last line begins "restart:", the rest of the line is read as
# extra command line options to add to the restarted mysqld.
# Anything other than 'wait' or 'restart:' (with a colon) will
# result in a restart with original mysqld options.
if ($last_line =~ /restart:(.+)/) {
my @rest_opt= split(' ', $1);
$mysqld->{'restart_opts'}= \@rest_opt;
} else {
delete $mysqld->{'restart_opts'};
}
unlink($expect_file);
# Start server with same settings as last time
return mysqld_start($mysqld, $mysqld->{'started_opts'});
} }
# Loop ran through: we should keep waiting after a re-check
return 2;
} }
# Not an expected crash # Not an expected crash
@ -5134,6 +5130,7 @@ sub mysqld_start ($$) {
if ( defined $exe ) if ( defined $exe )
{ {
mtr_tofile($output, "\$ $exe @$args\n");
pre_write_errorlog($output); pre_write_errorlog($output);
$mysqld->{'proc'}= My::SafeProcess->new $mysqld->{'proc'}= My::SafeProcess->new
( (
@ -5152,17 +5149,11 @@ sub mysqld_start ($$) {
mtr_verbose("Started $mysqld->{proc}"); mtr_verbose("Started $mysqld->{proc}");
} }
if (!sleep_until_file_created($mysqld->value('pid-file'),
$opt_start_timeout, $mysqld->{'proc'}, $warn_seconds))
{
my $mname= $mysqld->name();
mtr_error("Failed to start mysqld $mname with command $exe");
}
# Remember options used when starting
$mysqld->{'started_opts'}= $extra_opts; $mysqld->{'started_opts'}= $extra_opts;
return; my $expect_file= "$opt_vardir/tmp/".$mysqld->name().".expect";
return sleep_until_file_created($mysqld->value('pid-file'), $expect_file,
$opt_start_timeout, $mysqld->{'proc'}, $warn_seconds);
} }

View File

@ -408,4 +408,22 @@ SHOW SESSION VARIABLES LIKE "unique_checks";
DROP TABLE t1; DROP TABLE t1;
disconnect fresh; disconnect fresh;
connection default;
--echo #
--echo # MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log
--echo #
reset master;
--error ER_DUP_FIELDNAME
create table t as select 1 as b, 2 as b;
create table t (old_table_field int);
--error ER_DUP_FIELDNAME
create or replace table t as select 1 as b, 2 as b;
--error ER_DUP_FIELDNAME
create or replace temporary table t as select 1 as b, 2 as b;
create table t (new_table_field int);
--source include/show_binlog_events.inc
# cleanup
drop table t;

View File

@ -1073,3 +1073,26 @@ Variable_name Value
unique_checks OFF unique_checks OFF
DROP TABLE t1; DROP TABLE t1;
disconnect fresh; disconnect fresh;
connection default;
#
# MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log
#
reset master;
create table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create table t (old_table_field int);
create or replace table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create or replace temporary table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create table t (new_table_field int);
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t (old_table_field int)
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */
master-bin.000001 # Query # # ROLLBACK
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t (new_table_field int)
drop table t;

View File

@ -673,3 +673,27 @@ Variable_name Value
unique_checks OFF unique_checks OFF
DROP TABLE t1; DROP TABLE t1;
disconnect fresh; disconnect fresh;
connection default;
#
# MDEV-25595 DROP part of failed CREATE OR REPLACE is not written into binary log
#
reset master;
create table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create table t (old_table_field int);
create or replace table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create or replace temporary table t as select 1 as b, 2 as b;
ERROR 42S21: Duplicate column name 'b'
create table t (new_table_field int);
include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t (old_table_field int)
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # DROP TEMPORARY TABLE IF EXISTS `test`.`t`/* Generated to handle failed CREATE OR REPLACE */
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t (new_table_field int)
drop table t;

View File

@ -3917,6 +3917,293 @@ sum(i) over () IN ( SELECT 1 FROM t1 a)
0 0
DROP TABLE t1; DROP TABLE t1;
# #
# MDEV-25565: 2-nd call of SP with SELECT from view / derived table / CTE
# returning the result of calculation of 2 window
# functions that use the same window specification
#
create table t1 (a int);
insert into t1 values (3), (7), (1), (7), (1), (1), (3), (1), (5);
create view v2 as select a from t1 group by a;
create view v1 as select * from v2;
create procedure sp1() select v1.a,
sum(v1.a) over (partition by v1.a order by v1.a) as k,
avg(v1.a) over (partition by v1.a order by v1.a) as m
from v1;
call sp1();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp1();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select v1.a,
sum(v1.a) over (partition by v1.a order by v1.a) as k,
avg(v1.a) over (partition by v1.a order by v1.a) as m
from v1";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp2() select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from (select * from v2) as dt1
) as dt;
call sp2();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp2();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from (select * from v2) as dt1
) as dt";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp3() select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from ( select * from (select * from t1 group by a) as dt2 ) as dt1
) as dt;
call sp3();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp3();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "select * from
( select dt1.a,
sum(dt1.a) over (partition by dt1.a order by dt1.a) as k,
avg(dt1.a) over (partition by dt1.a order by dt1.a) as m
from ( select * from (select * from t1 group by a) as dt2 ) as dt1
) as dt";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp4() with cte1 as (select * from (select * from t1 group by a) as dt2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp4();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp4();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with cte1 as (select * from (select * from t1 group by a) as dt2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp5() with cte1 as (select * from v2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp5();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp5();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with cte1 as (select * from v2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp6() with
cte1 as (with cte2 as (select * from t1 group by a) select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp6();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp6();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with
cte1 as (with cte2 as (select * from t1 group by a) select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
create procedure sp7() with
cte2 as (select * from v1),
cte1 as (select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte;
call sp7();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
call sp7();
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
prepare stmt from "with
cte2 as (select * from v1),
cte1 as (select * from cte2),
cte as
( select cte1.a,
sum(cte1.a) over (partition by cte1.a order by cte1.a) as k,
avg(cte1.a) over (partition by cte1.a order by cte1.a) as m
from cte1 )
select * from cte";
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
execute stmt;
a k m
1 1 1.0000
3 3 3.0000
5 5 5.0000
7 7 7.0000
deallocate prepare stmt;
drop procedure sp1;
drop procedure sp2;
drop procedure sp3;
drop procedure sp4;
drop procedure sp5;
drop procedure sp6;
drop procedure sp7;
drop view v1,v2;
drop table t1;
#
# End of 10.2 tests # End of 10.2 tests
# #
# #

View File

@ -48,6 +48,12 @@ while ($cnt)
{ {
real_sleep 1; real_sleep 1;
dec $cnt; dec $cnt;
if ($cnt == 200)
{
--disable_query_log
set global innodb_encrypt_tables = on;
--enable_query_log
}
} }
} }
if (!$success) if (!$success)
@ -78,6 +84,12 @@ while ($cnt)
{ {
real_sleep 1; real_sleep 1;
dec $cnt; dec $cnt;
if ($cnt == 200)
{
--disable_query_log
set global innodb_encrypt_tables = off;
--enable_query_log
}
} }
} }
if (!$success) if (!$success)
@ -107,6 +119,12 @@ while ($cnt)
{ {
real_sleep 1; real_sleep 1;
dec $cnt; dec $cnt;
if ($cnt == 200)
{
--disable_query_log
set global innodb_encrypt_tables=on;
--enable_query_log
}
} }
} }
if (!$success) if (!$success)

View File

@ -607,4 +607,78 @@ DELETE FROM t1;
DROP TEMPORARY TABLE t1; DROP TEMPORARY TABLE t1;
--echo #
--echo # Original test case from MDEV-17890
--echo #
CREATE TABLE t1 (
pk BIGINT AUTO_INCREMENT,
b BIT(15),
v BIT(10) AS (b) VIRTUAL,
PRIMARY KEY(pk),
UNIQUE(v)
);
INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101');
SELECT pk, b FROM t1 INTO OUTFILE 'load.data';
--error ER_DATA_TOO_LONG
LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b);
# Cleanup
DROP TABLE t1;
--let $datadir= `SELECT @@datadir`
--remove_file $datadir/test/load.data
--echo #
--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
--echo #
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
# Cleanup
DROP TABLE t1;
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
# Cleanup
DROP TABLE t1;
} }
--echo #
--echo # MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT
--echo #
CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int);
INSERT INTO t1 VALUES (1,1,1);
UPDATE t1 SET b=DEFAULT;
SELECT * from t1;
REPLACE t1 VALUES(1,1,1);
INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT;
SELECT * from t1;
REPLACE t1 VALUES(1,1,1);
CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int);
INSERT INTO t2 VALUES (5,5,5);
UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT;
SELECT * from t1, t2;
DROP TABLE t1, t2;

View File

@ -812,7 +812,7 @@ DROP TABLE t1;
--echo # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' --echo # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength'
--echo # failed in ha_myisam::setup_vcols_for_repair --echo # failed in ha_myisam::setup_vcols_for_repair
CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL);
ALTER TABLE t1 ADD KEY (a); ALTER TABLE t1 ADD KEY (a);
DROP TABLE t1; DROP TABLE t1;

View File

@ -153,3 +153,19 @@ CHECK TABLE t EXTENDED;
FLUSH TABLES; FLUSH TABLES;
CHECK TABLE t EXTENDED; CHECK TABLE t EXTENDED;
DROP TABLE t; DROP TABLE t;
--echo #
--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
--echo #
CREATE TABLE t1 (
a INT,
b INT,
c BIT(4) NOT NULL DEFAULT b'0',
pk INTEGER AUTO_INCREMENT,
d BIT(4) AS (c) VIRTUAL,
PRIMARY KEY(pk),
KEY (b,d)
) PARTITION BY HASH(pk);
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;

View File

@ -221,3 +221,58 @@ select * from t1;
drop view v1; drop view v1;
drop table t1; drop table t1;
--echo #
--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
--echo #
CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),
('1985-12-24 10:15:08.456');
DELETE FROM v1 ORDER BY v LIMIT 4;
# Cleanup
DROP VIEW v1;
DROP TABLE t1;
--echo #
--echo # [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in
--echo # Field_blob::val_str with virtual columns and views
--echo #
CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL);
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (a) VALUES ('foo'),('bar');
DELETE FROM v1 ORDER BY b LIMIT 2;
# Cleanup
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d INT, v TINYINT AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004'),('1985') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP TABLE t1;
DROP VIEW v1;
--echo #
--echo # MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE
--echo #
create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual);
insert into t1 (c) values ('a'),('b');
analyze table t1 persistent for columns (v) indexes ();

View File

@ -435,6 +435,26 @@ UPDATE t1 SET col1 = 2;
UPDATE t1 SET col7 = DEFAULT; UPDATE t1 SET col7 = DEFAULT;
UPDATE t1 SET col8 = DEFAULT; UPDATE t1 SET col8 = DEFAULT;
DROP TABLE t1; DROP TABLE t1;
Bug#20797344: WL#8149: ALLOCATED SPACE FOR INDEXED BLOB VGC CAN BE
OVERWRITTEN FOR UPDATE
#
CREATE TABLE t (a varchar(100), b blob,
c blob GENERATED ALWAYS AS (concat(a,b)) VIRTUAL,
d blob GENERATED ALWAYS AS (b) VIRTUAL,
e int(11) GENERATED ALWAYS AS (10) VIRTUAL,
h int(11) NOT NULL, PRIMARY KEY (h), key(c(20)));
INSERT INTO t(a,b,h) VALUES('aaaaaaa','1111111', 11);
INSERT INTO t(a,b,h) VALUES('bbbbbbb','2222222', 22);
SELECT c FROM t;
c
aaaaaaa1111111
bbbbbbb2222222
UPDATE t SET a='ccccccc';
SELECT c FROM t;
c
ccccccc1111111
ccccccc2222222
DROP TABLE t;
# Bug#21081742: ASSERTION !TABLE || (!TABLE->WRITE_SET || # Bug#21081742: ASSERTION !TABLE || (!TABLE->WRITE_SET ||
# BITMAP_IS_SET(TABLE->WRITE_SET # BITMAP_IS_SET(TABLE->WRITE_SET
# #
@ -491,6 +511,21 @@ SELECT * FROM t;
x y gc x y gc
2 1 3 2 1 3
DROP TABLE t; DROP TABLE t;
CREATE TABLE t (
x INT, y INT, gc INT GENERATED ALWAYS AS (x+1), KEY (x,gc)
);
INSERT INTO t VALUES ();
UPDATE t t1, t t2 SET t1.x = 1, t2.y = 2;
SELECT * FROM t;
x y gc
1 2 2
SELECT gc FROM t;
gc
2
CHECK TABLE t;
Table Op Msg_type Msg_text
test.t check status OK
DROP TABLE t;
# stored # stored
CREATE TABLE C ( CREATE TABLE C (
col_varchar_nokey VARCHAR(1), col_varchar_nokey VARCHAR(1),
@ -552,6 +587,99 @@ SELECT * from C;
col_varchar_nokey col_varchar_key col_varchar_nokey col_varchar_key
a aa a aa
DROP TABLE C; DROP TABLE C;
# virtual, indexed
CREATE TABLE C (
col_varchar_nokey VARCHAR(1),
col_varchar_key VARCHAR(2) GENERATED ALWAYS AS
(CONCAT(col_varchar_nokey, col_varchar_nokey)) VIRTUAL,
KEY (col_varchar_key, col_varchar_nokey)
);
INSERT INTO C (col_varchar_nokey) VALUES ('c');
EXPLAIN UPDATE C AS OUTR1, C AS OUTR2
SET OUTR1.`col_varchar_nokey` = 'f',
OUTR2.`col_varchar_nokey` = "a";
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE OUTR1 ALL NULL NULL NULL NULL 1
1 SIMPLE OUTR2 ALL NULL NULL NULL NULL 1
UPDATE C AS OUTR1, C AS OUTR2
SET OUTR1.`col_varchar_nokey` = 'f',
OUTR2.`col_varchar_nokey` = "a";
SELECT * from C;
col_varchar_nokey col_varchar_key
a aa
DROP TABLE C;
#
# Bug #21530366 CRASH/ASSERTION, CORRUPTION WITH INDEXES +
# VIRTUAL COLUMNS, BLOB
#
CREATE TABLE t (
a INTEGER,
b BLOB GENERATED ALWAYS AS (a) VIRTUAL,
INDEX (b(57))
);
INSERT INTO t (a) VALUES (9);
UPDATE t SET a = 10;
DELETE FROM t WHERE a = 10;
DROP TABLE t;
# Bug#21807818: Generated columns not updated with empty insert list
CREATE TABLE t (
a BLOB GENERATED ALWAYS AS ('') VIRTUAL,
b TIMESTAMP(4) GENERATED ALWAYS AS ('') VIRTUAL,
KEY (a(183),b)
);
INSERT IGNORE INTO t VALUES(), (), ();
Warnings:
Warning 1265 Data truncated for column 'b' at row 1
Warning 1265 Data truncated for column 'b' at row 2
Warning 1265 Data truncated for column 'b' at row 3
DELETE IGNORE FROM t;
DROP TABLE t;
#
# Bug#22195458:GCOLS: ASSERTION 0 AND CORRUPTION...
#
CREATE TABLE t (
a INT,
b YEAR GENERATED ALWAYS AS ('a') VIRTUAL,
c YEAR GENERATED ALWAYS AS ('aaaa') VIRTUAL,
b1 YEAR GENERATED ALWAYS AS ('a') STORED,
c1 YEAR GENERATED ALWAYS AS ('aaaa') STORED,
UNIQUE(b),
UNIQUE(b1)
);
INSERT IGNORE INTO t VALUES();
SELECT b from t;
b
0000
SELECT b1 from t;
b1
0000
SELECT * from t;
a b c b1 c1
NULL 0000 0000 0000 0000
DELETE FROM t;
CHECK TABLE t EXTENDED;
Table Op Msg_type Msg_text
test.t check status OK
DROP TABLE t;
# Bug#22195364:GCOLS: FAILING ASSERTION:
# DFIELD_IS_NULL(DFIELD2) || DFIELD2->DATA
CREATE TABLE t (
a INT,
c BLOB GENERATED ALWAYS AS ('') VIRTUAL,
UNIQUE KEY(c(1),a)
);
INSERT INTO t(a) VALUES(1) ON DUPLICATE KEY UPDATE a=2;
SELECT * FROM t;
a c
1
INSERT INTO t(a) VALUES(1) ON DUPLICATE KEY UPDATE a=2;
SELECT * FROM t;
a c
2
SELECT GROUP_CONCAT(c ORDER BY c) FROM t;
GROUP_CONCAT(c ORDER BY c)
DROP TABLE t;
#Bug#21929967:GCOLS:GCOL VALUE CHANGES WHEN SESSION CHANGES SQL_MODE #Bug#21929967:GCOLS:GCOL VALUE CHANGES WHEN SESSION CHANGES SQL_MODE
CREATE TABLE t(c1 INT GENERATED ALWAYS AS (1) VIRTUAL, CREATE TABLE t(c1 INT GENERATED ALWAYS AS (1) VIRTUAL,
c2 INT GENERATED ALWAYS AS(2) STORED); c2 INT GENERATED ALWAYS AS(2) STORED);
@ -593,6 +721,98 @@ i1 i2
5 10 5 10
5 10 5 10
DROP TABLE t1,t2; DROP TABLE t1,t2;
#
# Bug#22070021 GCOL:ASSERTION `!TABLE || (!TABLE->WRITE_SET ||
# BITMAP_IS_SET(TABLE->WRITE_SET,
#
CREATE TABLE t1(
c1 INT,
c2 INT GENERATED ALWAYS AS (c1 + c1) VIRTUAL,
KEY(c2)
);
INSERT INTO t1(c1) VALUES(0);
DELETE O1.* FROM t1 AS O1, t1 AS O2;
SELECT * FROM t1;
c1 c2
DROP TABLE t1;
#
# Bug#21944199 SIMPLE DELETE QUERY CAUSES INNODB: FAILING ASSERTION: 0
# & DATA CORRUPTION
#
CREATE TEMPORARY TABLE t1 (
a INTEGER NOT NULL,
b INTEGER GENERATED ALWAYS AS (a+1) VIRTUAL
);
INSERT INTO t1 (a) VALUES (0), (0), (0);
ALTER TABLE t1 ADD INDEX idx (b);
DELETE FROM t1;
DROP TEMPORARY TABLE t1;
#
# Original test case from MDEV-17890
#
CREATE TABLE t1 (
pk BIGINT AUTO_INCREMENT,
b BIT(15),
v BIT(10) AS (b) VIRTUAL,
PRIMARY KEY(pk),
UNIQUE(v)
);
INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101');
Warnings:
Warning 1264 Out of range value for column 'v' at row 1
SELECT pk, b FROM t1 INTO OUTFILE 'load.data';
LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b);
ERROR 22001: Data too long for column 'v' at row 1
DROP TABLE t1;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
Warnings:
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
DROP TABLE t1;
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
Warnings:
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
DROP TABLE t1;
#
# MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT
#
CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int);
INSERT INTO t1 VALUES (1,1,1);
UPDATE t1 SET b=DEFAULT;
SELECT * from t1;
a b c
1 2 1
REPLACE t1 VALUES(1,1,1);
INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT;
SELECT * from t1;
a b c
1 2 1
REPLACE t1 VALUES(1,1,1);
CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int);
INSERT INTO t2 VALUES (5,5,5);
UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT;
SELECT * from t1, t2;
a b c a b c
1 2 1 5 6 5
DROP TABLE t1, t2;
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3; DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p1;

View File

@ -571,13 +571,13 @@ UNIQUE(b1)
INSERT IGNORE INTO t VALUES(); INSERT IGNORE INTO t VALUES();
SELECT b from t; SELECT b from t;
b b
2000 0000
SELECT b1 from t; SELECT b1 from t;
b1 b1
0000 0000
SELECT * from t; SELECT * from t;
a b c b1 c1 a b c b1 c1
NULL 2000 0000 0000 0000 NULL 0000 0000 0000 0000
DELETE FROM t; DELETE FROM t;
CHECK TABLE t EXTENDED; CHECK TABLE t EXTENDED;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
@ -669,6 +669,72 @@ INSERT INTO t1 (a) VALUES (0), (0), (0);
ALTER TABLE t1 ADD INDEX idx (b); ALTER TABLE t1 ADD INDEX idx (b);
DELETE FROM t1; DELETE FROM t1;
DROP TEMPORARY TABLE t1; DROP TEMPORARY TABLE t1;
#
# Original test case from MDEV-17890
#
CREATE TABLE t1 (
pk BIGINT AUTO_INCREMENT,
b BIT(15),
v BIT(10) AS (b) VIRTUAL,
PRIMARY KEY(pk),
UNIQUE(v)
);
INSERT IGNORE INTO t1 (b) VALUES (b'101110001110100'),(b'011101');
Warnings:
Warning 1264 Out of range value for column 'v' at row 1
SELECT pk, b FROM t1 INTO OUTFILE 'load.data';
LOAD DATA INFILE 'load.data' REPLACE INTO TABLE t1 (pk, b);
ERROR 22001: Data too long for column 'v' at row 1
DROP TABLE t1;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
Warnings:
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
DROP TABLE t1;
CREATE TABLE t1 (
id INT NOT NULL AUTO_INCREMENT,
f ENUM('a','b','c'),
v ENUM('a','b','c') AS (f),
KEY(v,id)
) ENGINE=MyISAM;
INSERT INTO t1 (f) VALUES ('a'),('b');
INSERT IGNORE INTO t1 SELECT * FROM t1;
Warnings:
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
Warning 1906 The value specified for generated column 'v' in table 't1' has been ignored
DROP TABLE t1;
#
# MDEV-23597 Assertion `marked_for_read()' failed while evaluating DEFAULT
#
CREATE TABLE t1 (a INT UNIQUE, b INT DEFAULT (c+1), c int);
INSERT INTO t1 VALUES (1,1,1);
UPDATE t1 SET b=DEFAULT;
SELECT * from t1;
a b c
1 2 1
REPLACE t1 VALUES(1,1,1);
INSERT INTO t1 VALUES (1,1,1) ON DUPLICATE KEY UPDATE b= DEFAULT;
SELECT * from t1;
a b c
1 2 1
REPLACE t1 VALUES(1,1,1);
CREATE TABLE t2 (a INT, b INT DEFAULT (c+1), c int);
INSERT INTO t2 VALUES (5,5,5);
UPDATE t1 join t2 set t1.b= DEFAULT, t2.b= DEFAULT;
SELECT * from t1, t2;
a b c a b c
1 2 1 5 6 5
DROP TABLE t1, t2;
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3; DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p1;

View File

@ -879,7 +879,7 @@ ERROR 22003: Out of range value for column 'vi' at row 1
DROP TABLE t1; DROP TABLE t1;
# MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength'
# failed in ha_myisam::setup_vcols_for_repair # failed in ha_myisam::setup_vcols_for_repair
CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL);
ALTER TABLE t1 ADD KEY (a); ALTER TABLE t1 ADD KEY (a);
DROP TABLE t1; DROP TABLE t1;
# #

View File

@ -879,7 +879,7 @@ ERROR 22003: Out of range value for column 'vi' at row 1
DROP TABLE t1; DROP TABLE t1;
# MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength' # MDEV-19011 Assertion `file->s->base.reclength < file->s->vreclength'
# failed in ha_myisam::setup_vcols_for_repair # failed in ha_myisam::setup_vcols_for_repair
CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL) ENGINE=MyISAM; CREATE TABLE t1 (a INT GENERATED ALWAYS AS (1) VIRTUAL);
ALTER TABLE t1 ADD KEY (a); ALTER TABLE t1 ADD KEY (a);
DROP TABLE t1; DROP TABLE t1;
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;

View File

@ -89,6 +89,21 @@ Table Op Msg_type Msg_text
test.t check status OK test.t check status OK
DROP TABLE t; DROP TABLE t;
# #
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (
a INT,
b INT,
c BIT(4) NOT NULL DEFAULT b'0',
pk INTEGER AUTO_INCREMENT,
d BIT(4) AS (c) VIRTUAL,
PRIMARY KEY(pk),
KEY (b,d)
) PARTITION BY HASH(pk);
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
#
# MDEV-16980 Wrongly set tablename len while opening the # MDEV-16980 Wrongly set tablename len while opening the
# table for purge thread # table for purge thread
# #

View File

@ -86,6 +86,21 @@ CHECK TABLE t EXTENDED;
Table Op Msg_type Msg_text Table Op Msg_type Msg_text
test.t check status OK test.t check status OK
DROP TABLE t; DROP TABLE t;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (
a INT,
b INT,
c BIT(4) NOT NULL DEFAULT b'0',
pk INTEGER AUTO_INCREMENT,
d BIT(4) AS (c) VIRTUAL,
PRIMARY KEY(pk),
KEY (b,d)
) PARTITION BY HASH(pk);
INSERT INTO t1 () VALUES (),();
UPDATE t1 SET a = 0 WHERE b IS NULL ORDER BY pk;
DROP TABLE t1;
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3; DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p1;

View File

@ -271,6 +271,47 @@ a b c
1 -1 -1 1 -1 -1
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),
('1985-12-24 10:15:08.456');
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP VIEW v1;
DROP TABLE t1;
#
# [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in
# Field_blob::val_str with virtual columns and views
#
CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL);
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (a) VALUES ('foo'),('bar');
DELETE FROM v1 ORDER BY b LIMIT 2;
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d INT, v TINYINT AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004'),('1985') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP TABLE t1;
DROP VIEW v1;
#
# MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE
#
create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual);
insert into t1 (c) values ('a'),('b');
analyze table t1 persistent for columns (v) indexes ();
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3; DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p1;

View File

@ -271,6 +271,47 @@ a b c
1 -1 -1 1 -1 -1
drop view v1; drop view v1;
drop table t1; drop table t1;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
CREATE TABLE t1 (d DATETIME(3), v DATETIME(2) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),
('1985-12-24 10:15:08.456');
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP VIEW v1;
DROP TABLE t1;
#
# [duplicate] MDEV-19306 Assertion `marked_for_read()' failed in
# Field_blob::val_str with virtual columns and views
#
CREATE TABLE t1 (a BLOB, b TEXT AS (a) VIRTUAL);
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (a) VALUES ('foo'),('bar');
DELETE FROM v1 ORDER BY b LIMIT 2;
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d INT, v TINYINT AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004'),('1985') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP VIEW v1;
DROP TABLE t1;
CREATE TABLE t1 (d VARCHAR(64), v VARCHAR(63) AS (d));
CREATE VIEW v1 AS SELECT * FROM t1;
INSERT INTO t1 (d) VALUES ('2004-04-19 15:37:39.123'),('1985-12-24 10:15:08.456') ;
DELETE FROM v1 ORDER BY v LIMIT 4;
DROP TABLE t1;
DROP VIEW v1;
#
# MDEV-18249 ASSERT_COLUMN_MARKED_FOR_READ failed in ANALYZE TABLE
#
create table t1 (c varchar(3) not null, v varchar(4) as (c) virtual);
insert into t1 (c) values ('a'),('b');
analyze table t1 persistent for columns (v) indexes ();
Table Op Msg_type Msg_text
test.t1 analyze status Engine-independent statistics collected
test.t1 analyze status OK
DROP VIEW IF EXISTS v1,v2; DROP VIEW IF EXISTS v1,v2;
DROP TABLE IF EXISTS t1,t2,t3; DROP TABLE IF EXISTS t1,t2,t3;
DROP PROCEDURE IF EXISTS p1; DROP PROCEDURE IF EXISTS p1;

View File

@ -36,7 +36,7 @@ eval SET @@session.default_storage_engine = 'InnoDB';
#------------------------------------------------------------------------------# #------------------------------------------------------------------------------#
# Execute the tests to be applied to all storage engines # Execute the tests to be applied to all storage engines
let $support_virtual_index= 0; let $support_virtual_index= 1;
--source suite/gcol/inc/gcol_ins_upd.inc --source suite/gcol/inc/gcol_ins_upd.inc
#------------------------------------------------------------------------------# #------------------------------------------------------------------------------#

View File

@ -14,7 +14,7 @@ set default role role_a for user_a@localhost;
set default role invalid_role for user_a@localhost; set default role invalid_role for user_a@localhost;
ERROR OP000: Invalid role specification `invalid_role` ERROR OP000: Invalid role specification `invalid_role`
set default role role_b for user_a@localhost; set default role role_b for user_a@localhost;
ERROR OP000: User `user_a@localhost` has not been granted role `role_b` ERROR OP000: User `root`@`localhost` has not been granted role `role_b`
set default role role_b for user_b@localhost; set default role role_b for user_b@localhost;
show grants; show grants;
Grants for user_a@localhost Grants for user_a@localhost
@ -37,7 +37,7 @@ user host default_role
user_a localhost role_a user_a localhost role_a
user_b localhost role_b user_b localhost role_b
set default role role_b for current_user; set default role role_b for current_user;
ERROR OP000: User `user_a@localhost` has not been granted role `role_b` ERROR OP000: User `user_a`@`localhost` has not been granted role `role_b`
show grants; show grants;
Grants for user_b@localhost Grants for user_b@localhost
GRANT `role_b` TO `user_b`@`localhost` GRANT `role_b` TO `user_b`@`localhost`

View File

@ -48,7 +48,7 @@ CREATE USER b;
CREATE ROLE r1; CREATE ROLE r1;
CREATE ROLE r2; CREATE ROLE r2;
SET DEFAULT ROLE r1 FOR a; SET DEFAULT ROLE r1 FOR a;
ERROR OP000: User `a@%` has not been granted role `r1` ERROR OP000: User `root`@`localhost` has not been granted role `r1`
GRANT r1 TO b; GRANT r1 TO b;
GRANT r2 TO b; GRANT r2 TO b;
SET DEFAULT ROLE r1 FOR b; SET DEFAULT ROLE r1 FOR b;
@ -100,7 +100,7 @@ GRANT USAGE ON *.* TO `b`@`%`
GRANT SELECT, UPDATE ON `mysql`.* TO `b`@`%` GRANT SELECT, UPDATE ON `mysql`.* TO `b`@`%`
SET DEFAULT ROLE `r2` FOR `b`@`%` SET DEFAULT ROLE `r2` FOR `b`@`%`
SET DEFAULT ROLE r1 FOR a; SET DEFAULT ROLE r1 FOR a;
ERROR OP000: User `a@%` has not been granted role `r1` ERROR OP000: User `b`@`%` has not been granted role `r1`
SET DEFAULT ROLE invalid_role; SET DEFAULT ROLE invalid_role;
ERROR OP000: Invalid role specification `invalid_role` ERROR OP000: Invalid role specification `invalid_role`
SET DEFAULT ROLE invalid_role FOR a; SET DEFAULT ROLE invalid_role FOR a;
@ -117,7 +117,7 @@ SET DEFAULT ROLE None;
# Change user b (session 3: role granted to user a) # Change user b (session 3: role granted to user a)
SET DEFAULT ROLE r1 FOR a; SET DEFAULT ROLE r1 FOR a;
SET DEFAULT ROLE r2 FOR a; SET DEFAULT ROLE r2 FOR a;
ERROR OP000: User `a@%` has not been granted role `r2` ERROR OP000: User `b`@`%` has not been granted role `r2`
SET DEFAULT ROLE invalid_role; SET DEFAULT ROLE invalid_role;
ERROR OP000: Invalid role specification `invalid_role` ERROR OP000: Invalid role specification `invalid_role`
SET DEFAULT ROLE invalid_role FOR a; SET DEFAULT ROLE invalid_role FOR a;

View File

@ -66,7 +66,7 @@ Grants for test_user@localhost
GRANT USAGE ON *.* TO `test_user`@`localhost` GRANT USAGE ON *.* TO `test_user`@`localhost`
GRANT `test_role1` TO `test_user`@`localhost` GRANT `test_role1` TO `test_user`@`localhost`
set role test_role2; set role test_role2;
ERROR OP000: User `test_user@localhost` has not been granted role `test_role2` ERROR OP000: User `test_user`@`localhost` has not been granted role `test_role2`
select current_user(), current_role(); select current_user(), current_role();
current_user() current_role() current_user() current_role()
test_user@localhost NULL test_user@localhost NULL

View File

@ -100,6 +100,9 @@ include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t1 (a int) master-bin.000001 # Query # # use `test`; create table t1 (a int)
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */
master-bin.000001 # Query # # ROLLBACK
drop table if exists t1,t2; drop table if exists t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 'test.t1' Note 1051 Unknown table 'test.t1'

View File

@ -128,6 +128,9 @@ include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t1 (a int) master-bin.000001 # Query # # use `test`; create table t1 (a int)
master-bin.000001 # Gtid # # BEGIN GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */
master-bin.000001 # Query # # ROLLBACK
drop table if exists t1,t2; drop table if exists t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 'test.t1' Note 1051 Unknown table 'test.t1'

View File

@ -103,6 +103,8 @@ include/show_binlog_events.inc
Log_name Pos Event_type Server_id End_log_pos Info Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Gtid # # GTID #-#-# master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; create table t1 (a int) master-bin.000001 # Query # # use `test`; create table t1 (a int)
master-bin.000001 # Gtid # # GTID #-#-#
master-bin.000001 # Query # # use `test`; DROP TABLE IF EXISTS `test`.`t1`/* Generated to handle failed CREATE OR REPLACE */
drop table if exists t1,t2; drop table if exists t1,t2;
Warnings: Warnings:
Note 1051 Unknown table 'test.t1' Note 1051 Unknown table 'test.t1'

View File

@ -80,4 +80,18 @@ Warnings:
Warning 1265 Data truncated for column 'b' at row 1 Warning 1265 Data truncated for column 'b' at row 1
Warning 1265 Data truncated for column 'b' at row 2 Warning 1265 Data truncated for column 'b' at row 2
DROP TABLE t1; DROP TABLE t1;
#
# MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
#
SET SESSION binlog_row_image= noblob;
CREATE TEMPORARY TABLE t1 SELECT UUID();
show create table t1;
Table Create Table
t1 CREATE TEMPORARY TABLE `t1` (
`UUID()` varchar(36) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
CREATE TABLE t2 (a INT PRIMARY KEY, b TEXT, c INT GENERATED ALWAYS AS(b));
INSERT INTO t2 (a,b) VALUES (1,1);
SET SESSION binlog_row_image= default;
DROP TABLE t2;
include/rpl_end.inc include/rpl_end.inc

View File

@ -66,4 +66,18 @@ UPDATE IGNORE t1 SET a = NULL;
DROP TABLE t1; DROP TABLE t1;
--echo #
--echo # MDEV-18166 ASSERT_COLUMN_MARKED_FOR_READ failed on tables with vcols
--echo #
SET SESSION binlog_row_image= noblob;
CREATE TEMPORARY TABLE t1 SELECT UUID();
show create table t1;
CREATE TABLE t2 (a INT PRIMARY KEY, b TEXT, c INT GENERATED ALWAYS AS(b));
INSERT INTO t2 (a,b) VALUES (1,1);
SET SESSION binlog_row_image= default;
DROP TABLE t2;
--source include/rpl_end.inc --source include/rpl_end.inc

View File

@ -73,12 +73,14 @@ usage () {
cat <<EOF cat <<EOF
Usage: $0 [OPTIONS] Usage: $0 [OPTIONS]
--no-defaults Don't read the system defaults file --no-defaults Don't read the system defaults file
--core-file-size=LIMIT Limit core files to the specified size
--defaults-file=FILE Use the specified defaults file --defaults-file=FILE Use the specified defaults file
--defaults-extra-file=FILE Also use defaults from the specified file --defaults-extra-file=FILE Also use defaults from the specified file
--defaults-group-suffix=X Additionally read default groups with X appended
as a suffix
--ledir=DIRECTORY Look for mysqld in the specified directory --ledir=DIRECTORY Look for mysqld in the specified directory
--open-files-limit=LIMIT Limit the number of open files --open-files-limit=LIMIT Limit the number of open files
--crash-script=FILE Script to call when mysqld crashes --crash-script=FILE Script to call when mysqld crashes
--core-file-size=LIMIT Limit core files to the specified size
--timezone=TZ Set the system timezone --timezone=TZ Set the system timezone
--malloc-lib=LIB Preload shared library LIB if available --malloc-lib=LIB Preload shared library LIB if available
--mysqld=FILE Use the specified file as mysqld --mysqld=FILE Use the specified file as mysqld

View File

@ -6288,6 +6288,7 @@ bool Field_timef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
int Field_year::store(const char *from, size_t len,CHARSET_INFO *cs) int Field_year::store(const char *from, size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED;
THD *thd= get_thd();
char *end; char *end;
int error; int error;
longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error); longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
@ -6299,7 +6300,14 @@ int Field_year::store(const char *from, size_t len,CHARSET_INFO *cs)
set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1); set_warning(ER_WARN_DATA_OUT_OF_RANGE, 1);
return 1; return 1;
} }
if (get_thd()->count_cuted_fields > CHECK_FIELD_EXPRESSION &&
if (thd->count_cuted_fields <= CHECK_FIELD_EXPRESSION && error == MY_ERRNO_EDOM)
{
*ptr= 0;
return 1;
}
if (thd->count_cuted_fields > CHECK_FIELD_EXPRESSION &&
(error= check_int(cs, from, len, end, error))) (error= check_int(cs, from, len, end, error)))
{ {
if (unlikely(error == 1) /* empty or incorrect string */) if (unlikely(error == 1) /* empty or incorrect string */)

View File

@ -5402,8 +5402,7 @@ int ha_partition::index_init(uint inx, bool sorted)
do do
{ {
for (i= 0; i < (*key_info)->user_defined_key_parts; i++) for (i= 0; i < (*key_info)->user_defined_key_parts; i++)
bitmap_set_bit(table->read_set, (*key_info)->key_part[i].field->register_field_in_read_map();
(*key_info)->key_part[i].field->field_index);
} while (*(++key_info)); } while (*(++key_info));
} }
for (i= bitmap_get_first_set(&m_part_info->read_partitions); for (i= bitmap_get_first_set(&m_part_info->read_partitions);

View File

@ -5880,13 +5880,15 @@ public:
class Item_default_value : public Item_field class Item_default_value : public Item_field
{ {
bool vcol_assignment_ok;
void calculate(); void calculate();
public: public:
Item *arg; Item *arg;
Field *cached_field; Field *cached_field;
Item_default_value(THD *thd, Name_resolution_context *context_arg, Item *a) Item_default_value(THD *thd, Name_resolution_context *context_arg, Item *a,
bool vcol_assignment_arg)
:Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL, :Item_field(thd, context_arg, (const char *)NULL, (const char *)NULL,
&null_clex_str), &null_clex_str), vcol_assignment_ok(vcol_assignment_arg),
arg(a), cached_field(NULL) {} arg(a), cached_field(NULL) {}
enum Type type() const { return DEFAULT_VALUE_ITEM; } enum Type type() const { return DEFAULT_VALUE_ITEM; }
bool eq(const Item *item, bool binary_cmp) const; bool eq(const Item *item, bool binary_cmp) const;
@ -5923,6 +5925,7 @@ public:
if (field && field->default_value) if (field && field->default_value)
field->default_value->expr->update_used_tables(); field->default_value->expr->update_used_tables();
} }
bool vcol_assignment_allowed_value() const { return vcol_assignment_ok; }
Field *get_tmp_table_field() { return 0; } Field *get_tmp_table_field() { return 0; }
Item *get_tmp_table_item(THD *thd) { return this; } Item *get_tmp_table_item(THD *thd) { return this; }
Item_field *field_for_view_update() { return 0; } Item_field *field_for_view_update() { return 0; }

View File

@ -467,7 +467,7 @@ void key_unpack(String *to, TABLE *table, KEY *key)
bool is_key_used(TABLE *table, uint idx, const MY_BITMAP *fields) bool is_key_used(TABLE *table, uint idx, const MY_BITMAP *fields)
{ {
table->mark_columns_used_by_index(idx, &table->tmp_set); table->mark_index_columns(idx, &table->tmp_set);
return bitmap_is_overlapping(&table->tmp_set, fields); return bitmap_is_overlapping(&table->tmp_set, fields);
} }

View File

@ -2634,7 +2634,6 @@ end:
my_error(ER_INVALID_ROLE, MYF(0), rolename); my_error(ER_INVALID_ROLE, MYF(0), rolename);
break; break;
case 1: case 1:
StringBuffer<1024> c_usr;
LEX_CSTRING role_lex; LEX_CSTRING role_lex;
/* First, check if current user can see mysql database. */ /* First, check if current user can see mysql database. */
bool read_access= !check_access(thd, SELECT_ACL, "mysql", NULL, NULL, 1, 1); bool read_access= !check_access(thd, SELECT_ACL, "mysql", NULL, NULL, 1, 1);
@ -2655,11 +2654,9 @@ end:
NULL) == -1)) NULL) == -1))
{ {
/* Role is not granted but current user can see the role */ /* Role is not granted but current user can see the role */
c_usr.append(user, strlen(user)); my_printf_error(ER_INVALID_ROLE, "User %`s@%`s has not been granted role %`s",
c_usr.append('@'); MYF(0), thd->security_ctx->priv_user,
c_usr.append(host, strlen(host)); thd->security_ctx->priv_host, rolename);
my_printf_error(ER_INVALID_ROLE, "User %`s has not been granted role %`s",
MYF(0), c_usr.c_ptr(), rolename);
} }
else else
{ {

View File

@ -859,7 +859,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
enum enum_field_types type= (*field_ptr)->type(); enum enum_field_types type= (*field_ptr)->type();
if (type < MYSQL_TYPE_MEDIUM_BLOB || if (type < MYSQL_TYPE_MEDIUM_BLOB ||
type > MYSQL_TYPE_BLOB) type > MYSQL_TYPE_BLOB)
bitmap_set_bit(tab->read_set, fields); tab->field[fields]->register_field_in_read_map();
else else
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_NO_EIS_FOR_FIELD, ER_NO_EIS_FOR_FIELD,
@ -887,7 +887,7 @@ static bool mysql_admin_table(THD* thd, TABLE_LIST* tables,
enum enum_field_types type= tab->field[pos]->type(); enum enum_field_types type= tab->field[pos]->type();
if (type < MYSQL_TYPE_MEDIUM_BLOB || if (type < MYSQL_TYPE_MEDIUM_BLOB ||
type > MYSQL_TYPE_BLOB) type > MYSQL_TYPE_BLOB)
bitmap_set_bit(tab->read_set, pos); tab->field[pos]->register_field_in_read_map();
else else
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN, push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_NO_EIS_FOR_FIELD, ER_NO_EIS_FOR_FIELD,

View File

@ -6120,7 +6120,7 @@ find_field_in_table_ref(THD *thd, TABLE_LIST *table_list,
TABLE *table= field_to_set->table; TABLE *table= field_to_set->table;
DBUG_ASSERT(table); DBUG_ASSERT(table);
if (thd->column_usage == MARK_COLUMNS_READ) if (thd->column_usage == MARK_COLUMNS_READ)
bitmap_set_bit(table->read_set, field_to_set->field_index); field_to_set->register_field_in_read_map();
else else
bitmap_set_bit(table->write_set, field_to_set->field_index); bitmap_set_bit(table->write_set, field_to_set->field_index);
} }

View File

@ -6960,8 +6960,8 @@ void THD::binlog_prepare_row_images(TABLE *table)
{ {
case BINLOG_ROW_IMAGE_MINIMAL: case BINLOG_ROW_IMAGE_MINIMAL:
/* MINIMAL: Mark only PK */ /* MINIMAL: Mark only PK */
table->mark_columns_used_by_index(table->s->primary_key, table->mark_index_columns(table->s->primary_key,
&table->tmp_set); &table->tmp_set);
break; break;
case BINLOG_ROW_IMAGE_NOBLOB: case BINLOG_ROW_IMAGE_NOBLOB:
/** /**

View File

@ -1027,6 +1027,7 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex,
bool parse_status= false; bool parse_status= false;
st_select_lex *with_select; st_select_lex *with_select;
st_select_lex *last_clone_select;
char save_end= unparsed_spec.str[unparsed_spec.length]; char save_end= unparsed_spec.str[unparsed_spec.length];
const_cast<char*>(unparsed_spec.str)[unparsed_spec.length]= '\0'; const_cast<char*>(unparsed_spec.str)[unparsed_spec.length]= '\0';
@ -1114,11 +1115,6 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex,
lex->unit.include_down(with_table->select_lex); lex->unit.include_down(with_table->select_lex);
lex->unit.set_slave(with_select); lex->unit.set_slave(with_select);
lex->unit.cloned_from= spec; lex->unit.cloned_from= spec;
old_lex->all_selects_list=
(st_select_lex*) (lex->all_selects_list->
insert_chain_before(
(st_select_lex_node **) &(old_lex->all_selects_list),
with_select));
/* /*
Now all references to the CTE defined outside of the cloned specification Now all references to the CTE defined outside of the cloned specification
@ -1134,6 +1130,15 @@ st_select_lex_unit *With_element::clone_parsed_spec(LEX *old_lex,
goto err; goto err;
} }
last_clone_select= lex->all_selects_list;
while (last_clone_select->next_select_in_list())
last_clone_select= last_clone_select->next_select_in_list();
old_lex->all_selects_list=
(st_select_lex*) (lex->all_selects_list->
insert_chain_before(
(st_select_lex_node **) &(old_lex->all_selects_list),
last_clone_select));
lex->sphead= NULL; // in order not to delete lex->sphead lex->sphead= NULL; // in order not to delete lex->sphead
lex_end(lex); lex_end(lex);
err: err:
@ -1271,6 +1276,7 @@ bool With_element::is_anchor(st_select_lex *sel)
With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table) With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table)
{ {
With_element *found= NULL; With_element *found= NULL;
With_clause *containing_with_clause= NULL;
st_select_lex_unit *master_unit; st_select_lex_unit *master_unit;
st_select_lex *outer_sl; st_select_lex *outer_sl;
for (st_select_lex *sl= this; sl; sl= outer_sl) for (st_select_lex *sl= this; sl; sl= outer_sl)
@ -1283,6 +1289,7 @@ With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table)
*/ */
With_clause *attached_with_clause= sl->get_with_clause(); With_clause *attached_with_clause= sl->get_with_clause();
if (attached_with_clause && if (attached_with_clause &&
attached_with_clause != containing_with_clause &&
(found= attached_with_clause->find_table_def(table, NULL))) (found= attached_with_clause->find_table_def(table, NULL)))
break; break;
master_unit= sl->master_unit(); master_unit= sl->master_unit();
@ -1290,7 +1297,7 @@ With_element *st_select_lex::find_table_def_in_with_clauses(TABLE_LIST *table)
With_element *with_elem= sl->get_with_element(); With_element *with_elem= sl->get_with_element();
if (with_elem) if (with_elem)
{ {
With_clause *containing_with_clause= with_elem->get_owner(); containing_with_clause= with_elem->get_owner();
With_element *barrier= containing_with_clause->with_recursive ? With_element *barrier= containing_with_clause->with_recursive ?
NULL : with_elem; NULL : with_elem;
if ((found= containing_with_clause->find_table_def(table, barrier))) if ((found= containing_with_clause->find_table_def(table, barrier)))

View File

@ -4525,8 +4525,17 @@ select_create::prepare(List<Item> &_values, SELECT_LEX_UNIT *u)
DEBUG_SYNC(thd,"create_table_select_before_check_if_exists"); DEBUG_SYNC(thd,"create_table_select_before_check_if_exists");
if (!(table= create_table_from_items(thd, &values, &extra_lock, hook_ptr))) if (!(table= create_table_from_items(thd, &values, &extra_lock, hook_ptr)))
{
if (create_info->or_replace())
{
/* Original table was deleted. We have to log it */
log_drop_table(thd, &create_table->db, &create_table->table_name,
thd->lex->tmp_table());
}
/* abort() deletes table */ /* abort() deletes table */
DBUG_RETURN(-1); DBUG_RETURN(-1);
}
if (create_info->tmp_table()) if (create_info->tmp_table())
{ {

View File

@ -1619,7 +1619,12 @@ static int mysql_test_select(Prepared_statement *stmt,
if (!lex->describe && !thd->lex->analyze_stmt && !stmt->is_sql_prepare()) if (!lex->describe && !thd->lex->analyze_stmt && !stmt->is_sql_prepare())
{ {
/* Make copy of item list, as change_columns may change it */ /* Make copy of item list, as change_columns may change it */
List<Item> fields(lex->select_lex.item_list); SELECT_LEX_UNIT* master_unit= unit->first_select()->master_unit();
bool is_union_op=
master_unit->is_unit_op() || master_unit->fake_select_lex;
List<Item> fields(is_union_op ? unit->item_list :
lex->select_lex.item_list);
/* Change columns if a procedure like analyse() */ /* Change columns if a procedure like analyse() */
if (unit->last_procedure && unit->last_procedure->change_columns(thd, fields)) if (unit->last_procedure && unit->last_procedure->change_columns(thd, fields))

View File

@ -1537,7 +1537,7 @@ int JOIN::init_join_caches()
if (table->file->keyread_enabled()) if (table->file->keyread_enabled())
{ {
if (!(table->file->index_flags(table->file->keyread, 0, 1) & HA_CLUSTERED_INDEX)) if (!(table->file->index_flags(table->file->keyread, 0, 1) & HA_CLUSTERED_INDEX))
table->mark_columns_used_by_index(table->file->keyread, table->read_set); table->mark_index_columns(table->file->keyread, table->read_set);
} }
else if ((tab->read_first_record == join_read_first || else if ((tab->read_first_record == join_read_first ||
tab->read_first_record == join_read_last) && tab->read_first_record == join_read_last) &&
@ -8539,7 +8539,9 @@ static
double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s, double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s,
table_map rem_tables) table_map rem_tables)
{ {
uint16 ref_keyuse_steps[MAX_REF_PARTS - 1]; uint16 ref_keyuse_steps_buf[MAX_REF_PARTS];
uint ref_keyuse_size= MAX_REF_PARTS;
uint16 *ref_keyuse_steps= ref_keyuse_steps_buf;
Field *field; Field *field;
TABLE *table= s->table; TABLE *table= s->table;
MY_BITMAP *read_set= table->read_set; MY_BITMAP *read_set= table->read_set;
@ -8686,6 +8688,29 @@ double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s,
} }
if (keyparts > 1) if (keyparts > 1)
{ {
/*
Prepare to set ref_keyuse_steps[keyparts-2]: resize the array
if it is not large enough
*/
if (keyparts - 2 >= ref_keyuse_size)
{
uint new_size= MY_MAX(ref_keyuse_size*2, keyparts);
void *new_buf;
if (!(new_buf= my_malloc(sizeof(*ref_keyuse_steps)*new_size,
MYF(0))))
{
sel= 1.0; // As if no selectivity was computed
goto exit;
}
memcpy(new_buf, ref_keyuse_steps,
sizeof(*ref_keyuse_steps)*ref_keyuse_size);
if (ref_keyuse_steps != ref_keyuse_steps_buf)
my_free(ref_keyuse_steps);
ref_keyuse_steps= (uint16*)new_buf;
ref_keyuse_size= new_size;
}
ref_keyuse_steps[keyparts-2]= (uint16)(keyuse - prev_ref_keyuse); ref_keyuse_steps[keyparts-2]= (uint16)(keyuse - prev_ref_keyuse);
prev_ref_keyuse= keyuse; prev_ref_keyuse= keyuse;
} }
@ -8740,7 +8765,9 @@ double table_cond_selectivity(JOIN *join, uint idx, JOIN_TAB *s,
sel*= table_multi_eq_cond_selectivity(join, idx, s, rem_tables, sel*= table_multi_eq_cond_selectivity(join, idx, s, rem_tables,
keyparts, ref_keyuse_steps); keyparts, ref_keyuse_steps);
exit:
if (ref_keyuse_steps != ref_keyuse_steps_buf)
my_free(ref_keyuse_steps);
return sel; return sel;
} }
@ -22881,6 +22908,12 @@ check_reverse_order:
if (select->quick == save_quick) if (select->quick == save_quick)
save_quick= 0; // make_reverse() consumed it save_quick= 0; // make_reverse() consumed it
select->set_quick(tmp); select->set_quick(tmp);
/* Cancel "Range checked for each record" */
if (tab->use_quick == 2)
{
tab->use_quick= 1;
tab->read_first_record= join_init_read_record;
}
} }
else if (tab->type != JT_NEXT && tab->type != JT_REF_OR_NULL && else if (tab->type != JT_NEXT && tab->type != JT_REF_OR_NULL &&
tab->ref.key >= 0 && tab->ref.key_parts <= used_key_parts) tab->ref.key >= 0 && tab->ref.key_parts <= used_key_parts)
@ -22893,6 +22926,12 @@ check_reverse_order:
*/ */
tab->read_first_record= join_read_last_key; tab->read_first_record= join_read_last_key;
tab->read_record.read_record_func= join_read_prev_same; tab->read_record.read_record_func= join_read_prev_same;
/* Cancel "Range checked for each record" */
if (tab->use_quick == 2)
{
tab->use_quick= 1;
tab->read_first_record= join_init_read_record;
}
/* /*
Cancel Pushed Index Condition, as it doesn't work for reverse scans. Cancel Pushed Index Condition, as it doesn't work for reverse scans.
*/ */

View File

@ -30,6 +30,7 @@
#include "filesort.h" // filesort_free_buffers #include "filesort.h" // filesort_free_buffers
#include "sql_view.h" #include "sql_view.h"
#include "sql_cte.h" #include "sql_cte.h"
#include "item_windowfunc.h"
bool mysql_union(THD *thd, LEX *lex, select_result *result, bool mysql_union(THD *thd, LEX *lex, select_result *result,
SELECT_LEX_UNIT *unit, ulong setup_tables_done_option) SELECT_LEX_UNIT *unit, ulong setup_tables_done_option)
@ -1875,7 +1876,8 @@ bool st_select_lex_unit::cleanup()
{ {
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
} }
if (with_element && with_element->is_recursive && union_result) if (with_element && with_element->is_recursive && union_result &&
with_element->rec_outer_references)
{ {
select_union_recursive *result= with_element->rec_result; select_union_recursive *result= with_element->rec_result;
if (++result->cleanup_count == with_element->rec_outer_references) if (++result->cleanup_count == with_element->rec_outer_references)
@ -2044,6 +2046,29 @@ static void cleanup_order(ORDER *order)
} }
static void cleanup_window_funcs(List<Item_window_func> &win_funcs)
{
List_iterator_fast<Item_window_func> it(win_funcs);
Item_window_func *win_func;
while ((win_func= it++))
{
Window_spec *win_spec= win_func->window_spec;
if (!win_spec)
continue;
if (win_spec->save_partition_list)
{
win_spec->partition_list= win_spec->save_partition_list;
win_spec->save_partition_list= NULL;
}
if (win_spec->save_order_list)
{
win_spec->order_list= win_spec->save_order_list;
win_spec->save_order_list= NULL;
}
}
}
bool st_select_lex::cleanup() bool st_select_lex::cleanup()
{ {
bool error= FALSE; bool error= FALSE;
@ -2053,6 +2078,8 @@ bool st_select_lex::cleanup()
cleanup_order(group_list.first); cleanup_order(group_list.first);
cleanup_ftfuncs(this); cleanup_ftfuncs(this);
cleanup_window_funcs(window_funcs);
if (join) if (join)
{ {
List_iterator<TABLE_LIST> ti(leaf_tables); List_iterator<TABLE_LIST> ti(leaf_tables);
@ -2079,7 +2106,8 @@ bool st_select_lex::cleanup()
for (SELECT_LEX_UNIT *lex_unit= first_inner_unit(); lex_unit ; for (SELECT_LEX_UNIT *lex_unit= first_inner_unit(); lex_unit ;
lex_unit= lex_unit->next_unit()) lex_unit= lex_unit->next_unit())
{ {
if (lex_unit->with_element && lex_unit->with_element->is_recursive) if (lex_unit->with_element && lex_unit->with_element->is_recursive &&
lex_unit->with_element->rec_outer_references)
continue; continue;
error= (bool) ((uint) error | (uint) lex_unit->cleanup()); error= (bool) ((uint) error | (uint) lex_unit->cleanup());
} }

View File

@ -244,7 +244,7 @@ static void prepare_record_for_error_message(int error, TABLE *table)
/* Create unique_map with all fields used by that index. */ /* Create unique_map with all fields used by that index. */
my_bitmap_init(&unique_map, unique_map_buf, table->s->fields, FALSE); my_bitmap_init(&unique_map, unique_map_buf, table->s->fields, FALSE);
table->mark_columns_used_by_index(keynr, &unique_map); table->mark_index_columns(keynr, &unique_map);
/* Subtract read_set and write_set. */ /* Subtract read_set and write_set. */
bitmap_subtract(&unique_map, table->read_set); bitmap_subtract(&unique_map, table->read_set);

View File

@ -592,9 +592,15 @@ int compare_window_funcs_by_window_specs(Item_window_func *win_func1,
Let's use only one of the lists. Let's use only one of the lists.
*/ */
if (!win_spec1->name() && win_spec2->name()) if (!win_spec1->name() && win_spec2->name())
{
win_spec1->save_partition_list= win_spec1->partition_list;
win_spec1->partition_list= win_spec2->partition_list; win_spec1->partition_list= win_spec2->partition_list;
}
else else
{
win_spec2->save_partition_list= win_spec2->partition_list;
win_spec2->partition_list= win_spec1->partition_list; win_spec2->partition_list= win_spec1->partition_list;
}
cmp= compare_order_lists(win_spec1->order_list, cmp= compare_order_lists(win_spec1->order_list,
win_spec2->order_list); win_spec2->order_list);
@ -607,9 +613,15 @@ int compare_window_funcs_by_window_specs(Item_window_func *win_func1,
Let's use only one of the lists. Let's use only one of the lists.
*/ */
if (!win_spec1->name() && win_spec2->name()) if (!win_spec1->name() && win_spec2->name())
{
win_spec1->save_order_list= win_spec2->order_list;
win_spec1->order_list= win_spec2->order_list; win_spec1->order_list= win_spec2->order_list;
}
else else
{
win_spec1->save_order_list= win_spec2->order_list;
win_spec2->order_list= win_spec1->order_list; win_spec2->order_list= win_spec1->order_list;
}
cmp= compare_window_frames(win_spec1->window_frame, cmp= compare_window_frames(win_spec1->window_frame,
win_spec2->window_frame); win_spec2->window_frame);

View File

@ -111,8 +111,10 @@ class Window_spec : public Sql_alloc
LEX_CSTRING *window_ref; LEX_CSTRING *window_ref;
SQL_I_List<ORDER> *partition_list; SQL_I_List<ORDER> *partition_list;
SQL_I_List<ORDER> *save_partition_list;
SQL_I_List<ORDER> *order_list; SQL_I_List<ORDER> *order_list;
SQL_I_List<ORDER> *save_order_list;
Window_frame *window_frame; Window_frame *window_frame;
@ -123,7 +125,8 @@ class Window_spec : public Sql_alloc
SQL_I_List<ORDER> *ord_list, SQL_I_List<ORDER> *ord_list,
Window_frame *win_frame) Window_frame *win_frame)
: window_names_are_checked(false), window_ref(win_ref), : window_names_are_checked(false), window_ref(win_ref),
partition_list(part_list), order_list(ord_list), partition_list(part_list), save_partition_list(NULL),
order_list(ord_list), save_order_list(NULL),
window_frame(win_frame), referenced_win_spec(NULL) {} window_frame(win_frame), referenced_win_spec(NULL) {}
virtual const char *name() { return NULL; } virtual const char *name() { return NULL; }

View File

@ -1937,7 +1937,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
table_wild simple_expr column_default_non_parenthesized_expr udf_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr
primary_expr string_factor_expr mysql_concatenation_expr primary_expr string_factor_expr mysql_concatenation_expr
select_sublist_qualified_asterisk select_sublist_qualified_asterisk
expr_or_default set_expr_or_default expr_or_ignore expr_or_ignore_or_default set_expr_or_default
geometry_function signed_literal expr_or_literal geometry_function signed_literal expr_or_literal
sp_opt_default sp_opt_default
simple_ident_nospvar simple_ident_nospvar
@ -2426,7 +2426,7 @@ execute_var_list:
; ;
execute_var_ident: execute_var_ident:
expr_or_default expr_or_ignore_or_default
{ {
if (unlikely(Lex->prepared_stmt_params.push_back($1, if (unlikely(Lex->prepared_stmt_params.push_back($1,
thd->mem_root))) thd->mem_root)))
@ -10354,7 +10354,7 @@ column_default_non_parenthesized_expr:
if (unlikely(il)) if (unlikely(il))
my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str));
$$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), $$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(),
$3); $3, 0);
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->default_used= TRUE; Lex->default_used= TRUE;
@ -13592,7 +13592,7 @@ ident_eq_list:
; ;
ident_eq_value: ident_eq_value:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal expr_or_ignore_or_default
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (unlikely(lex->field_list.push_back($1, thd->mem_root)) || if (unlikely(lex->field_list.push_back($1, thd->mem_root)) ||
@ -13662,12 +13662,12 @@ opt_values_with_names:
; ;
values: values:
values ',' expr_or_default values ',' expr_or_ignore_or_default
{ {
if (unlikely(Lex->insert_list->push_back($3, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($3, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| expr_or_default | expr_or_ignore_or_default
{ {
if (unlikely(Lex->insert_list->push_back($1, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($1, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13675,7 +13675,7 @@ values:
; ;
values_with_names: values_with_names:
values_with_names ',' remember_name expr_or_default remember_end values_with_names ',' remember_name expr_or_ignore_or_default remember_end
{ {
if (unlikely(Lex->insert_list->push_back($4, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($4, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13683,7 +13683,7 @@ values_with_names:
if (!$4->name.str || $4->name.str == item_empty_name) if (!$4->name.str || $4->name.str == item_empty_name)
$4->set_name(thd, $3, (uint) ($5 - $3), thd->charset()); $4->set_name(thd, $3, (uint) ($5 - $3), thd->charset());
} }
| remember_name expr_or_default remember_end | remember_name expr_or_ignore_or_default remember_end
{ {
if (unlikely(Lex->insert_list->push_back($2, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($2, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13693,14 +13693,8 @@ values_with_names:
} }
; ;
expr_or_default: expr_or_ignore:
expr { $$= $1;} expr { $$= $1;}
| DEFAULT
{
$$= new (thd->mem_root) Item_default_specification(thd);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
}
| IGNORE_SYM | IGNORE_SYM
{ {
$$= new (thd->mem_root) Item_ignore_specification(thd); $$= new (thd->mem_root) Item_ignore_specification(thd);
@ -13709,6 +13703,16 @@ expr_or_default:
} }
; ;
expr_or_ignore_or_default:
expr_or_ignore { $$= $1;}
| DEFAULT
{
$$= new (thd->mem_root) Item_default_specification(thd);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
}
;
opt_insert_update: opt_insert_update:
/* empty */ /* empty */
| ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; } | ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; }
@ -13765,10 +13769,16 @@ update_list:
; ;
update_elem: update_elem:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal DEFAULT
{ {
if (unlikely(add_item_to_list(thd, $1)) || Item *def= new (thd->mem_root) Item_default_value(thd,
unlikely(add_value_to_list(thd, $3))) Lex->current_context(), $1, 1);
if (!def || add_item_to_list(thd, $1) || add_value_to_list(thd, def))
MYSQL_YYABORT;
}
| simple_ident_nospvar equal expr_or_ignore
{
if (add_item_to_list(thd, $1) || add_value_to_list(thd, $3))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
@ -13779,7 +13789,7 @@ insert_update_list:
; ;
insert_update_elem: insert_update_elem:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal expr_or_ignore_or_default
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || if (unlikely(lex->update_list.push_back($1, thd->mem_root)) ||
@ -15046,7 +15056,7 @@ load_data_set_list:
; ;
load_data_set_elem: load_data_set_elem:
simple_ident_nospvar equal remember_name expr_or_default remember_end simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || if (unlikely(lex->update_list.push_back($1, thd->mem_root)) ||

View File

@ -1338,7 +1338,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize);
table_wild simple_expr column_default_non_parenthesized_expr udf_expr table_wild simple_expr column_default_non_parenthesized_expr udf_expr
primary_expr string_factor_expr mysql_concatenation_expr primary_expr string_factor_expr mysql_concatenation_expr
select_sublist_qualified_asterisk select_sublist_qualified_asterisk
expr_or_default set_expr_or_default expr_or_ignore expr_or_ignore_or_default set_expr_or_default
geometry_function signed_literal expr_or_literal geometry_function signed_literal expr_or_literal
sp_opt_default sp_opt_default
simple_ident_nospvar simple_ident_nospvar
@ -1848,7 +1848,7 @@ execute_var_list:
; ;
execute_var_ident: execute_var_ident:
expr_or_default expr_or_ignore_or_default
{ {
if (unlikely(Lex->prepared_stmt_params.push_back($1, if (unlikely(Lex->prepared_stmt_params.push_back($1,
thd->mem_root))) thd->mem_root)))
@ -10293,7 +10293,7 @@ column_default_non_parenthesized_expr:
if (unlikely(il)) if (unlikely(il))
my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str)); my_yyabort_error((ER_WRONG_COLUMN_NAME, MYF(0), il->my_name()->str));
$$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(), $$= new (thd->mem_root) Item_default_value(thd, Lex->current_context(),
$3); $3, 0);
if (unlikely($$ == NULL)) if (unlikely($$ == NULL))
MYSQL_YYABORT; MYSQL_YYABORT;
Lex->default_used= TRUE; Lex->default_used= TRUE;
@ -13546,7 +13546,7 @@ ident_eq_list:
; ;
ident_eq_value: ident_eq_value:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal expr_or_ignore_or_default
{ {
LEX *lex=Lex; LEX *lex=Lex;
if (unlikely(lex->field_list.push_back($1, thd->mem_root)) || if (unlikely(lex->field_list.push_back($1, thd->mem_root)) ||
@ -13616,12 +13616,12 @@ opt_values_with_names:
; ;
values: values:
values ',' expr_or_default values ',' expr_or_ignore_or_default
{ {
if (unlikely(Lex->insert_list->push_back($3, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($3, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
| expr_or_default | expr_or_ignore_or_default
{ {
if (unlikely(Lex->insert_list->push_back($1, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($1, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13629,7 +13629,7 @@ values:
; ;
values_with_names: values_with_names:
values_with_names ',' remember_name expr_or_default remember_end values_with_names ',' remember_name expr_or_ignore_or_default remember_end
{ {
if (unlikely(Lex->insert_list->push_back($4, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($4, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13637,7 +13637,7 @@ values_with_names:
if (!$4->name.str || $4->name.str == item_empty_name) if (!$4->name.str || $4->name.str == item_empty_name)
$4->set_name(thd, $3, (uint) ($5 - $3), thd->charset()); $4->set_name(thd, $3, (uint) ($5 - $3), thd->charset());
} }
| remember_name expr_or_default remember_end | remember_name expr_or_ignore_or_default remember_end
{ {
if (unlikely(Lex->insert_list->push_back($2, thd->mem_root))) if (unlikely(Lex->insert_list->push_back($2, thd->mem_root)))
MYSQL_YYABORT; MYSQL_YYABORT;
@ -13647,14 +13647,8 @@ values_with_names:
} }
; ;
expr_or_default: expr_or_ignore:
expr { $$= $1;} expr { $$= $1;}
| DEFAULT
{
$$= new (thd->mem_root) Item_default_specification(thd);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
}
| IGNORE_SYM | IGNORE_SYM
{ {
$$= new (thd->mem_root) Item_ignore_specification(thd); $$= new (thd->mem_root) Item_ignore_specification(thd);
@ -13663,6 +13657,16 @@ expr_or_default:
} }
; ;
expr_or_ignore_or_default:
expr_or_ignore { $$= $1;}
| DEFAULT
{
$$= new (thd->mem_root) Item_default_specification(thd);
if (unlikely($$ == NULL))
MYSQL_YYABORT;
}
;
opt_insert_update: opt_insert_update:
/* empty */ /* empty */
| ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; } | ON DUPLICATE_SYM { Lex->duplicates= DUP_UPDATE; }
@ -13719,10 +13723,16 @@ update_list:
; ;
update_elem: update_elem:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal DEFAULT
{ {
if (unlikely(add_item_to_list(thd, $1)) || Item *def= new (thd->mem_root) Item_default_value(thd,
unlikely(add_value_to_list(thd, $3))) Lex->current_context(), $1, 1);
if (!def || add_item_to_list(thd, $1) || add_value_to_list(thd, def))
MYSQL_YYABORT;
}
| simple_ident_nospvar equal expr_or_ignore
{
if (add_item_to_list(thd, $1) || add_value_to_list(thd, $3))
MYSQL_YYABORT; MYSQL_YYABORT;
} }
; ;
@ -13733,7 +13743,7 @@ insert_update_list:
; ;
insert_update_elem: insert_update_elem:
simple_ident_nospvar equal expr_or_default simple_ident_nospvar equal expr_or_ignore_or_default
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || if (unlikely(lex->update_list.push_back($1, thd->mem_root)) ||
@ -15006,7 +15016,7 @@ load_data_set_list:
; ;
load_data_set_elem: load_data_set_elem:
simple_ident_nospvar equal remember_name expr_or_default remember_end simple_ident_nospvar equal remember_name expr_or_ignore_or_default remember_end
{ {
LEX *lex= Lex; LEX *lex= Lex;
if (unlikely(lex->update_list.push_back($1, thd->mem_root)) || if (unlikely(lex->update_list.push_back($1, thd->mem_root)) ||

View File

@ -6448,7 +6448,7 @@ void TABLE::prepare_for_position()
if ((file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) && if ((file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX) &&
s->primary_key < MAX_KEY) s->primary_key < MAX_KEY)
{ {
mark_columns_used_by_index_no_reset(s->primary_key, read_set); mark_index_columns_for_read(s->primary_key);
/* signal change */ /* signal change */
file->column_bitmaps_signal(); file->column_bitmaps_signal();
} }
@ -6464,7 +6464,7 @@ MY_BITMAP *TABLE::prepare_for_keyread(uint index, MY_BITMAP *map)
file->ha_start_keyread(index); file->ha_start_keyread(index);
if (map != read_set || !(file->index_flags(index, 0, 1) & HA_CLUSTERED_INDEX)) if (map != read_set || !(file->index_flags(index, 0, 1) & HA_CLUSTERED_INDEX))
{ {
mark_columns_used_by_index(index, map); mark_index_columns(index, map);
column_bitmaps_set(map); column_bitmaps_set(map);
} }
DBUG_RETURN(backup); DBUG_RETURN(backup);
@ -6475,12 +6475,12 @@ MY_BITMAP *TABLE::prepare_for_keyread(uint index, MY_BITMAP *map)
Mark that only fields from one key is used. Useful before keyread. Mark that only fields from one key is used. Useful before keyread.
*/ */
void TABLE::mark_columns_used_by_index(uint index, MY_BITMAP *bitmap) void TABLE::mark_index_columns(uint index, MY_BITMAP *bitmap)
{ {
DBUG_ENTER("TABLE::mark_columns_used_by_index"); DBUG_ENTER("TABLE::mark_index_columns");
bitmap_clear_all(bitmap); bitmap_clear_all(bitmap);
mark_columns_used_by_index_no_reset(index, bitmap); mark_index_columns_no_reset(index, bitmap);
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
@ -6504,23 +6504,36 @@ void TABLE::restore_column_maps_after_keyread(MY_BITMAP *backup)
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
} }
static void do_mark_index_columns(TABLE *table, uint index,
MY_BITMAP *bitmap, bool read)
{
KEY_PART_INFO *key_part= table->key_info[index].key_part;
uint key_parts= table->key_info[index].user_defined_key_parts;
for (uint k= 0; k < key_parts; k++)
if (read)
key_part[k].field->register_field_in_read_map();
else
bitmap_set_bit(bitmap, key_part[k].fieldnr-1);
if (table->file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX &&
table->s->primary_key != MAX_KEY && table->s->primary_key != index)
do_mark_index_columns(table, table->s->primary_key, bitmap, read);
}
/* /*
mark columns used by key, but don't reset other fields mark columns used by key, but don't reset other fields
*/ */
void TABLE::mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *bitmap) inline void TABLE::mark_index_columns_no_reset(uint index, MY_BITMAP *bitmap)
{ {
KEY_PART_INFO *key_part= key_info[index].key_part; do_mark_index_columns(this, index, bitmap, false);
KEY_PART_INFO *key_part_end= (key_part + key_info[index].user_defined_key_parts);
for (;key_part != key_part_end; key_part++)
bitmap_set_bit(bitmap, key_part->fieldnr-1);
if (file->ha_table_flags() & HA_PRIMARY_KEY_IN_READ_INDEX &&
s->primary_key != MAX_KEY && s->primary_key != index)
mark_columns_used_by_index_no_reset(s->primary_key, bitmap);
} }
inline void TABLE::mark_index_columns_for_read(uint index)
{
do_mark_index_columns(this, index, read_set, true);
}
/* /*
Mark auto-increment fields as used fields in both read and write maps Mark auto-increment fields as used fields in both read and write maps
@ -6539,7 +6552,7 @@ void TABLE::mark_auto_increment_column()
bitmap_set_bit(read_set, found_next_number_field->field_index); bitmap_set_bit(read_set, found_next_number_field->field_index);
bitmap_set_bit(write_set, found_next_number_field->field_index); bitmap_set_bit(write_set, found_next_number_field->field_index);
if (s->next_number_keypart) if (s->next_number_keypart)
mark_columns_used_by_index_no_reset(s->next_number_index, read_set); mark_index_columns_for_read(s->next_number_index);
file->column_bitmaps_signal(); file->column_bitmaps_signal();
} }
@ -6595,7 +6608,7 @@ void TABLE::mark_columns_needed_for_delete()
file->use_hidden_primary_key(); file->use_hidden_primary_key();
else else
{ {
mark_columns_used_by_index_no_reset(s->primary_key, read_set); mark_index_columns_for_read(s->primary_key);
need_signal= true; need_signal= true;
} }
} }
@ -6688,7 +6701,7 @@ void TABLE::mark_columns_needed_for_update()
file->use_hidden_primary_key(); file->use_hidden_primary_key();
else else
{ {
mark_columns_used_by_index_no_reset(s->primary_key, read_set); mark_index_columns_for_read(s->primary_key);
need_signal= true; need_signal= true;
} }
} }
@ -6848,7 +6861,7 @@ void TABLE::mark_columns_per_binlog_row_image()
if ((my_field->flags & PRI_KEY_FLAG) || if ((my_field->flags & PRI_KEY_FLAG) ||
(my_field->type() != MYSQL_TYPE_BLOB)) (my_field->type() != MYSQL_TYPE_BLOB))
{ {
bitmap_set_bit(read_set, my_field->field_index); my_field->register_field_in_read_map();
bitmap_set_bit(rpl_write_set, my_field->field_index); bitmap_set_bit(rpl_write_set, my_field->field_index);
} }
} }
@ -6860,7 +6873,7 @@ void TABLE::mark_columns_per_binlog_row_image()
We don't need to mark the primary key in the rpl_write_set as the We don't need to mark the primary key in the rpl_write_set as the
binary log will include all columns read anyway. binary log will include all columns read anyway.
*/ */
mark_columns_used_by_index_no_reset(s->primary_key, read_set); mark_index_columns_for_read(s->primary_key);
if (versioned()) if (versioned())
{ {
// TODO: After MDEV-18432 we don't pass history rows, so remove this: // TODO: After MDEV-18432 we don't pass history rows, so remove this:

View File

@ -1459,8 +1459,9 @@ public:
MY_BITMAP *prepare_for_keyread(uint index, MY_BITMAP *map); MY_BITMAP *prepare_for_keyread(uint index, MY_BITMAP *map);
MY_BITMAP *prepare_for_keyread(uint index) MY_BITMAP *prepare_for_keyread(uint index)
{ return prepare_for_keyread(index, &tmp_set); } { return prepare_for_keyread(index, &tmp_set); }
void mark_columns_used_by_index(uint index, MY_BITMAP *map); void mark_index_columns(uint index, MY_BITMAP *bitmap);
void mark_columns_used_by_index_no_reset(uint index, MY_BITMAP *map); void mark_index_columns_no_reset(uint index, MY_BITMAP *bitmap);
void mark_index_columns_for_read(uint index);
void restore_column_maps_after_keyread(MY_BITMAP *backup); void restore_column_maps_after_keyread(MY_BITMAP *backup);
void mark_auto_increment_column(void); void mark_auto_increment_column(void);
void mark_columns_needed_for_update(void); void mark_columns_needed_for_update(void);

View File

@ -1203,12 +1203,12 @@ trx_flush_log_if_needed_low(
bool flush = srv_file_flush_method != SRV_NOSYNC; bool flush = srv_file_flush_method != SRV_NOSYNC;
switch (srv_flush_log_at_trx_commit) { switch (srv_flush_log_at_trx_commit) {
case 3:
case 2: case 2:
/* Write the log but do not flush it to disk */ /* Write the log but do not flush it to disk */
flush = false; flush = false;
/* fall through */ /* fall through */
case 1: case 1:
case 3:
/* Write the log and optionally flush it to disk */ /* Write the log and optionally flush it to disk */
log_write_up_to(lsn, flush); log_write_up_to(lsn, flush);
return; return;

View File

@ -152,6 +152,11 @@ let $MASTER_1_COMMENT_TEXT_PK1_1=
COMMENT 'tbl "t1", srv "s_2_1"'; COMMENT 'tbl "t1", srv "s_2_1"';
let $MASTER_1_COMMENT_TEXT_KEY1_1= let $MASTER_1_COMMENT_TEXT_KEY1_1=
COMMENT 'tbl "t1", srv "s_2_1"'; COMMENT 'tbl "t1", srv "s_2_1"';
let $MASTER_1_COMMENT_MDEV_25985=
COMMENT='table "t1"'
PARTITION BY LIST COLUMNS(`a`) (
PARTITION `pt1` DEFAULT COMMENT = 'srv "s_2_1"'
);
let $MASTER_1_CHECK_DIRECT_UPDATE_STATUS= let $MASTER_1_CHECK_DIRECT_UPDATE_STATUS=
SHOW STATUS LIKE 'Spider_direct_update'; SHOW STATUS LIKE 'Spider_direct_update';
let $MASTER_1_CHECK_DIRECT_DELETE_STATUS= let $MASTER_1_CHECK_DIRECT_DELETE_STATUS=

View File

@ -262,6 +262,40 @@ a b c d e f
56B68DA68D6D4A04A08B453D09AD7B70 821E71E6ABB4404EBAA349BB681089F8 51041110620310 2018-08-02 13:48:28 510411 0 56B68DA68D6D4A04A08B453D09AD7B70 821E71E6ABB4404EBAA349BB681089F8 51041110620310 2018-08-02 13:48:28 510411 0
51ECF2C0CD3C48D99C91792E99D3C1A0 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:29 510411 0 51ECF2C0CD3C48D99C91792E99D3C1A0 017B8A460DBC444682B791305EF75356 51041110620308 2018-08-02 13:48:29 510411 0
093B37A93A534DF883787AF5F6799674 996C7F14989D480589A553717D735E3E 51041110620302 2018-08-02 13:48:30 510411 0 093B37A93A534DF883787AF5F6799674 996C7F14989D480589A553717D735E3E 51041110620302 2018-08-02 13:48:30 510411 0
#
# MDEV-25985 Spider handle ">=" as ">" in some cases
#
connection child2_1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
a int,
b int,
c int,
PRIMARY KEY (a),
KEY (b,c)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 1);
connection master_1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
a int,
b int,
c int,
PRIMARY KEY (a),
KEY (b,c)
) ENGINE=Spider DEFAULT CHARSET=utf8 COMMENT='table "t1"'
PARTITION BY LIST COLUMNS(`a`) (
PARTITION `pt1` DEFAULT COMMENT = 'srv "s_2_1"'
);
connection master_1;
SELECT * FROM t1 WHERE c > 0 AND b >= 1 AND b <= 2;
a b c
1 1 1
2 2 1
SELECT * FROM t1 WHERE c < 3 AND b <= 2;
a b c
1 1 1
2 2 1
Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084) Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084)
Fixed with 4968049799193394d442f26b4e3a8d95b185be72 Fixed with 4968049799193394d442f26b4e3a8d95b185be72

View File

@ -726,6 +726,41 @@ if ($HAVE_PARTITION)
} }
} }
--echo #
--echo # MDEV-25985 Spider handle ">=" as ">" in some cases
--echo #
--connection child2_1
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
eval CREATE TABLE t1 (
a int,
b int,
c int,
PRIMARY KEY (a),
KEY (b,c)
) $CHILD2_1_ENGINE $CHILD2_1_CHARSET;
INSERT INTO t1 VALUES (1, 1, 1), (2, 2, 1);
--connection master_1
--disable_warnings
DROP TABLE IF EXISTS t1;
--enable_warnings
eval CREATE TABLE t1 (
a int,
b int,
c int,
PRIMARY KEY (a),
KEY (b,c)
) $MASTER_1_ENGINE $MASTER_1_CHARSET $MASTER_1_COMMENT_MDEV_25985;
--connection master_1
SELECT * FROM t1 WHERE c > 0 AND b >= 1 AND b <= 2;
SELECT * FROM t1 WHERE c < 3 AND b <= 2;
--echo --echo
--echo Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084) --echo Crash from b4a2baffa82e5c07b96a1c752228560dcac1359b (MDEV-11084)
--echo Fixed with 4968049799193394d442f26b4e3a8d95b185be72 --echo Fixed with 4968049799193394d442f26b4e3a8d95b185be72

View File

@ -1921,12 +1921,20 @@ int spider_db_append_key_where_internal(
case HA_READ_AFTER_KEY: case HA_READ_AFTER_KEY:
if (sql_kind == SPIDER_SQL_KIND_SQL) if (sql_kind == SPIDER_SQL_KIND_SQL)
{ {
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_GT_STR;
op_len = SPIDER_SQL_GT_LEN;
} else {
op_str = SPIDER_SQL_GTEQUAL_STR;
op_len = SPIDER_SQL_GTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length + if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
SPIDER_SQL_GT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM); DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index); dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_GT_STR, SPIDER_SQL_GT_LEN); str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util-> if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr, append_column_value(spider, str, field, ptr,
share->access_charset)) share->access_charset))
@ -1981,12 +1989,20 @@ int spider_db_append_key_where_internal(
result_list->desc_flg = TRUE; result_list->desc_flg = TRUE;
if (sql_kind == SPIDER_SQL_KIND_SQL) if (sql_kind == SPIDER_SQL_KIND_SQL)
{ {
const char* op_str;
uint32 op_len;
if (start_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length + if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM); DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index); dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN); str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util-> if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr, append_column_value(spider, str, field, ptr,
share->access_charset)) share->access_charset))
@ -2351,12 +2367,20 @@ int spider_db_append_key_where_internal(
case HA_READ_BEFORE_KEY: case HA_READ_BEFORE_KEY:
if (sql_kind == SPIDER_SQL_KIND_SQL) if (sql_kind == SPIDER_SQL_KIND_SQL)
{ {
const char* op_str;
uint32 op_len;
if (end_key_part_map == 1) {
op_str = SPIDER_SQL_LT_STR;
op_len = SPIDER_SQL_LT_LEN;
} else {
op_str = SPIDER_SQL_LTEQUAL_STR;
op_len = SPIDER_SQL_LTEQUAL_LEN;
}
if (str->reserve(store_length + key_name_length + if (str->reserve(store_length + key_name_length +
/* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + /* SPIDER_SQL_NAME_QUOTE_LEN */ 2 + op_len))
SPIDER_SQL_LT_LEN))
DBUG_RETURN(HA_ERR_OUT_OF_MEM); DBUG_RETURN(HA_ERR_OUT_OF_MEM);
dbton_share->append_column_name(str, field->field_index); dbton_share->append_column_name(str, field->field_index);
str->q_append(SPIDER_SQL_LT_STR, SPIDER_SQL_LT_LEN); str->q_append(op_str, op_len);
if (spider_dbton[dbton_id].db_util-> if (spider_dbton[dbton_id].db_util->
append_column_value(spider, str, field, ptr, append_column_value(spider, str, field, ptr,
share->access_charset)) share->access_charset))

View File

@ -79,7 +79,7 @@ IF(UNIX)
INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT SupportFiles) INSTALL(FILES ${out} DESTINATION ${inst_location}/policy/selinux COMPONENT SupportFiles)
ENDFOREACH() ENDFOREACH()
IF(RPM) IF(RPM)
EXECUTE_PROCESS(COMMAND rpm -q --qf "%{VERSION}-%{RELEASE}" libsepol EXECUTE_PROCESS(COMMAND rpm -q --qf "%{VERSION}" libsepol
OUTPUT_VARIABLE LIBSEPOL_VERSION RESULT_VARIABLE err) OUTPUT_VARIABLE LIBSEPOL_VERSION RESULT_VARIABLE err)
IF (NOT err) IF (NOT err)
SET(CPACK_RPM_server_PACKAGE_REQUIRES SET(CPACK_RPM_server_PACKAGE_REQUIRES

View File

@ -20520,6 +20520,71 @@ static void test_ps_params_in_ctes()
myquery(rc); myquery(rc);
} }
void display_result_metadata(MYSQL_FIELD *field,
uint num_fields)
{
MYSQL_FIELD* field_end;
mct_log("Catalog\tDatabase\tTable\tTable_alias\tColumn\t"
"Column_alias\tType\tLength\tMax length\tIs_null\t"
"Flags\tDecimals\tCharsetnr\n");
for (field_end= field+num_fields; field < field_end; field++)
{
mct_log("%s\t", field->catalog);
mct_log("%s\t", field->db);
mct_log("%s\t", field->org_table);
mct_log("%s\t", field->table);
mct_log("%s\t", field->org_name);
mct_log("%s\t", field->name);
mct_log("%u\t", field->type);
mct_log("%lu\t", field->length);
mct_log("%lu\t", field->max_length);
mct_log("%s\t", (IS_NOT_NULL(field->flags) ? "N" : "Y"));
mct_log("%u\t", field->flags);
mct_log("%u\t", field->decimals);
mct_log("%u\n", field->charsetnr);
}
}
static void test_mdev_26145()
{
MYSQL_STMT *stmt;
MYSQL_RES *result;
MYSQL_FIELD *fields;
int rc, num_fields;
myheader("test_mdev_26145");
rc= mysql_query(mysql, "DROP TABLE IF EXISTS t1");
myquery(rc);
rc= mysql_query(mysql, "CREATE TABLE t1(a INT)");
myquery(rc);
stmt= mysql_simple_prepare(
mysql, "(SELECT MAX(a) FROM t1) UNION (SELECT MAX(a) FROM t1)");
check_stmt(stmt);
rc= mysql_stmt_execute(stmt);
check_execute(stmt, rc);
result= mysql_stmt_result_metadata(stmt);
DIE_UNLESS(result);
num_fields= mysql_stmt_field_count(stmt);
fields= mysql_fetch_fields(result);
mct_start_logging("test_mdev26145");
display_result_metadata(fields, num_fields);
mct_close_log();
mysql_free_result(result);
mysql_stmt_close(stmt);
rc= mysql_query(mysql, "DROP TABLE t1");
myquery(rc);
}
static void print_metadata(MYSQL_RES *rs_metadata, int num_fields) static void print_metadata(MYSQL_RES *rs_metadata, int num_fields)
{ {
@ -21011,6 +21076,7 @@ static void test_mdev19838()
static struct my_tests_st my_tests[]= { static struct my_tests_st my_tests[]= {
{ "test_mdev_26145", test_mdev_26145 },
{ "disable_query_logs", disable_query_logs }, { "disable_query_logs", disable_query_logs },
{ "test_view_sp_list_fields", test_view_sp_list_fields }, { "test_view_sp_list_fields", test_view_sp_list_fields },
{ "client_query", client_query }, { "client_query", client_query },