MDEV-16288 ALTER TABLE…ALGORITHM=DEFAULT does not override alter_algorithm

- ALTER_ALGORITHM should be substituted when there is no mention of
algorithm in alter statement.
- Introduced algorithm(thd) in Alter_info. It returns the
user requested algorithm. If user doesn't specify algorithm explicitly then
it returns alter_algorithm variable.
- changed algorithm() to get_algorithm(thd) to return algorithm name for
displaying the error.
- set_requested_algorithm(algo_value) to avoid direct assignment on
requested_algorithm variable.
- Avoid direct access of requested_algorithm to encapsulate
requested_algorithm variable
parent f98017bb
--- alter_algorithm.result --- alter_algorithm.result 2020-04-30 21:39:48.923115511 +0530
+++ alter_algorithm.reject +++ alter_algorithm.reject 2020-04-30 21:45:04.131642093 +0530
@@ -7,40 +7,40 @@ @@ -7,43 +7,43 @@
INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1); INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1);
SELECT @@alter_algorithm; SELECT @@alter_algorithm;
@@alter_algorithm @@alter_algorithm
...@@ -54,11 +54,16 @@ ...@@ -54,11 +54,16 @@
-affected rows: 1 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0 -info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0 +affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t1 FORCE, ALGORITHM=DEFAULT;
-affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0 +info: Records: 0 Duplicates: 0 Warnings: 0
DROP TABLE t1; DROP TABLE t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL, CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL,
@@ -53,22 +53,22 @@ @@ -56,22 +56,22 @@
FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB; FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB;
INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4); INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4);
ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1; ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1;
...@@ -91,7 +96,7 @@ ...@@ -91,7 +96,7 @@
DROP TABLE t2, t1; DROP TABLE t2, t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT NOT NULL, CREATE TABLE t1(f1 INT NOT NULL,
@@ -81,27 +81,27 @@ @@ -84,28 +84,27 @@
INSERT INTO t1(f1, f2) VALUES(1, 1); INSERT INTO t1(f1, f2) VALUES(1, 1);
# Add column at the end of the table # Add column at the end of the table
ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL'; ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL';
...@@ -119,7 +124,9 @@ ...@@ -119,7 +124,9 @@
+info: Records: 0 Duplicates: 0 Warnings: 0 +info: Records: 0 Duplicates: 0 Warnings: 0
# Rename table # Rename table
ALTER TABLE t1 RENAME t3; ALTER TABLE t1 RENAME t3;
affected rows: 0 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
# Drop Virtual Column # Drop Virtual Column
ALTER TABLE t3 DROP COLUMN vcol; ALTER TABLE t3 DROP COLUMN vcol;
-affected rows: 1 -affected rows: 1
...@@ -129,7 +136,7 @@ ...@@ -129,7 +136,7 @@
# Column length varies # Column length varies
ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20); ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20);
affected rows: 0 affected rows: 0
@@ -109,12 +109,12 @@ @@ -113,12 +112,12 @@
SET foreign_key_checks = 0; SET foreign_key_checks = 0;
affected rows: 0 affected rows: 0
ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1); ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1);
......
--- alter_algorithm.result --- alter_algorithm.result 2020-04-30 21:39:48.923115511 +0530
+++ alter_algorithm.reject +++ alter_algorithm.reject 2020-04-30 21:47:08.245465018 +0530
@@ -7,40 +7,32 @@ @@ -7,43 +7,35 @@
INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1); INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1);
SELECT @@alter_algorithm; SELECT @@alter_algorithm;
@@alter_algorithm @@alter_algorithm
...@@ -47,10 +47,15 @@ ...@@ -47,10 +47,15 @@
-affected rows: 1 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0 -info: Records: 1 Duplicates: 0 Warnings: 0
+Got one of the listed errors +Got one of the listed errors
ALTER TABLE t1 FORCE, ALGORITHM=DEFAULT;
-affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
DROP TABLE t1; DROP TABLE t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL, CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL,
@@ -53,22 +45,17 @@ @@ -56,22 +48,17 @@
FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB; FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB;
INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4); INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4);
ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1; ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1;
...@@ -78,7 +83,7 @@ ...@@ -78,7 +83,7 @@
DROP TABLE t2, t1; DROP TABLE t2, t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT NOT NULL, CREATE TABLE t1(f1 INT NOT NULL,
@@ -81,27 +68,27 @@ @@ -84,28 +71,27 @@
INSERT INTO t1(f1, f2) VALUES(1, 1); INSERT INTO t1(f1, f2) VALUES(1, 1);
# Add column at the end of the table # Add column at the end of the table
ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL'; ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL';
...@@ -106,7 +111,9 @@ ...@@ -106,7 +111,9 @@
+info: Records: 0 Duplicates: 0 Warnings: 0 +info: Records: 0 Duplicates: 0 Warnings: 0
# Rename table # Rename table
ALTER TABLE t1 RENAME t3; ALTER TABLE t1 RENAME t3;
affected rows: 0 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
# Drop Virtual Column # Drop Virtual Column
ALTER TABLE t3 DROP COLUMN vcol; ALTER TABLE t3 DROP COLUMN vcol;
-affected rows: 1 -affected rows: 1
...@@ -116,7 +123,7 @@ ...@@ -116,7 +123,7 @@
# Column length varies # Column length varies
ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20); ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20);
affected rows: 0 affected rows: 0
@@ -109,12 +96,12 @@ @@ -113,12 +99,12 @@
SET foreign_key_checks = 0; SET foreign_key_checks = 0;
affected rows: 0 affected rows: 0
ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1); ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1);
......
--- alter_algorithm.result --- alter_algorithm.result 2020-04-30 21:39:48.923115511 +0530
+++ alter_algorithm.reject +++ alter_algorithm.reject 2020-04-30 21:52:10.785967739 +0530
@@ -7,40 +7,32 @@ @@ -7,43 +7,35 @@
INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1); INSERT INTO t1(f1, f2, f3) VALUES(1, 1, 1);
SELECT @@alter_algorithm; SELECT @@alter_algorithm;
@@alter_algorithm @@alter_algorithm
...@@ -47,10 +47,15 @@ ...@@ -47,10 +47,15 @@
-affected rows: 1 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0 -info: Records: 1 Duplicates: 0 Warnings: 0
+Got one of the listed errors +Got one of the listed errors
ALTER TABLE t1 FORCE, ALGORITHM=DEFAULT;
-affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
+info: Records: 0 Duplicates: 0 Warnings: 0
DROP TABLE t1; DROP TABLE t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL, CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL,
@@ -53,22 +45,22 @@ @@ -56,22 +48,22 @@
FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB; FOREIGN KEY fidx(f1) REFERENCES t1(f1))ENGINE=INNODB;
INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4); INSERT INTO t1(f1, f2, f4, f5) VALUES(1, 2, 3, 4);
ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1; ALTER TABLE t1 ADD INDEX idx1(f4), page_compressed=1;
...@@ -83,7 +88,7 @@ ...@@ -83,7 +88,7 @@
DROP TABLE t2, t1; DROP TABLE t2, t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT NOT NULL, CREATE TABLE t1(f1 INT NOT NULL,
@@ -81,27 +73,27 @@ @@ -84,28 +76,27 @@
INSERT INTO t1(f1, f2) VALUES(1, 1); INSERT INTO t1(f1, f2) VALUES(1, 1);
# Add column at the end of the table # Add column at the end of the table
ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL'; ALTER TABLE t1 ADD COLUMN f4 char(100) default 'BIG WALL';
...@@ -111,7 +116,9 @@ ...@@ -111,7 +116,9 @@
+info: Records: 0 Duplicates: 0 Warnings: 0 +info: Records: 0 Duplicates: 0 Warnings: 0
# Rename table # Rename table
ALTER TABLE t1 RENAME t3; ALTER TABLE t1 RENAME t3;
affected rows: 0 -affected rows: 1
-info: Records: 1 Duplicates: 0 Warnings: 0
+affected rows: 0
# Drop Virtual Column # Drop Virtual Column
ALTER TABLE t3 DROP COLUMN vcol; ALTER TABLE t3 DROP COLUMN vcol;
-affected rows: 1 -affected rows: 1
...@@ -121,7 +128,7 @@ ...@@ -121,7 +128,7 @@
# Column length varies # Column length varies
ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20); ALTER TABLE t2 CHANGE f3 f3 VARCHAR(20);
affected rows: 0 affected rows: 0
@@ -109,12 +101,12 @@ @@ -113,12 +104,12 @@
SET foreign_key_checks = 0; SET foreign_key_checks = 0;
affected rows: 0 affected rows: 0
ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1); ALTER TABLE t3 ADD FOREIGN KEY fidx(f2) REFERENCES t2(f1);
......
...@@ -41,6 +41,9 @@ info: Records: 1 Duplicates: 0 Warnings: 0 ...@@ -41,6 +41,9 @@ info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 ENGINE=INNODB; ALTER TABLE t1 ENGINE=INNODB;
affected rows: 1 affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0 info: Records: 1 Duplicates: 0 Warnings: 0
ALTER TABLE t1 FORCE, ALGORITHM=DEFAULT;
affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
DROP TABLE t1; DROP TABLE t1;
affected rows: 0 affected rows: 0
CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL, CREATE TABLE t1(f1 INT PRIMARY KEY, f2 INT NOT NULL,
...@@ -97,7 +100,8 @@ affected rows: 1 ...@@ -97,7 +100,8 @@ affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0 info: Records: 1 Duplicates: 0 Warnings: 0
# Rename table # Rename table
ALTER TABLE t1 RENAME t3; ALTER TABLE t1 RENAME t3;
affected rows: 0 affected rows: 1
info: Records: 1 Duplicates: 0 Warnings: 0
# Drop Virtual Column # Drop Virtual Column
ALTER TABLE t3 DROP COLUMN vcol; ALTER TABLE t3 DROP COLUMN vcol;
affected rows: 1 affected rows: 1
......
...@@ -54,3 +54,23 @@ DROP PROCEDURE p1; ...@@ -54,3 +54,23 @@ DROP PROCEDURE p1;
affected rows: 0 affected rows: 0
DROP PROCEDURE p2; DROP PROCEDURE p2;
affected rows: 0 affected rows: 0
CREATE TABLE t1(id INT PRIMARY KEY,
col1 INT UNSIGNED NOT NULL UNIQUE)ENGINE=InnoDB;
affected rows: 0
INSERT INTO t1 VALUES(1,1),(2,2),(3,3);
affected rows: 3
info: Records: 3 Duplicates: 0 Warnings: 0
SET ALTER_ALGORITHM=INSTANT;
affected rows: 0
ALTER TABLE t1 DROP COLUMN col1;
ERROR 0A000: ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=INPLACE
ALTER TABLE t1 DROP COLUMN col1, ALGORITHM=NOCOPY;
ERROR 0A000: ALGORITHM=NOCOPY is not supported for this operation. Try ALGORITHM=INPLACE
ALTER TABLE t1 DROP COLUMN col1, ALGORITHM=DEFAULT;
affected rows: 0
info: Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE t1 DROP PRIMARY KEY, ALGORITHM=DEFAULT;
affected rows: 3
info: Records: 3 Duplicates: 0 Warnings: 0
DROP TABLE t1;
affected rows: 0
...@@ -55,6 +55,10 @@ ALTER TABLE t1 ROW_FORMAT=COMPRESSED; ...@@ -55,6 +55,10 @@ ALTER TABLE t1 ROW_FORMAT=COMPRESSED;
--error $error_code --error $error_code
ALTER TABLE t1 ENGINE=INNODB; ALTER TABLE t1 ENGINE=INNODB;
# Irrespective of alter_algorithm value, the following command
# should succeed because of explicitly mentioning ALGORTHM=DEFAULT
ALTER TABLE t1 FORCE, ALGORITHM=DEFAULT;
DROP TABLE t1; DROP TABLE t1;
--disable_info --disable_info
......
...@@ -44,4 +44,16 @@ call p1(); ...@@ -44,4 +44,16 @@ call p1();
DROP TABLE t1; DROP TABLE t1;
DROP PROCEDURE p1; DROP PROCEDURE p1;
DROP PROCEDURE p2; DROP PROCEDURE p2;
CREATE TABLE t1(id INT PRIMARY KEY,
col1 INT UNSIGNED NOT NULL UNIQUE)ENGINE=InnoDB;
INSERT INTO t1 VALUES(1,1),(2,2),(3,3);
SET ALTER_ALGORITHM=INSTANT;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
ALTER TABLE t1 DROP COLUMN col1;
--error ER_ALTER_OPERATION_NOT_SUPPORTED
ALTER TABLE t1 DROP COLUMN col1, ALGORITHM=NOCOPY;
ALTER TABLE t1 DROP COLUMN col1, ALGORITHM=DEFAULT;
ALTER TABLE t1 DROP PRIMARY KEY, ALGORITHM=DEFAULT;
DROP TABLE t1;
--disable_info --disable_info
...@@ -69,6 +69,10 @@ bool Alter_info::set_requested_algorithm(const LEX_CSTRING *str) ...@@ -69,6 +69,10 @@ bool Alter_info::set_requested_algorithm(const LEX_CSTRING *str)
return false; return false;
} }
void Alter_info::set_requested_algorithm(enum_alter_table_algorithm algo_val)
{
requested_algorithm= algo_val;
}
bool Alter_info::set_requested_lock(const LEX_CSTRING *str) bool Alter_info::set_requested_lock(const LEX_CSTRING *str)
{ {
...@@ -86,13 +90,16 @@ bool Alter_info::set_requested_lock(const LEX_CSTRING *str) ...@@ -86,13 +90,16 @@ bool Alter_info::set_requested_lock(const LEX_CSTRING *str)
return false; return false;
} }
const char* Alter_info::algorithm() const const char* Alter_info::algorithm_clause(THD *thd) const
{ {
switch (requested_algorithm) { switch (algorithm(thd)) {
case ALTER_TABLE_ALGORITHM_INPLACE: case ALTER_TABLE_ALGORITHM_INPLACE:
return "ALGORITHM=INPLACE"; return "ALGORITHM=INPLACE";
case ALTER_TABLE_ALGORITHM_COPY: case ALTER_TABLE_ALGORITHM_COPY:
return "ALGORITHM=COPY"; return "ALGORITHM=COPY";
case ALTER_TABLE_ALGORITHM_NONE:
DBUG_ASSERT(0);
/* Fall through */
case ALTER_TABLE_ALGORITHM_DEFAULT: case ALTER_TABLE_ALGORITHM_DEFAULT:
return "ALGORITHM=DEFAULT"; return "ALGORITHM=DEFAULT";
case ALTER_TABLE_ALGORITHM_NOCOPY: case ALTER_TABLE_ALGORITHM_NOCOPY:
...@@ -123,9 +130,6 @@ const char* Alter_info::lock() const ...@@ -123,9 +130,6 @@ const char* Alter_info::lock() const
bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result,
const Alter_inplace_info *ha_alter_info) const Alter_inplace_info *ha_alter_info)
{ {
if (requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT)
requested_algorithm = (Alter_info::enum_alter_table_algorithm) thd->variables.alter_algorithm;
switch (result) { switch (result) {
case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: case HA_ALTER_INPLACE_EXCLUSIVE_LOCK:
case HA_ALTER_INPLACE_SHARED_LOCK: case HA_ALTER_INPLACE_SHARED_LOCK:
...@@ -134,16 +138,16 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, ...@@ -134,16 +138,16 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result,
return false; return false;
case HA_ALTER_INPLACE_COPY_NO_LOCK: case HA_ALTER_INPLACE_COPY_NO_LOCK:
case HA_ALTER_INPLACE_COPY_LOCK: case HA_ALTER_INPLACE_COPY_LOCK:
if (requested_algorithm >= Alter_info::ALTER_TABLE_ALGORITHM_NOCOPY) if (algorithm(thd) >= Alter_info::ALTER_TABLE_ALGORITHM_NOCOPY)
{ {
ha_alter_info->report_unsupported_error(algorithm(), ha_alter_info->report_unsupported_error(algorithm_clause(thd),
"ALGORITHM=INPLACE"); "ALGORITHM=INPLACE");
return true; return true;
} }
return false; return false;
case HA_ALTER_INPLACE_NOCOPY_NO_LOCK: case HA_ALTER_INPLACE_NOCOPY_NO_LOCK:
case HA_ALTER_INPLACE_NOCOPY_LOCK: case HA_ALTER_INPLACE_NOCOPY_LOCK:
if (requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_INSTANT) if (algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_INSTANT)
{ {
ha_alter_info->report_unsupported_error("ALGORITHM=INSTANT", ha_alter_info->report_unsupported_error("ALGORITHM=INSTANT",
"ALGORITHM=NOCOPY"); "ALGORITHM=NOCOPY");
...@@ -151,9 +155,9 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result, ...@@ -151,9 +155,9 @@ bool Alter_info::supports_algorithm(THD *thd, enum_alter_inplace_result result,
} }
return false; return false;
case HA_ALTER_INPLACE_NOT_SUPPORTED: case HA_ALTER_INPLACE_NOT_SUPPORTED:
if (requested_algorithm >= Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) if (algorithm(thd) >= Alter_info::ALTER_TABLE_ALGORITHM_INPLACE)
{ {
ha_alter_info->report_unsupported_error(algorithm(), ha_alter_info->report_unsupported_error(algorithm_clause(thd),
"ALGORITHM=COPY"); "ALGORITHM=COPY");
return true; return true;
} }
...@@ -174,7 +178,7 @@ bool Alter_info::supports_lock(THD *thd, enum_alter_inplace_result result, ...@@ -174,7 +178,7 @@ bool Alter_info::supports_lock(THD *thd, enum_alter_inplace_result result,
case HA_ALTER_INPLACE_EXCLUSIVE_LOCK: case HA_ALTER_INPLACE_EXCLUSIVE_LOCK:
// If SHARED lock and no particular algorithm was requested, use COPY. // If SHARED lock and no particular algorithm was requested, use COPY.
if (requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && if (requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED &&
requested_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && algorithm(thd) == Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT &&
thd->variables.alter_algorithm == thd->variables.alter_algorithm ==
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT)
return false; return false;
...@@ -237,6 +241,14 @@ bool Alter_info::vers_prohibited(THD *thd) const ...@@ -237,6 +241,14 @@ bool Alter_info::vers_prohibited(THD *thd) const
return false; return false;
} }
Alter_info::enum_alter_table_algorithm
Alter_info::algorithm(const THD *thd) const
{
if (requested_algorithm == ALTER_TABLE_ALGORITHM_NONE)
return (Alter_info::enum_alter_table_algorithm) thd->variables.alter_algorithm;
return requested_algorithm;
}
Alter_table_ctx::Alter_table_ctx() Alter_table_ctx::Alter_table_ctx()
: datetime_field(NULL), error_if_not_empty(false), : datetime_field(NULL), error_if_not_empty(false),
......
...@@ -57,7 +57,10 @@ class Alter_info ...@@ -57,7 +57,10 @@ class Alter_info
ALTER_TABLE_ALGORITHM_NOCOPY, ALTER_TABLE_ALGORITHM_NOCOPY,
// Instant should allow any operation that changes metadata only. // Instant should allow any operation that changes metadata only.
ALTER_TABLE_ALGORITHM_INSTANT ALTER_TABLE_ALGORITHM_INSTANT,
// When there is no specification of algorithm during alter table.
ALTER_TABLE_ALGORITHM_NONE
}; };
...@@ -104,8 +107,11 @@ class Alter_info ...@@ -104,8 +107,11 @@ class Alter_info
List<const char> partition_names; List<const char> partition_names;
// Number of partitions. // Number of partitions.
uint num_parts; uint num_parts;
private:
// Type of ALTER TABLE algorithm. // Type of ALTER TABLE algorithm.
enum_alter_table_algorithm requested_algorithm; enum_alter_table_algorithm requested_algorithm;
public:
// Type of ALTER TABLE lock. // Type of ALTER TABLE lock.
enum_alter_table_lock requested_lock; enum_alter_table_lock requested_lock;
...@@ -114,7 +120,7 @@ class Alter_info ...@@ -114,7 +120,7 @@ class Alter_info
flags(0), partition_flags(0), flags(0), partition_flags(0),
keys_onoff(LEAVE_AS_IS), keys_onoff(LEAVE_AS_IS),
num_parts(0), num_parts(0),
requested_algorithm(ALTER_TABLE_ALGORITHM_DEFAULT), requested_algorithm(ALTER_TABLE_ALGORITHM_NONE),
requested_lock(ALTER_TABLE_LOCK_DEFAULT) requested_lock(ALTER_TABLE_LOCK_DEFAULT)
{} {}
...@@ -130,7 +136,7 @@ class Alter_info ...@@ -130,7 +136,7 @@ class Alter_info
keys_onoff= LEAVE_AS_IS; keys_onoff= LEAVE_AS_IS;
num_parts= 0; num_parts= 0;
partition_names.empty(); partition_names.empty();
requested_algorithm= ALTER_TABLE_ALGORITHM_DEFAULT; requested_algorithm= ALTER_TABLE_ALGORITHM_NONE;
requested_lock= ALTER_TABLE_LOCK_DEFAULT; requested_lock= ALTER_TABLE_LOCK_DEFAULT;
} }
...@@ -177,10 +183,16 @@ class Alter_info ...@@ -177,10 +183,16 @@ class Alter_info
bool set_requested_lock(const LEX_CSTRING *str); bool set_requested_lock(const LEX_CSTRING *str);
/**
Set the requested algorithm to the given algorithm value
@param algo_value algorithm to be set
*/
void set_requested_algorithm(enum_alter_table_algorithm algo_value);
/** /**
Returns the algorithm value in the format "algorithm=value" Returns the algorithm value in the format "algorithm=value"
*/ */
const char* algorithm() const; const char* algorithm_clause(THD *thd) const;
/** /**
Returns the lock value in the format "lock=value" Returns the lock value in the format "lock=value"
...@@ -216,6 +228,12 @@ class Alter_info ...@@ -216,6 +228,12 @@ class Alter_info
bool supports_lock(THD *thd, enum_alter_inplace_result result, bool supports_lock(THD *thd, enum_alter_inplace_result result,
const Alter_inplace_info *ha_alter_info); const Alter_inplace_info *ha_alter_info);
/**
Return user requested algorithm. If user does not specify
algorithm then return alter_algorithm variable value.
*/
enum_alter_table_algorithm algorithm(const THD *thd) const;
private: private:
Alter_info &operator=(const Alter_info &rhs); // not implemented Alter_info &operator=(const Alter_info &rhs); // not implemented
Alter_info(const Alter_info &rhs); // not implemented Alter_info(const Alter_info &rhs); // not implemented
......
...@@ -6008,7 +6008,7 @@ the generated partition syntax in a correct manner. ...@@ -6008,7 +6008,7 @@ the generated partition syntax in a correct manner.
*/ */
if (alter_info->partition_flags != ALTER_PARTITION_INFO || if (alter_info->partition_flags != ALTER_PARTITION_INFO ||
!table->part_info || !table->part_info ||
alter_info->requested_algorithm != alter_info->algorithm(thd) !=
Alter_info::ALTER_TABLE_ALGORITHM_INPLACE || Alter_info::ALTER_TABLE_ALGORITHM_INPLACE ||
!table->part_info->has_same_partitioning(part_info)) !table->part_info->has_same_partitioning(part_info))
{ {
......
...@@ -9558,7 +9558,7 @@ do_continue:; ...@@ -9558,7 +9558,7 @@ do_continue:;
*/ */
if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) && if (!(alter_info->flags & ~(ALTER_RENAME | ALTER_KEYS_ONOFF)) &&
alter_info->partition_flags == 0 && alter_info->partition_flags == 0 &&
alter_info->requested_algorithm != alter_info->algorithm(thd) !=
Alter_info::ALTER_TABLE_ALGORITHM_COPY) // No need to touch frm. Alter_info::ALTER_TABLE_ALGORITHM_COPY) // No need to touch frm.
{ {
bool res; bool res;
...@@ -9636,7 +9636,7 @@ do_continue:; ...@@ -9636,7 +9636,7 @@ do_continue:;
"LOCK=DEFAULT"); "LOCK=DEFAULT");
DBUG_RETURN(true); DBUG_RETURN(true);
} }
else if (alter_info->requested_algorithm != else if (alter_info->algorithm(thd) !=
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT)
{ {
my_error(ER_ALTER_OPERATION_NOT_SUPPORTED_REASON, MYF(0), my_error(ER_ALTER_OPERATION_NOT_SUPPORTED_REASON, MYF(0),
...@@ -9676,20 +9676,21 @@ do_continue:; ...@@ -9676,20 +9676,21 @@ do_continue:;
using in-place API. using in-place API.
*/ */
if ((thd->variables.alter_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_COPY && if ((thd->variables.alter_algorithm == Alter_info::ALTER_TABLE_ALGORITHM_COPY &&
alter_info->requested_algorithm != alter_info->algorithm(thd) !=
Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) Alter_info::ALTER_TABLE_ALGORITHM_INPLACE)
|| is_inplace_alter_impossible(table, create_info, alter_info) || is_inplace_alter_impossible(table, create_info, alter_info)
|| IF_PARTITIONING((partition_changed && || IF_PARTITIONING((partition_changed &&
!(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)), 0)) !(table->s->db_type()->partition_flags() & HA_USE_AUTO_PARTITION)), 0))
{ {
if (alter_info->requested_algorithm == if (alter_info->algorithm(thd) ==
Alter_info::ALTER_TABLE_ALGORITHM_INPLACE) Alter_info::ALTER_TABLE_ALGORITHM_INPLACE)
{ {
my_error(ER_ALTER_OPERATION_NOT_SUPPORTED, MYF(0), my_error(ER_ALTER_OPERATION_NOT_SUPPORTED, MYF(0),
"ALGORITHM=INPLACE", "ALGORITHM=COPY"); "ALGORITHM=INPLACE", "ALGORITHM=COPY");
DBUG_RETURN(true); DBUG_RETURN(true);
} }
alter_info->requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; alter_info->set_requested_algorithm(
Alter_info::ALTER_TABLE_ALGORITHM_COPY);
} }
/* /*
...@@ -9809,7 +9810,7 @@ do_continue:; ...@@ -9809,7 +9810,7 @@ do_continue:;
/* Remember that we have not created table in storage engine yet. */ /* Remember that we have not created table in storage engine yet. */
bool no_ha_table= true; bool no_ha_table= true;
if (alter_info->requested_algorithm != Alter_info::ALTER_TABLE_ALGORITHM_COPY) if (alter_info->algorithm(thd) != Alter_info::ALTER_TABLE_ALGORITHM_COPY)
{ {
Alter_inplace_info ha_alter_info(create_info, alter_info, Alter_inplace_info ha_alter_info(create_info, alter_info,
key_info, key_count, key_info, key_count,
...@@ -9900,7 +9901,7 @@ do_continue:; ...@@ -9900,7 +9901,7 @@ do_continue:;
// If SHARED lock and no particular algorithm was requested, use COPY. // If SHARED lock and no particular algorithm was requested, use COPY.
if (inplace_supported == HA_ALTER_INPLACE_EXCLUSIVE_LOCK && if (inplace_supported == HA_ALTER_INPLACE_EXCLUSIVE_LOCK &&
alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED && alter_info->requested_lock == Alter_info::ALTER_TABLE_LOCK_SHARED &&
alter_info->requested_algorithm == alter_info->algorithm(thd) ==
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT && Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT &&
thd->variables.alter_algorithm == thd->variables.alter_algorithm ==
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT) Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT)
...@@ -10743,7 +10744,8 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy) ...@@ -10743,7 +10744,8 @@ bool mysql_recreate_table(THD *thd, TABLE_LIST *table_list, bool table_copy)
alter_info.flags= (ALTER_CHANGE_COLUMN | ALTER_RECREATE); alter_info.flags= (ALTER_CHANGE_COLUMN | ALTER_RECREATE);
if (table_copy) if (table_copy)
alter_info.requested_algorithm= Alter_info::ALTER_TABLE_ALGORITHM_COPY; alter_info.set_requested_algorithm(
Alter_info::ALTER_TABLE_ALGORITHM_COPY);
bool res= mysql_alter_table(thd, &null_clex_str, &null_clex_str, &create_info, bool res= mysql_alter_table(thd, &null_clex_str, &null_clex_str, &create_info,
table_list, &alter_info, 0, table_list, &alter_info, 0,
......
...@@ -8531,8 +8531,8 @@ opt_index_lock_algorithm: ...@@ -8531,8 +8531,8 @@ opt_index_lock_algorithm:
alter_algorithm_option: alter_algorithm_option:
ALGORITHM_SYM opt_equal DEFAULT ALGORITHM_SYM opt_equal DEFAULT
{ {
Lex->alter_info.requested_algorithm= Lex->alter_info.set_requested_algorithm(
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT);
} }
| ALGORITHM_SYM opt_equal ident | ALGORITHM_SYM opt_equal ident
{ {
......
...@@ -8468,8 +8468,8 @@ opt_index_lock_algorithm: ...@@ -8468,8 +8468,8 @@ opt_index_lock_algorithm:
alter_algorithm_option: alter_algorithm_option:
ALGORITHM_SYM opt_equal DEFAULT ALGORITHM_SYM opt_equal DEFAULT
{ {
Lex->alter_info.requested_algorithm= Lex->alter_info.set_requested_algorithm(
Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT; Alter_info::ALTER_TABLE_ALGORITHM_DEFAULT);
} }
| ALGORITHM_SYM opt_equal ident | ALGORITHM_SYM opt_equal ident
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment