@@ -27,6 +27,7 @@ C_MODE_START
2727
2828extern ulonglong log_10_int [20 ];
2929extern uchar days_in_month [];
30+ extern const char my_zero_datetime6 []; /* "0000-00-00 00:00:00.000000" */
3031
3132/*
3233 Portable time_t replacement.
@@ -41,6 +42,8 @@ typedef long my_time_t;
4142#define MY_TIME_T_MAX LONG_MAX
4243#define MY_TIME_T_MIN LONG_MIN
4344
45+ #define DATETIME_MAX_DECIMALS 6
46+
4447/* Time handling defaults */
4548#define TIMESTAMP_MAX_YEAR 2038
4649#define TIMESTAMP_MIN_YEAR (1900 + YY_PART_YEAR - 1)
@@ -63,17 +66,27 @@ typedef long my_time_t;
6366 ((x) >= TIMESTAMP_MIN_VALUE)
6467#endif
6568
66- /* Flags to str_to_datetime */
67- #define TIME_FUZZY_DATE 1
68- #define TIME_DATETIME_ONLY 2
69+ /* Flags to str_to_datetime and number_to_datetime */
70+ #define TIME_FUZZY_DATE 1
71+ #define TIME_DATETIME_ONLY 2
72+ #define TIME_NO_NSEC_ROUNDING 4
73+ #define TIME_NO_DATE_FRAC_WARN 8
74+
6975/* Must be same as MODE_NO_ZERO_IN_DATE */
7076#define TIME_NO_ZERO_IN_DATE (65536L*2*2*2*2*2*2*2)
7177/* Must be same as MODE_NO_ZERO_DATE */
7278#define TIME_NO_ZERO_DATE (TIME_NO_ZERO_IN_DATE*2)
7379#define TIME_INVALID_DATES (TIME_NO_ZERO_DATE*2)
7480
75- #define MYSQL_TIME_WARN_TRUNCATED 1
76- #define MYSQL_TIME_WARN_OUT_OF_RANGE 2
81+ /* Conversion warnings */
82+ #define MYSQL_TIME_WARN_TRUNCATED 1
83+ #define MYSQL_TIME_WARN_OUT_OF_RANGE 2
84+ #define MYSQL_TIME_WARN_INVALID_TIMESTAMP 4
85+ #define MYSQL_TIME_WARN_ZERO_DATE 8
86+ #define MYSQL_TIME_NOTE_TRUNCATED 16
87+
88+ /* Usefull constants */
89+ #define SECONDS_IN_24H 86400L
7790
7891/* Limits for the TIME data type */
7992#define TIME_MAX_HOUR 838
@@ -84,23 +97,71 @@ typedef long my_time_t;
8497#define TIME_MAX_VALUE_SECONDS (TIME_MAX_HOUR * 3600L + \
8598 TIME_MAX_MINUTE * 60L + TIME_MAX_SECOND)
8699
100+ /*
101+ Structure to return status from
102+ str_to_datetime(), str_to_time(), number_to_datetime(), number_to_time()
103+ */
104+ typedef struct st_mysql_time_status
105+ {
106+ int warnings ;
107+ uint fractional_digits ;
108+ uint nanoseconds ;
109+ } MYSQL_TIME_STATUS ;
110+
111+ static inline void my_time_status_init (MYSQL_TIME_STATUS * status )
112+ {
113+ status -> warnings = status -> fractional_digits = status -> nanoseconds = 0 ;
114+ }
115+
116+
87117my_bool check_date (const MYSQL_TIME * ltime , my_bool not_zero_date ,
88118 ulonglong flags , int * was_cut );
89- enum enum_mysql_timestamp_type
90- str_to_datetime (const char * str , uint length , MYSQL_TIME * l_time ,
91- ulonglong flags , int * was_cut );
119+ my_bool str_to_datetime (const char * str , uint length , MYSQL_TIME * l_time ,
120+ ulonglong flags , MYSQL_TIME_STATUS * status );
92121longlong number_to_datetime (longlong nr , MYSQL_TIME * time_res ,
93122 ulonglong flags , int * was_cut );
123+ my_bool number_to_time (longlong nr , MYSQL_TIME * ltime , int * warnings );
94124ulonglong TIME_to_ulonglong_datetime (const MYSQL_TIME * );
95125ulonglong TIME_to_ulonglong_date (const MYSQL_TIME * );
96126ulonglong TIME_to_ulonglong_time (const MYSQL_TIME * );
97127ulonglong TIME_to_ulonglong (const MYSQL_TIME * );
98128
129+ #define MY_PACKED_TIME_GET_INT_PART (x ) ((x) >> 24)
130+ #define MY_PACKED_TIME_GET_FRAC_PART (x ) ((x) % (1LL << 24))
131+ #define MY_PACKED_TIME_MAKE (i , f ) ((((longlong) (i)) << 24) + (f))
132+ #define MY_PACKED_TIME_MAKE_INT (i ) ((((longlong) (i)) << 24))
133+
134+ longlong year_to_longlong_datetime_packed (long year );
135+ longlong TIME_to_longlong_datetime_packed (const MYSQL_TIME * );
136+ longlong TIME_to_longlong_date_packed (const MYSQL_TIME * );
137+ longlong TIME_to_longlong_time_packed (const MYSQL_TIME * );
138+ longlong TIME_to_longlong_packed (const MYSQL_TIME * );
139+
140+ void TIME_from_longlong_datetime_packed (MYSQL_TIME * ltime , longlong nr );
141+ void TIME_from_longlong_time_packed (MYSQL_TIME * ltime , longlong nr );
142+ void TIME_from_longlong_date_packed (MYSQL_TIME * ltime , longlong nr );
143+ void TIME_set_yymmdd (MYSQL_TIME * ltime , uint yymmdd );
144+ void TIME_set_hhmmss (MYSQL_TIME * ltime , uint hhmmss );
145+
146+ void my_datetime_packed_to_binary (longlong nr , uchar * ptr , uint dec );
147+ longlong my_datetime_packed_from_binary (const uchar * ptr , uint dec );
148+ uint my_datetime_binary_length (uint dec );
149+
150+ void my_time_packed_to_binary (longlong nr , uchar * ptr , uint dec );
151+ longlong my_time_packed_from_binary (const uchar * ptr , uint dec );
152+ uint my_time_binary_length (uint dec );
153+
154+ void my_timestamp_to_binary (const struct timeval * tm , uchar * ptr , uint dec );
155+ void my_timestamp_from_binary (struct timeval * tm , const uchar * ptr , uint dec );
156+ uint my_timestamp_binary_length (uint dec );
99157
100158my_bool str_to_time (const char * str ,uint length , MYSQL_TIME * l_time ,
101- int * warning );
159+ MYSQL_TIME_STATUS * status );
102160
103- int check_time_range (struct st_mysql_time * , int * warning );
161+ my_bool check_time_mmssff_range (const MYSQL_TIME * ltime );
162+ my_bool check_time_range_quick (const MYSQL_TIME * ltime );
163+ my_bool check_datetime_range (const MYSQL_TIME * ltime );
164+ void adjust_time_range (struct st_mysql_time * , int * warning );
104165
105166long calc_daynr (uint year ,uint month ,uint day );
106167uint calc_days_in_year (uint year );
@@ -137,6 +198,8 @@ my_system_gmt_sec(const MYSQL_TIME *t, long *my_timezone,
137198 my_bool * in_dst_time_gap );
138199
139200void set_zero_time (MYSQL_TIME * tm , enum enum_mysql_timestamp_type time_type );
201+ void set_max_time (MYSQL_TIME * tm , my_bool neg );
202+ void set_max_hhmmss (MYSQL_TIME * tm );
140203
141204/*
142205 Required buffer length for my_time_to_str, my_date_to_str,
@@ -148,10 +211,12 @@ void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type);
148211*/
149212#define MAX_DATE_STRING_REP_LENGTH 30
150213
151- int my_time_to_str (const MYSQL_TIME * l_time , char * to );
214+ int my_time_to_str (const MYSQL_TIME * l_time , char * to , uint dec );
152215int my_date_to_str (const MYSQL_TIME * l_time , char * to );
153- int my_datetime_to_str (const MYSQL_TIME * l_time , char * to );
154- int my_TIME_to_str (const MYSQL_TIME * l_time , char * to );
216+ int my_datetime_to_str (const MYSQL_TIME * l_time , char * to , uint dec );
217+ int my_TIME_to_str (const MYSQL_TIME * l_time , char * to , uint dec );
218+
219+ int my_timeval_to_str (const struct timeval * tm , char * to , uint dec );
155220
156221/*
157222 Available interval types used in any statement.
0 commit comments