Timestamp function instead of CAST for literal construct.

This commit is contained in:
go-jet 2019-08-06 13:58:17 +02:00
parent d235385c2a
commit fbf5fbddbc
4 changed files with 35 additions and 28 deletions

View file

@ -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"))
}

View file

@ -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

View file

@ -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)))
}

View file

@ -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,7 +764,8 @@ 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 ?;
`)
@ -775,6 +777,7 @@ LIMIT ?;
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"
}
`)
}