MySQL 8.0.32
Source Code Documentation
my_time.h
Go to the documentation of this file.
1/* Copyright (c) 2004, 2022, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is also distributed with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have included with MySQL.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License, version 2.0, for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
22
23#ifndef MY_TIME_INCLUDED
24#define MY_TIME_INCLUDED
25
26/**
27 @ingroup MY_TIME
28 @{
29
30 @file include/my_time.h
31
32 Interface for low level time utilities.
33*/
34
35#include "my_config.h"
36
37#include <assert.h> // assert
38#include <algorithm>
39#include <cstddef> // std::size_t
40#include <cstdint> // std::int32_t
41#include <cstring> // strncpy
42#include <limits> // std::numeric_limits
43
44#ifdef HAVE_SYS_TIME_H
45#include <sys/time.h> // struct timeval
46#endif /* HAVE_SYS_TIME_H */
47#ifdef _WIN32
48#include <winsock2.h> // struct timeval
49#endif /* _WIN32 */
50
51#include "field_types.h"
52#include "my_time_t.h"
53#include "mysql_time.h" // struct MYSQL_TIME, shared with client code
54
55extern const unsigned long long int log_10_int[20];
56extern const unsigned char days_in_month[];
57extern const char my_zero_datetime6[]; /* "0000-00-00 00:00:00.000000" */
58
59constexpr const bool HAVE_64_BITS_TIME_T = sizeof(time_t) == sizeof(my_time_t);
60
61/** Time handling defaults */
62constexpr const int MYTIME_MAX_YEAR = HAVE_64_BITS_TIME_T ? 9999 : 2038;
63constexpr const int TIMESTAMP_MAX_YEAR = 2038;
64
65/** Two-digit years < this are 20XX; >= this are 19XX */
66constexpr const int YY_PART_YEAR = 70;
67constexpr const int MYTIME_MIN_YEAR = (1900 + YY_PART_YEAR - 1);
68
69/** max seconds from epoch of host's time_t stored in my_time_t
70 Windows allows up to 3001-01-18 23:59:59 UTC for localtime_r, so
71 that is our effective limit, although Unixen allow higher time points.
72 Hence the magic constant 32536771199.
73 */
74constexpr const my_time_t MYTIME_MAX_VALUE =
75 HAVE_64_BITS_TIME_T ? 32536771199
76 : std::numeric_limits<std::int32_t>::max();
77
78/**
79 Zero represents the first time value we allow, i.e. UNIX epoch.
80 We do not allow times before UNIX epoch, except for inside computations,
81 hence we use a signed integer as the base type, cf. prepare_tz_info.
82*/
83constexpr const int MYTIME_MIN_VALUE = 0;
84
85/** max seconds from epoch that can be stored in a column of type TIMESTAMP.
86 This also impacts the max value that can be given to SET TIMESTAMP
87*/
88constexpr const std::int64_t TYPE_TIMESTAMP_MAX_VALUE =
89 std::numeric_limits<std::int32_t>::max();
90constexpr const std::int64_t TYPE_TIMESTAMP_MIN_VALUE = 1;
91
92/** Flags to str_to_datetime and number_to_datetime */
93using my_time_flags_t = unsigned int;
94
95/** Allow zero day and zero month */
96constexpr const my_time_flags_t TIME_FUZZY_DATE = 1;
97
98/** Only allow full datetimes. */
100
103
104/** Don't allow zero day or zero month */
106
107/** Don't allow 0000-00-00 date */
109
110/** Allow 2000-02-31 */
112
113/** Allow only HH:MM:SS or MM:SS time formats */
114constexpr const my_time_flags_t TIME_STRICT_COLON = 128;
115
116/** Conversion warnings */
117constexpr const int MYSQL_TIME_WARN_TRUNCATED = 1;
118constexpr const int MYSQL_TIME_WARN_OUT_OF_RANGE = 2;
119constexpr const int MYSQL_TIME_WARN_INVALID_TIMESTAMP = 4;
120constexpr const int MYSQL_TIME_WARN_ZERO_DATE = 8;
121constexpr const int MYSQL_TIME_NOTE_TRUNCATED = 16;
122constexpr const int MYSQL_TIME_WARN_ZERO_IN_DATE = 32;
123constexpr const int MYSQL_TIME_WARN_DATETIME_OVERFLOW = 64;
124
125/** Useful constants */
126constexpr const int64_t SECONDS_IN_24H = 86400LL;
127
128/** Limits for the TIME data type */
129constexpr const int TIME_MAX_HOUR = 838;
130constexpr const int TIME_MAX_MINUTE = 59;
131constexpr const int TIME_MAX_SECOND = 59;
132
133/**
134 Note that this MUST be a signed type, as we use the unary - operator on it.
135 */
136constexpr const int TIME_MAX_VALUE =
138
139constexpr const int TIME_MAX_VALUE_SECONDS =
141
142constexpr const int DATETIME_MAX_DECIMALS = 6;
143
144constexpr const int SECS_PER_MIN = 60;
145constexpr const int MINS_PER_HOUR = 60;
146constexpr const int HOURS_PER_DAY = 24;
147constexpr const int DAYS_PER_WEEK = 7;
148constexpr const int DAYS_PER_NYEAR = 365;
149constexpr const int DAYS_PER_LYEAR = 366;
150constexpr const int SECS_PER_HOUR = (SECS_PER_MIN * MINS_PER_HOUR);
151constexpr const int SECS_PER_DAY = (SECS_PER_HOUR * HOURS_PER_DAY);
152constexpr const int MONS_PER_YEAR = 12;
153
154constexpr const int MAX_TIME_ZONE_HOURS = 14;
155
156/** Flags for calc_week() function. */
157constexpr const unsigned int WEEK_MONDAY_FIRST = 1;
158constexpr const unsigned int WEEK_YEAR = 2;
159constexpr const unsigned int WEEK_FIRST_WEEKDAY = 4;
160
161/** Daynumber from year 0 to 9999-12-31 */
162constexpr const int64_t MAX_DAY_NUMBER = 3652424;
163
164/**
165 Structure to return status from
166 str_to_datetime(), str_to_time(), number_to_datetime(), number_to_time()
167 @note Implicit default constructor initializes all members to 0.
168*/
170 int warnings{0};
171 unsigned int fractional_digits{0};
172 unsigned int nanoseconds{0};
173 struct DEPRECATION { // We only report first offense
175 DP_NONE, // no deprecated delimiter seen yet
176 DP_WRONG_KIND, // seen a delimiter in correct position, but wrong one
177 DP_WRONG_SPACE, // seen a space delimiter which isn't 0x20 ' '.
178 DP_SUPERFLUOUS // seen a superfluous delimiter
179 } m_kind{DP_NONE};
181 bool m_colon; // for DP_WRONG_KIND: true if we expect ':', else '-'
182 int m_position; // 0-based in m_arg
183 char m_arg[40]; // the string argument we found a deprecation in
185 ///< Register wrong delimiter if it's the first we see for this value
186 ///< @param kind what kind of deprecation did we see
187 ///< @param arg the string we try to interpret as a datetime value
188 ///< @param end points to the character after arg, usually a '\0'
189 ///< @param delim what delimiter was used
190 ///< @param colon used if kind==DP_WRONG_KIND. true: expect ':' else expect'-'
191 void set_deprecation(DEPRECATION::DEPR_KIND kind, const char *arg,
192 const char *end, const char *delim, bool colon = false) {
193 if (m_deprecation.m_kind == DEPRECATION::DP_NONE) {
194 m_deprecation.m_kind = kind;
196 m_deprecation.m_colon = colon;
197 const size_t bufsize = sizeof(m_deprecation.m_arg) - 1; // -1: for '\0'
198 const size_t argsize = end - arg;
199 const size_t size = std::min(bufsize, argsize);
200 // The input string is not necessarily zero-terminated,
201 // so do not use snprintf().
202 std::strncpy(m_deprecation.m_arg, arg, size);
203 m_deprecation.m_arg[size] = '\0';
204 m_deprecation.m_position = delim - arg;
205 }
206 }
207 MYSQL_TIME_STATUS() = default;
209 /// Assignment: don't clobber an existing deprecation, first one wins
211 warnings = b.warnings;
214 // keep first deprecation
215 if (m_deprecation.m_kind == DEPRECATION::DP_NONE) {
217 }
218 return *this;
219 }
221};
222
223/**
224 Struct representing a duration. Content is similar to MYSQL_TIME
225 but member variables are unsigned.
226 */
227struct Interval {
228 unsigned long int year;
229 unsigned long int month;
230 unsigned long int day;
231 unsigned long int hour;
232 unsigned long long int minute;
233 unsigned long long int second;
234 unsigned long long int second_part;
235 bool neg;
236};
237
238void my_init_time();
239
240long calc_daynr(unsigned int year, unsigned int month, unsigned int day);
241unsigned int calc_days_in_year(unsigned int year);
242unsigned int year_2000_handling(unsigned int year);
243
244bool time_zone_displacement_to_seconds(const char *str, size_t length,
245 int *result);
246
247void get_date_from_daynr(int64_t daynr, unsigned int *year, unsigned int *month,
248 unsigned int *day);
249int calc_weekday(long daynr, bool sunday_first_day_of_week);
250bool valid_period(long long int period);
251uint64_t convert_period_to_month(uint64_t period);
252uint64_t convert_month_to_period(uint64_t month);
253
254/**
255 Check for valid my_time_t value. Note: timestamp here pertains to seconds
256 since epoch, not the legacy MySQL type TIMESTAMP, which is limited to
257 32 bits even on 64 bit platforms.
258*/
259inline bool is_time_t_valid_for_timestamp(time_t x) {
260 return (static_cast<int64_t>(x) <= static_cast<int64_t>(MYTIME_MAX_VALUE) &&
261 x >= MYTIME_MIN_VALUE);
262}
263
264unsigned int calc_week(const MYSQL_TIME &l_time, unsigned int week_behaviour,
265 unsigned int *year);
266
267bool check_date(const MYSQL_TIME &ltime, bool not_zero_date,
268 my_time_flags_t flags, int *was_cut);
269bool str_to_datetime(const char *str, std::size_t length, MYSQL_TIME *l_time,
271long long int number_to_datetime(long long int nr, MYSQL_TIME *time_res,
272 my_time_flags_t flags, int *was_cut);
273bool number_to_time(long long int nr, MYSQL_TIME *ltime, int *warnings);
274unsigned long long int TIME_to_ulonglong_datetime(const MYSQL_TIME &my_time);
275unsigned long long int TIME_to_ulonglong_date(const MYSQL_TIME &my_time);
276unsigned long long int TIME_to_ulonglong_time(const MYSQL_TIME &my_time);
277unsigned long long int TIME_to_ulonglong(const MYSQL_TIME &my_time);
278
279unsigned long long int TIME_to_ulonglong_datetime_round(
280 const MYSQL_TIME &my_time, int *warnings);
281unsigned long long int TIME_to_ulonglong_time_round(const MYSQL_TIME &my_time);
282
283/**
284 Round any MYSQL_TIME timepoint and convert to ulonglong.
285 @param my_time input
286 @param[out] warnings warning vector
287 @return time point as ulonglong
288 */
289inline unsigned long long int TIME_to_ulonglong_round(const MYSQL_TIME &my_time,
290 int *warnings) {
291 switch (my_time.time_type) {
298 default:
299 assert(false);
300 return 0;
301 }
302}
303
304/**
305 Extract the microsecond part of a MYSQL_TIME struct as an n *
306 (1/10^6) fraction as a double.
307
308 @return microseconds part as double
309 */
310inline double TIME_microseconds(const MYSQL_TIME &my_time) {
311 return static_cast<double>(my_time.second_part) / 1000000.0;
312}
313
314/**
315 Convert a MYSQL_TIME datetime to double where the integral part is
316 the timepoint as an ulonglong, and the fractional part is the
317 fraction of the second.
318
319 @param my_time datetime to convert
320 @return datetime as double
321 */
323 return static_cast<double>(TIME_to_ulonglong_datetime(my_time)) +
325}
326
327/**
328 Convert a MYSQL_TIME time to double where the integral part is
329 the timepoint as an ulonglong, and the fractional part is the
330 fraction of the second.
331
332 @param my_time time to convert
333 @return datetime as double
334 */
336 return static_cast<double>(TIME_to_ulonglong_time(my_time)) +
338}
339
340/**
341 Convert a MYSQL_TIME to double where the integral part is the
342 timepoint as an ulonglong, and the fractional part is the fraction
343 of the second. The actual time type is extracted from
344 MYSQL_TIME::time_type.
345
346 @param my_time MYSQL_TIME to convert
347 @return MYSQL_TIME as double
348 */
349inline double TIME_to_double(const MYSQL_TIME &my_time) {
350 return static_cast<double>(TIME_to_ulonglong(my_time)) +
352}
353
354/**
355 Return the fraction of the second as the number of microseconds.
356
357 @param i timepoint as longlong
358 @return frational part of an timepoint represented as an (u)longlong
359*/
360inline long long int my_packed_time_get_frac_part(long long int i) {
361 return (i % (1LL << 24));
362}
363
364long long int year_to_longlong_datetime_packed(long year);
368long long int TIME_to_longlong_packed(const MYSQL_TIME &my_time);
369
370void TIME_from_longlong_datetime_packed(MYSQL_TIME *ltime, long long int nr);
371void TIME_from_longlong_time_packed(MYSQL_TIME *ltime, long long int nr);
372void TIME_from_longlong_date_packed(MYSQL_TIME *ltime, long long int nr);
373void TIME_set_yymmdd(MYSQL_TIME *ltime, unsigned int yymmdd);
374void TIME_set_hhmmss(MYSQL_TIME *ltime, unsigned int hhmmss);
375
376void my_datetime_packed_to_binary(long long int nr, unsigned char *ptr,
377 unsigned int dec);
378long long int my_datetime_packed_from_binary(const unsigned char *ptr,
379 unsigned int dec);
380
381void my_time_packed_to_binary(long long int nr, unsigned char *ptr,
382 unsigned int dec);
383long long int my_time_packed_from_binary(const unsigned char *ptr,
384 unsigned int dec);
385
386void my_timestamp_to_binary(const my_timeval *tm, unsigned char *ptr,
387 unsigned int dec);
388void my_timestamp_from_binary(my_timeval *tm, const unsigned char *ptr,
389 unsigned int dec);
390
391bool str_to_time(const char *str, std::size_t length, MYSQL_TIME *l_time,
393
398
399/**
400 Check whether the argument holds a valid UNIX time value
401 (seconds after epoch). This function doesn't make precise check, but rather a
402 rough estimate before time zone adjustments.
403
404 @param my_time timepoint to check
405 @returns true if value satisfies the check above, false otherwise.
406*/
408 if (my_time.year < MYTIME_MIN_YEAR || my_time.year > MYTIME_MAX_YEAR)
409 return false;
410
411 return true;
412}
413
415 bool *in_dst_time_gap);
416
417void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type);
418void set_max_time(MYSQL_TIME *tm, bool neg);
419void set_max_hhmmss(MYSQL_TIME *tm);
420
421/**
422 Required buffer length for my_time_to_str, my_date_to_str,
423 my_datetime_to_str and TIME_to_string functions. Note, that the
424 caller is still responsible to check that given TIME structure
425 has values in valid ranges, otherwise size of the buffer might
426 well be insufficient. We also rely on the fact that even incorrect values
427 sent using binary protocol fit in this buffer.
428*/
429constexpr const std::size_t MAX_DATE_STRING_REP_LENGTH =
430 sizeof("YYYY-MM-DD AM HH:MM:SS.FFFFFF+HH:MM");
431
432int my_time_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec);
433int my_date_to_str(const MYSQL_TIME &my_time, char *to);
434int my_datetime_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec);
435int my_TIME_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec);
436
437void my_date_to_binary(const MYSQL_TIME *ltime, unsigned char *ptr);
438int my_timeval_to_str(const my_timeval *tm, char *to, unsigned int dec);
439
440/**
441 Available interval types used in any statement.
442
443 'interval_type' must be sorted so that simple intervals comes first,
444 ie year, quarter, month, week, day, hour, etc. The order based on
445 interval size is also important and the intervals should be kept in a
446 large to smaller order. (get_interval_value() depends on this)
447
448 @note If you change the order of elements in this enum you should fix
449 order of elements in 'interval_type_to_name' and 'interval_names'
450 arrays
451
452 @see interval_type_to_name, get_interval_value, interval_names
453*/
477
478bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type,
479 Interval interval, int *warnings);
480
481/**
482 Round the input argument to the specified precision by computing
483 the remainder modulo log10 of the difference between max and
484 desired precision.
485
486 @param nr number to round
487 @param decimals desired precision
488 @return nr rounded according to the desired precision.
489*/
490inline long my_time_fraction_remainder(long nr, unsigned int decimals) {
491 assert(decimals <= DATETIME_MAX_DECIMALS);
492 return nr % static_cast<long>(log_10_int[DATETIME_MAX_DECIMALS - decimals]);
493}
494
495/**
496 Truncate the number of microseconds in MYSQL_TIME::second_part to
497 the desired precision.
498
499 @param ltime time point
500 @param decimals desired precision
501*/
502inline void my_time_trunc(MYSQL_TIME *ltime, unsigned int decimals) {
503 ltime->second_part -=
504 my_time_fraction_remainder(ltime->second_part, decimals);
505}
506
507/**
508 Alias for my_time_trunc.
509
510 @param ltime time point
511 @param decimals desired precision
512 */
513inline void my_datetime_trunc(MYSQL_TIME *ltime, unsigned int decimals) {
514 return my_time_trunc(ltime, decimals);
515}
516
517/**
518 Truncate the tv_usec member of a posix timeval struct to the
519 specified number of decimals.
520
521 @param tv timepoint/duration
522 @param decimals desired precision
523 */
524inline void my_timeval_trunc(my_timeval *tv, unsigned int decimals) {
525 tv->m_tv_usec -= my_time_fraction_remainder(tv->m_tv_usec, decimals);
526}
527
528/**
529 Predicate for fuzzyness of date.
530
531 @param my_time time point to check
532 @param fuzzydate bitfield indicating if fuzzy dates are premitted
533 @retval true if TIME_FUZZY_DATE is unset and either month or day is 0
534 @retval false otherwise
535 */
537 my_time_flags_t fuzzydate) {
538 return !(fuzzydate & TIME_FUZZY_DATE) && (!my_time.month || !my_time.day);
539}
540
541/**
542 Predicate which returns true if at least one of the date members are non-zero.
543
544 @param my_time time point to check.
545 @retval false if all the date members are zero
546 @retval true otherwise
547 */
548inline bool non_zero_date(const MYSQL_TIME &my_time) {
549 return my_time.year || my_time.month || my_time.day;
550}
551
552/**
553 Predicate which returns true if at least one of the time members are non-zero.
554
555 @param my_time time point to check.
556 @retval false if all the time members are zero
557 @retval true otherwise
558*/
559inline bool non_zero_time(const MYSQL_TIME &my_time) {
560 return my_time.hour || my_time.minute || my_time.second ||
561 my_time.second_part;
562}
563
564/**
565 "Casts" MYSQL_TIME datetime to a MYSQL_TIME time. Sets
566 MYSQL_TIME::time_type to MYSQL_TIMESTAMP_TIME and zeroes out the
567 date members.
568
569 @param ltime timepoint to cast
570 */
571inline void datetime_to_time(MYSQL_TIME *ltime) {
572 ltime->year = 0;
573 ltime->month = 0;
574 ltime->day = 0;
576}
577
578/**
579 "Casts" MYSQL_TIME datetime to a MYSQL_TIME date. Sets
580 MYSQL_TIME::time_type to MYSQL_TIMESTAMP_DATE and zeroes out the
581 time members.
582
583 @param ltime timepoint to cast
584*/
585inline void datetime_to_date(MYSQL_TIME *ltime) {
586 ltime->hour = 0;
587 ltime->minute = 0;
588 ltime->second = 0;
589 ltime->second_part = 0;
591}
592
593/**
594 "Casts" a MYSQL_TIME to datetime by setting MYSQL_TIME::time_type to
595 MYSQL_TIMESTAMP_DATETIME.
596 @note There is no check to ensure that the result is a valid datetime.
597
598 @param ltime timpoint to cast
599*/
600inline void date_to_datetime(MYSQL_TIME *ltime) {
602}
603
605 unsigned int nanoseconds,
606 int *warnings);
608 unsigned int nanoseconds);
610 unsigned int nanoseconds, int *warnings);
611
613 unsigned int nanoseconds,
614 int *warnings);
615
617 unsigned int nanoseconds, int *warnings,
618 bool truncate);
619
621 unsigned int nanoseconds,
622 int *warnings, bool truncate);
623
624bool my_time_adjust_frac(MYSQL_TIME *ltime, unsigned int dec, bool truncate);
625bool my_datetime_adjust_frac(MYSQL_TIME *ltime, unsigned int dec, int *warnings,
626 bool truncate);
627bool my_timeval_round(my_timeval *tv, unsigned int decimals);
629
630void localtime_to_TIME(MYSQL_TIME *to, const struct tm *from);
631void calc_time_from_sec(MYSQL_TIME *to, long long int seconds,
632 long microseconds);
633bool calc_time_diff(const MYSQL_TIME &my_time1, const MYSQL_TIME &my_time2,
634 int l_sign, long long int *seconds_out,
635 long *microseconds_out);
636int my_time_compare(const MYSQL_TIME &my_time_a, const MYSQL_TIME &my_time_b);
637
638long long int TIME_to_longlong_packed(const MYSQL_TIME &my_time,
640
642 long long int packed_value);
643
645 long long int packed_value);
646
648 long long int packed_value);
649
650/**
651 @} (end of ingroup MY_TIME)
652*/
653#endif /* MY_TIME_INCLUDED */
This file contains the field type.
enum_field_types
Column types for MySQL.
Definition: field_types.h:52
static const std::string dec("DECRYPTION")
bool my_time_adjust_frac(MYSQL_TIME *ltime, unsigned int dec, bool truncate)
Round/Truncate time value to the given precision.
Definition: my_time.cc:2570
void TIME_set_yymmdd(MYSQL_TIME *ltime, unsigned int yymmdd)
Set day, month and year from a number.
Definition: my_time.cc:1571
unsigned long long int TIME_to_ulonglong_date(const MYSQL_TIME &my_time)
Convert MYSQL_TIME value to integer in YYYYMMDD format.
Definition: my_time.cc:1547
unsigned int calc_days_in_year(unsigned int year)
Calc days in one year.
Definition: my_time.cc:133
my_time_t my_system_gmt_sec(const MYSQL_TIME &my_time, my_time_t *my_timezone, bool *in_dst_time_gap)
Convert time in MYSQL_TIME representation in system time zone to its my_time_t form (number of second...
Definition: my_time.cc:1078
long long int TIME_to_longlong_time_packed(const MYSQL_TIME &my_time)
Convert time value to numeric packed representation.
Definition: my_time.cc:1688
uint64_t convert_month_to_period(uint64_t month)
Convert month to period.
Definition: my_time.cc:2265
bool datetime_add_nanoseconds_with_round(MYSQL_TIME *ltime, unsigned int nanoseconds, int *warnings)
Add nanoseconds to a datetime value with rounding.
Definition: my_time.cc:2497
unsigned long long int TIME_to_ulonglong(const MYSQL_TIME &my_time)
Convert struct MYSQL_TIME (date and time split into year/month/day/hour/... to a number in format YYY...
Definition: my_time.cc:1610
long long int longlong_from_datetime_packed(enum enum_field_types type, long long int packed_value)
Convert packed numeric representation to unpacked numeric representation.
Definition: my_time.cc:2854
bool str_to_datetime(const char *str, std::size_t length, MYSQL_TIME *l_time, my_time_flags_t flags, MYSQL_TIME_STATUS *status)
Convert a timestamp string to a MYSQL_TIME value.
Definition: my_time.cc:364
void localtime_to_TIME(MYSQL_TIME *to, const struct tm *from)
Converts a timepoint in a posix tm struct to a MYSQL_TIME struct.
Definition: my_time.cc:2675
bool calc_time_diff(const MYSQL_TIME &my_time1, const MYSQL_TIME &my_time2, int l_sign, long long int *seconds_out, long *microseconds_out)
Calculate difference between two datetime values as seconds + microseconds.
Definition: my_time.cc:2727
bool datetime_add_nanoseconds_adjust_frac(MYSQL_TIME *ltime, unsigned int nanoseconds, int *warnings, bool truncate)
Add nanoseconds to datetime and round or truncate as indicated by argument.
Definition: my_time.cc:2549
void TIME_from_longlong_time_packed(MYSQL_TIME *ltime, long long int nr)
Convert time packed numeric representation to time.
Definition: my_time.cc:1702
bool datetime_add_nanoseconds_with_truncate(MYSQL_TIME *ltime, unsigned int nanoseconds)
Add nanoseconds to a datetime value with truncation.
Definition: my_time.cc:2434
unsigned long long int TIME_to_ulonglong_time(const MYSQL_TIME &my_time)
Convert MYSQL_TIME value to integer in HHMMSS format.
Definition: my_time.cc:1560
void set_max_time(MYSQL_TIME *tm, bool neg)
Set MYSQL_TIME variable to maximum time value.
Definition: my_time.cc:163
bool time_zone_displacement_to_seconds(const char *str, size_t length, int *result)
Parses a time zone displacement string on the form {+-}HH:MM, converting to seconds.
Definition: my_time.cc:276
void my_timestamp_from_binary(my_timeval *tm, const unsigned char *ptr, unsigned int dec)
Convert binary timestamp representation to in-memory representation.
Definition: my_time.cc:2015
const char my_zero_datetime6[]
Definition: my_time.cc:83
bool check_date(const MYSQL_TIME &ltime, bool not_zero_date, my_time_flags_t flags, int *was_cut)
Check datetime value for validity according to flags.
Definition: my_time.cc:188
long long int year_to_longlong_datetime_packed(long year)
Convert year to packed numeric date representation.
Definition: my_time.cc:1886
void set_max_hhmmss(MYSQL_TIME *tm)
Set hour, minute and second of a MYSQL_TIME variable to maximum time value.
Definition: my_time.cc:152
int my_time_compare(const MYSQL_TIME &my_time_a, const MYSQL_TIME &my_time_b)
Compare tow MYSQL_TIME objects.
Definition: my_time.cc:2781
void TIME_from_longlong_date_packed(MYSQL_TIME *ltime, long long int nr)
Convert packed numeric date representation to MYSQL_TIME.
Definition: my_time.cc:1930
bool my_datetime_adjust_frac(MYSQL_TIME *ltime, unsigned int dec, int *warnings, bool truncate)
Round/Truncate datetime value to the given precision.
Definition: my_time.cc:2592
bool check_time_range_quick(const MYSQL_TIME &my_time)
Check TIME range.
Definition: my_time.cc:234
void my_init_time()
Prepare offset of system time zone from UTC for my_system_gmt_sec() func.
Definition: my_time.cc:996
bool check_datetime_range(const MYSQL_TIME &my_time)
Check datetime, date, or normalized time (i.e.
Definition: my_time.cc:251
void calc_time_from_sec(MYSQL_TIME *to, long long int seconds, long microseconds)
Initialize MYSQL_TIME with MYSQL_TIMESTAMP_TIME from given number of seconds and microseconds.
Definition: my_time.cc:2691
long long int TIME_to_longlong_packed(const MYSQL_TIME &my_time)
Convert a temporal value to packed numeric temporal representation, depending on its time_type.
Definition: my_time.cc:2087
void mix_date_and_time(MYSQL_TIME *ldate, const MYSQL_TIME &my_time)
Mix a date value and a time value.
Definition: my_time.cc:2634
void adjust_time_range(MYSQL_TIME *, int *warning)
Adjust 'time' value to lie in the MYSQL_TIME range.
Definition: my_time.cc:984
int my_date_to_str(const MYSQL_TIME &my_time, char *to)
Converts a date value to a string with the format 'YYYY-MM-DD'.
Definition: my_time.cc:1312
const unsigned long long int log_10_int[20]
Definition: my_time.cc:62
const unsigned char days_in_month[]
Definition: my_time.cc:89
long long int my_datetime_packed_from_binary(const unsigned char *ptr, unsigned int dec)
Convert on-disk datetime representation to in-memory packed numeric representation.
Definition: my_time.cc:1949
unsigned int year_2000_handling(unsigned int year)
Handle 2 digit year conversions.
Definition: my_time.cc:1025
unsigned long long int TIME_to_ulonglong_time_round(const MYSQL_TIME &my_time)
Round MYSQL_TIME time value and convert to to ulonglong representation.
Definition: my_time.cc:1652
void get_date_from_daynr(int64_t daynr, unsigned int *year, unsigned int *month, unsigned int *day)
Change a daynr to year, month and day.
Definition: my_time.cc:2112
void TIME_from_longlong_packed(MYSQL_TIME *ltime, enum enum_field_types type, long long int packed_value)
Convert packed numeric temporal representation to time, date or datetime, using field type.
Definition: my_time.cc:2825
bool date_add_interval(MYSQL_TIME *ltime, interval_type int_type, Interval interval, int *warnings)
Add an interval to a MYSQL_TIME struct.
Definition: my_time.cc:2280
void my_date_to_binary(const MYSQL_TIME *ltime, unsigned char *ptr)
Convert in-memory date representation to on-disk representation.
Definition: my_time.cc:2075
unsigned long long int TIME_to_ulonglong_datetime(const MYSQL_TIME &my_time)
Convert time value to integer in YYYYMMDDHHMMSS.
Definition: my_time.cc:1533
int my_datetime_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec)
Print a datetime value with an optional fractional part.
Definition: my_time.cc:1366
bool my_timeval_round(my_timeval *tv, unsigned int decimals)
Round timeval value to the given precision.
Definition: my_time.cc:2610
void TIME_set_hhmmss(MYSQL_TIME *ltime, unsigned int hhmmss)
Set hour, minute and secondr from a number.
Definition: my_time.cc:1583
unsigned long long int TIME_to_ulonglong_datetime_round(const MYSQL_TIME &my_time, int *warnings)
Round MYSQL_TIME datetime value and convert to ulonglong representation.
Definition: my_time.cc:1635
long long int TIME_to_longlong_datetime_packed(const MYSQL_TIME &my_time)
Convert datetime to packed numeric datetime representation.
Definition: my_time.cc:1859
bool time_add_nanoseconds_with_truncate(MYSQL_TIME *ltime, unsigned int nanoseconds, int *warnings)
Add nanoseconds to a time value with truncation.
Definition: my_time.cc:2414
bool number_to_time(long long int nr, MYSQL_TIME *ltime, int *warnings)
Convert number to TIME.
Definition: my_time.cc:943
double double_from_datetime_packed(enum enum_field_types type, long long int packed_value)
Convert packed numeric temporal representation to unpacked numeric representation.
Definition: my_time.cc:2884
void my_time_packed_to_binary(long long int nr, unsigned char *ptr, unsigned int dec)
Convert in-memory numeric time representation to on-disk representation.
Definition: my_time.cc:1733
uint64_t convert_period_to_month(uint64_t period)
Calculate month from period.
Definition: my_time.cc:2248
void set_zero_time(MYSQL_TIME *tm, enum enum_mysql_timestamp_type time_type)
Set MYSQL_TIME structure to 0000-00-00 00:00:00.000000.
Definition: my_time.cc:143
bool str_to_time(const char *str, std::size_t length, MYSQL_TIME *l_time, MYSQL_TIME_STATUS *status, my_time_flags_t flags=0)
Convert a time string to a MYSQL_TIME struct.
Definition: my_time.cc:736
long long int number_to_datetime(long long int nr, MYSQL_TIME *time_res, my_time_flags_t flags, int *was_cut)
Convert datetime value specified as number to broken-down TIME representation and form value of DATET...
Definition: my_time.cc:1452
long long int my_time_packed_from_binary(const unsigned char *ptr, unsigned int dec)
Convert on-disk time representation to in-memory packed numeric representation.
Definition: my_time.cc:1773
bool time_add_nanoseconds_with_round(MYSQL_TIME *ltime, unsigned int nanoseconds, int *warnings)
Add nanoseconds to a time value with rounding.
Definition: my_time.cc:2453
void my_datetime_packed_to_binary(long long int nr, unsigned char *ptr, unsigned int dec)
Store in-memory numeric packed datetime representation to disk.
Definition: my_time.cc:1980
int my_timeval_to_str(const my_timeval *tm, char *to, unsigned int dec)
Print a timestamp with an oprional fractional part: XXXXX[.YYYYY].
Definition: my_time.cc:1416
bool check_time_mmssff_range(const MYSQL_TIME &my_time)
Check if TIME fields can be adjusted to make the time value valid.
Definition: my_time.cc:217
long calc_daynr(unsigned int year, unsigned int month, unsigned int day)
Calculate nr of day since year 0 in new date-system (from 1615).
Definition: my_time.cc:1041
void TIME_from_longlong_datetime_packed(MYSQL_TIME *ltime, long long int nr)
Convert packed numeric datetime representation to MYSQL_TIME.
Definition: my_time.cc:1897
int calc_weekday(long daynr, bool sunday_first_day_of_week)
Calc weekday from daynr.
Definition: my_time.cc:2155
unsigned int calc_week(const MYSQL_TIME &l_time, unsigned int week_behaviour, unsigned int *year)
Calculate the week number from a MYSQL_TIME value.
Definition: my_time.cc:2197
bool time_add_nanoseconds_adjust_frac(MYSQL_TIME *ltime, unsigned int nanoseconds, int *warnings, bool truncate)
Add nanoseconds to time and round or truncate as indicated by argument.
Definition: my_time.cc:2531
int my_TIME_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec)
Convert struct DATE/TIME/DATETIME value to string using built-in MySQL time conversion formats.
Definition: my_time.cc:1389
long long int TIME_to_longlong_date_packed(const MYSQL_TIME &my_time)
Convert date to packed numeric date representation.
Definition: my_time.cc:1875
void my_timestamp_to_binary(const my_timeval *tm, unsigned char *ptr, unsigned int dec)
Convert in-memory timestamp representation to on-disk representation.
Definition: my_time.cc:2044
int my_time_to_str(const MYSQL_TIME &my_time, char *to, unsigned int dec)
Converts a time value to a string with the format HH:MM:SS[.fraction].
Definition: my_time.cc:1282
static int flags[50]
Definition: hp_test1.cc:39
time_t my_time(int)
Return current time.
Definition: my_systime.h:170
constexpr const int MYTIME_MIN_YEAR
Definition: my_time.h:67
void my_time_trunc(MYSQL_TIME *ltime, unsigned int decimals)
Truncate the number of microseconds in MYSQL_TIME::second_part to the desired precision.
Definition: my_time.h:502
constexpr const int DAYS_PER_LYEAR
Definition: my_time.h:149
void date_to_datetime(MYSQL_TIME *ltime)
"Casts" a MYSQL_TIME to datetime by setting MYSQL_TIME::time_type to MYSQL_TIMESTAMP_DATETIME.
Definition: my_time.h:600
constexpr const bool HAVE_64_BITS_TIME_T
Definition: my_time.h:59
constexpr const my_time_flags_t TIME_NO_ZERO_IN_DATE
Don't allow zero day or zero month.
Definition: my_time.h:105
constexpr const int YY_PART_YEAR
Two-digit years < this are 20XX; >= this are 19XX.
Definition: my_time.h:66
bool validate_my_time(const MYSQL_TIME &my_time)
Check whether the argument holds a valid UNIX time value (seconds after epoch).
Definition: my_time.h:407
long long int my_packed_time_get_frac_part(long long int i)
Return the fraction of the second as the number of microseconds.
Definition: my_time.h:360
void my_datetime_trunc(MYSQL_TIME *ltime, unsigned int decimals)
Alias for my_time_trunc.
Definition: my_time.h:513
constexpr const int MYSQL_TIME_WARN_INVALID_TIMESTAMP
Definition: my_time.h:119
constexpr const my_time_flags_t TIME_INVALID_DATES
Allow 2000-02-31.
Definition: my_time.h:111
double TIME_to_double(const MYSQL_TIME &my_time)
Convert a MYSQL_TIME to double where the integral part is the timepoint as an ulonglong,...
Definition: my_time.h:349
double TIME_to_double_time(const MYSQL_TIME &my_time)
Convert a MYSQL_TIME time to double where the integral part is the timepoint as an ulonglong,...
Definition: my_time.h:335
constexpr const int MYSQL_TIME_NOTE_TRUNCATED
Definition: my_time.h:121
bool non_zero_date(const MYSQL_TIME &my_time)
Predicate which returns true if at least one of the date members are non-zero.
Definition: my_time.h:548
constexpr const int TIMESTAMP_MAX_YEAR
Definition: my_time.h:63
constexpr const int MYSQL_TIME_WARN_TRUNCATED
Conversion warnings.
Definition: my_time.h:117
constexpr const unsigned int WEEK_FIRST_WEEKDAY
Definition: my_time.h:159
constexpr const int MINS_PER_HOUR
Definition: my_time.h:145
constexpr const my_time_flags_t TIME_DATETIME_ONLY
Only allow full datetimes.
Definition: my_time.h:99
constexpr const int TIME_MAX_HOUR
Limits for the TIME data type.
Definition: my_time.h:129
constexpr const unsigned int WEEK_YEAR
Definition: my_time.h:158
constexpr const my_time_t MYTIME_MAX_VALUE
max seconds from epoch of host's time_t stored in my_time_t Windows allows up to 3001-01-18 23:59:59 ...
Definition: my_time.h:74
double TIME_microseconds(const MYSQL_TIME &my_time)
Extract the microsecond part of a MYSQL_TIME struct as an n * (1/10^6) fraction as a double.
Definition: my_time.h:310
constexpr const my_time_flags_t TIME_NO_ZERO_DATE
Don't allow 0000-00-00 date.
Definition: my_time.h:108
constexpr const int DATETIME_MAX_DECIMALS
Definition: my_time.h:142
constexpr const int MAX_TIME_ZONE_HOURS
Definition: my_time.h:154
constexpr const int MYSQL_TIME_WARN_DATETIME_OVERFLOW
Definition: my_time.h:123
constexpr const int HOURS_PER_DAY
Definition: my_time.h:146
constexpr const int TIME_MAX_MINUTE
Definition: my_time.h:130
bool check_fuzzy_date(const MYSQL_TIME &my_time, my_time_flags_t fuzzydate)
Predicate for fuzzyness of date.
Definition: my_time.h:536
constexpr const int64_t MAX_DAY_NUMBER
Daynumber from year 0 to 9999-12-31.
Definition: my_time.h:162
constexpr const int DAYS_PER_NYEAR
Definition: my_time.h:148
void my_timeval_trunc(my_timeval *tv, unsigned int decimals)
Truncate the tv_usec member of a posix timeval struct to the specified number of decimals.
Definition: my_time.h:524
void datetime_to_date(MYSQL_TIME *ltime)
"Casts" MYSQL_TIME datetime to a MYSQL_TIME date.
Definition: my_time.h:585
constexpr const int SECS_PER_DAY
Definition: my_time.h:151
constexpr const int MYSQL_TIME_WARN_ZERO_IN_DATE
Definition: my_time.h:122
constexpr const my_time_flags_t TIME_FUZZY_DATE
Allow zero day and zero month.
Definition: my_time.h:96
long my_time_fraction_remainder(long nr, unsigned int decimals)
Round the input argument to the specified precision by computing the remainder modulo log10 of the di...
Definition: my_time.h:490
constexpr const int TIME_MAX_VALUE
Note that this MUST be a signed type, as we use the unary - operator on it.
Definition: my_time.h:136
bool is_time_t_valid_for_timestamp(time_t x)
Check for valid my_time_t value.
Definition: my_time.h:259
constexpr const int TIME_MAX_VALUE_SECONDS
Definition: my_time.h:139
constexpr const int64_t SECONDS_IN_24H
Useful constants.
Definition: my_time.h:126
constexpr const int TIME_MAX_SECOND
Definition: my_time.h:131
double TIME_to_double_datetime(const MYSQL_TIME &my_time)
Convert a MYSQL_TIME datetime to double where the integral part is the timepoint as an ulonglong,...
Definition: my_time.h:322
void datetime_to_time(MYSQL_TIME *ltime)
"Casts" MYSQL_TIME datetime to a MYSQL_TIME time.
Definition: my_time.h:571
unsigned long long int TIME_to_ulonglong_round(const MYSQL_TIME &my_time, int *warnings)
Round any MYSQL_TIME timepoint and convert to ulonglong.
Definition: my_time.h:289
constexpr const int MYTIME_MIN_VALUE
Zero represents the first time value we allow, i.e.
Definition: my_time.h:83
constexpr const std::int64_t TYPE_TIMESTAMP_MIN_VALUE
Definition: my_time.h:90
constexpr const my_time_flags_t TIME_NO_DATE_FRAC_WARN
Definition: my_time.h:102
constexpr const int MYTIME_MAX_YEAR
Time handling defaults.
Definition: my_time.h:62
constexpr const std::int64_t TYPE_TIMESTAMP_MAX_VALUE
max seconds from epoch that can be stored in a column of type TIMESTAMP.
Definition: my_time.h:88
bool non_zero_time(const MYSQL_TIME &my_time)
Predicate which returns true if at least one of the time members are non-zero.
Definition: my_time.h:559
constexpr const int MYSQL_TIME_WARN_OUT_OF_RANGE
Definition: my_time.h:118
constexpr const int MONS_PER_YEAR
Definition: my_time.h:152
bool valid_period(long long int period)
unsigned int my_time_flags_t
Flags to str_to_datetime and number_to_datetime.
Definition: my_time.h:93
constexpr const unsigned int WEEK_MONDAY_FIRST
Flags for calc_week() function.
Definition: my_time.h:157
constexpr const std::size_t MAX_DATE_STRING_REP_LENGTH
Required buffer length for my_time_to_str, my_date_to_str, my_datetime_to_str and TIME_to_string func...
Definition: my_time.h:429
constexpr const int MYSQL_TIME_WARN_ZERO_DATE
Definition: my_time.h:120
constexpr const int DAYS_PER_WEEK
Definition: my_time.h:147
constexpr const my_time_flags_t TIME_FRAC_TRUNCATE
Definition: my_time.h:101
interval_type
Available interval types used in any statement.
Definition: my_time.h:454
@ INTERVAL_HOUR_SECOND
Definition: my_time.h:469
@ INTERVAL_MONTH
Definition: my_time.h:457
@ INTERVAL_HOUR_MICROSECOND
Definition: my_time.h:472
@ INTERVAL_MINUTE
Definition: my_time.h:461
@ INTERVAL_HOUR_MINUTE
Definition: my_time.h:468
@ INTERVAL_DAY
Definition: my_time.h:459
@ INTERVAL_LAST
Definition: my_time.h:475
@ INTERVAL_MINUTE_MICROSECOND
Definition: my_time.h:473
@ INTERVAL_MINUTE_SECOND
Definition: my_time.h:470
@ INTERVAL_QUARTER
Definition: my_time.h:456
@ INTERVAL_YEAR
Definition: my_time.h:455
@ INTERVAL_WEEK
Definition: my_time.h:458
@ INTERVAL_DAY_MICROSECOND
Definition: my_time.h:471
@ INTERVAL_SECOND_MICROSECOND
Definition: my_time.h:474
@ INTERVAL_SECOND
Definition: my_time.h:462
@ INTERVAL_DAY_HOUR
Definition: my_time.h:465
@ INTERVAL_HOUR
Definition: my_time.h:460
@ INTERVAL_YEAR_MONTH
Definition: my_time.h:464
@ INTERVAL_DAY_SECOND
Definition: my_time.h:467
@ INTERVAL_MICROSECOND
Definition: my_time.h:463
@ INTERVAL_DAY_MINUTE
Definition: my_time.h:466
constexpr const int SECS_PER_MIN
Definition: my_time.h:144
constexpr const int SECS_PER_HOUR
Definition: my_time.h:150
constexpr const my_time_flags_t TIME_STRICT_COLON
Allow only HH:MM:SS or MM:SS time formats.
Definition: my_time.h:114
int64_t my_time_t
Portable time_t replacement.
Definition: my_time_t.h:31
Time declarations shared between the server and client API: you should not add anything to this heade...
enum_mysql_timestamp_type
Definition: mysql_time.h:44
@ MYSQL_TIMESTAMP_TIME
Stores hour, minute, second and microsecond.
Definition: mysql_time.h:59
@ MYSQL_TIMESTAMP_DATETIME
Stores all date and time components.
Definition: mysql_time.h:56
@ MYSQL_TIMESTAMP_DATE
Stores year, month and day components.
Definition: mysql_time.h:49
static int interval
Definition: mysqladmin.cc:64
void warning(const char *format,...)
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1063
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:75
Cursor end()
A past-the-end Cursor.
Definition: rules_table_service.cc:191
required uint32 status
Definition: replication_asynchronous_connection_failover.proto:60
required string type
Definition: replication_group_member_actions.proto:33
Struct representing a duration.
Definition: my_time.h:227
bool neg
Definition: my_time.h:235
unsigned long long int second
Definition: my_time.h:233
unsigned long long int second_part
Definition: my_time.h:234
unsigned long int hour
Definition: my_time.h:231
unsigned long int day
Definition: my_time.h:230
unsigned long int month
Definition: my_time.h:229
unsigned long int year
Definition: my_time.h:228
unsigned long long int minute
Definition: my_time.h:232
Definition: my_time.h:173
DEPR_KIND
Definition: my_time.h:174
@ DP_SUPERFLUOUS
Definition: my_time.h:178
@ DP_WRONG_SPACE
Definition: my_time.h:177
@ DP_NONE
Definition: my_time.h:175
@ DP_WRONG_KIND
Definition: my_time.h:176
char m_delim_seen
Definition: my_time.h:180
char m_arg[40]
Definition: my_time.h:183
enum MYSQL_TIME_STATUS::DEPRECATION::DEPR_KIND DP_NONE
int m_position
Definition: my_time.h:182
bool m_colon
Definition: my_time.h:181
Structure to return status from str_to_datetime(), str_to_time(), number_to_datetime(),...
Definition: my_time.h:169
unsigned int nanoseconds
Definition: my_time.h:172
MYSQL_TIME_STATUS()=default
struct MYSQL_TIME_STATUS::DEPRECATION m_deprecation
Register wrong delimiter if it's the first we see for this value.
void squelch_deprecation()
Definition: my_time.h:220
void set_deprecation(DEPRECATION::DEPR_KIND kind, const char *arg, const char *end, const char *delim, bool colon=false)
Definition: my_time.h:191
MYSQL_TIME_STATUS & operator=(const MYSQL_TIME_STATUS &b)
Assignment: don't clobber an existing deprecation, first one wins.
Definition: my_time.h:210
int warnings
Definition: my_time.h:170
unsigned int fractional_digits
Definition: my_time.h:171
MYSQL_TIME_STATUS(const MYSQL_TIME_STATUS &)=default
Definition: mysql_time.h:81
unsigned long second_part
microseconds
Definition: mysql_time.h:83
unsigned int second
Definition: mysql_time.h:82
enum enum_mysql_timestamp_type time_type
Definition: mysql_time.h:85
unsigned int hour
Definition: mysql_time.h:82
unsigned int minute
Definition: mysql_time.h:82
unsigned int month
Definition: mysql_time.h:82
unsigned int day
Definition: mysql_time.h:82
unsigned int year
Definition: mysql_time.h:82
Replacement of system's struct timeval to ensure we can carry 64 bit values even on a platform which ...
Definition: my_time_t.h:44
int64_t m_tv_usec
Definition: my_time_t.h:46
Definition: result.h:29
double seconds()
Definition: task.cc:309
Include file for Sun RPC to compile out of the box.