Merge 10.4 into 10.5
This commit is contained in:
commit
af27f17ea1
103
include/ilist.h
103
include/ilist.h
@ -16,7 +16,8 @@
|
|||||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#ifndef ILIST_H
|
||||||
|
#define ILIST_H
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
@ -24,15 +25,17 @@
|
|||||||
// Derive your class from this struct to insert to a linked list.
|
// Derive your class from this struct to insert to a linked list.
|
||||||
template <class Tag= void> struct ilist_node
|
template <class Tag= void> struct ilist_node
|
||||||
{
|
{
|
||||||
ilist_node()
|
ilist_node() noexcept
|
||||||
#ifndef DBUG_OFF
|
#ifndef DBUG_OFF
|
||||||
:
|
: next(NULL), prev(NULL)
|
||||||
next(NULL), prev(NULL)
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
ilist_node(ilist_node *next, ilist_node *prev) : next(next), prev(prev) {}
|
ilist_node(ilist_node *next, ilist_node *prev) noexcept
|
||||||
|
: next(next), prev(prev)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
ilist_node *next;
|
ilist_node *next;
|
||||||
ilist_node *prev;
|
ilist_node *prev;
|
||||||
@ -70,40 +73,40 @@ public:
|
|||||||
typedef T *pointer;
|
typedef T *pointer;
|
||||||
typedef T &reference;
|
typedef T &reference;
|
||||||
|
|
||||||
Iterator(ListNode *node) : node_(node) {}
|
Iterator(ListNode *node) noexcept : node_(node) {}
|
||||||
|
|
||||||
Iterator &operator++()
|
Iterator &operator++() noexcept
|
||||||
{
|
{
|
||||||
node_= node_->next;
|
node_= node_->next;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
Iterator operator++(int)
|
Iterator operator++(int) noexcept
|
||||||
{
|
{
|
||||||
Iterator tmp(*this);
|
Iterator tmp(*this);
|
||||||
operator++();
|
operator++();
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
Iterator &operator--()
|
Iterator &operator--() noexcept
|
||||||
{
|
{
|
||||||
node_= node_->prev;
|
node_= node_->prev;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
Iterator operator--(int)
|
Iterator operator--(int) noexcept
|
||||||
{
|
{
|
||||||
Iterator tmp(*this);
|
Iterator tmp(*this);
|
||||||
operator--();
|
operator--();
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
reference operator*() { return *static_cast<pointer>(node_); }
|
reference operator*() noexcept { return *static_cast<pointer>(node_); }
|
||||||
pointer operator->() { return static_cast<pointer>(node_); }
|
pointer operator->() noexcept { return static_cast<pointer>(node_); }
|
||||||
|
|
||||||
friend bool operator==(const Iterator &lhs, const Iterator &rhs)
|
friend bool operator==(const Iterator &lhs, const Iterator &rhs) noexcept
|
||||||
{
|
{
|
||||||
return lhs.node_ == rhs.node_;
|
return lhs.node_ == rhs.node_;
|
||||||
}
|
}
|
||||||
friend bool operator!=(const Iterator &lhs, const Iterator &rhs)
|
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) noexcept
|
||||||
{
|
{
|
||||||
return !(lhs == rhs);
|
return !(lhs == rhs);
|
||||||
}
|
}
|
||||||
@ -114,30 +117,36 @@ public:
|
|||||||
friend class ilist;
|
friend class ilist;
|
||||||
};
|
};
|
||||||
|
|
||||||
ilist() : sentinel_(&sentinel_, &sentinel_) {}
|
ilist() noexcept : sentinel_(&sentinel_, &sentinel_) {}
|
||||||
|
|
||||||
reference front() { return *begin(); }
|
reference front() noexcept { return *begin(); }
|
||||||
reference back() { return *--end(); }
|
reference back() noexcept { return *--end(); }
|
||||||
const_reference front() const { return *begin(); }
|
const_reference front() const noexcept { return *begin(); }
|
||||||
const_reference back() const { return *--end(); }
|
const_reference back() const noexcept { return *--end(); }
|
||||||
|
|
||||||
iterator begin() { return iterator(sentinel_.next); }
|
iterator begin() noexcept { return iterator(sentinel_.next); }
|
||||||
const_iterator begin() const
|
const_iterator begin() const noexcept
|
||||||
{
|
{
|
||||||
return iterator(const_cast<ListNode *>(sentinel_.next));
|
return iterator(const_cast<ListNode *>(sentinel_.next));
|
||||||
}
|
}
|
||||||
iterator end() { return iterator(&sentinel_); }
|
iterator end() noexcept { return iterator(&sentinel_); }
|
||||||
const_iterator end() const
|
const_iterator end() const noexcept
|
||||||
{
|
{
|
||||||
return iterator(const_cast<ListNode *>(&sentinel_));
|
return iterator(const_cast<ListNode *>(&sentinel_));
|
||||||
}
|
}
|
||||||
|
|
||||||
reverse_iterator rbegin() { return reverse_iterator(end()); }
|
reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }
|
||||||
const_reverse_iterator rbegin() const { return reverse_iterator(end()); }
|
const_reverse_iterator rbegin() const noexcept
|
||||||
reverse_iterator rend() { return reverse_iterator(begin()); }
|
{
|
||||||
const_reverse_iterator rend() const { return reverse_iterator(begin()); }
|
return reverse_iterator(end());
|
||||||
|
}
|
||||||
|
reverse_iterator rend() noexcept { return reverse_iterator(begin()); }
|
||||||
|
const_reverse_iterator rend() const noexcept
|
||||||
|
{
|
||||||
|
return reverse_iterator(begin());
|
||||||
|
}
|
||||||
|
|
||||||
bool empty() const { return sentinel_.next == &sentinel_; }
|
bool empty() const noexcept { return sentinel_.next == &sentinel_; }
|
||||||
|
|
||||||
// Not implemented because it's O(N)
|
// Not implemented because it's O(N)
|
||||||
// size_type size() const
|
// size_type size() const
|
||||||
@ -145,13 +154,13 @@ public:
|
|||||||
// return static_cast<size_type>(std::distance(begin(), end()));
|
// return static_cast<size_type>(std::distance(begin(), end()));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
void clear()
|
void clear() noexcept
|
||||||
{
|
{
|
||||||
sentinel_.next= &sentinel_;
|
sentinel_.next= &sentinel_;
|
||||||
sentinel_.prev= &sentinel_;
|
sentinel_.prev= &sentinel_;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator insert(iterator pos, reference value)
|
iterator insert(iterator pos, reference value) noexcept
|
||||||
{
|
{
|
||||||
ListNode *curr= pos.node_;
|
ListNode *curr= pos.node_;
|
||||||
ListNode *prev= pos.node_->prev;
|
ListNode *prev= pos.node_->prev;
|
||||||
@ -165,7 +174,7 @@ public:
|
|||||||
return iterator(&value);
|
return iterator(&value);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator erase(iterator pos)
|
iterator erase(iterator pos) noexcept
|
||||||
{
|
{
|
||||||
ListNode *prev= pos.node_->prev;
|
ListNode *prev= pos.node_->prev;
|
||||||
ListNode *next= pos.node_->next;
|
ListNode *next= pos.node_->next;
|
||||||
@ -182,15 +191,15 @@ public:
|
|||||||
return next;
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
void push_back(reference value) { insert(end(), value); }
|
void push_back(reference value) noexcept { insert(end(), value); }
|
||||||
void pop_back() { erase(end()); }
|
void pop_back() noexcept { erase(end()); }
|
||||||
|
|
||||||
void push_front(reference value) { insert(begin(), value); }
|
void push_front(reference value) noexcept { insert(begin(), value); }
|
||||||
void pop_front() { erase(begin()); }
|
void pop_front() noexcept { erase(begin()); }
|
||||||
|
|
||||||
// STL version is O(n) but this is O(1) because an element can't be inserted
|
// STL version is O(n) but this is O(1) because an element can't be inserted
|
||||||
// several times in the same ilist.
|
// several times in the same ilist.
|
||||||
void remove(reference value) { erase(iterator(&value)); }
|
void remove(reference value) noexcept { erase(iterator(&value)); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ListNode sentinel_;
|
ListNode sentinel_;
|
||||||
@ -216,36 +225,38 @@ public:
|
|||||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||||
typedef std::reverse_iterator<const iterator> const_reverse_iterator;
|
typedef std::reverse_iterator<const iterator> const_reverse_iterator;
|
||||||
|
|
||||||
sized_ilist() : size_(0) {}
|
sized_ilist() noexcept : size_(0) {}
|
||||||
|
|
||||||
size_type size() const { return size_; }
|
size_type size() const noexcept { return size_; }
|
||||||
|
|
||||||
void clear()
|
void clear() noexcept
|
||||||
{
|
{
|
||||||
BASE::clear();
|
BASE::clear();
|
||||||
size_= 0;
|
size_= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator insert(iterator pos, reference value)
|
iterator insert(iterator pos, reference value) noexcept
|
||||||
{
|
{
|
||||||
++size_;
|
++size_;
|
||||||
return BASE::insert(pos, value);
|
return BASE::insert(pos, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
iterator erase(iterator pos)
|
iterator erase(iterator pos) noexcept
|
||||||
{
|
{
|
||||||
--size_;
|
--size_;
|
||||||
return BASE::erase(pos);
|
return BASE::erase(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
void push_back(reference value) { insert(BASE::end(), value); }
|
void push_back(reference value) noexcept { insert(BASE::end(), value); }
|
||||||
void pop_back() { erase(BASE::end()); }
|
void pop_back() noexcept { erase(BASE::end()); }
|
||||||
|
|
||||||
void push_front(reference value) { insert(BASE::begin(), value); }
|
void push_front(reference value) noexcept { insert(BASE::begin(), value); }
|
||||||
void pop_front() { erase(BASE::begin()); }
|
void pop_front() noexcept { erase(BASE::begin()); }
|
||||||
|
|
||||||
void remove(reference value) { erase(iterator(&value)); }
|
void remove(reference value) noexcept { erase(iterator(&value)); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
size_type size_;
|
size_type size_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
21
mysql-test/main/rowid_filter_myisam.result
Normal file
21
mysql-test/main/rowid_filter_myisam.result
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# MDEV-22553: Assertion `info->lastpos == (~ (my_off_t) 0)' failed in mi_rkey with rowid_filer=on
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (
|
||||||
|
a smallint(6) DEFAULT NULL,
|
||||||
|
b bigint(20) DEFAULT NULL,
|
||||||
|
c varchar(64) DEFAULT NULL,
|
||||||
|
d varchar(64) DEFAULT NULL,
|
||||||
|
e smallint(6) DEFAULT NULL,
|
||||||
|
f bigint(20) DEFAULT NULL,
|
||||||
|
KEY a (a),
|
||||||
|
KEY d (d),
|
||||||
|
KEY f (f)
|
||||||
|
) ENGINE=MyISAM;
|
||||||
|
ALTER TABLE t1 DISABLE KEYS;
|
||||||
|
# Insert a lot of rows
|
||||||
|
ALTER TABLE t1 ENABLE KEYS;
|
||||||
|
# Must not crash:
|
||||||
|
SELECT * FROM t1 WHERE ( a BETWEEN 255 AND 270 OR f = 200 ) AND f IN ( 1, 4, 112, 143 ) AND d IN ('Montana', 'South Dakota');
|
||||||
|
a b c d e f
|
||||||
|
DROP TABLE t1;
|
1625
mysql-test/main/rowid_filter_myisam.test
Normal file
1625
mysql-test/main/rowid_filter_myisam.test
Normal file
File diff suppressed because it is too large
Load Diff
@ -70,11 +70,11 @@ CREATE DEFINER='root'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user A
|
|||||||
|
|
||||||
SET sql_mode='';
|
SET sql_mode='';
|
||||||
|
|
||||||
delimiter |;
|
|
||||||
|
|
||||||
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
||||||
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
||||||
|
|
||||||
|
delimiter |;
|
||||||
|
|
||||||
CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
CREATE DEFINER=`root`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
||||||
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER
|
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER
|
||||||
begin
|
begin
|
||||||
|
286
mysql-test/main/upgrade_MDEV-23102-1.result
Normal file
286
mysql-test/main/upgrade_MDEV-23102-1.result
Normal file
@ -0,0 +1,286 @@
|
|||||||
|
#
|
||||||
|
# MDEV-23102: 10.4 create mariadb.sys user on each update even
|
||||||
|
# is the user is not needed
|
||||||
|
#
|
||||||
|
# part 1: reassigning mysql.user and gis procedures to other user
|
||||||
|
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted");
|
||||||
|
create database mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
create table save_global_priv as select * from mysql.global_priv;
|
||||||
|
create table save_tables_priv as select * from mysql.tables_priv;
|
||||||
|
create table save_proxies_priv as select * from mysql.proxies_priv;
|
||||||
|
create table mysql.save_proc like mysql.proc;
|
||||||
|
insert into mysql.save_proc select * from mysql.proc;
|
||||||
|
set @save_sql_mode= @@sql_mode;
|
||||||
|
use mysql;
|
||||||
|
# make changed definition of gis procedures and user view
|
||||||
|
create user superuser@localhost;
|
||||||
|
grant all privileges on mysql.* to superuser@localhost;
|
||||||
|
drop view user;
|
||||||
|
CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT
|
||||||
|
Host,
|
||||||
|
User,
|
||||||
|
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
|
||||||
|
'N' AS password_expired,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
|
||||||
|
FROM global_priv;
|
||||||
|
SET sql_mode='';
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
||||||
|
CREATE DEFINER=`superuser`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
||||||
|
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER
|
||||||
|
begin
|
||||||
|
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end |
|
||||||
|
CREATE DEFINER=`superuser`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
||||||
|
t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER
|
||||||
|
begin
|
||||||
|
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end |
|
||||||
|
set @@sql_mode= @save_sql_mode;
|
||||||
|
drop user 'mariadb.sys'@'localhost';
|
||||||
|
# check changed definitions mysql_upgrade
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE
|
||||||
|
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE
|
||||||
|
# Run mysql_upgrade
|
||||||
|
Phase 1/7: Checking and upgrading mysql database
|
||||||
|
Processing databases
|
||||||
|
mysql
|
||||||
|
mysql.column_stats OK
|
||||||
|
mysql.columns_priv OK
|
||||||
|
mysql.db OK
|
||||||
|
mysql.event OK
|
||||||
|
mysql.func OK
|
||||||
|
mysql.global_priv OK
|
||||||
|
mysql.gtid_slave_pos OK
|
||||||
|
mysql.help_category OK
|
||||||
|
mysql.help_keyword OK
|
||||||
|
mysql.help_relation OK
|
||||||
|
mysql.help_topic OK
|
||||||
|
mysql.index_stats OK
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.plugin OK
|
||||||
|
mysql.proc OK
|
||||||
|
mysql.procs_priv OK
|
||||||
|
mysql.proxies_priv OK
|
||||||
|
mysql.roles_mapping OK
|
||||||
|
mysql.save_proc OK
|
||||||
|
mysql.servers OK
|
||||||
|
mysql.table_stats OK
|
||||||
|
mysql.tables_priv OK
|
||||||
|
mysql.time_zone OK
|
||||||
|
mysql.time_zone_leap_second OK
|
||||||
|
mysql.time_zone_name OK
|
||||||
|
mysql.time_zone_transition OK
|
||||||
|
mysql.time_zone_transition_type OK
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
|
||||||
|
Repairing tables
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
Phase 2/7: Installing used storage engines... Skipped
|
||||||
|
Phase 3/7: Fixing views
|
||||||
|
mysql.user OK
|
||||||
|
Phase 4/7: Running 'mysql_fix_privilege_tables'
|
||||||
|
Phase 5/7: Fixing table and database names
|
||||||
|
Phase 6/7: Checking and upgrading tables
|
||||||
|
Processing databases
|
||||||
|
information_schema
|
||||||
|
mtr
|
||||||
|
mtr.global_suppressions OK
|
||||||
|
mtr.test_suppressions OK
|
||||||
|
mysqltest1
|
||||||
|
mysqltest1.save_global_priv OK
|
||||||
|
mysqltest1.save_proxies_priv OK
|
||||||
|
mysqltest1.save_tables_priv OK
|
||||||
|
performance_schema
|
||||||
|
test
|
||||||
|
Phase 7/7: Running 'FLUSH PRIVILEGES'
|
||||||
|
OK
|
||||||
|
# check new definitions mysql_upgrade
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
select count(*) from global_priv where user='mariadb.sys' and host='localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
# above should be 0 (no mariadb.sys@localhost user)
|
||||||
|
# restore environment
|
||||||
|
DROP USER 'superuser'@'localhost';
|
||||||
|
DROP VIEW mysql.user;
|
||||||
|
DROP PROCEDURE AddGeometryColumn;
|
||||||
|
DROP PROCEDURE DropGeometryColumn;
|
||||||
|
Phase 1/7: Checking and upgrading mysql database
|
||||||
|
Processing databases
|
||||||
|
mysql
|
||||||
|
mysql.column_stats OK
|
||||||
|
mysql.columns_priv OK
|
||||||
|
mysql.db OK
|
||||||
|
mysql.event OK
|
||||||
|
mysql.func OK
|
||||||
|
mysql.global_priv OK
|
||||||
|
mysql.gtid_slave_pos OK
|
||||||
|
mysql.help_category OK
|
||||||
|
mysql.help_keyword OK
|
||||||
|
mysql.help_relation OK
|
||||||
|
mysql.help_topic OK
|
||||||
|
mysql.index_stats OK
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.plugin OK
|
||||||
|
mysql.proc OK
|
||||||
|
mysql.procs_priv OK
|
||||||
|
mysql.proxies_priv OK
|
||||||
|
mysql.roles_mapping OK
|
||||||
|
mysql.save_proc OK
|
||||||
|
mysql.servers OK
|
||||||
|
mysql.table_stats OK
|
||||||
|
mysql.tables_priv OK
|
||||||
|
mysql.time_zone OK
|
||||||
|
mysql.time_zone_leap_second OK
|
||||||
|
mysql.time_zone_name OK
|
||||||
|
mysql.time_zone_transition OK
|
||||||
|
mysql.time_zone_transition_type OK
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
|
||||||
|
Repairing tables
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
Phase 2/7: Installing used storage engines... Skipped
|
||||||
|
Phase 3/7: Fixing views
|
||||||
|
Phase 4/7: Running 'mysql_fix_privilege_tables'
|
||||||
|
Phase 5/7: Fixing table and database names
|
||||||
|
Phase 6/7: Checking and upgrading tables
|
||||||
|
Processing databases
|
||||||
|
information_schema
|
||||||
|
mtr
|
||||||
|
mtr.global_suppressions OK
|
||||||
|
mtr.test_suppressions OK
|
||||||
|
mysqltest1
|
||||||
|
mysqltest1.save_global_priv OK
|
||||||
|
mysqltest1.save_proxies_priv OK
|
||||||
|
mysqltest1.save_tables_priv OK
|
||||||
|
performance_schema
|
||||||
|
test
|
||||||
|
Phase 7/7: Running 'FLUSH PRIVILEGES'
|
||||||
|
OK
|
||||||
|
delete from global_priv;
|
||||||
|
delete from tables_priv;
|
||||||
|
delete from proxies_priv;
|
||||||
|
delete from proc;
|
||||||
|
insert into mysql.global_priv select * from mysqltest1.save_global_priv;
|
||||||
|
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv;
|
||||||
|
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv;
|
||||||
|
rename table proc to bad_proc;
|
||||||
|
rename table save_proc to proc;
|
||||||
|
drop table bad_proc;
|
||||||
|
flush privileges;
|
||||||
|
disconnect default;
|
||||||
|
connect default,localhost,root,,;
|
||||||
|
connection default;
|
||||||
|
drop database mysqltest1;
|
||||||
|
# End of 10.4 tests (but better do not add other tests here)
|
163
mysql-test/main/upgrade_MDEV-23102-1.test
Normal file
163
mysql-test/main/upgrade_MDEV-23102-1.test
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # MDEV-23102: 10.4 create mariadb.sys user on each update even
|
||||||
|
--echo # is the user is not needed
|
||||||
|
--echo #
|
||||||
|
--echo # part 1: reassigning mysql.user and gis procedures to other user
|
||||||
|
|
||||||
|
--source include/mysql_upgrade_preparation.inc
|
||||||
|
|
||||||
|
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted");
|
||||||
|
create database mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
create table save_global_priv as select * from mysql.global_priv;
|
||||||
|
create table save_tables_priv as select * from mysql.tables_priv;
|
||||||
|
create table save_proxies_priv as select * from mysql.proxies_priv;
|
||||||
|
create table mysql.save_proc like mysql.proc;
|
||||||
|
insert into mysql.save_proc select * from mysql.proc;
|
||||||
|
set @save_sql_mode= @@sql_mode;
|
||||||
|
|
||||||
|
use mysql;
|
||||||
|
|
||||||
|
--echo # make changed definition of gis procedures and user view
|
||||||
|
|
||||||
|
create user superuser@localhost;
|
||||||
|
grant all privileges on mysql.* to superuser@localhost;
|
||||||
|
|
||||||
|
drop view user;
|
||||||
|
|
||||||
|
CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT
|
||||||
|
Host,
|
||||||
|
User,
|
||||||
|
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
|
||||||
|
'N' AS password_expired,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
|
||||||
|
FROM global_priv;
|
||||||
|
|
||||||
|
|
||||||
|
SET sql_mode='';
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
||||||
|
|
||||||
|
delimiter |;
|
||||||
|
|
||||||
|
CREATE DEFINER=`superuser`@`localhost` PROCEDURE AddGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
||||||
|
t_name varchar(64), geometry_column varchar(64), t_srid int) SQL SECURITY INVOKER
|
||||||
|
begin
|
||||||
|
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' ADD ', geometry_column,' GEOMETRY REF_SYSTEM_ID=', t_srid); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end |
|
||||||
|
|
||||||
|
CREATE DEFINER=`superuser`@`localhost` PROCEDURE DropGeometryColumn(catalog varchar(64), t_schema varchar(64),
|
||||||
|
t_name varchar(64), geometry_column varchar(64)) SQL SECURITY INVOKER
|
||||||
|
begin
|
||||||
|
set @qwe= concat('ALTER TABLE ', t_schema, '.', t_name, ' DROP ', geometry_column); PREPARE ls from @qwe; execute ls; deallocate prepare ls; end |
|
||||||
|
|
||||||
|
delimiter ;|
|
||||||
|
|
||||||
|
set @@sql_mode= @save_sql_mode;
|
||||||
|
|
||||||
|
drop user 'mariadb.sys'@'localhost';
|
||||||
|
|
||||||
|
--echo # check changed definitions mysql_upgrade
|
||||||
|
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
|
||||||
|
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
|
||||||
|
--echo # Run mysql_upgrade
|
||||||
|
--exec $MYSQL_UPGRADE 2>&1
|
||||||
|
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
|
||||||
|
--echo # check new definitions mysql_upgrade
|
||||||
|
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
|
||||||
|
select count(*) from global_priv where user='mariadb.sys' and host='localhost';
|
||||||
|
--echo # above should be 0 (no mariadb.sys@localhost user)
|
||||||
|
|
||||||
|
--echo # restore environment
|
||||||
|
|
||||||
|
DROP USER 'superuser'@'localhost';
|
||||||
|
DROP VIEW mysql.user;
|
||||||
|
DROP PROCEDURE AddGeometryColumn;
|
||||||
|
DROP PROCEDURE DropGeometryColumn;
|
||||||
|
--exec $MYSQL_UPGRADE 2>&1
|
||||||
|
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
|
||||||
|
delete from global_priv;
|
||||||
|
delete from tables_priv;
|
||||||
|
delete from proxies_priv;
|
||||||
|
delete from proc;
|
||||||
|
insert into mysql.global_priv select * from mysqltest1.save_global_priv;
|
||||||
|
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv;
|
||||||
|
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv;
|
||||||
|
rename table proc to bad_proc;
|
||||||
|
rename table save_proc to proc;
|
||||||
|
drop table bad_proc;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
disconnect default;
|
||||||
|
connect default,localhost,root,,;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
drop database mysqltest1;
|
||||||
|
|
||||||
|
--echo # End of 10.4 tests (but better do not add other tests here)
|
262
mysql-test/main/upgrade_MDEV-23102-2.result
Normal file
262
mysql-test/main/upgrade_MDEV-23102-2.result
Normal file
@ -0,0 +1,262 @@
|
|||||||
|
#
|
||||||
|
# MDEV-23102: 10.4 create mariadb.sys user on each update even
|
||||||
|
# is the user is not needed
|
||||||
|
#
|
||||||
|
# part 2: reassigning mysql.user and deleting gis procedures
|
||||||
|
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted");
|
||||||
|
create database mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
create table save_global_priv as select * from mysql.global_priv;
|
||||||
|
create table save_tables_priv as select * from mysql.tables_priv;
|
||||||
|
create table save_proxies_priv as select * from mysql.proxies_priv;
|
||||||
|
create table mysql.save_proc like mysql.proc;
|
||||||
|
insert into mysql.save_proc select * from mysql.proc;
|
||||||
|
set @save_sql_mode= @@sql_mode;
|
||||||
|
use mysql;
|
||||||
|
# make changed definition of gis procedures and user view
|
||||||
|
create user superuser@localhost;
|
||||||
|
grant all privileges on mysql.* to superuser@localhost;
|
||||||
|
drop view user;
|
||||||
|
CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT
|
||||||
|
Host,
|
||||||
|
User,
|
||||||
|
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
|
||||||
|
'N' AS password_expired,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
|
||||||
|
FROM global_priv;
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
||||||
|
drop user 'mariadb.sys'@'localhost';
|
||||||
|
# check changed definitions mysql_upgrade
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
GRANTEE TABLE_CATALOG PRIVILEGE_TYPE IS_GRANTABLE
|
||||||
|
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE
|
||||||
|
# Run mysql_upgrade
|
||||||
|
Phase 1/7: Checking and upgrading mysql database
|
||||||
|
Processing databases
|
||||||
|
mysql
|
||||||
|
mysql.column_stats OK
|
||||||
|
mysql.columns_priv OK
|
||||||
|
mysql.db OK
|
||||||
|
mysql.event OK
|
||||||
|
mysql.func OK
|
||||||
|
mysql.global_priv OK
|
||||||
|
mysql.gtid_slave_pos OK
|
||||||
|
mysql.help_category OK
|
||||||
|
mysql.help_keyword OK
|
||||||
|
mysql.help_relation OK
|
||||||
|
mysql.help_topic OK
|
||||||
|
mysql.index_stats OK
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.plugin OK
|
||||||
|
mysql.proc OK
|
||||||
|
mysql.procs_priv OK
|
||||||
|
mysql.proxies_priv OK
|
||||||
|
mysql.roles_mapping OK
|
||||||
|
mysql.save_proc OK
|
||||||
|
mysql.servers OK
|
||||||
|
mysql.table_stats OK
|
||||||
|
mysql.tables_priv OK
|
||||||
|
mysql.time_zone OK
|
||||||
|
mysql.time_zone_leap_second OK
|
||||||
|
mysql.time_zone_name OK
|
||||||
|
mysql.time_zone_transition OK
|
||||||
|
mysql.time_zone_transition_type OK
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
|
||||||
|
Repairing tables
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
Phase 2/7: Installing used storage engines... Skipped
|
||||||
|
Phase 3/7: Fixing views
|
||||||
|
mysql.user OK
|
||||||
|
Phase 4/7: Running 'mysql_fix_privilege_tables'
|
||||||
|
Phase 5/7: Fixing table and database names
|
||||||
|
Phase 6/7: Checking and upgrading tables
|
||||||
|
Processing databases
|
||||||
|
information_schema
|
||||||
|
mtr
|
||||||
|
mtr.global_suppressions OK
|
||||||
|
mtr.test_suppressions OK
|
||||||
|
mysqltest1
|
||||||
|
mysqltest1.save_global_priv OK
|
||||||
|
mysqltest1.save_proxies_priv OK
|
||||||
|
mysqltest1.save_tables_priv OK
|
||||||
|
performance_schema
|
||||||
|
test
|
||||||
|
Phase 7/7: Running 'FLUSH PRIVILEGES'
|
||||||
|
OK
|
||||||
|
# check new definitions mysql_upgrade
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
count(*)
|
||||||
|
1
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
select count(*) from global_priv where user='mariadb.sys' and host='localhost';
|
||||||
|
count(*)
|
||||||
|
0
|
||||||
|
# above should be 0 (no mariadb.sys@localhost user)
|
||||||
|
# restore environment
|
||||||
|
DROP USER 'superuser'@'localhost';
|
||||||
|
DROP VIEW mysql.user;
|
||||||
|
Phase 1/7: Checking and upgrading mysql database
|
||||||
|
Processing databases
|
||||||
|
mysql
|
||||||
|
mysql.column_stats OK
|
||||||
|
mysql.columns_priv OK
|
||||||
|
mysql.db OK
|
||||||
|
mysql.event OK
|
||||||
|
mysql.func OK
|
||||||
|
mysql.global_priv OK
|
||||||
|
mysql.gtid_slave_pos OK
|
||||||
|
mysql.help_category OK
|
||||||
|
mysql.help_keyword OK
|
||||||
|
mysql.help_relation OK
|
||||||
|
mysql.help_topic OK
|
||||||
|
mysql.index_stats OK
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.plugin OK
|
||||||
|
mysql.proc OK
|
||||||
|
mysql.procs_priv OK
|
||||||
|
mysql.proxies_priv OK
|
||||||
|
mysql.roles_mapping OK
|
||||||
|
mysql.save_proc OK
|
||||||
|
mysql.servers OK
|
||||||
|
mysql.table_stats OK
|
||||||
|
mysql.tables_priv OK
|
||||||
|
mysql.time_zone OK
|
||||||
|
mysql.time_zone_leap_second OK
|
||||||
|
mysql.time_zone_name OK
|
||||||
|
mysql.time_zone_transition OK
|
||||||
|
mysql.time_zone_transition_type OK
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
|
||||||
|
Repairing tables
|
||||||
|
mysql.innodb_index_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.innodb_table_stats
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
mysql.transaction_registry
|
||||||
|
Error : Unknown storage engine 'InnoDB'
|
||||||
|
error : Corrupt
|
||||||
|
Phase 2/7: Installing used storage engines... Skipped
|
||||||
|
Phase 3/7: Fixing views
|
||||||
|
Phase 4/7: Running 'mysql_fix_privilege_tables'
|
||||||
|
Phase 5/7: Fixing table and database names
|
||||||
|
Phase 6/7: Checking and upgrading tables
|
||||||
|
Processing databases
|
||||||
|
information_schema
|
||||||
|
mtr
|
||||||
|
mtr.global_suppressions OK
|
||||||
|
mtr.test_suppressions OK
|
||||||
|
mysqltest1
|
||||||
|
mysqltest1.save_global_priv OK
|
||||||
|
mysqltest1.save_proxies_priv OK
|
||||||
|
mysqltest1.save_tables_priv OK
|
||||||
|
performance_schema
|
||||||
|
test
|
||||||
|
Phase 7/7: Running 'FLUSH PRIVILEGES'
|
||||||
|
OK
|
||||||
|
delete from global_priv;
|
||||||
|
delete from tables_priv;
|
||||||
|
delete from proxies_priv;
|
||||||
|
delete from proc;
|
||||||
|
insert into mysql.global_priv select * from mysqltest1.save_global_priv;
|
||||||
|
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv;
|
||||||
|
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv;
|
||||||
|
rename table proc to bad_proc;
|
||||||
|
rename table save_proc to proc;
|
||||||
|
drop table bad_proc;
|
||||||
|
flush privileges;
|
||||||
|
disconnect default;
|
||||||
|
connect default,localhost,root,,;
|
||||||
|
connection default;
|
||||||
|
drop database mysqltest1;
|
||||||
|
# End of 10.4 tests (but better do not add other tests here)
|
141
mysql-test/main/upgrade_MDEV-23102-2.test
Normal file
141
mysql-test/main/upgrade_MDEV-23102-2.test
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # MDEV-23102: 10.4 create mariadb.sys user on each update even
|
||||||
|
--echo # is the user is not needed
|
||||||
|
--echo #
|
||||||
|
--echo # part 2: reassigning mysql.user and deleting gis procedures
|
||||||
|
|
||||||
|
--source include/mysql_upgrade_preparation.inc
|
||||||
|
|
||||||
|
call mtr.add_suppression("Cannot load from mysql.proc. The table is probably corrupted");
|
||||||
|
create database mysqltest1;
|
||||||
|
use mysqltest1;
|
||||||
|
create table save_global_priv as select * from mysql.global_priv;
|
||||||
|
create table save_tables_priv as select * from mysql.tables_priv;
|
||||||
|
create table save_proxies_priv as select * from mysql.proxies_priv;
|
||||||
|
create table mysql.save_proc like mysql.proc;
|
||||||
|
insert into mysql.save_proc select * from mysql.proc;
|
||||||
|
set @save_sql_mode= @@sql_mode;
|
||||||
|
|
||||||
|
use mysql;
|
||||||
|
|
||||||
|
--echo # make changed definition of gis procedures and user view
|
||||||
|
|
||||||
|
create user superuser@localhost;
|
||||||
|
grant all privileges on mysql.* to superuser@localhost;
|
||||||
|
|
||||||
|
drop view user;
|
||||||
|
|
||||||
|
CREATE DEFINER='superuser'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT
|
||||||
|
Host,
|
||||||
|
User,
|
||||||
|
IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv,
|
||||||
|
IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string,
|
||||||
|
'N' AS password_expired,
|
||||||
|
ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role,
|
||||||
|
IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role,
|
||||||
|
CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time
|
||||||
|
FROM global_priv;
|
||||||
|
|
||||||
|
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.AddGeometryColumn;
|
||||||
|
DROP PROCEDURE IF EXISTS mysql.DropGeometryColumn;
|
||||||
|
|
||||||
|
|
||||||
|
drop user 'mariadb.sys'@'localhost';
|
||||||
|
|
||||||
|
--echo # check changed definitions mysql_upgrade
|
||||||
|
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn';
|
||||||
|
|
||||||
|
SELECT * FROM information_schema.USER_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
SELECT * FROM information_schema.TABLE_PRIVILEGES WHERE GRANTEE="'mariadb.sys'@'localhost'";
|
||||||
|
|
||||||
|
let $MYSQLD_DATADIR= `select @@datadir`;
|
||||||
|
|
||||||
|
--echo # Run mysql_upgrade
|
||||||
|
--exec $MYSQL_UPGRADE 2>&1
|
||||||
|
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
|
||||||
|
--echo # check new definitions mysql_upgrade
|
||||||
|
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def'
|
||||||
|
and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'superuser@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='AddGeometryColumn';
|
||||||
|
SELECT count(*) FROM information_schema.ROUTINES WHERE ROUTINE_CATALOG = 'def' and ROUTINE_SCHEMA = 'mysql' and ROUTINE_NAME='DropGeometryColumn';
|
||||||
|
|
||||||
|
|
||||||
|
select count(*) from global_priv where user='mariadb.sys' and host='localhost';
|
||||||
|
--echo # above should be 0 (no mariadb.sys@localhost user)
|
||||||
|
|
||||||
|
--echo # restore environment
|
||||||
|
|
||||||
|
DROP USER 'superuser'@'localhost';
|
||||||
|
DROP VIEW mysql.user;
|
||||||
|
--exec $MYSQL_UPGRADE 2>&1
|
||||||
|
--file_exists $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
--remove_file $MYSQLD_DATADIR/mysql_upgrade_info
|
||||||
|
|
||||||
|
delete from global_priv;
|
||||||
|
delete from tables_priv;
|
||||||
|
delete from proxies_priv;
|
||||||
|
delete from proc;
|
||||||
|
insert into mysql.global_priv select * from mysqltest1.save_global_priv;
|
||||||
|
insert into mysql.tables_priv select * from mysqltest1.save_tables_priv;
|
||||||
|
insert into mysql.proxies_priv select * from mysqltest1.save_proxies_priv;
|
||||||
|
rename table proc to bad_proc;
|
||||||
|
rename table save_proc to proc;
|
||||||
|
drop table bad_proc;
|
||||||
|
flush privileges;
|
||||||
|
|
||||||
|
disconnect default;
|
||||||
|
connect default,localhost,root,,;
|
||||||
|
connection default;
|
||||||
|
|
||||||
|
drop database mysqltest1;
|
||||||
|
|
||||||
|
--echo # End of 10.4 tests (but better do not add other tests here)
|
@ -401,5 +401,10 @@ SET DEBUG_SYNC='now SIGNAL emptied';
|
|||||||
connection con2;
|
connection con2;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
connection default;
|
connection default;
|
||||||
|
ALTER TABLE t1 DROP c;
|
||||||
|
INSERT INTO t1 VALUES (2),(3),(4);
|
||||||
|
CHECK TABLE t1;
|
||||||
|
Table Op Msg_type Msg_text
|
||||||
|
test.t1 check status OK
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET DEBUG_SYNC=RESET;
|
SET DEBUG_SYNC=RESET;
|
||||||
|
@ -455,5 +455,8 @@ connection con2;
|
|||||||
reap;
|
reap;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
connection default;
|
connection default;
|
||||||
|
ALTER TABLE t1 DROP c;
|
||||||
|
INSERT INTO t1 VALUES (2),(3),(4);
|
||||||
|
CHECK TABLE t1;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET DEBUG_SYNC=RESET;
|
SET DEBUG_SYNC=RESET;
|
||||||
|
@ -36,12 +36,20 @@ static char *opt_plugin_dir; /* To be dynamically linked. */
|
|||||||
static const char *tool_name= "auth_pam_tool_dir/auth_pam_tool";
|
static const char *tool_name= "auth_pam_tool_dir/auth_pam_tool";
|
||||||
static const int tool_name_len= 31;
|
static const int tool_name_len= 31;
|
||||||
|
|
||||||
|
/*
|
||||||
|
sleep_limit is now 5 meaning up to 1 second sleep.
|
||||||
|
each step means 10 times longer sleep, so 6 would mean 10 seconds.
|
||||||
|
*/
|
||||||
|
static const unsigned int sleep_limit= 5;
|
||||||
|
|
||||||
static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
|
static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
|
||||||
{
|
{
|
||||||
int p_to_c[2], c_to_p[2]; /* Parent-to-child and child-to-parent pipes. */
|
int p_to_c[2], c_to_p[2]; /* Parent-to-child and child-to-parent pipes. */
|
||||||
pid_t proc_id;
|
pid_t proc_id;
|
||||||
int result= CR_ERROR, pkt_len= 0;
|
int result= CR_ERROR, pkt_len= 0;
|
||||||
unsigned char field, *pkt;
|
unsigned char field, *pkt;
|
||||||
|
unsigned int n_sleep= 0;
|
||||||
|
useconds_t sleep_time= 100;
|
||||||
|
|
||||||
PAM_DEBUG((stderr, "PAM: opening pipes.\n"));
|
PAM_DEBUG((stderr, "PAM: opening pipes.\n"));
|
||||||
if (pipe(p_to_c) < 0 || pipe(c_to_p) < 0)
|
if (pipe(p_to_c) < 0 || pipe(c_to_p) < 0)
|
||||||
@ -190,7 +198,24 @@ static int pam_auth(MYSQL_PLUGIN_VIO *vio, MYSQL_SERVER_AUTH_INFO *info)
|
|||||||
error_ret:
|
error_ret:
|
||||||
close(p_to_c[1]);
|
close(p_to_c[1]);
|
||||||
close(c_to_p[0]);
|
close(c_to_p[0]);
|
||||||
waitpid(proc_id, NULL, WNOHANG);
|
while (waitpid(proc_id, NULL, WNOHANG) != (int) proc_id)
|
||||||
|
{
|
||||||
|
if (n_sleep++ == sleep_limit)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
The auth_pam_tool application doesn't terminate.
|
||||||
|
Means something wrong happened there like pam_xxx.so hanged.
|
||||||
|
*/
|
||||||
|
kill(proc_id, SIGKILL);
|
||||||
|
sleep_time= 1000000; /* 1 second wait should be enough. */
|
||||||
|
PAM_DEBUG((stderr, "PAM: auth_pam_tool doesn't terminate,"
|
||||||
|
" have to kill it.\n"));
|
||||||
|
}
|
||||||
|
else if (n_sleep > sleep_limit)
|
||||||
|
break;
|
||||||
|
usleep(sleep_time);
|
||||||
|
sleep_time*= 10;
|
||||||
|
}
|
||||||
|
|
||||||
PAM_DEBUG((stderr, "PAM: auth result %d.\n", result));
|
PAM_DEBUG((stderr, "PAM: auth result %d.\n", result));
|
||||||
return result;
|
return result;
|
||||||
|
@ -37,9 +37,15 @@ CREATE TABLE IF NOT EXISTS global_priv (Host char(60) binary DEFAULT '', User ch
|
|||||||
|
|
||||||
set @had_sys_user= 0 <> (select count(*) from mysql.global_priv where Host="localhost" and User="mariadb.sys");
|
set @had_sys_user= 0 <> (select count(*) from mysql.global_priv where Host="localhost" and User="mariadb.sys");
|
||||||
|
|
||||||
|
set @exists_user_view= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user');
|
||||||
|
|
||||||
|
set @exists_user_view_by_root= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost');
|
||||||
|
|
||||||
|
set @need_sys_user_creation= (NOT @had_sys_user) AND (( NOT @exists_user_view) OR @exists_user_view_by_root);
|
||||||
|
|
||||||
CREATE TEMPORARY TABLE tmp_user_sys LIKE global_priv;
|
CREATE TEMPORARY TABLE tmp_user_sys LIKE global_priv;
|
||||||
INSERT INTO tmp_user_sys (Host,User,Priv) VALUES ('localhost','mariadb.sys','{"access":0,"plugin":"mysql_native_password","authentication_string":"","account_locked":true,"password_last_changed":0}');
|
INSERT INTO tmp_user_sys (Host,User,Priv) VALUES ('localhost','mariadb.sys','{"access":0,"plugin":"mysql_native_password","authentication_string":"","account_locked":true,"password_last_changed":0}');
|
||||||
INSERT INTO global_priv SELECT * FROM tmp_user_sys WHERE NOT @had_sys_user;
|
INSERT INTO global_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation;
|
||||||
DROP TABLE tmp_user_sys;
|
DROP TABLE tmp_user_sys;
|
||||||
|
|
||||||
|
|
||||||
@ -111,7 +117,7 @@ CREATE TABLE IF NOT EXISTS tables_priv ( Host char(60) binary DEFAULT '' NOT NUL
|
|||||||
|
|
||||||
CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv;
|
CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv;
|
||||||
INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Update,Delete');
|
INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Update,Delete');
|
||||||
INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE NOT @had_sys_user;
|
INSERT INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation;
|
||||||
DROP TABLE tmp_user_sys;
|
DROP TABLE tmp_user_sys;
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS columns_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name) ) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Column privileges';
|
CREATE TABLE IF NOT EXISTS columns_priv ( Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(80) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Column_priv set('Select','Insert','Update','References') COLLATE utf8_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name) ) engine=Aria transactional=1 CHARACTER SET utf8 COLLATE utf8_bin comment='Column privileges';
|
||||||
|
@ -5074,6 +5074,11 @@ btr_cur_pessimistic_update(
|
|||||||
btr_page_reorganize(page_cursor, index, mtr);
|
btr_page_reorganize(page_cursor, index, mtr);
|
||||||
rec = page_cursor->rec;
|
rec = page_cursor->rec;
|
||||||
rec_offs_make_valid(rec, index, true, *offsets);
|
rec_offs_make_valid(rec, index, true, *offsets);
|
||||||
|
if (page_cursor->block->page.id().page_no()
|
||||||
|
== index->page) {
|
||||||
|
btr_set_instant(page_cursor->block, *index,
|
||||||
|
mtr);
|
||||||
|
}
|
||||||
} else if (!dict_table_is_locking_disabled(index->table)) {
|
} else if (!dict_table_is_locking_disabled(index->table)) {
|
||||||
lock_rec_restore_from_page_infimum(
|
lock_rec_restore_from_page_infimum(
|
||||||
btr_cur_get_block(cursor), rec, block);
|
btr_cur_get_block(cursor), rec, block);
|
||||||
|
@ -563,7 +563,15 @@ check_result_t mi_check_index_tuple(MI_INFO *info, uint keynr, uchar *record)
|
|||||||
if (need_unpack && mi_unpack_index_tuple(info, keynr, record))
|
if (need_unpack && mi_unpack_index_tuple(info, keynr, record))
|
||||||
res= CHECK_ERROR;
|
res= CHECK_ERROR;
|
||||||
else
|
else
|
||||||
res= info->rowid_filter_func(info->rowid_filter_func_arg);
|
{
|
||||||
|
if ((res= info->rowid_filter_func(info->rowid_filter_func_arg)) ==
|
||||||
|
CHECK_OUT_OF_RANGE)
|
||||||
|
{
|
||||||
|
/* We got beyond the end of scanned range */
|
||||||
|
info->lastpos= HA_OFFSET_ERROR; /* No active record */
|
||||||
|
my_errno= HA_ERR_END_OF_FILE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user