diff --git a/postgres/functions.go b/postgres/functions.go index 31343254..bce2e987 100644 --- a/postgres/functions.go +++ b/postgres/functions.go @@ -344,6 +344,15 @@ func DATE_TRUNC(field unit, source Expression, timezone ...string) TimestampExpr return jet.NewTimestampFunc("DATE_TRUNC", jet.FixedLiteral(unitToString(field)), source) } +// GENERATE_SERIES generates a series of values from start to stop, with a step size of step. +func GENERATE_SERIES(start Expression, stop Expression, step ...Expression) Expression { + if len(step) > 0 { + return jet.NewFunc("GENERATE_SERIES", []Expression{start, stop, step[0]}, nil) + } + + return jet.NewFunc("GENERATE_SERIES", []Expression{start, stop}, nil) +} + // --------------- Conditional Expressions Functions -------------// // COALESCE function returns the first of its arguments that is not null. diff --git a/postgres/functions_test.go b/postgres/functions_test.go index d0081b05..c7afea8a 100644 --- a/postgres/functions_test.go +++ b/postgres/functions_test.go @@ -21,3 +21,16 @@ func TestDATE_TRUNC(t *testing.T) { "DATE_TRUNC('DAY', NOW() + INTERVAL '1 HOUR', 'Australia/Sydney')", ) } + +func TestGENERATE_SERIES(t *testing.T) { + assertSerialize( + t, + GENERATE_SERIES(NOW(), NOW().ADD(INTERVAL(10, DAY))), + "GENERATE_SERIES(NOW(), NOW() + INTERVAL '10 DAY')", + ) + assertSerialize( + t, + GENERATE_SERIES(NOW(), NOW().ADD(INTERVAL(10, DAY)), INTERVAL(2, DAY)), + "GENERATE_SERIES(NOW(), NOW() + INTERVAL '10 DAY', INTERVAL '2 DAY')", + ) +}