1
0
mirror of https://github.com/mariadb-corporation/mariadb-connector-c.git synced 2025-08-07 02:42:49 +03:00

CONC-372 Fix str_to_TIME() parsing wrt performance.

Fix implementations of str_to_TIME() and my_atoll()

Implement own version my_strtoll() (similar to strtoull(), not requiring
null termination).

Use it to for optimized implementation of numbers and dates.
This commit is contained in:
Vladislav Vaintroub
2018-11-10 23:48:27 +01:00
parent 334964f071
commit 06fd8c901e
2 changed files with 414 additions and 117 deletions

View File

@@ -4653,9 +4653,9 @@ static int test_compress(MYSQL *mysql)
static int equal_MYSQL_TIME(MYSQL_TIME *tm1, MYSQL_TIME *tm2)
{
return tm1->day==tm1->day && tm1->hour==tm1->hour && tm1->minute==tm1->minute &&
tm1->month==tm1->month && tm1->neg==tm1->neg && tm1->second==tm1->second &&
tm1->second_part==tm1->second_part && tm1->time_type==tm1->time_type && tm1->year==tm1->year;
return tm1->day==tm2->day && tm1->hour==tm2->hour && tm1->minute==tm2->minute &&
tm1->month==tm2->month && tm1->neg==tm2->neg && tm1->second==tm2->second &&
tm1->second_part==tm2->second_part && tm1->time_type==tm2->time_type && tm1->year==tm2->year;
}
static int test_codbc138(MYSQL *mysql)
@@ -4676,6 +4676,9 @@ static int test_codbc138(MYSQL *mysql)
{ "SELECT '2001-02-03 11:12:13.123456'",
{ 2001,2,3,11,12,13,123456L,0, MYSQL_TIMESTAMP_DATETIME }
},
{ "SELECT '2001-02-03 11:12:13.123'",
{ 2001,2,3,11,12,13,123000L,0, MYSQL_TIMESTAMP_DATETIME }
},
{ "SELECT '-11:12:13'",
{ 0,0,0,11,12,13,0,1, MYSQL_TIMESTAMP_TIME }
},
@@ -4683,13 +4686,124 @@ static int test_codbc138(MYSQL *mysql)
{ 0,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
},
{ "SELECT '1--'",
{ 1,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
{ 0,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
},
{ "SELECT '-2001-01-01'",
{ 1,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
{ 0,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
},
{ "SELECT '-11:00'",
{ 1,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
{ 0,0,0,0,0,0,0,0, MYSQL_TIMESTAMP_ERROR }
},
{"SELECT '1972-04-22'",
{1972,4,22, 0,0,0, 0,0,MYSQL_TIMESTAMP_DATE}
},
{"SELECT ' 1972-04-22 '",
{1972,4,22, 0,0,0, 0,0,MYSQL_TIMESTAMP_DATE}
},
{"SELECT '1972-04-22a'",
{1972,4,22, 0,0,0, 0,0,MYSQL_TIMESTAMP_DATE}
},
{"SELECT '0000-00-00'",
{0,0,0, 0,0,0 ,0,0,MYSQL_TIMESTAMP_DATE}
},
{"SELECT '1970-01-00'",
{1970,1,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '0069-12-31'",
{69,12,31, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '69-12-31'",
{2069,12,31, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '68-12-31'",
{2068,12,31, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '70-01-01'",
{1970,1,1, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '2010-1-1'",
{2010,1,1, 0,0,0, 0,0, MYSQL_TIMESTAMP_DATE}
},
{"SELECT '10000-01-01'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-a-01'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-01-32'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-13-01'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1YYY-01-01'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-0M-01'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-00-'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979-00'",
{0,0,0, 0,0,0, 0,0,MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '1979'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '79'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR}
},
{"SELECT '10:15:00'",
{0,0,0, 10,15,0, 0,0, MYSQL_TIMESTAMP_TIME}
},
{"SELECT '10:15:01'",
{0,0,0, 10,15,1, 0,0, MYSQL_TIMESTAMP_TIME}
},
{"SELECT '00:00:00'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_TIME}
},
{"SELECT '0:0:0'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_TIME}
},
{"SELECT '10:15:01.'",
{0,0,0, 10,15,1, 0,0, MYSQL_TIMESTAMP_TIME},
},
{"SELECT '25:59:59'",
{0,0,0, 25,59,59, 0,0, MYSQL_TIMESTAMP_TIME},
},
{"SELECT '838:59:59'",
{0,0,0, 838,59,59, 0,0, MYSQL_TIMESTAMP_TIME},
},
{"SELECT '-838:59:59'",
{0,0,0, 838,59,59, 0, 1, MYSQL_TIMESTAMP_TIME},
},
{"SELECT '00:60:00'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR},
},
{"SELECT '00:60:00'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR},
},
{"SELECT '839:00:00'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR},
},
{"SELECT '-839:00:00'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR},
},
{"SELECT '-10:15:a'",
{ 0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR },
},
{"SELECT '1999-12-31 23:59:59.9999999'",
{1999,12,31, 23,59,59, 999999, 0, MYSQL_TIMESTAMP_DATETIME},
},
{"SELECT '00-08-11 8:46:40'",
{2000,8,11, 8,46,40, 0,0, MYSQL_TIMESTAMP_DATETIME},
},
{"SELECT '1999-12-31 25:59:59.999999'",
{0,0,0, 0,0,0, 0,0, MYSQL_TIMESTAMP_ERROR },
},
{ NULL,{ 0 } }
};