[MDEV-6179] dynamic columns functions/cast()/convert() doesn't play nice with CREATE/ALTER TABLE Created: 2014-04-26  Updated: 2014-11-19  Resolved: 2014-11-19

Status: Closed
Project: MariaDB Server
Component/s: Dynamic Columns, Virtual Columns
Affects Version/s: 5.2.14, 5.3.12, 5.5.40, 10.0.10, 10.1.1
Fix Version/s: 5.5.41, 10.0.15

Type: Bug Priority: Critical
Reporter: Kolbe Kegel (Inactive) Assignee: Sergei Golubchik
Resolution: Fixed Votes: 0
Labels: None


 Description   

I thought it would be neat to combine dynamic columns and virtual columns, but it isn't going so well.

create table assets (
  item_name varchar(32) primary key, -- A common attribute for all items
  dynamic_cols  blob  -- Dynamic columns will be stored here
);
INSERT INTO assets VALUES 
  ('MariaDB T-shirt', COLUMN_CREATE('color', 'blue', 'size', 'XL'));
INSERT INTO assets VALUES
  ('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500));
 
alter table assets add column color char(32) as (left(COLUMN_GET(dynamic_cols, 'color' as char),32)) persistent;

It seems that it ignores the char(32) that I specify and instead uses char(0), thus truncating everything it tries to enter into the column.

mysql 10.0.10-MariaDB (root) [test]> alter table assets add column color char(32) as (left(COLUMN_GET(dynamic_cols, 'color' as char),32)) persistent;
Query OK, 2 rows affected, 2 warnings (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 2
 
mysql 10.0.10-MariaDB (root) [test]> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'color' at row 1 |
| Warning | 1265 | Data truncated for column 'color' at row 2 |
+---------+------+--------------------------------------------+
2 rows in set (0.00 sec)
 
mysql 10.0.10-MariaDB (root) [test]> show create table assets\G
*************************** 1. row ***************************
       Table: assets
Create Table: CREATE TABLE `assets` (
  `item_name` varchar(32) NOT NULL,
  `dynamic_cols` blob,
  `color` char(0) AS (left(COLUMN_GET(dynamic_cols, 'color' as char),32)) PERSISTENT,
  PRIMARY KEY (`item_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)



 Comments   
Comment by Elena Stepanova [ 2014-04-26 ]

If it's really not supported, it would be safer to produce an error, and it should also be documented.

I'm not sure whether it's a vcol issue or dyncol issue, assigned to Igor assuming it's the former. Please reassign as needed.

Comment by Kolbe Kegel (Inactive) [ 2014-04-26 ]

I think it's quite important to support this operation. This is an important piece of the NoSQL puzzle in MariaDB, IMO.

Note that this "works" if you use a column of type TEXT, instead.

Comment by Oleksandr Byelkin [ 2014-06-14 ]

It looks like new alter table ignore that the field is virtual and trying to put real data in it.

Comment by Kolbe Kegel (Inactive) [ 2014-10-02 ]

Is there any progress on this issue?

Comment by Oleksandr Byelkin [ 2014-10-31 ]

The test suite for 5.5:

create table assets (
item_name varchar(32) primary key, – A common attribute for all items
dynamic_cols blob, – Dynamic columns will be stored here
color char(32) as (left(COLUMN_GET(dynamic_cols, 1 as char),32)) persistent
);
INSERT INTO assets(item_name, dynamic_cols) VALUES
('MariaDB T-shirt', COLUMN_CREATE(1, 'blue', 2, 'XL'));
INSERT INTO assets(item_name, dynamic_cols) VALUES
('Thinkpad Laptop', COLUMN_CREATE(1, 'black', 3, 500));

select item_name, color from assets;

drop table assets;

Comment by Oleksandr Byelkin [ 2014-10-31 ]

The real problem is in the parser.

CREATE TABLE and COLUMN_GET uses both the same global variables for parsing types (lex->length, lex->dec, lex->type)

Comment by Oleksandr Byelkin [ 2014-11-02 ]

It was not COLUMN_GET but
cast_type:

Comment by Oleksandr Byelkin [ 2014-11-02 ]

and cast type is from COLUMN_GET

Comment by Oleksandr Byelkin [ 2014-11-02 ]

The problem is older then it seemd to be:

create table t1 (
  n int,
  c char(32) as (cast(n as char)) persistent
);
 
insert into t1(n) values (1),(2),(3);
 
select * from t1;
 
show create table t1;
 
drop t1;

Comment by Oleksandr Byelkin [ 2014-11-02 ]

commited for review

Comment by Oleksandr Byelkin [ 2014-11-02 ]

I think it is possible to reproduce the bug on earlier version if play with CONVERT/CAST recursive functions but I doubts in practical sens of it...

Comment by Oleksandr Byelkin [ 2014-11-11 ]

Your patch will go to the tree so I assign it to you.

Generated at Thu Feb 08 07:09:57 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.