Details
-
Bug
-
Status: Closed (View Workflow)
-
Major
-
Resolution: Fixed
-
10.3(EOL), 10.4(EOL), 10.5
-
None
Description
Oracle database has the following syntax for the BLOB data type:
{ BLOB | BINARY LARGE OBJECT } [ ( length [{K |M |G }] ) ] |
The default BLOB length is two gigabytes (2,147,483,647).
To satisfy the default length of 2Gb, when running with sql_mode=ORACLE, MariaDB translates:
CREATE TABLE t1 (a BLOB); |
to
CREATE TABLE t1 (a LONGBLOB); |
But it also translates:
CREATE TABLE t1 (a BLOB(65535)); |
to
CREATE TABLE t1 (a LONGBLOB); |
The latter looks wrong. When explicit length is specified, it should try to preserve the BLOB data type, corresponding to MYSQL_TYPE_BLOB (which uses 2 bytes per length).
This script demonstrates the problem:
SET sql_mode=ORACLE; |
CREATE OR REPLACE TABLE t1 (a BLOB(65535)); |
SHOW CREATE TABLE t1; |
+-------+---------------------------------------------------+
|
| Table | Create Table |
|
+-------+---------------------------------------------------+
|
| t1 | CREATE TABLE "t1" (
|
"a" longblob DEFAULT NULL
|
) |
|
+-------+---------------------------------------------------+
|
The expected output in the last script (with sql_mode=ORACLE) should be:
+-------+---------------------------------------------------+
|
| Table | Create Table |
|
+-------+---------------------------------------------------+
|
| t1 | CREATE TABLE "t1" (
|
"a" blob(65535) DEFAULT NULL
|
) |
|
+-------+---------------------------------------------------+
|
Attachments
Issue Links
- blocks
-
MDEV-19632 Replication aborts with ER_SLAVE_CONVERSION_FAILED upon CREATE ... SELECT in ORACLE mode
- Closed