Bug #75864 Incorrect handling of unsigned not null integers in innodb_memcached

Submitted: 11 Feb 2015 17:55 Modified: 1 Jun 2015 15:18
Reporter: Piotr Jurkiewicz (OCA) Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Memcached Severity:S3 (Non-critical)
Version:5.6.23, 5.6.24 OS:Any
Assigned to: CPU Architecture:Any
Tags: Contribution, memcached

[11 Feb 2015 17:55] Piotr Jurkiewicz
Description:
Memcached plugin handles unsigned integer value columns incorrectly.

Column attributes are in several places compared to IB_COL_UNSIGNED:

    if (m_col->attr == IB_COL_UNSIGNED)

However, in case when there are any other flags (like IB_COL_NOT_NULL) set on the column this comparison fails.

How to repeat:
SQL commands to prepare a database:

USE innodb_memcache;

INSERT INTO containers VALUES ("int_test", "test", "int_test",
			       "k", "v",  "", "", "", "PRIMARY");

CREATE DATABASE IF NOT EXISTS test;
USE test

CREATE TABLE int_test (k varchar(32), v int unsigned NOT NULL, PRIMARY KEY (k)) ENGINE=InnoDB;

---

Inside a telnet connection to memcached:

get @@int_test
VALUE @@int_test 0 13
test/int_test
END

set somekey 0 0 3
543
STORED

get somekey
VALUE somekey 0 3
0
END

---

GET returns zero, despite being 543 (it can be checked using SQL).

Suggested fix:
Existence of IB_COL_UNSIGNED flag should be always determined by using binary & operator:

    if (m_col->attr & IB_COL_UNSIGNED)
[11 Feb 2015 17:56] Piotr Jurkiewicz
Patch fixing this bug

(*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.

Contribution: unsigned.diff (text/plain), 3.09 KiB.

[13 Feb 2015 7:42] MySQL Verification Team
Hello Piotr Jurkiewicz,

Thank you for the report and contribution.

Thanks,
Umesh
[13 Feb 2015 7:43] MySQL Verification Team
// 5.6.24
// Build used, setup followed - http://dev.mysql.com/doc/refman/5.6/en/innodb-memcached-installing.html

commit: caae6b64ef613df007609b569b8368c599d5c995
date: 2015-02-03 12:05:54 +0100
build-date: 2015-02-03 18:45:47 +0100
short: caae6b6
branch: mysql-5.6

MySQL source 5.6.24

scripts/mysql_install_db --basedir=/export/umesh/mysql-5.6.24 --datadir=/export/umesh/mysql-5.6.24/75864
bin/mysqld --basedir=/export/umesh/mysql-5.6.24 --datadir=/export/umesh/mysql-5.6.24/75864 --core-file --socket=/tmp/mysql_ushastry.sock  --port=15000 --log-error=/export/umesh/mysql-5.6.24/75864/log.err 2>&1 &

//

[umshastr@hod03]/export/umesh/mysql-5.7.6: telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
..

get @@int_test
VALUE @@int_test 0 13
test/int_test
END
set somekey 0 0 3
543
STORED
get somekey
VALUE somekey 0 5
32573
END

##  from CLI session

mysql> select * from int_test;
+---------+-----+
| k       | v   |
+---------+-----+
| somekey | 543 |
+---------+-----+
1 row in set (0.00 sec)

## uninstalled/installed memcached plugin to see if that helps

mysql> uninstall plugin daemon_memcached;
Query OK, 0 rows affected (2.00 sec)

mysql> install plugin daemon_memcached soname "libmemcached.so";
Query OK, 0 rows affected (0.00 sec)

//

[umshastr@hod03]~: telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get @@int_test
VALUE @@int_test 0 13
test/int_test
END
set somekey 0 0 3
543
STORED
get somekey
VALUE somekey 0 1
0
END

## from CLI session

mysql> select * from int_test;
+---------+-----+
| k       | v   |
+---------+-----+
| somekey | 543 |
+---------+-----+
1 row in set (0.00 sec)
[1 Jun 2015 15:18] Daniel Price
Posted by developer:
 
Fixed as of the upcoming 5.6.26, 5.7.8, 5.8.0 releases, and here's the changelog entry:

The "InnoDB" "memcached" plugin handled unsigned NOT NULL integer columns
incorrectly. Thanks to Piotr Jurkiewicz for the patch. 

Thank you for the bug report.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.040 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.