MySQL  8.0.23
Source Code Documentation
sql_time.h
Go to the documentation of this file.
1 /* Copyright (c) 2006, 2020, 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 SQL_TIME_INCLUDED
24 #define SQL_TIME_INCLUDED
25 
26 /**
27  @ingroup SQL_TIME
28  @{
29 
30  @file sql/sql_time.h
31 
32  Interface for server time utilities.
33 */
34 
35 #include "my_config.h"
36 
37 #include <stddef.h>
38 #ifdef HAVE_SYS_TIME_H
39 #include <sys/time.h>
40 #endif
41 #include <sys/types.h>
42 
43 #include "field_types.h" // enum_field_types
44 #include "lex_string.h"
45 #include "m_ctype.h"
46 #include "my_dbug.h"
47 #include "my_inttypes.h"
48 #include "my_time.h"
49 #include "mysql_time.h" /* enum_mysql_timestamp_type */
50 #include "sql/sql_error.h" /* Sql_condition */
51 #include "sql_string.h"
52 
53 class THD;
54 class Time_zone;
55 class my_decimal;
56 
57 /**
58  Representation of time formats.
59  */
63 };
64 
65 /**
66  Collection of strings describing date/time formats.
67  */
69  const char *format_name;
70  const char *date_format;
71  const char *datetime_format;
72  const char *time_format;
73 };
74 
76  bool *not_exist);
78  const Time_zone &tz,
79  struct timeval *tm,
80  int *warnings);
81 bool datetime_to_timeval(const MYSQL_TIME *t, const Time_zone &tz,
82  struct timeval *tm, int *warnings);
87 bool my_double_to_datetime_with_warn(double nr, MYSQL_TIME *ltime,
91 bool my_decimal_to_time_with_warn(const my_decimal *decimal, MYSQL_TIME *ltime);
92 bool my_double_to_time_with_warn(double nr, MYSQL_TIME *ltime);
94 bool str_to_time_with_warn(String *str, MYSQL_TIME *l_time);
95 void time_to_datetime(THD *thd, const MYSQL_TIME *tm, const Time_zone &tz,
96  MYSQL_TIME *dt);
97 void time_to_datetime(THD *thd, const MYSQL_TIME *in, MYSQL_TIME *out);
98 
101  const ErrConvString &val,
102  enum_mysql_timestamp_type time_type,
103  const char *field_name);
104 
105 const char *get_date_time_format_str(const Known_date_time_format *format,
107 void make_date(const Date_time_format *format, const MYSQL_TIME *l_time,
108  String *str);
109 void make_time(const Date_time_format *format, const MYSQL_TIME *l_time,
110  String *str, uint dec);
111 void make_datetime(const Date_time_format *format, const MYSQL_TIME *l_time,
112  String *str, uint dec);
113 bool my_TIME_to_str(const MYSQL_TIME *ltime, String *str, uint dec);
114 
115 void propagate_datetime_overflow_helper(THD *thd, int *warnings);
116 
117 /**
118  Wrapper function which will propagate any DATETIME_OVERFLOW warnings
119  to the THD. Overload for the case where a warnings bitset already
120  exists which can be inspected before the value of the mysys
121  function is passed on.
122 
123  @param thd Thread context
124  @param warnings bitset used mysys function
125  @param t value mysys function which is passed on
126  @returns t
127  */
128 template <class T>
129 inline T propagate_datetime_overflow(THD *thd, int *warnings, T t) {
130  propagate_datetime_overflow_helper(thd, warnings);
131  return t;
132 }
133 
134 /**
135  Wrapper function which will propagate any DATETIME_OVERFLOW warnings
136  to the THD. Overload for the case when a warnings bitset must be
137  created and inspected to call a mysys function. The mysys function
138  must be invoked by the closure argument which invoked with a
139  pointer to the warnings bitset as argument.
140 
141  @param thd Thread context
142  @param clos closure to call with empty warnings bitset
143  @return return value of closure
144  */
145 template <class CLOS>
146 inline auto propagate_datetime_overflow(THD *thd, CLOS &&clos) {
147  int warnings = 0;
148  return propagate_datetime_overflow(thd, &warnings, clos(&warnings));
149 }
150 
152  interval_type int_type, Interval interval);
153 
154 bool str_to_time(const CHARSET_INFO *cs, const char *str, size_t length,
157 
158 /**
159  Converts a time String value to MYSQL_TIME. Forwards to the version
160  taking an explicit charset, c-string and length.
161 
162  @return False on success, true on error.
163  */
164 inline bool str_to_time(const String *str, MYSQL_TIME *ltime,
166  return str_to_time(str->charset(), str->ptr(), str->length(), ltime, flags,
167  status);
168 }
169 
170 bool str_to_datetime(const CHARSET_INFO *cs, const char *str, size_t length,
173 
174 /**
175  Converts a datetime String value to MYSQL_TIME. Forwards to the
176  version taking an explicit charset, c-string and length.
177 
178  @return False on success, true on error.
179 */
180 inline bool str_to_datetime(const String *str, MYSQL_TIME *ltime,
182  return str_to_datetime(str->charset(), str->ptr(), str->length(), ltime,
183  flags, status);
184 }
185 
186 extern const LEX_CSTRING interval_type_to_name[];
187 
189  enum enum_field_types type,
190  longlong packed_value);
191 
192 /**
193  Return the timstamp value corresponding the field type passed as argument.
194 
195  @param type field type
196  @return corresponding timestamp type
197  */
199  enum enum_field_types type) {
200  switch (type) {
201  case MYSQL_TYPE_TIME:
202  return MYSQL_TIMESTAMP_TIME;
203  case MYSQL_TYPE_DATE:
204  return MYSQL_TIMESTAMP_DATE;
206  case MYSQL_TYPE_DATETIME:
208  default:
209  return MYSQL_TIMESTAMP_NONE;
210  }
211 }
212 
213 /**
214  This function gets GMT time and adds value of time_zone to get
215  the local time. This function is used when server wants a timestamp
216  value from dictionary system.
217 
218  @return time converted to local time
219 */
220 
222 
223 /**
224  In lieu of a proper constructor for the C struct MYSQL_TIME, this method
225  initializes the struct.
226 */
227 MYSQL_TIME my_time_set(uint y, uint m, uint d, uint h, uint mi, uint s,
228  unsigned long ms, bool negative,
230 /**
231  Return the number of significant second fraction decimals in ts, e.g.
232  for ts->second_part == 120300, return 4.
233 
234  @param ts the time value for which we wnat the number of decmals
235  @return the number of decimals
236 */
237 uint actual_decimals(const MYSQL_TIME *ts);
238 
239 /**
240  For a time fraction with a given number of decimals, return maximum fraction,
241  if any, can be are present in a time value. For example, if 2 decimals are
242  specified, return 990000. If none, 0.
243 
244  @param decimals the number of decimals
245  @return the maximum fraction
246 */
247 size_t max_fraction(uint decimals);
248 
249 /**
250  @} (end of ingroup SQL_TIME)
251 */
252 
253 #endif /* SQL_TIME_INCLUDED */
make_time
void make_time(const Date_time_format *format, const MYSQL_TIME *l_time, String *str, uint dec)
Convert TIME value to String.
Definition: sql_time.cc:601
actual_decimals
uint actual_decimals(const MYSQL_TIME *ts)
Return the number of significant second fraction decimals in ts, e.g.
Definition: sql_time.cc:791
my_longlong_to_time_with_warn
bool my_longlong_to_time_with_warn(longlong nr, MYSQL_TIME *ltime)
Convert longlong number to TIME.
Definition: sql_time.cc:398
MYSQL_LEX_CSTRING
Definition: mysql_lex_string.h:39
MYSQL_TIMESTAMP_TIME
@ MYSQL_TIMESTAMP_TIME
Stores hour, minute, second and microsecond.
Definition: mysql_time.h:59
String::ptr
const char * ptr() const
Definition: sql_string.h:246
THD
Definition: sql_class.h:807
make_truncated_value_warning
bool make_truncated_value_warning(THD *thd, Sql_condition::enum_severity_level level, const ErrConvString &val, enum_mysql_timestamp_type time_type, const char *field_name)
Create and add a truncated value warning to the THD.
Definition: sql_time.cc:653
String::charset
const CHARSET_INFO * charset() const
Definition: sql_string.h:237
str_to_time
bool str_to_time(const CHARSET_INFO *cs, const char *str, size_t length, MYSQL_TIME *l_time, my_time_flags_t flags, MYSQL_TIME_STATUS *status)
Character set-aware version of str_to_time().
Definition: sql_time.cc:125
field_types.h
This file contains the field type.
Known_date_time_format::date_format
const char * date_format
Definition: sql_time.h:70
my_decimal_to_datetime_with_warn
bool my_decimal_to_datetime_with_warn(const my_decimal *decimal, MYSQL_TIME *ltime, my_time_flags_t flags)
Convert decimal value to datetime value with a warning.
Definition: sql_time.cc:234
my_time_set
MYSQL_TIME my_time_set(uint y, uint m, uint d, uint h, uint mi, uint s, unsigned long ms, bool negative, enum_mysql_timestamp_type type)
In lieu of a proper constructor for the C struct MYSQL_TIME, this method initializes the struct.
Definition: sql_time.cc:785
str_to_datetime
bool str_to_datetime(const CHARSET_INFO *cs, const char *str, size_t length, MYSQL_TIME *l_time, my_time_flags_t flags, MYSQL_TIME_STATUS *status)
Character set-aware version of str_to_datetime().
Definition: sql_time.cc:146
CHARSET_INFO
Definition: m_ctype.h:354
sql_string.h
my_dbug.h
MYSQL_TYPE_DATETIME
@ MYSQL_TYPE_DATETIME
Definition: field_types.h:69
String
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:164
datetime_to_timeval
bool datetime_to_timeval(const MYSQL_TIME *t, const Time_zone &tz, struct timeval *tm, int *warnings)
Convert a datetime MYSQL_TIME representation to corresponding "struct timeval" value.
Definition: sql_time.cc:503
sql_error.h
my_time_t
[] long int my_time_t
Portable time_t replacement.
longlong
long long int longlong
Definition: my_inttypes.h:54
MYSQL_TIMESTAMP_DATETIME
@ MYSQL_TIMESTAMP_DATETIME
Stores all date and time components.
Definition: mysql_time.h:56
my_decimal_to_time_with_warn
bool my_decimal_to_time_with_warn(const my_decimal *decimal, MYSQL_TIME *ltime)
Convert decimal number to TIME.
Definition: sql_time.cc:340
max_fraction
size_t max_fraction(uint decimals)
For a time fraction with a given number of decimals, return maximum fraction, if any,...
Definition: sql_time.cc:800
Sql_condition::enum_severity_level
enum_severity_level
Enumeration value describing the severity of the condition.
Definition: sql_error.h:58
MYSQL_TIMESTAMP_DATE
@ MYSQL_TIMESTAMP_DATE
Stores year, month and day components.
Definition: mysql_time.h:49
my_config.h
Known_date_time_format::datetime_format
const char * datetime_format
Definition: sql_time.h:71
propagate_datetime_overflow
T propagate_datetime_overflow(THD *thd, int *warnings, T t)
Wrapper function which will propagate any DATETIME_OVERFLOW warnings to the THD.
Definition: sql_time.h:129
Known_date_time_format::time_format
const char * time_format
Definition: sql_time.h:72
date_add_interval_with_warn
bool date_add_interval_with_warn(THD *, MYSQL_TIME *ltime, interval_type int_type, Interval interval)
Uses propagate_datetime_overflow() to handle and propagate any warnings from date_add_interval() to t...
Definition: sql_time.cc:701
str_to_datetime_with_warn
bool str_to_datetime_with_warn(String *str, MYSQL_TIME *l_time, my_time_flags_t flags)
Convert a timestamp string to a MYSQL_TIME value and produce a warning if string was truncated during...
Definition: sql_time.cc:171
my_TIME_to_str
bool my_TIME_to_str(const MYSQL_TIME *ltime, String *str, uint dec)
Convert TIME/DATE/DATETIME value to String.
Definition: sql_time.cc:641
status
static STATUS status
Definition: mysql.cc:200
my_inttypes.h
my_double_to_time_with_warn
bool my_double_to_time_with_warn(double nr, MYSQL_TIME *ltime)
Convert double number to TIME.
Definition: sql_time.cc:370
propagate_datetime_overflow_helper
void propagate_datetime_overflow_helper(THD *thd, int *warnings)
Propagates a DATETIME_OVERFLOW warning from warnings bitfield to DA in thd.
Definition: sql_time.cc:714
MYSQL_TIMESTAMP_NONE
@ MYSQL_TIMESTAMP_NONE
Definition: mysql_time.h:45
m_ctype.h
MYSQL_TYPE_TIME
@ MYSQL_TYPE_TIME
Definition: field_types.h:68
lex_string.h
cs
Definition: commit_order_queue.h:33
interval_type_to_name
const LEX_CSTRING interval_type_to_name[]
Name description of interval names used in statements.
Definition: sql_time.cc:67
MYSQL_TYPE_DATE
@ MYSQL_TYPE_DATE
Definition: field_types.h:67
time.h
enum_field_types
enum_field_types
Column types for MySQL.
Definition: field_types.h:57
uint
unsigned int uint
Definition: uca-dump.cc:29
time_to_datetime
void time_to_datetime(THD *thd, const MYSQL_TIME *tm, const Time_zone &tz, MYSQL_TIME *dt)
interval_type
interval_type
Available interval types used in any statement.
Definition: my_time.h:403
str_to_time_with_warn
bool str_to_time_with_warn(String *str, MYSQL_TIME *l_time)
Convert a time string to a MYSQL_TIME struct and produce a warning if string was cut during conversio...
Definition: sql_time.cc:518
dec
static const std::string dec("DECRYPTION")
make_date
void make_date(const Date_time_format *format, const MYSQL_TIME *l_time, String *str)
Convert DATE value to String.
Definition: sql_time.cc:614
uchar
unsigned char uchar
Definition: my_inttypes.h:51
MYSQL_TYPE_TIMESTAMP
@ MYSQL_TYPE_TIMESTAMP
Definition: field_types.h:64
my_decimal_from_datetime_packed
my_decimal * my_decimal_from_datetime_packed(my_decimal *dec, enum enum_field_types type, longlong packed_value)
Unpack packed numeric temporal value to date/time value and then convert to decimal representation.
Definition: sql_time.cc:733
Date_time_format::format
LEX_CSTRING format
Definition: sql_time.h:62
gmt_time_to_local_time
ulonglong gmt_time_to_local_time(ulonglong time)
This function gets GMT time and adds value of time_zone to get the local time.
Definition: sql_time.cc:764
my_time_flags_t
unsigned int my_time_flags_t
Flags to str_to_datetime and number_to_datetime.
Definition: my_time.h:82
my_decimal
my_decimal class limits 'decimal_t' type to what we need in MySQL.
Definition: my_decimal.h:91
my_double_to_datetime_with_warn
bool my_double_to_datetime_with_warn(double nr, MYSQL_TIME *ltime, my_time_flags_t flags)
Convert double value to datetime value with a warning.
Definition: sql_time.cc:266
Interval
Struct representing a duration.
Definition: my_time.h:168
Time_zone
This class represents abstract time zone and provides basic interface for MYSQL_TIME <-> my_time_t co...
Definition: tztime.h:48
MYSQL_TIME
Definition: mysql_time.h:81
my_longlong_to_datetime_with_warn
bool my_longlong_to_datetime_with_warn(longlong nr, MYSQL_TIME *ltime, my_time_flags_t flags)
Convert longlong value to datetime value with a warning.
Definition: sql_time.cc:297
my_time.h
make_datetime
void make_datetime(const Date_time_format *format, const MYSQL_TIME *l_time, String *str, uint dec)
Convert DATETIME value to String.
Definition: sql_time.cc:628
String::length
size_t length() const
Definition: sql_string.h:238
enum_mysql_timestamp_type
enum_mysql_timestamp_type
Definition: mysql_time.h:44
Date_time_format
Representation of time formats.
Definition: sql_time.h:60
Known_date_time_format
Collection of strings describing date/time formats.
Definition: sql_time.h:68
get_date_time_format_str
const char * get_date_time_format_str(const Known_date_time_format *format, enum_mysql_timestamp_type type)
Return format string according format name.
Definition: sql_time.cc:563
Known_date_time_format::format_name
const char * format_name
Definition: sql_time.h:69
gis::length
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
ulonglong
unsigned long long int ulonglong
Definition: my_inttypes.h:55
field_type_to_timestamp_type
enum_mysql_timestamp_type field_type_to_timestamp_type(enum enum_field_types type)
Return the timstamp value corresponding the field type passed as argument.
Definition: sql_time.h:198
TIME_to_timestamp
my_time_t TIME_to_timestamp(const MYSQL_TIME *t, const Time_zone &tz, bool *not_exist)
MYSQL_TIME_STATUS
Structure to return status from str_to_datetime(), str_to_time(), number_to_datetime(),...
Definition: my_time.h:158
binary_log::transaction::compression::type
type
Definition: base.h:36
interval
static int interval
Definition: mysqladmin.cc:64
mysql_time.h
ErrConvString
Definition: sql_error.h:220
flags
static int flags[50]
Definition: hp_test1.cc:39
datetime_with_no_zero_in_date_to_timeval
bool datetime_with_no_zero_in_date_to_timeval(const MYSQL_TIME *t, const Time_zone &tz, struct timeval *tm, int *warnings)
Converts a datetime in MYSQL_TIME representation to corresponding struct timeval value.
Definition: sql_time.cc:437
Date_time_format::positions
uchar positions[8]
Definition: sql_time.h:61