Skip to content

Commit

Permalink
Add PostgreSql temporal types to SqlBinaryExpr (#4657)
Browse files Browse the repository at this point in the history
* Update PostgreSqlTypeResolver temporal type

For encapsulatingType allow expressions to return temporal types
    PostgreSqlType.INTERVAL,
    PostgreSqlType.TIMESTAMP_TIMEZONE
    PostgreSqlType.TIMESTAMP

e.g 31 * INTERVAL '1 minute' + INTERVAL '2 days'

Timestamp should be ordered last

When binary expression contains TIMESTAMP and INTERVAL, TIMESTAMP must be selected

* Add PostgreSql integration tests

Extend the existing tests with binary expressions

* Change test to compare two intervals

Check that now + 1 is greater than now
  • Loading branch information
griffio committed Nov 16, 2023
1 parent ac96b24 commit c23621c
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,9 @@ class PostgreSqlTypeResolver(private val parentResolver: TypeResolver) : TypeRes
REAL,
TEXT,
BLOB,
PostgreSqlType.INTERVAL,
PostgreSqlType.TIMESTAMP_TIMEZONE,
PostgreSqlType.TIMESTAMP,
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,18 @@ SELECT date_part('hour', timestamp), date_part('hour', timestamp_with_timezone)
selectNow:
SELECT NOW();

selectNowInterval:
SELECT NOW() AS now, NOW() + INTERVAL '1 day' AS nowPlusOneDay;

selectInterval:
SELECT INTERVAL '1 day';

selectMultiplyInterval:
SELECT 31 * INTERVAL '1 day';

selectAddInterval:
SELECT INTERVAL '1 day' + INTERVAL '3 hour';

selectMax:
SELECT max(timestamp) FROM dates;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -276,12 +276,31 @@ class PostgreSqlTest {
assertThat(now).isGreaterThan(OffsetDateTime.MIN)
}

@Test fun nowPlusInterval() {
val selectNowInterval = database.datesQueries.selectNowInterval().executeAsOne()
assertThat(selectNowInterval.now).isNotNull()
assertThat(selectNowInterval.nowPlusOneDay).isGreaterThan(selectNowInterval.now)
}

@Test fun interval() {
val interval = database.datesQueries.selectInterval().executeAsOne()
assertThat(interval).isNotNull()
assertThat(interval.getDays()).isEqualTo(1)
}

@Test fun intervalBinaryMultiplyExpression() {
val interval = database.datesQueries.selectMultiplyInterval().executeAsOne()
assertThat(interval).isNotNull()
assertThat(interval.getDays()).isEqualTo(31)
}

@Test fun intervalBinaryAddExpression() {
val interval = database.datesQueries.selectAddInterval().executeAsOne()
assertThat(interval).isNotNull()
assertThat(interval.getDays()).isEqualTo(1)
assertThat(interval.getHours()).isEqualTo(3)
}

@Test fun successfulOptimisticLock() {
with(database.withLockQueries) {
val row = insertText("sup").executeAsOne()
Expand Down

0 comments on commit c23621c

Please sign in to comment.