Skip to content

PostgreSqlType - Change "PGInterval" to "String #5403

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 13, 2025

Conversation

griffio
Copy link
Collaborator

@griffio griffio commented Aug 14, 2024

PostgreSqlType INTERVAL was initially mapped as PgInterval

https://github.com/cashapp/sqldelight/blob/431caee2a99885719b1a43db2e08ef16a3b64af8/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlType.kt#L21

This 🥨 changes the mapping to String as org.postgresql.util.PgInterval is a JDBC type and would be consistent with JSON, TSVECTOR, XML type mapping. The client can use a type adapter for the string value to a desired platform type - Duration, Period ... etc. Docs page updated with type mapping

Requirement -
Write to an Interval column using setObject Other, as this is required for it to interpret as an interval type
Read from an Interval column usinggetString, this is formatted using the intervalstyle* PG client option

  • For example, "-c intervalstyle=iso_8601" can be set on the client connection options and used with a custom kotlin.time.Duration column adapter as intended by SqlDelight to encode/decode iso interval values

Note:
Future Developments

  • PostgreSqlType dialect type should not reference JDBC (java.sql) types as not all drivers are JDBC
  • There should be specific driver dialect subclasses (PostgreSql JDBC, PostgreSql R2DBC) without the need to create a new dialect
    • e.g PostgreSql JDBC has PGobject types for JSON, Interval that setObject can use
    • e.g PostgreSql R2DBC needs a specific codec class for JSON type that currently cannot be used in statements

@griffio griffio force-pushed the fix-postgresql-interval branch from 9e036f4 to 296bdf2 Compare September 5, 2024 10:06
@griffio griffio force-pushed the fix-postgresql-interval branch 2 times, most recently from 5f99018 to 6fc7138 Compare September 23, 2024 12:07
@griffio griffio force-pushed the fix-postgresql-interval branch from 6fc7138 to ef9d8e6 Compare September 30, 2024 11:48
@griffio griffio marked this pull request as ready for review September 30, 2024 12:08
@griffio griffio force-pushed the fix-postgresql-interval branch from ef9d8e6 to ecee0af Compare October 2, 2024 07:15
@griffio griffio force-pushed the fix-postgresql-interval branch from ecee0af to f8e8100 Compare February 13, 2025 13:55
@griffio griffio force-pushed the fix-postgresql-interval branch from f8e8100 to cf5b907 Compare March 26, 2025 08:53
@AlecKazakova
Copy link
Collaborator

we do require a jdbc driver type for postgres: https://github.com/sqldelight/sqldelight/blob/master/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlDialect.kt#L20-L23

so I think returning PGInterval is fine? Or is it that when you use async and it needs an R2DBC driver that then its a problem

@griffio
Copy link
Collaborator Author

griffio commented May 13, 2025

so I think returning PGInterval is fine? Or is it that when you use async and it needs an R2DBC driver that then its a problem

The change was for consistency to make PostgreSqlType use only Java platform types - interval is the only Jdbc type referenced - the other types can be encoded as Strings. The client can use a Sqldelight column type adapter value map to a desired platform type rather than String.

PostgreSqlType dialect type should not reference JDBC (java.sql) types as not all drivers are JDBC
e.g PostgreSql JDBC has PGobject types for JSON, Interval that setObject can use
e.g PostgreSql R2DBC needs a specific Json codec for any kind of support

Future Developments as mentioned 🧑‍🚀
However - the current problem is having a single PostgreSqlType that must bind to an implementation class as r2dbc and jdbc libraries use their own wrapper classes for db types like json etc - So for future development, having a PostgreSqlType for each driver dialect would allow the appropriate driver wrapper class to be specified.
There should be specific driver dialect subclasses (PostgreSqlTypeJDBC, PostgreSqlTypeR2dbc) without the need to create a new dialect - e.g add a new runtype class https://github.com/sqldelight/sqldelight/blob/master/dialects/postgresql/src/main/kotlin/app/cash/sqldelight/dialects/postgresql/PostgreSqlDialect.kt#L20-L23

Currently, R2DBC driver is very limited anyway as other issues like connection factory support need to be added and reworking the api to support coroutines in transactions

PGInterval is a JDBC type
The client should choose how to adapt the String into PGInterval, Duration, Period etc depending on platform
@griffio griffio force-pushed the fix-postgresql-interval branch from cf5b907 to b000756 Compare May 13, 2025 17:19
@AlecKazakova
Copy link
Collaborator

👍 thanks for clarifying

@AlecKazakova AlecKazakova merged commit d174a9c into sqldelight:master May 13, 2025
18 checks passed
svc-squareup-copybara pushed a commit to cashapp/misk that referenced this pull request May 20, 2025
| Package | Type | Package file | Manager | Update | Change |
|---|---|---|---|---|---|
|
[com.github.jsqlparser:jsqlparser](https://github.com/JSQLParser/JSqlParser)
| dependencies | misk/gradle/libs.versions.toml | gradle | minor | `5.2`
-> `5.3` |
| [app.cash.sqldelight](https://github.com/sqldelight/sqldelight) |
plugin | misk/gradle/libs.versions.toml | gradle | minor | `2.0.2` ->
`2.1.0` |
|
[app.cash.sqldelight:runtime](https://github.com/sqldelight/sqldelight)
| dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.0.2` -> `2.1.0` |
|
[app.cash.sqldelight:mysql-dialect](https://github.com/sqldelight/sqldelight)
| dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.0.2` -> `2.1.0` |
|
[app.cash.sqldelight:jdbc-driver](https://github.com/sqldelight/sqldelight)
| dependencies | misk/gradle/libs.versions.toml | gradle | minor |
`2.0.2` -> `2.1.0` |
| [software.amazon.awssdk:sdk-core](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
| [software.amazon.awssdk:sqs](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
|
[software.amazon.awssdk:dynamodb-enhanced](https://aws.amazon.com/sdkforjava)
| dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
| [software.amazon.awssdk:dynamodb](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
| [software.amazon.awssdk:aws-core](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
| [software.amazon.awssdk:bom](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |
| [software.amazon.awssdk:auth](https://aws.amazon.com/sdkforjava) |
dependencies | misk/gradle/libs.versions.toml | gradle | patch |
`2.31.44` -> `2.31.45` |

---

### Release Notes

<details>
<summary>sqldelight/sqldelight (app.cash.sqldelight)</summary>

###
[`v2.1.0`](https://github.com/sqldelight/sqldelight/blob/HEAD/CHANGELOG.md#210---2025-05-16)

[Compare
Source](sqldelight/sqldelight@2.0.2...2.1.0)

##### Added

- \[WASM Driver] Add support for wasmJs to web worker driver
([#&#8203;5534](sqldelight/sqldelight#5534) by
\[Ilya Gulya]\[IlyaGulya])
- \[PostgreSQL Dialect] Support PostgreSql UnNest Array to rows
([#&#8203;5673](sqldelight/sqldelight#5673) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql TSRANGE/TSTZRANGE support
([#&#8203;5297](sqldelight/sqldelight#5297) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql Right Full Join
([#&#8203;5086](sqldelight/sqldelight#5086) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Postrgesql extract from temporal types
([#&#8203;5273](sqldelight/sqldelight#5273) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql array contains operators
([#&#8203;4933](sqldelight/sqldelight#4933) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql drop constraint
([#&#8203;5288](sqldelight/sqldelight#5288) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Postgresql type casting
([#&#8203;5089](sqldelight/sqldelight#5089) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql lateral join operator for subquery
([#&#8203;5122](sqldelight/sqldelight#5122) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Postgresql ILIKE operator
([#&#8203;5330](sqldelight/sqldelight#5330) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql XML type
([#&#8203;5331](sqldelight/sqldelight#5331) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql AT TIME ZONE
([#&#8203;5243](sqldelight/sqldelight#5243) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Support postgresql order by nulls
([#&#8203;5199](sqldelight/sqldelight#5199) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Add PostgreSQL current date/time function
support
([#&#8203;5226](sqldelight/sqldelight#5226) by
\[Drew Dobson]\[drewd])
- \[PostgreSQL Dialect] PostgreSql Regex operators
([#&#8203;5137](sqldelight/sqldelight#5137) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] add brin gist
([#&#8203;5059](sqldelight/sqldelight#5059) by
\[Griffio]\[griffio])
- \[MySQL Dialect] Support RENAME INDEX for MySql dialect
([#&#8203;5212](sqldelight/sqldelight#5212) by
\[Oren Kislev]\[orenkislev-faire])
- \[JSON Extension] Add alias to json table function
([#&#8203;5372](sqldelight/sqldelight#5372) by
\[Griffio]\[griffio])

##### Changed

- \[Compiler] Generated query files return row counts for simple
mutators
([#&#8203;4578](sqldelight/sqldelight#4578) by
\[Marius Volkhart]\[MariusV])
- \[Native Driver] Update NativeSqlDatabase.kt to change readonly flag
for DELETE, INSERT, and UPDATE statements
([#&#8203;5680](sqldelight/sqldelight#5680) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Change PgInterval to String
([#&#8203;5403](sqldelight/sqldelight#5403) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Support SqlDelight modules to implement
PostgreSql extensions
([#&#8203;5677](sqldelight/sqldelight#5677) by
\[Griffio]\[griffio])

##### Fixed

- \[Compiler] fix: notify queries when executing group statements with
result
([#&#8203;5006](sqldelight/sqldelight#5006) by
\[Vitor Hugo Schwaab]\[vitorhugods])
- \[Compiler] Fix SqlDelightModule type resolver
([#&#8203;5625](sqldelight/sqldelight#5625) by
\[Griffio]\[griffio])
- \[Compiler] Fix 5501 insert object escaped column
([#&#8203;5503](sqldelight/sqldelight#5503) by
\[Griffio]\[griffio])
- \[Compiler] Compiler: Improve error message such that path links are
clickable with the correct line & char position.
([#&#8203;5604](sqldelight/sqldelight#5604) by
\[Niklas Baudy]\[vanniktech])
-   \[Compiler] Fix issue 5298: allow keywords to be used as table names
-   \[Compiler] fix named executes and add test
- \[Compiler] Consider foreign key table constraints when sorting
initialization statements
([#&#8203;5325](sqldelight/sqldelight#5325) by
\[Leon Linhart]\[TheMrMilchmann])
- \[Compiler] Align error underlines properly when tabs are involved
([#&#8203;5224](sqldelight/sqldelight#5224) by
\[Drew Dobson]\[drewd])
- \[JDBC Driver] Fix memory leak for connectionManager during end of
transaction
- \[JDBC Driver] Run SQLite migrations inside transaction as mentioned
in documentation
([#&#8203;5218](sqldelight/sqldelight#5218) by
\[Lukáš Moravec]\[morki])
- \[JDBC Driver] Fix leaking connections after transaction commit /
rollback
([#&#8203;5205](sqldelight/sqldelight#5205) by
\[Lukáš Moravec]\[morki])
- \[Gradle Plugin] Execute `DriverInitializer` before
`GenerateSchemaTask`
([#&#8203;5562](sqldelight/sqldelight#5562) by
\[Emeka Nwagu]\[nwagu])
- \[Runtime] Fix crash in LogSqliteDriver when real driver is Async
([#&#8203;5723](sqldelight/sqldelight#5723) by
\[Eric Denman]\[edenman])
- \[Runtime] Fix StringBuilder capacity
([#&#8203;5192](sqldelight/sqldelight#5192) by
\[Jan Bína]\[janbina])
- \[PostgreSQL Dialect] PostgreSql create or replace view
([#&#8203;5407](sqldelight/sqldelight#5407) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Postgresql to_json
([#&#8203;5606](sqldelight/sqldelight#5606) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql numeric resolver
([#&#8203;5399](sqldelight/sqldelight#5399) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] sqlite windows function
([#&#8203;2799](sqldelight/sqldelight#2799) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql SELECT DISTINCT ON
([#&#8203;5345](sqldelight/sqldelight#5345) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] alter table add column if not exists
([#&#8203;5309](sqldelight/sqldelight#5309) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] Postgresql async bind parameter
([#&#8203;5313](sqldelight/sqldelight#5313) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql boolean literals
([#&#8203;5262](sqldelight/sqldelight#5262) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql window functions
([#&#8203;5155](sqldelight/sqldelight#5155) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql isNull isNotNull types
([#&#8203;5173](sqldelight/sqldelight#5173) by
\[Griffio]\[griffio])
- \[PostgreSQL Dialect] PostgreSql select distinct
([#&#8203;5172](sqldelight/sqldelight#5172) by
\[Griffio]\[griffio])
- \[Paging Extension] paging refresh initial load fix
([#&#8203;5615](sqldelight/sqldelight#5615) by
\[Eva]\[evant])
- \[Paging Extension] Add MacOS native targets
([#&#8203;5324](sqldelight/sqldelight#5324) by
\[Vitor Hugo Schwaab]\[vitorhugods])
-   \[IntelliJ Plugin] K2 Support

</details>

---

### Configuration

📅 **Schedule**: Branch creation - "after 6pm every weekday,before 2am
every weekday" in timezone Australia/Melbourne, Automerge - At any time
(no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Never, or you tick the rebase/retry checkbox.

👻 **Immortal**: This PR will be recreated if closed unmerged. Get
[config help](https://github.com/renovatebot/renovate/discussions) if
that's undesired.

---

- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check
this box

---

This PR has been generated by [Renovate
Bot](https://github.com/renovatebot/renovate).

GitOrigin-RevId: 2c67f3c06e13d86329db5149abfceba98e3701a4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

3 participants