Bug #1476

mroongaエンジンのdatetime型について

Added by Kentoku SHIBA over 5 years ago. Updated about 5 years ago.

Status:完了チェック待ちStart date:09/12/2012
Priority:NormalDue date:
Assignee:Kentaro HAYASHI% Done:

50%

Category:-
Target version:-

Description

表題の件ですが、mroongaエンジンを使ったテーブルで、
datetime型のカラムにインサートを行ったところ、
意図していないデータが登録されてしまったため、報告させていただきます。
詳細は以下をご覧下さい。


【環境】
・CentOS6.2
・MySQL5.1.61
・mroonga2.0.3


【テーブル構造】
mysql> show create table datetime_test \G
*************************** 1. row ***************************
       Table: datetime_test
Create Table: CREATE TABLE `datetime_test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `input` varchar(254) DEFAULT NULL,
  `datetime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=mroonga DEFAULT CHARSET=utf8
1 row in set (0.00 sec)


【データ】
上記のテーブルに下記6点のデータをインサートしました。
------------------------------------------
・mysql> insert into datetime_test (input,datetime) values ('NULL',NULL);
・mysql> insert into datetime_test (input,datetime) values ('1000-01-01
00:00:00','1000-01-01 00:00:00');
・mysql> insert into datetime_test (input,datetime) values ('9999-12-31
23:59:59','9999-12-31 23:59:59');
・mysql> insert into datetime_test (input,datetime) values ('2038-01-19
03:14:07','2038-01-19 03:14:07');
・mysql> insert into datetime_test (input,datetime) values ('2038-01-19
03:14:08','2038-01-19 03:14:08');
・mysql> insert into datetime_test (input,datetime) values ('2012','2012');
------------------------------------------
※確認しやすいように、datetimeカラムにインサートする日付を、inputカラムにvarchar型で入力しています。


そのselect結果が以下になります。

mysql> select * from datetime_test ;
+----+---------------------+---------------------+
| id | input               | datetime            |
+----+---------------------+---------------------+
|  1 | NULL                | 1970-01-01 00:00:00 |
|  2 | 1000-01-01 00:00:00 | 1987-04-15 03:01:07 |
|  3 | 9999-12-31 23:59:59 | 1970-01-09 21:47:45 |
|  4 | 2038-01-19 03:14:07 | 2038-01-19 03:14:07 |
|  5 | 2038-01-19 03:14:08 | 1901-12-13 20:45:52 |
|  6 | 2012                | 2034-08-29 05:43:15 |
+----+---------------------+---------------------+
6 rows in set (0.00 sec)


このように、本来datetime型で入るはずの日付が、違う日付に変わってしまっています。
また、2038年問題と思われる現象も起きているようです。
参考までに、同じ内容をInnoDBのテーブルで入力したところ、下記の結果が得られます。

mysql> select * from datetime_test2;
+----+---------------------+---------------------+
| id | input               | datetime            |
+----+---------------------+---------------------+
|  1 | NULL                | NULL                |
|  2 | 1000-01-01 00:00:00 | 1000-01-01 00:00:00 |
|  3 | 9999-12-31 23:59:59 | 9999-12-31 23:59:59 |
|  4 | 2038-01-19 03:14:07 | 2038-01-19 03:14:07 |
|  5 | 2038-01-19 03:14:08 | 2038-01-19 03:14:08 |
|  6 | 2012                | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+
6 rows in set (0.00 sec)


現象は以上になります。

私の環境に問題がありそうであれば、その箇所を教えていただけますと幸いです。
どうぞよろしくお願い致します。

History

#1 Updated by Kentaro HAYASHI over 5 years ago

上記件について追試を行った。

■ 追試結果

・mroonga v2.03で再現した。 ・mroonga v2.06でも同様の結果となった。

■ 追試手順について

CentOS6.2環境をnetinstall.isoを利用して仮想環境に構築後、yum install mysqlにてMySQLをインストール。 設定等は変更せずデフォルトの状態。

[root@centos62-x86-64 yum.repos.d]# rpm -qa|grep mysql
mysql-5.1.61-1.el6_2.1.x86_64
mysql-server-5.1.61-1.el6_2.1.x86_64
mysql-libs-5.1.61-1.el6_2.1.x86_64

mroongaについては公式サイトのドキュメントに従ってパッケージをインストール。 ただし、v2.03でまず確認するためyum install mroonga-2.03として明示的に古いバージョンをインストールした。 設定等は変更せずデフォルトの状態。

[root@centos62-x86-64 yum.repos.d]# rpm -qa|grep mroonga
mysql-mroonga-2.03-0.el6.x86_64

報告にあるようにテーブルを作成、データを挿入して、selectした結果が報告と一致することを確認(再現)。

mysql> select * from datetime_test;
+----+---------------------+---------------------+
| id | input               | datetime            |
+----+---------------------+---------------------+
|  1 | NULL                | 1970-01-01 00:00:00 |
|  2 | 1000-01-01 00:00:00 | 1987-04-15 03:01:07 |
|  3 | 9999-12-31 23:59:59 | 1970-01-09 21:47:45 |
|  4 | 2038-01-19 03:14:07 | 2038-01-19 03:14:07 |
|  5 | 2038-01-19 03:14:08 | 1901-12-13 20:45:52 |
|  6 | 2012                | 2034-08-29 05:43:15 |
+----+---------------------+---------------------+
6 rows in set (0.00 sec)

その後、mroongaをv2.06にアップグレードしv2.03と同様の手順(テーブル作成、データ挿入)を踏んでselectした結果が一致することを確認(再現)した。

[root@centos62-x86-64 yum.repos.d]# rpm -qa|grep mroonga
mysql-mroonga-2.06-0.el6.x86_64

#2 Updated by Kentoku SHIBA over 5 years ago

  • Status changed from 新規 to 担当者作業中
  • Assignee set to Kentoku SHIBA
  • % Done changed from 0 to 10

#3 Updated by Kentoku SHIBA over 5 years ago

  • Status changed from 担当者作業中 to ドキュメント中
  • % Done changed from 10 to 50

以下の点が、他のストレージエンジンとは動作が異なるが、 それ以外については挙動を合わせた。

・NULLはストレージモードではサポート外 ・0月0日は、groonga内部で表現できないので、1月1日になるよう補正

| 1 | NULL                | 1970-01-01 00:00:00 |
| 2 | 1000-01-01 00:00:00 | 1000-01-01 00:00:00 |
| 3 | 9999-12-31 23:59:59 | 9999-12-31 23:59:59 |
| 4 | 2038-01-19 03:14:07 | 2038-01-19 03:14:07 |
| 5 | 2038-01-19 03:14:08 | 2038-01-19 03:14:08 |
| 6 | 2012                | 0000-01-01 00:00:00 |

#4 Updated by Kentaro HAYASHI about 5 years ago

  • Status changed from ドキュメント中 to 完了チェック待ち
  • Assignee changed from Kentoku SHIBA to Kentaro HAYASHI

ドキュメントの状況について更新。

4.6.1. カラムの値に関する制限事項に必要な情報を記載した。

補正のされ方について

  • DATE、DATETIMEカラムで、月もしくは日に「0月」や「0日」を指定した際には「1月」もしくは「1日」に補正されることを注意点として明記

NULL値について

  • NULL値のmroongaでの扱いについて明記

上記を実行例とともに記載した。

Also available in: Atom PDF