diff --git a/ext/mysql2/result.c b/ext/mysql2/result.c index 3e94f341..5bf3ee93 100644 --- a/ext/mysql2/result.c +++ b/ext/mysql2/result.c @@ -287,17 +287,17 @@ static VALUE rb_mysql_result_fetch_field_type(VALUE self, unsigned int idx) { rb_field_type = rb_sprintf("double(%ld,%d)", field->length, field->decimals); break; case MYSQL_TYPE_TIME: // MYSQL_TIME - rb_field_type = rb_str_new_cstr("time"); + rb_field_type = rb_sprintf("time(%d)", field->decimals); break; case MYSQL_TYPE_DATE: // MYSQL_TIME case MYSQL_TYPE_NEWDATE: // MYSQL_TIME rb_field_type = rb_str_new_cstr("date"); break; case MYSQL_TYPE_DATETIME: // MYSQL_TIME - rb_field_type = rb_str_new_cstr("datetime"); + rb_field_type = rb_sprintf("datetime(%d)", field->decimals); break; case MYSQL_TYPE_TIMESTAMP: // MYSQL_TIME - rb_field_type = rb_str_new_cstr("timestamp"); + rb_field_type = rb_sprintf("timestamp(%d)", field->decimals); break; case MYSQL_TYPE_DECIMAL: // char[] case MYSQL_TYPE_NEWDECIMAL: // char[] diff --git a/spec/mysql2/result_spec.rb b/spec/mysql2/result_spec.rb index ac42f2de..d2ebbb67 100644 --- a/spec/mysql2/result_spec.rb +++ b/spec/mysql2/result_spec.rb @@ -148,9 +148,9 @@ decimal(10,3) decimal(10,3) date - datetime - timestamp - time + datetime(0) + timestamp(0) + time(0) year(4) char(13) varchar(13) @@ -199,6 +199,22 @@ expect(result.field_types).to eql(expected_types) end + it "should return precision for datetimes" do + result = @client.query( + "SELECT cast(now() as datetime), " \ + "cast(now() as datetime(3)), " \ + "cast(now() as datetime(6))", + ) + + expected_types = %w[ + datetime(0) + datetime(3) + datetime(6) + ] + + expect(result.field_types).to eql(expected_types) + end + it "should return json type on mysql 8.0" do next unless /8.\d+.\d+/ =~ @client.server_info[:version]