Open
Description
Today I learned two fun facts:
- in MySQL, although
now()
is a datetime,now() + 0
is an integer formed from all of the decimal digits in the date. e.g. 2021-05-27 17:00:26 vs 20210527170026. (I'm not sure why one would ever want that.) - in Go's
database/sql
API for prepared statements, "?" applied to a duration value treats the duration (thanks to reflection on the underlying type) as an integer number of nanoseconds, not an interval. I don't know why one would ever want that either, since nanoseconds are not really useful in SQL.
The combination of these two facts means that the behavior of query("now() + ?", 1*time.Hour)
isn't remotely close to what one might expect:
mysql> select now(), now() + interval 1 hour, now() + 60*60*1e9;
+---------------------+-------------------------+-------------------+
| now() | now() + interval 1 hour | now() + 60*60*1e9 |
+---------------------+-------------------------+-------------------+
| 2021-05-27 17:13:53 | 2021-05-27 18:13:53 | 23810527171353 |
+---------------------+-------------------------+-------------------+
1 row in set (0.00 sec)
Perhaps go-sql-driver could support time.Duration by mapping it to interval 1 hour
, thereby avoiding this pitfall.
Alternatively, simply rejecting it with a clear error ("you cannot possibly have wanted this behavior") would be an improvement.
(See also golang/go#46427: I reported this initially against database/sql, and it was closed as a driver-specific issue.)
Metadata
Metadata
Assignees
Labels
No labels