Hi Sergei, As I told you, I was working on prototype just for blobs. I was having some issue with key definition between MariaDB .frm file and information in the MyISAM storage engine. I have solved that problem temporarily. Here is my output MariaDB [database1]> set storage_engine=myisam; Query OK, 0 rows affected (0.00 sec) MariaDB [database1]> create database mydb; Query OK, 1 row affected (0.00 sec) MariaDB [database1]> use mydb; Database changed MariaDB [mydb]> create table table1(a int,b1 blob,b2 longblob,unique(a,b1,b2(5)) ); Query OK, 0 rows affected (0.09 sec) MariaDB [mydb]> insert into table1 values(4,3333333,55555555); Query OK, 1 row affected (0.00 sec) MariaDB [mydb]> insert into table1 values(4,3333333,55555); ERROR 1169 (23000): Can't write, because of unique constraint, to table 'table1' MariaDB [mydb]> insert into table1 values(4,3333333,55555555); ERROR 1169 (23000): Can't write, because of unique constraint, to table 'table1' MariaDB [mydb]> insert into table1 values(4,333333453,55555555); Query OK, 1 row affected (0.00 sec) 3 rows in set (0.00 sec) MariaDB [mydb]> insert into table1 values(5,333333453,55555555); Query OK, 1 row affected (0.00 sec) MariaDB [mydb]> insert into table1 values(5,333333453,55555); ERROR 1169 (23000): Can't write, because of unique constraint, to table 'table1' MariaDB [mydb]> show indexes from table1; +--------+------------+----------+--------------+-------------+-----------+----- --------+----------+--------+------+------------+---------+---------------+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Card inality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | +--------+------------+----------+--------------+-------------+-----------+----- --------+----------+--------+------+------------+---------+---------------+ | table1 | 0 | a | 1 | a | A | NULL | NULL | NULL | YES | BTREE | | | | table1 | 0 | a | 2 | b1 | A | NULL | NULL | NULL | YES | BTREE | | | | table1 | 0 | a | 3 | b2 | A | 0 | 5 | NULL | YES | BTREE | | | +--------+------------+----------+--------------+-------------+-----------+----- --------+----------+--------+------+------------+---------+---------------+ 3 rows in set (0.00 sec) Any suggestions would be helpful. Thanks, Shubham On 20 March 2016 at 11:10, Shubham Barai <shubhambaraiss@gmail.com> wrote:
Hi Sergei, Sorry! I made a mistake. Actually, when I changed my storage engine to MyISAM and executed create table statement(with unique blobs and no prefix length),mysqld crashed. After reconnecting to the server, the storage engine got changed to default (InnoDB).I didn't know about that and I executed all queries on InnoDB. I thought my patch was working for MyISAM but there are some issues.I am working on it but it might require some time to get it working. Since application deadline for GSoC is 25 March, I will try to submit my proposal as early as possible.
Thanks, Shubham
On 19 March 2016 at 14:22, Shubham Barai <shubhambaraiss@gmail.com> wrote:
Hello Sergei,
As you suggested, I tried to develop a prototype just for blobs. So far it is working fine but I am still verifying it for different cases. I will provide you the link to my Github repository shortly.
Thanks, Shubham
On 16 March 2016 at 17:55, Sergei Golubchik <serg@mariadb.org> wrote:
Hi, Shubham!
On Mar 16, Shubham Barai wrote:
Hello, Sergie! I tried to explore the source code from mi_create.c,ha_myisam.cc,sql/sql_table.cc,include/myisam.h,.and some other files. The main task is to create MI_UNIQUEDEF "uniques" for long unique constraints. We have to consider all the cases where we need to create MI_UNIQUEDEF instead of MI_KEYDEF.
It will include queries like create table table1 (blob_column blob,unique(blob_column) ); create table table1 (a int,blob_column blob,unique(a,blob_column) ); create table table1 (a int,blob_column1 blob,blob_column2 blob,unique(blob_column1(300),blob_column2) ); (key with multiple blob columns and one of the blob column specified with prefix length).
I think we have to create MI_UNIQUEDEF if any one of the columns in a key is a blob field without prefix length.
Yes. And also for any other UNIQUE constraint that is too long for a normal index. For example, many long VARCHAR columns.
But, of course, for a prototype one can start just with blobs.
In sql/sql_table, mysql_prepare_create_table is the function which prepares the table and key structures for table creation in mi_create. It generates an error if any one of the blob fields in a key is specified without length. Currently, this task is limited to MyISAM, so if any other storage engine is selected, we have to generate the same error in mysql_prepare_create_table.
There's a generic check whether the key is too long. It can be used here, it doesn't depend on the storage engine.
In storage/myisam/ha_myisam.cc, table2myisam is a function which allocates and initializes myisam key and column definitions.The current function prototype of table2myisam is table2myisam(TABLE *table_arg, MI_KEYDEF **keydef_out, MI_COLUMNDEF **recinfo_out, uint records_out) We have to change it to table2myisam(TABLE *table_arg,MI_KEYDEF **keydef_out,MI_UNIQUEDEF ** uniquedef_out,MI_COLUMNDEF **recinfo_out,uint records_out)
Right.
table2myisam initializes all the key definitions from table_arg->keyinfo. So we can set a new flag (say uniquedef) in a keyinfo struct in mysql_prepare_create_table if any one of the key_part consists of blob field without prefix length.
There's a field 'algorithm' already. Because MI_UNIQUEDEF in MyISAM is, basically, an index of hashed column values, it is kind of a hash index. So you can use algorithm=HA_KEY_ALG_HASH to mark such columns. And the user will be able to create these indexes explicitly with
create table table1 (blob_column blob,unique(blob_column) using hash);
Later we can check the flag in table2myisam to see if we want to create MI_KEYDEF or MI_UNIQUEDEF.
Thanks, Shubham.
Very good!
Regards, Sergei Chief Architect MariaDB and security@mariadb.org