Save on coercion overhead for zero value decimal and float column values
This commit is contained in:
parent
c808e78028
commit
d9153b82fc
@ -22,8 +22,10 @@ create_table_sql = %[
|
|||||||
int_test INT,
|
int_test INT,
|
||||||
big_int_test BIGINT,
|
big_int_test BIGINT,
|
||||||
float_test FLOAT(10,3),
|
float_test FLOAT(10,3),
|
||||||
|
float_zero_test FLOAT(10,3),
|
||||||
double_test DOUBLE(10,3),
|
double_test DOUBLE(10,3),
|
||||||
decimal_test DECIMAL(10,3),
|
decimal_test DECIMAL(10,3),
|
||||||
|
decimal_zero_test DECIMAL(10,3),
|
||||||
date_test DATE,
|
date_test DATE,
|
||||||
date_time_test DATETIME,
|
date_time_test DATETIME,
|
||||||
timestamp_test TIMESTAMP,
|
timestamp_test TIMESTAMP,
|
||||||
@ -55,7 +57,7 @@ def insert_record(args)
|
|||||||
insert_sql = "
|
insert_sql = "
|
||||||
INSERT INTO mysql2_test (
|
INSERT INTO mysql2_test (
|
||||||
null_test, bit_test, tiny_int_test, small_int_test, medium_int_test, int_test, big_int_test,
|
null_test, bit_test, tiny_int_test, small_int_test, medium_int_test, int_test, big_int_test,
|
||||||
float_test, double_test, decimal_test, date_test, date_time_test, timestamp_test, time_test,
|
float_test, float_zero_test, double_test, decimal_test, decimal_zero_test, date_test, date_time_test, timestamp_test, time_test,
|
||||||
year_test, char_test, varchar_test, binary_test, varbinary_test, tiny_blob_test,
|
year_test, char_test, varchar_test, binary_test, varbinary_test, tiny_blob_test,
|
||||||
tiny_text_test, blob_test, text_test, medium_blob_test, medium_text_test,
|
tiny_text_test, blob_test, text_test, medium_blob_test, medium_text_test,
|
||||||
long_blob_test, long_text_test, enum_test, set_test
|
long_blob_test, long_text_test, enum_test, set_test
|
||||||
@ -63,7 +65,7 @@ def insert_record(args)
|
|||||||
|
|
||||||
VALUES (
|
VALUES (
|
||||||
NULL, #{args[:bit_test]}, #{args[:tiny_int_test]}, #{args[:small_int_test]}, #{args[:medium_int_test]}, #{args[:int_test]}, #{args[:big_int_test]},
|
NULL, #{args[:bit_test]}, #{args[:tiny_int_test]}, #{args[:small_int_test]}, #{args[:medium_int_test]}, #{args[:int_test]}, #{args[:big_int_test]},
|
||||||
#{args[:float_test]}, #{args[:double_test]}, #{args[:decimal_test]}, '#{args[:date_test]}', '#{args[:date_time_test]}', '#{args[:timestamp_test]}', '#{args[:time_test]}',
|
#{args[:float_test]}, #{args[:float_zero_test]}, #{args[:double_test]}, #{args[:decimal_test]}, #{args[:decimal_zero_test]}, '#{args[:date_test]}', '#{args[:date_time_test]}', '#{args[:timestamp_test]}', '#{args[:time_test]}',
|
||||||
#{args[:year_test]}, '#{args[:char_test]}', '#{args[:varchar_test]}', '#{args[:binary_test]}', '#{args[:varbinary_test]}', '#{args[:tiny_blob_test]}',
|
#{args[:year_test]}, '#{args[:char_test]}', '#{args[:varchar_test]}', '#{args[:binary_test]}', '#{args[:varbinary_test]}', '#{args[:tiny_blob_test]}',
|
||||||
'#{args[:tiny_text_test]}', '#{args[:blob_test]}', '#{args[:text_test]}', '#{args[:medium_blob_test]}', '#{args[:medium_text_test]}',
|
'#{args[:tiny_text_test]}', '#{args[:blob_test]}', '#{args[:text_test]}', '#{args[:medium_blob_test]}', '#{args[:medium_text_test]}',
|
||||||
'#{args[:long_blob_test]}', '#{args[:long_text_test]}', '#{args[:enum_test]}', '#{args[:set_test]}'
|
'#{args[:long_blob_test]}', '#{args[:long_text_test]}', '#{args[:enum_test]}', '#{args[:set_test]}'
|
||||||
@ -82,8 +84,10 @@ num.times do |n|
|
|||||||
:int_test => rand(2147483647),
|
:int_test => rand(2147483647),
|
||||||
:big_int_test => rand(9223372036854775807),
|
:big_int_test => rand(9223372036854775807),
|
||||||
:float_test => rand(32767)/1.87,
|
:float_test => rand(32767)/1.87,
|
||||||
|
:float_zero_test => 0.0,
|
||||||
:double_test => rand(8388607)/1.87,
|
:double_test => rand(8388607)/1.87,
|
||||||
:decimal_test => rand(8388607)/1.87,
|
:decimal_test => rand(8388607)/1.87,
|
||||||
|
:decimal_zero_test => 0,
|
||||||
:date_test => '2010-4-4',
|
:date_test => '2010-4-4',
|
||||||
:date_time_test => '2010-4-4 11:44:00',
|
:date_time_test => '2010-4-4 11:44:00',
|
||||||
:timestamp_test => '2010-4-4 11:44:00',
|
:timestamp_test => '2010-4-4 11:44:00',
|
||||||
|
@ -6,6 +6,7 @@ rb_encoding *binaryEncoding;
|
|||||||
|
|
||||||
VALUE cMysql2Result;
|
VALUE cMysql2Result;
|
||||||
VALUE cBigDecimal, cDate, cDateTime;
|
VALUE cBigDecimal, cDate, cDateTime;
|
||||||
|
VALUE opt_decimal_zero, opt_float_zero;
|
||||||
extern VALUE mMysql2, cMysql2Client, cMysql2Error;
|
extern VALUE mMysql2, cMysql2Client, cMysql2Error;
|
||||||
static VALUE intern_encoding_from_charset;
|
static VALUE intern_encoding_from_charset;
|
||||||
static ID intern_new, intern_utc, intern_local, intern_encoding_from_charset_code,
|
static ID intern_new, intern_utc, intern_local, intern_encoding_from_charset_code,
|
||||||
@ -95,6 +96,7 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
|
|||||||
MYSQL_FIELD * fields = NULL;
|
MYSQL_FIELD * fields = NULL;
|
||||||
unsigned int i = 0;
|
unsigned int i = 0;
|
||||||
unsigned long * fieldLengths;
|
unsigned long * fieldLengths;
|
||||||
|
double column_to_double;
|
||||||
void * ptr;
|
void * ptr;
|
||||||
#ifdef HAVE_RUBY_ENCODING_H
|
#ifdef HAVE_RUBY_ENCODING_H
|
||||||
rb_encoding *default_internal_enc = rb_default_internal_encoding();
|
rb_encoding *default_internal_enc = rb_default_internal_encoding();
|
||||||
@ -146,11 +148,20 @@ static VALUE rb_mysql_result_fetch_row(VALUE self, ID db_timezone, ID app_timezo
|
|||||||
break;
|
break;
|
||||||
case MYSQL_TYPE_DECIMAL: // DECIMAL or NUMERIC field
|
case MYSQL_TYPE_DECIMAL: // DECIMAL or NUMERIC field
|
||||||
case MYSQL_TYPE_NEWDECIMAL: // Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up)
|
case MYSQL_TYPE_NEWDECIMAL: // Precision math DECIMAL or NUMERIC field (MySQL 5.0.3 and up)
|
||||||
|
if (strtod(row[i], NULL) == 0.000000){
|
||||||
|
val = rb_funcall(cBigDecimal, intern_new, 1, opt_decimal_zero);
|
||||||
|
}else{
|
||||||
val = rb_funcall(cBigDecimal, intern_new, 1, rb_str_new(row[i], fieldLengths[i]));
|
val = rb_funcall(cBigDecimal, intern_new, 1, rb_str_new(row[i], fieldLengths[i]));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MYSQL_TYPE_FLOAT: // FLOAT field
|
case MYSQL_TYPE_FLOAT: // FLOAT field
|
||||||
case MYSQL_TYPE_DOUBLE: // DOUBLE or REAL field
|
case MYSQL_TYPE_DOUBLE: // DOUBLE or REAL field
|
||||||
val = rb_float_new(strtod(row[i], NULL));
|
column_to_double = strtod(row[i], NULL);
|
||||||
|
if (column_to_double == 0.000000){
|
||||||
|
val = opt_float_zero;
|
||||||
|
}else{
|
||||||
|
val = rb_float_new(column_to_double);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MYSQL_TYPE_TIME: { // TIME field
|
case MYSQL_TYPE_TIME: { // TIME field
|
||||||
int hour, min, sec, tokens;
|
int hour, min, sec, tokens;
|
||||||
@ -420,6 +431,11 @@ void init_mysql2_result() {
|
|||||||
sym_database_timezone = ID2SYM(rb_intern("database_timezone"));
|
sym_database_timezone = ID2SYM(rb_intern("database_timezone"));
|
||||||
sym_application_timezone = ID2SYM(rb_intern("application_timezone"));
|
sym_application_timezone = ID2SYM(rb_intern("application_timezone"));
|
||||||
|
|
||||||
|
rb_global_variable(&opt_decimal_zero); //never GC
|
||||||
|
opt_decimal_zero = rb_str_new2("0.0");
|
||||||
|
rb_global_variable(&opt_float_zero);
|
||||||
|
opt_float_zero = rb_float_new((double)0);
|
||||||
|
|
||||||
#ifdef HAVE_RUBY_ENCODING_H
|
#ifdef HAVE_RUBY_ENCODING_H
|
||||||
binaryEncoding = rb_enc_find("binary");
|
binaryEncoding = rb_enc_find("binary");
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,8 +20,10 @@ Spec::Runner.configure do |config|
|
|||||||
int_test INT,
|
int_test INT,
|
||||||
big_int_test BIGINT,
|
big_int_test BIGINT,
|
||||||
float_test FLOAT(10,3),
|
float_test FLOAT(10,3),
|
||||||
|
float_zero_test FLOAT(10,3),
|
||||||
double_test DOUBLE(10,3),
|
double_test DOUBLE(10,3),
|
||||||
decimal_test DECIMAL(10,3),
|
decimal_test DECIMAL(10,3),
|
||||||
|
decimal_zero_test DECIMAL(10,3),
|
||||||
date_test DATE,
|
date_test DATE,
|
||||||
date_time_test DATETIME,
|
date_time_test DATETIME,
|
||||||
timestamp_test TIMESTAMP,
|
timestamp_test TIMESTAMP,
|
||||||
@ -47,7 +49,7 @@ Spec::Runner.configure do |config|
|
|||||||
client.query %[
|
client.query %[
|
||||||
INSERT INTO mysql2_test (
|
INSERT INTO mysql2_test (
|
||||||
null_test, bit_test, tiny_int_test, bool_cast_test, small_int_test, medium_int_test, int_test, big_int_test,
|
null_test, bit_test, tiny_int_test, bool_cast_test, small_int_test, medium_int_test, int_test, big_int_test,
|
||||||
float_test, double_test, decimal_test, date_test, date_time_test, timestamp_test, time_test,
|
float_test, float_zero_test, double_test, decimal_test, decimal_zero_test, date_test, date_time_test, timestamp_test, time_test,
|
||||||
year_test, char_test, varchar_test, binary_test, varbinary_test, tiny_blob_test,
|
year_test, char_test, varchar_test, binary_test, varbinary_test, tiny_blob_test,
|
||||||
tiny_text_test, blob_test, text_test, medium_blob_test, medium_text_test,
|
tiny_text_test, blob_test, text_test, medium_blob_test, medium_text_test,
|
||||||
long_blob_test, long_text_test, enum_test, set_test
|
long_blob_test, long_text_test, enum_test, set_test
|
||||||
@ -55,7 +57,7 @@ Spec::Runner.configure do |config|
|
|||||||
|
|
||||||
VALUES (
|
VALUES (
|
||||||
NULL, b'101', 1, 1, 10, 10, 10, 10,
|
NULL, b'101', 1, 1, 10, 10, 10, 10,
|
||||||
10.3, 10.3, 10.3, '2010-4-4', '2010-4-4 11:44:00', '2010-4-4 11:44:00', '11:44:00',
|
10.3, 0, 10.3, 10.3, 0, '2010-4-4', '2010-4-4 11:44:00', '2010-4-4 11:44:00', '11:44:00',
|
||||||
2009, "test", "test", "test", "test", "test",
|
2009, "test", "test", "test", "test", "test",
|
||||||
"test", "test", "test", "test", "test",
|
"test", "test", "test", "test", "test",
|
||||||
"test", "test", 'val1', 'val1,val2'
|
"test", "test", 'val1', 'val1,val2'
|
||||||
|
Loading…
Reference in New Issue
Block a user