diff --git a/mysql/cast.go b/mysql/cast.go index 7e62637..0707efa 100644 --- a/mysql/cast.go +++ b/mysql/cast.go @@ -8,7 +8,6 @@ type cast interface { jet.Cast AS_DATETIME() DateTimeExpression - AS_TIMESTAMP() TimestampExpression AS_SIGNED() IntegerExpression AS_UNSIGNED() IntegerExpression AS_BINARY() StringExpression @@ -27,21 +26,17 @@ func CAST(expr jet.Expression) cast { } func (c *castImpl) AS_DATETIME() DateTimeExpression { - return jet.TimestampExp(c.AS("DATETIME")) -} - -func (c *castImpl) AS_TIMESTAMP() TimestampExpression { - return jet.TimestampExp(c.AS("DATETIME")) + return DateTimeExp(c.AS("DATETIME")) } func (c *castImpl) AS_SIGNED() IntegerExpression { - return jet.IntExp(c.AS("SIGNED")) + return IntExp(c.AS("SIGNED")) } func (c *castImpl) AS_UNSIGNED() IntegerExpression { - return jet.IntExp(c.AS("UNSIGNED")) + return IntExp(c.AS("UNSIGNED")) } func (c *castImpl) AS_BINARY() StringExpression { - return jet.StringExp(c.AS("BINARY")) + return StringExp(c.AS("BINARY")) } diff --git a/mysql/functions.go b/mysql/functions.go index 2f73e2c..3c9bffe 100644 --- a/mysql/functions.go +++ b/mysql/functions.go @@ -113,6 +113,14 @@ func NOW(fsp ...int) DateTimeExpression { return jet.NewTimestampFunc("NOW") } +func TIMESTAMP(str StringExpression) TimestampExpression { + return jet.NewTimestampFunc("TIMESTAMP", str) +} + +func UNIX_TIMESTAMP(str StringExpression) TimestampExpression { + return jet.NewTimestampFunc("UNIX_TIMESTAMP", str) +} + // --------------- Conditional Expressions Functions -------------// var COALESCE = jet.COALESCE var NULLIF = jet.NULLIF diff --git a/mysql/literal.go b/mysql/literal.go index ca77d97..fd18c4f 100644 --- a/mysql/literal.go +++ b/mysql/literal.go @@ -32,8 +32,8 @@ var DateTimeT = func(t time.Time) DateTimeExpression { return CAST(jet.TimestampT(t)).AS_DATETIME() } var Timestamp = func(year int, month time.Month, day, hour, minute, second int, milliseconds ...int) TimestampExpression { - return CAST(jet.Timestamp(year, month, day, hour, minute, second, milliseconds...)).AS_TIMESTAMP() + return TIMESTAMP(StringExp(jet.Timestamp(year, month, day, hour, minute, second, milliseconds...))) } var TimestampT = func(t time.Time) TimestampExpression { - return CAST(jet.TimestampT(t)).AS_TIMESTAMP() + return TIMESTAMP(StringExp(jet.TimestampT(t))) } diff --git a/tests/mysql/alltypes_test.go b/tests/mysql/alltypes_test.go index 37acab7..a36d09f 100644 --- a/tests/mysql/alltypes_test.go +++ b/tests/mysql/alltypes_test.go @@ -715,21 +715,21 @@ func TestTimestampExpressions(t *testing.T) { testutils.AssertDebugStatementSql(t, query, ` SELECT all_types.timestamp = all_types.timestamp, - all_types.timestamp = CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp = TIMESTAMP('2019-06-06 10:02:46'), all_types.timestamp_ptr != all_types.timestamp, - all_types.timestamp_ptr != CAST('2019-06-06 10:02:46.1000' AS DATETIME), + all_types.timestamp_ptr != TIMESTAMP('2019-06-06 10:02:46.1000'), NOT(all_types.timestamp <=> all_types.timestamp), - NOT(all_types.timestamp <=> CAST('2019-06-06 10:02:46' AS DATETIME)), + NOT(all_types.timestamp <=> TIMESTAMP('2019-06-06 10:02:46')), all_types.timestamp <=> all_types.timestamp, - all_types.timestamp <=> CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp <=> TIMESTAMP('2019-06-06 10:02:46'), all_types.timestamp < all_types.timestamp, - all_types.timestamp < CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp < TIMESTAMP('2019-06-06 10:02:46'), all_types.timestamp <= all_types.timestamp, - all_types.timestamp <= CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp <= TIMESTAMP('2019-06-06 10:02:46'), all_types.timestamp > all_types.timestamp, - all_types.timestamp > CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp > TIMESTAMP('2019-06-06 10:02:46'), all_types.timestamp >= all_types.timestamp, - all_types.timestamp >= CAST('2019-06-06 10:02:46' AS DATETIME), + all_types.timestamp >= TIMESTAMP('2019-06-06 10:02:46'), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP(2) FROM test_sample.all_types; @@ -752,7 +752,8 @@ func TestTimeLiterals(t *testing.T) { Time(timeT.Clock()).AS("time"), TimeT(timeT).AS("timeT"), DateTimeT(timeT).AS("datetime"), - TimestampT(timeT).AS("timestamp"), + Timestamp(2019, 8, 6, 10, 10, 30, 123456).AS("timestamp"), + TimestampT(timeT).AS("timestampT"), ).FROM(AllTypes).LIMIT(1) fmt.Println(query.Sql()) @@ -763,18 +764,20 @@ SELECT CAST(? AS DATE) AS "date", CAST(? AS TIME) AS "time", CAST(? AS TIME) AS "timeT", CAST(? AS DATETIME) AS "datetime", - CAST(? AS DATETIME) AS "timestamp" + TIMESTAMP(?) AS "timestamp", + TIMESTAMP(?) AS "timestampT" FROM test_sample.all_types LIMIT ?; `) var dest struct { - Date time.Time - DateT time.Time - Time time.Time - TimeT time.Time - DateTime time.Time - Timestamp time.Time + Date time.Time + DateT time.Time + Time time.Time + TimeT time.Time + DateTime time.Time + Timestamp time.Time + TimestampT time.Time } err = query.Query(db, &dest) @@ -789,7 +792,8 @@ LIMIT ?; "Time": "0000-01-01T20:34:58Z", "TimeT": "0000-01-01T19:34:58Z", "DateTime": "2009-11-17T19:34:58Z", - "Timestamp": "2009-11-17T19:34:58Z" + "Timestamp": "2019-08-06T10:10:30.123456Z", + "TimestampT": "2009-11-17T19:34:58.351387Z" } `) }