-
Notifications
You must be signed in to change notification settings - Fork 697
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
feat: Add ALL
and ANY
operators accepting array, subquery, or table parameters
#1886
Conversation
…e simple tests which are not run yet
…rray of strings) to work on PostgreSQL (`postgres` and `postgresNG`) Cherry-picked from: 7dd846b
…and refactor to simplify the `AllAnyOp` implementation As tested, it works for H2 as well in addition to PostgreSQL.
@bog-walk, could you please check? |
Hey @ShreckYe, thanks for the PR. Could you please run |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @ShreckYe and thanks for working on this PR. These operators will be a great addition to the API, so I've requested some changes to ensure that this implementation is extensible enough to be adapted later.
Using these operators with an array argument is very niched to PostgreSQL, and the standard way of using ANY|ALL
is with a subquery on the right hand side (supported by all except SQLite). This will be the expectation and natural progression if these operators are supported.
MySQL also has a very niched use case, accepting a table on the right hand side. We need to be able to add that functionality if users ask for it, especially if we're adding the PostgreSQL array.
The most ideal way to keep your functionality and future use cases possible would be to implement the feature in a way similar to SubQueryOp, but this would mean creating a class and a function for every single comparison operator that can precede ANY|ALL
and the DSL would become more verbose.
I think your way of incorporating the existing comparison operators reads better, so I would suggest extending Op
and creating a sealed class that allows us to build on it later. I've included this class and how to use it in my comments below.
object UntypedAndUnsizedArrayColumnType : ColumnType() { | ||
override fun sqlType(): String = | ||
currentDialect.dataTypeProvider.untypedAndUnsizedArrayType() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I appreciate the need for this and for the scope of this PR it's ok. It does have some problems, for example:
- If a logger is enabled, the array object value is not processed in the output string, which isn't helpful to users wanting to see the values.
- It won't work with edge cases like if a user wants to check if a datetime column value is in an array of LocalDateTimes.
But we need to flesh out the ArrayColumnType more thoroughly anyway, so I can work on these problems after this PR is merged.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't remove this because the implemented Op
s still depend on it. As you commented this will be fleshed out, so to not keep these new definitions in the PR, one way I can think of is to replace its usage with a temporary inlined anonymous ColumnType
with its sqlType
being the empty string or just "ARRAY" and the tests still pass.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, that sounds like a good temporary option to me.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, so shall I remove it and adopt this approach in the next commit?
/** Returns the specified [value] as an array query parameter. */ | ||
fun <T> arrayParam(value: Array<T>): Expression<Array<T>> = QueryParameter(value, UntypedAndUnsizedArrayColumnType) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please remove this as it isn't necessary for the Op
implementation. An arrayParam()
will be introduced to the API when the ArrayColumnType
is fully supported for storing arrays.
/** Returns this array of data wrapped in the `ALL` operator. */ | ||
fun <T> Array<T>.allOp(): Op<T> = AllAnyOp("ALL", this) | ||
|
||
/** Returns this array of data wrapped in the `ANY` operator. The name is explicitly distinguished from [Array.any]. */ | ||
fun <T> Array<T>.anyOp(): Op<T> = AllAnyOp("ANY", this) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Having these be extension functions makes it difficult to extend the functionality to, for example, a subquery. It also doesn't read like a natural SQL query: WHERE { Users.id eq arrayOf(1, 2).anyOp() }
.
Please replace them with anyFrom
which takes an array argument, that way we can make an override for subqueries and both will read well:
fun <T> anyFrom(array: Array<T>): AnyFromArrayOp<T> = AnyFromArrayOp(array)
fun <T> allFrom(array: Array<T>): AllFromArrayOp<T> = AllFromArrayOp(array)
// use
WHERE { Users.id eq anyFrom(arrayOf(1, 2)) }
WHERE { Users.id eq anyFrom(Users.selectAll()) }
Also, please place the functions in the subsection titled "// Array Comparisons".
/** Checks if this expression is equal to any element from [array]. | ||
* This is a more efficient alternative to [ISqlExpressionBuilder.inList] on PostgreSQL and H2. */ | ||
infix fun <T> ExpressionWithColumnType<T>.eqAny(array: Array<T>): Op<Boolean> = | ||
this eq array.anyOp() // TODO or `array.anyFunction()` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This won't be necessary once the functions above are switched to take an argument instead of the more verbose extension function.
class AllAnyOp<T>(val opName: String, val array: Array<T>) : Op<T>() { | ||
|
||
override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My suggestion would be to replace this with a sealed class, something like this:
sealed class AnyOrAllFromBaseOp<T>(
val isAny: Boolean,
val subSearch: Any
) : Op<T>() {
override fun toQueryBuilder(queryBuilder: QueryBuilder): Unit = queryBuilder {
if (isAny) {
+"ANY ("
} else {
+"ALL ("
}
when (subSearch) {
is Array<*> -> registerArgument(UntypedAndUnsizedArrayColumnType, subSearch)
}
+")"
}
}
class AnyFromArrayOp<T>(array: Array<T>) : AnyOrAllFromBaseOp<T>(isAny = true, subSearch = array)
class AllFromArrayOp<T>(array: Array<T>) : AnyOrAllFromBaseOp<T>(isAny = false, subSearch = array)
With that, we'd be able to easily go in an extend support to subqueries, etc. by just adding a branch to the when
block and some more subclasses.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I refactored opName
into isAny
as you suggested but there might still be other row and array comparison operators, for example SOME
though it's only an alias of ANY
. (see PostgreSQL docs and MySQL docs) If it's necessary to leave room for them (though I haven't find many cases supporting this), this class can be renamed to RowAndArrayComparisonOp
as how PostgreSQL calls them and the old opName
approach can be adopted.
Also I added a SubSearch
type parameter instead of using Any
for better type safety and implemented registerArgument
in subclasses for better extensibility from my point of view. If this is unnecessary I can change them to what you suggested.
/** Data type for arrays with no specified size or element type, used only as types of [QueryParameter]s for PostgreSQL and H2. | ||
* An array with no element type cannot be used for storing arrays in a column in either PostgreSQL or H2. */ | ||
abstract fun untypedAndUnsizedArrayType(): String | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's go by the majority here, since only 2 dialects are implemented. Please swap this with the following and remove all exceptions from unsupported dialect files:
open fun untypedAndUnsizedArrayType(): String =
throw UnsupportedByDialectException("This vendor does not support array data type", currentDialect)
@@ -211,6 +213,55 @@ class SelectTests : DatabaseTestsBase() { | |||
} | |||
} | |||
|
|||
val testDBsSupportingArrays = | |||
listOf(TestDB.POSTGRESQL, TestDB.POSTGRESQLNG, TestDB.H2, TestDB.H2_MYSQL, TestDB.H2_MARIADB, TestDB.H2_PSQL, TestDB.H2_ORACLE, TestDB.H2_SQLSERVER) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
TestDB.allH2TestDB
is available to replace listing all H2 modes.
fun testEqAny(eqOp: Column<String>.() -> Op<Boolean>) { | ||
withDb(testDBsSupportingArrays) { | ||
withCitiesAndUsers { _, users, _ -> | ||
val r = users.select { users.id.eqOp() }.orderBy(users.name).toList() | ||
|
||
assertEquals(2, r.size) | ||
assertEquals("Alex", r[0][users.name]) | ||
assertEquals("Andrey", r[1][users.name]) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I appreciate that this helps reduce redundancy, especially since you implemented the feature using both Op
and Function
. After refactoring, please use this (or whatever code you're testing) directly in each unit test instead. That way it will be more clear what the DSL we're testing actually looks like when used.
The tests that would be great to see are:
eq anyFrom
- One other comparison op: the example below is good ->
greaterEq anyFrom
neq anyFrom
eq anyFrom(emptyArray())
Major changes: 1. support the `ALL` and `ANY` operators taking subquery arguments and table arguments, and the `IN` operator taking table arguments 1. remove some no longer needed code, simplify code, and rename some functions 1. add related tests 1. run `apiDump` The operators (`IN`, `ANY`, and `ALL`) with table arguments are only supported by PostgreSQL and H2. MySQL claims supporting this but it does not work with the JDBC driver as tested. Those with subquery arguments are not supported by SQLite.
@bog-walk thank you for your comments. I have modified the sources as you suggested and requested. For some of them I still have some questions which I leave in their respective reply comments. |
/** Returns this subquery wrapped in the `ANY` operator. This function is not supported by the SQLite dialect. */ | ||
fun <T> anyFrom(subQuery: Query): Op<T> = AllAnyFromSubQueryOp(true, subQuery) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The ANY
and ALL
operators with subquery arguments are not supported by SQLite as is also commented in the commit message. Actually ANY
and ALL
are not keywords of SQLite at all according to this SO question.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ShreckYe I forgot to mention something. Please take AbstractQuery<*>
as the argument so we don't restrict it to just Query
. It should be possible to use a SetOperation
for example as a subquery in the SQL.
/** Returns this table wrapped in the `ANY` operator. This function is only supported by PostgreSQL and H2 dialects. */ | ||
fun <T> anyFrom(table: Table): Op<T> = AllAnyFromTableOp(true, table) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interestingly, The operators with table arguments are supported by PostgreSQL and H2 as tested though they haven't clearly documented about this, but the tests fail on MySQL who claims supporting it. I think it's probably because it's not supported by its JDBC connector. I verified by copying the SQL statement to an online MySQL executor and it works.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, there is currently an issue with the mysql8 docker setup in our tests, so the test failing is a false negative.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, so shall I allow the tests to run on MySQL related dialects and just let them fail, or skip the tests as how they are now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ShreckYe Thanks for all the work so far, it's looking great. I've left some comments and requested a few small edits.
Also, please address the detekt edit requested in the failed action.
object UntypedAndUnsizedArrayColumnType : ColumnType() { | ||
override fun sqlType(): String = | ||
currentDialect.dataTypeProvider.untypedAndUnsizedArrayType() | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sure, that sounds like a good temporary option to me.
/** Returns this table wrapped in the `ANY` operator. This function is only supported by PostgreSQL and H2 dialects. */ | ||
fun <T> anyFrom(table: Table): Op<T> = AllAnyFromTableOp(true, table) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, there is currently an issue with the mysql8 docker setup in our tests, so the test failing is a false negative.
// TODO Currently these functions delegate to `anyFrom`. Should the actual `SOME` SQL operator be supported? | ||
|
||
/** An alias for [anyFrom]. */ | ||
fun <T> someFrom(subQuery: Query): Op<T> = anyFrom(subQuery) | ||
|
||
/** An alias for [anyFrom]. */ | ||
fun <T> someFrom(array: Array<T>): Op<T> = anyFrom(array) | ||
|
||
/** An alias for [anyFrom]. */ | ||
fun <T> someFrom(table: Table): Op<T> = anyFrom(table) | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ShreckYe There's already quite a bit in this PR. Please remove these aliases and then SOME
can be introduced in another PR once this one is finalized. It won't take much tweaking with the current setup.
/** Checks if this expression is equal to any element from the column of [table] with only a single column. This function is only supported by PostgreSQL and H2 dialects. */ | ||
infix fun <T> ExpressionWithColumnType<T>.notInTable(table: Table): InTableOp = InTableOp(this, table, false) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A "not" is probably missing from the KDocs here.
Sorry I don't know how to fix the detekt failure. I don't see a blank line at the the location it mentions and my detekt plugin keeps crashing. I downloaded the detekt command line client and ran auto correction but nothing changed. Please help me check if it persists. |
OK I got the plugin to work on another computer and ran "AutoCorrect by detekt Rules" which removes Line 236 of the mentioned file. |
ALL
and ANY
operators accepting array parameters with an added untyped and unsized array type for PostgreSQL and H2ALL
and ANY
operators accepting array, subquery, or table parameters
Hey @ShreckYe, thanks for the PR! |
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [org.jetbrains.exposed:exposed-jdbc](https://github.com/JetBrains/Exposed) | `0.41.1` -> `0.52.0` | [![age](https://developer.mend.io/api/mc/badges/age/maven/org.jetbrains.exposed:exposed-jdbc/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/org.jetbrains.exposed:exposed-jdbc/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/org.jetbrains.exposed:exposed-jdbc/0.41.1/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/org.jetbrains.exposed:exposed-jdbc/0.41.1/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [org.jetbrains.exposed:exposed-core](https://github.com/JetBrains/Exposed) | `0.41.1` -> `0.52.0` | [![age](https://developer.mend.io/api/mc/badges/age/maven/org.jetbrains.exposed:exposed-core/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/maven/org.jetbrains.exposed:exposed-core/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/maven/org.jetbrains.exposed:exposed-core/0.41.1/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/org.jetbrains.exposed:exposed-core/0.41.1/0.52.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- > [!WARNING] > Some dependencies could not be looked up. Check the Dependency Dashboard for more information. --- ### Release Notes <details> <summary>JetBrains/Exposed (org.jetbrains.exposed:exposed-jdbc)</summary> ### [`v0.52.0`](https://github.com/JetBrains/Exposed/blob/HEAD/CHANGELOG.md#0520) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.51.1...0.52.0) Features: - feat: EXPOSED-334 Support MERGE statement by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2047](https://github.com/JetBrains/Exposed/pull/2047) - feat: EXPOSED-368 Ordering on References by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2083](https://github.com/JetBrains/Exposed/pull/2083) - Feat: EXPOSED-396 Supports fetchBatchedResults with sorting order by [@​roharon](https://github.com/roharon) in [https://github.com/JetBrains/Exposed/pull/2102](https://github.com/JetBrains/Exposed/pull/2102) - feat: Add OffsetDateTime extension functions by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2118](https://github.com/JetBrains/Exposed/pull/2118) - feat: EXPOSED-295 Support subqueries with preceding LATERAL by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2095](https://github.com/JetBrains/Exposed/pull/2095) - feat: EXPOSED-336 Support Where clause with batchUpsert by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2120](https://github.com/JetBrains/Exposed/pull/2120) - feat: EXPOSED-416 Support adding special database-specific column definitions by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2125](https://github.com/JetBrains/Exposed/pull/2125) Bug fixes: - fix: EXPOSED-389 Coalesce operator returning nullable value by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2107](https://github.com/JetBrains/Exposed/pull/2107) - fix: EXPOSED-390 ASC_NULLS_LAST and DESC_NULLS_FIRST for MySQL string columns by [@​zly2006](https://github.com/zly2006) in [https://github.com/JetBrains/Exposed/pull/2091](https://github.com/JetBrains/Exposed/pull/2091) - fix: EXPOSED-402 ClassCastException when eager loading with uuid().references() by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2112](https://github.com/JetBrains/Exposed/pull/2112) - fix(DoubleColumnType): correctly handle precision when casting Float to DoubleColumnType for a `real` column by [@​jackgisel-RL](https://github.com/jackgisel-RL) in [https://github.com/JetBrains/Exposed/pull/2115](https://github.com/JetBrains/Exposed/pull/2115) - fix: EXPOSED-277 statementsRequiredToActualizeScheme does not check s… by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2096](https://github.com/JetBrains/Exposed/pull/2096) - fix: EXPOSED-411 ClassCastException when `uuid().references()` is used with `referrersOn` by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2127](https://github.com/JetBrains/Exposed/pull/2127) - fix: EXPOSED-412 Remove all the usage of isOldMySql function in tests by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2126](https://github.com/JetBrains/Exposed/pull/2126) - fix: EXPOSED-405 SQLite bugs: Table with custom ID behaves weirdly in DAO and batchInsert by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2119](https://github.com/JetBrains/Exposed/pull/2119) - fix: EXPOSED-393 H2 upsert with JSON column creates invalid data by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2104](https://github.com/JetBrains/Exposed/pull/2104) - fix: EXPOSED-400 ClassCastException when using `fetchBatchedResults` by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2113](https://github.com/JetBrains/Exposed/pull/2113) - EXPOSED-398 Gradle task testH2\_v1 runs tests on version 2.2.224 by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2110](https://github.com/JetBrains/Exposed/pull/2110) - test: EXPOSED-191 Flaky Oracle test on TC build by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2098](https://github.com/JetBrains/Exposed/pull/2098) Infrastructure: - Spring Boot 3.3.1 - io.github.hakky54:logcaptor 2.9.3 - Spring Framework 6.1.10 - org.junit:junit-bom 5.10.2 - chore: Fix TC Docker `version` is obsolete by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2111](https://github.com/JetBrains/Exposed/pull/2111) - test: EXPOSED-249 Add MySQL8 to tests for AllAnyFromBaseOp feature by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2123](https://github.com/JetBrains/Exposed/pull/2123) - chore: Add migration module and move `generateMigrationScript` function to it by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2128](https://github.com/JetBrains/Exposed/pull/2128) - Add workflow to build documentation website by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/2134](https://github.com/JetBrains/Exposed/pull/2134) ### [`v0.51.1`](https://github.com/JetBrains/Exposed/blob/HEAD/CHANGELOG.md#0511) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.51.0...0.51.1) Bug fixes: - fix: EXPOSED-389 Coalesce operator returning nullable value by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2107](https://github.com/JetBrains/Exposed/pull/2107) ### [`v0.51.0`](https://github.com/JetBrains/Exposed/blob/HEAD/CHANGELOG.md#0510) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.50.1...0.51.0) Infrastructure: - Spring Boot 3.3.0 - Kotlin Coroutines 1.8.1 - Spring Framework 6.1.8 - SQLite driver 3.46.0.0 - Kotlinx Datetime JVM 0.6.0 Breaking changes: - build!: EXPOSED-315 Use the slimmer `spring-boot-starter-jdbc` instead of `spring-boot-starter-data-jdbc` by [@​bystam](https://github.com/bystam) [https://github.com/JetBrains/Exposed/pull/2055](https://github.com/JetBrains/Exposed/pull/2055)2055 - fix!: EXPOSED-360 Storing ULong.MAX_VALUE in ulong column not working by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2068](https://github.com/JetBrains/Exposed/pull/2068) - More details at [Breaking changes](https://jetbrains.github.io/Exposed/breaking-changes.html#0-51-0) Features: - feat: Add support for variable-length binary columns in H2 by [@​rnett](https://github.com/rnett) in [https://github.com/JetBrains/Exposed/pull/2100](https://github.com/JetBrains/Exposed/pull/2100) Bug fixes: - fix: EXPOSED-353 dateLiteral does not work on OracleDB 12c or 19c by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2057](https://github.com/JetBrains/Exposed/pull/2057) - fix: EXPOSED-382 ClassCastException when uuid().references() is used with EntityID column by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2079](https://github.com/JetBrains/Exposed/pull/2079) - fix: EXPOSED-384 CurrentTimestamp cannot be used with OffsetDateTimeColumnType by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2081](https://github.com/JetBrains/Exposed/pull/2081) - EXPOSED-372 UpsertStatement.resultedValues contains incorrect value by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2075](https://github.com/JetBrains/Exposed/pull/2075) - EXPOSED-365 Unable to insert values into `Array` column by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2072](https://github.com/JetBrains/Exposed/pull/2072) - EXPOSED-376 batchUpsert does not return database values on conflict by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2082](https://github.com/JetBrains/Exposed/pull/2082) - EXPOSED-387 Exposed Join.lastQueryAlias not working correctly by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2085](https://github.com/JetBrains/Exposed/pull/2085) - fix: Crash in aliased OpBoolean by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2094](https://github.com/JetBrains/Exposed/pull/2094) - fix: EXPOSED-395 ClassCastException with EntityId column operations by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2103](https://github.com/JetBrains/Exposed/pull/2103) - fix: EXPOSED-391 Cannot map columns to different types anymore by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2099](https://github.com/JetBrains/Exposed/pull/2099) Docs: - docs: fix typos in foreignKey documentation by [@​plplmax](https://github.com/plplmax) in [https://github.com/JetBrains/Exposed/pull/2077](https://github.com/JetBrains/Exposed/pull/2077) - docs: Specify a URL for clicks on the header logo by [@​vnikolova](https://github.com/vnikolova) in [https://github.com/JetBrains/Exposed/pull/2080](https://github.com/JetBrains/Exposed/pull/2080) ### [`v0.50.1`](https://github.com/JetBrains/Exposed/blob/HEAD/CHANGELOG.md#0501) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.50.0...0.50.1) Bug fixes: - fix: EXPOSED-366 inList with EntityID column causes type mismatch error by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2070](https://github.com/JetBrains/Exposed/pull/2070) - fix: EXPOSED-371 Fix incorrect table reference passed to EntityID instance when using value-based utility functions by [@​dzikoysk](https://github.com/dzikoysk) in [https://github.com/JetBrains/Exposed/pull/2074](https://github.com/JetBrains/Exposed/pull/2074) Docs: - update: update Exposed logo by [@​koshachy](https://github.com/koshachy) in [https://github.com/JetBrains/Exposed/pull/2071](https://github.com/JetBrains/Exposed/pull/2071) ### [`v0.50.0`](https://github.com/JetBrains/Exposed/blob/HEAD/CHANGELOG.md#0500) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.49.0...0.50.0) Infrastructure: - Spring Framework 6.1.6 Breaking changes: - fix!: EXPOSED-317 repetitionAttempts property is misleading by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2042](https://github.com/JetBrains/Exposed/pull/2042) - refactor!: Column type safety by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2027](https://github.com/JetBrains/Exposed/pull/2027) - More details at [Breaking changes](https://jetbrains.github.io/Exposed/breaking-changes.html#0-50-0) Deprecations: - deprecate: Raise deprecation levels of API elements by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2038](https://github.com/JetBrains/Exposed/pull/2038) - deprecate: EXPOSED-354 Database.connectPool() with ConnectionPoolDataSource by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2059](https://github.com/JetBrains/Exposed/pull/2059) Features: - feat: EXPOSED-327 Support GraalVM native images with Spring Boot by [@​joshlong](https://github.com/joshlong) and [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2039](https://github.com/JetBrains/Exposed/pull/2039). Many thanks to [joshlong](https://github.com/joshlong) for the support. - feat: EXPOSED-296 Add ability to check if a Sequence exists in a database by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2045](https://github.com/JetBrains/Exposed/pull/2045) - feat: EXPOSED-355 Support INSERT...RETURNING statement by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2060](https://github.com/JetBrains/Exposed/pull/2060) - feat: EXPOSED-357 Support DELETE...RETURNING statement by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2061](https://github.com/JetBrains/Exposed/pull/2061) - feat: EXPOSED-356 Support UPDATE...RETURNING statement by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2062](https://github.com/JetBrains/Exposed/pull/2062) Bug fixes: - fix(jdbc): existingIndices() misses indexes from tables with a schema by [@​jackgisel-RL](https://github.com/jackgisel-RL) in [https://github.com/JetBrains/Exposed/pull/2033](https://github.com/JetBrains/Exposed/pull/2033) - fix: EXPOSED-259 supportsSubqueryUnions is too strict for PostgreSQL 12+ by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2037](https://github.com/JetBrains/Exposed/pull/2037) - fix: EXPOSED-339 Oracle alias for blob does not work by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2048](https://github.com/JetBrains/Exposed/pull/2048) - fix: EXPOSED-340 Syntax error using upsert with MySQL8 below 8.0.19 by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2049](https://github.com/JetBrains/Exposed/pull/2049) - fix: EXPOSED-349 "defaultValueFun" is lost from Column in Alias by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2058](https://github.com/JetBrains/Exposed/pull/2058) - fix: Error when updating different entities mapped to the same table by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/2065](https://github.com/JetBrains/Exposed/pull/2065) - fix: EXPOSED-350 keepLoadedReferencesOutOfTransaction causes duplicate query when true by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2064](https://github.com/JetBrains/Exposed/pull/2064) Docs: - Move wiki to github pages documentation by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/2034](https://github.com/JetBrains/Exposed/pull/2034) - docs: EXPOSED-313 JSON columns support libraries other than kotlinx.serialization by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2041](https://github.com/JetBrains/Exposed/pull/2041) - docs: Update Contributing documentation with code style details by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2051](https://github.com/JetBrains/Exposed/pull/2051) - docs: EXPOSED-319 H2 customEnumeration example throws by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/2056](https://github.com/JetBrains/Exposed/pull/2056) Tests: - Move BLOB tests to own source files by [@​obabichevjb](https://github.com/obabichevjb) in [https://github.com/JetBrains/Exposed/pull/2053](https://github.com/JetBrains/Exposed/pull/2053) ### [`v0.49.0`](https://github.com/JetBrains/Exposed/releases/tag/0.49.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.48.0...0.49.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0490) ##### New Contributors - [@​breun](https://github.com/breun) made their first contribution in [https://github.com/JetBrains/Exposed/pull/2031](https://github.com/JetBrains/Exposed/pull/2031) ### [`v0.48.0`](https://github.com/JetBrains/Exposed/releases/tag/0.48.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.47.0...0.48.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0480) #### New Contributors: - [@​elektro-wolle](https://github.com/elektro-wolle) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1822](https://github.com/JetBrains/Exposed/pull/1822) ### [`v0.47.0`](https://github.com/JetBrains/Exposed/releases/tag/0.47.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.46.0...0.47.0) ##### What's Changed [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0470) ##### New Contributors - [@​ShreckYe](https://github.com/ShreckYe) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1886](https://github.com/JetBrains/Exposed/pull/1886) - [@​esperar](https://github.com/esperar) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1877](https://github.com/JetBrains/Exposed/pull/1877) - [@​reidbuzby](https://github.com/reidbuzby) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1773](https://github.com/JetBrains/Exposed/pull/1773) - [@​yeogai](https://github.com/yeogai) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1692](https://github.com/JetBrains/Exposed/pull/1692) - [@​timeking](https://github.com/timeking) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1746](https://github.com/JetBrains/Exposed/pull/1746) - [@​winkey728](https://github.com/winkey728) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1975](https://github.com/JetBrains/Exposed/pull/1975) ### [`v0.46.0`](https://github.com/JetBrains/Exposed/releases/tag/0.46.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.45.0...0.46.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0460) #### New Contributors: - [@​pank-su](https://github.com/pank-su) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1887](https://github.com/JetBrains/Exposed/pull/1887) ### [`v0.45.0`](https://github.com/JetBrains/Exposed/releases/tag/0.45.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.44.1...0.45.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0450) ### [`v0.44.1`](https://github.com/JetBrains/Exposed/releases/tag/0.44.1) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.44.0...0.44.1) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0441) ##### New Contributors - [@​adambrangenberg](https://github.com/adambrangenberg) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1858](https://github.com/JetBrains/Exposed/pull/1858) ### [`v0.44.0`](https://github.com/JetBrains/Exposed/releases/tag/0.44.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.43.0...0.44.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0440) #### New Contributors: - [@​ymotchi](https://github.com/ymotchi) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1847](https://github.com/JetBrains/Exposed/pull/1847) - [@​Hakky54](https://github.com/Hakky54) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1852](https://github.com/JetBrains/Exposed/pull/1852) - [@​rbraeunlich](https://github.com/rbraeunlich) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1645](https://github.com/JetBrains/Exposed/pull/1645) ### [`v0.43.0`](https://github.com/JetBrains/Exposed/releases/tag/0.43.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.42.1...0.43.0) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0430) ### [`v0.42.1`](https://github.com/JetBrains/Exposed/releases/tag/0.42.1) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.42.0...0.42.1) [Change log](https://github.com/JetBrains/Exposed/blob/main/docs/ChangeLog.md#0421) ### [`v0.42.0`](https://github.com/JetBrains/Exposed/releases/tag/0.42.0) [Compare Source](https://github.com/JetBrains/Exposed/compare/0.41.1...0.42.0) #### What's Changed - Fix an error when updating an entity with a foreign key id (issue 880) by [@​forketyfork](https://github.com/forketyfork) in [https://github.com/JetBrains/Exposed/pull/1668](https://github.com/JetBrains/Exposed/pull/1668) - Open Sauced -> Exposed by [@​K0zka](https://github.com/K0zka) in [https://github.com/JetBrains/Exposed/pull/1660](https://github.com/JetBrains/Exposed/pull/1660) - Show length instead of value for exceeded column length by [@​simboel](https://github.com/simboel) in [https://github.com/JetBrains/Exposed/pull/1667](https://github.com/JetBrains/Exposed/pull/1667) - Document configuration when using Spring starter by [@​Kantis](https://github.com/Kantis) in [https://github.com/JetBrains/Exposed/pull/1654](https://github.com/JetBrains/Exposed/pull/1654) - EXPOSED-15 Fix running mysql tests on M1 by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/1719](https://github.com/JetBrains/Exposed/pull/1719) - Fix grammar in error message by [@​micheljung](https://github.com/micheljung) in [https://github.com/JetBrains/Exposed/pull/1717](https://github.com/JetBrains/Exposed/pull/1717) - Fix: PostgreSQLDialect.modifyColumn is not able to drop default values by [@​michael-markl](https://github.com/michael-markl) in [https://github.com/JetBrains/Exposed/pull/1716](https://github.com/JetBrains/Exposed/pull/1716) - Fix UInt value out of bounds by [@​keta1](https://github.com/keta1) in [https://github.com/JetBrains/Exposed/pull/1709](https://github.com/JetBrains/Exposed/pull/1709) - fix: EXPOSED-16 Failed tests in KotlinTimeTests by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1724](https://github.com/JetBrains/Exposed/pull/1724) - EXPOSED-21 Primary key constraint not created by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1728](https://github.com/JetBrains/Exposed/pull/1728) - EXPOSED-19 Max timestamp in SQLite not working by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1725](https://github.com/JetBrains/Exposed/pull/1725) - docs: Add contribution guide by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1729](https://github.com/JetBrains/Exposed/pull/1729) - fix: EXPOSED-27 Id is not in record set by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1731](https://github.com/JetBrains/Exposed/pull/1731) - fix: EXPOSED-28 Update with join fails on H2 in MySql mode by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1732](https://github.com/JetBrains/Exposed/pull/1732) - fix: EXPOSED-29 Cannot set nullable composite column in InsertStatement by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1733](https://github.com/JetBrains/Exposed/pull/1733) - fix: EXPOSED-23 H2 unsupported indexing behavior by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1734](https://github.com/JetBrains/Exposed/pull/1734) - fix: EXPOSED-31 Landing Readme links and demo code by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1736](https://github.com/JetBrains/Exposed/pull/1736) - Add CHARINDEX function for sqlserver by [@​eukleshnin](https://github.com/eukleshnin) in [https://github.com/JetBrains/Exposed/pull/1675](https://github.com/JetBrains/Exposed/pull/1675) - feat: EXPOSED-32 Support string function CHAR_LENGTH by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1737](https://github.com/JetBrains/Exposed/pull/1737) - feat: EXPOSED-37 Support null-safe equality comparison by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1739](https://github.com/JetBrains/Exposed/pull/1739) - Remove unnecessary parentheses for functions by [@​Maxr1998](https://github.com/Maxr1998) in [https://github.com/JetBrains/Exposed/pull/1642](https://github.com/JetBrains/Exposed/pull/1642) - fix: EXPOSED-36 LocalDate comparison in SQLite by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1741](https://github.com/JetBrains/Exposed/pull/1741) - fix: EXPOSED-42 Can't create BLOB column with default value by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1740](https://github.com/JetBrains/Exposed/pull/1740) - feat: EXPOSED-45 Support single statement UPSERT by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1743](https://github.com/JetBrains/Exposed/pull/1743) - fix: EXPOSED-49 Replace statement defined as upsert statement by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1747](https://github.com/JetBrains/Exposed/pull/1747) - Note breaking change in 0.40.1 by [@​timmc](https://github.com/timmc) in [https://github.com/JetBrains/Exposed/pull/1723](https://github.com/JetBrains/Exposed/pull/1723) - fix: EXPOSED-48 Incorrect statistics aggregate functions by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1745](https://github.com/JetBrains/Exposed/pull/1745) - feat: EXPOSED-52 Support batch UPSERT by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1749](https://github.com/JetBrains/Exposed/pull/1749) - Sum batch results for inserts by [@​johnzeringue](https://github.com/johnzeringue) in [https://github.com/JetBrains/Exposed/pull/1641](https://github.com/JetBrains/Exposed/pull/1641) - docs: EXPOSED-55 Change TC build status badge links by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1750](https://github.com/JetBrains/Exposed/pull/1750) - task: EXPOSED-58 Revisit detekt.yml and fix existing issues by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1752](https://github.com/JetBrains/Exposed/pull/1752) - Add samples folder by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/1753](https://github.com/JetBrains/Exposed/pull/1753) - fix: EXPOSED-57 BatchInsertStatement can't be used with MySQL upsert by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1754](https://github.com/JetBrains/Exposed/pull/1754) - feat: EXPOSED-47 Add support for SET DEFAULT reference option by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1744](https://github.com/JetBrains/Exposed/pull/1744) - docs: Correct broken links after README was moved by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1758](https://github.com/JetBrains/Exposed/pull/1758) - Add API tracking by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/1756](https://github.com/JetBrains/Exposed/pull/1756) - control whether arguments should be inlined or passed in. by [@​lure](https://github.com/lure) in [https://github.com/JetBrains/Exposed/pull/1621](https://github.com/JetBrains/Exposed/pull/1621) - build: Perform apiDump to fix failed merge build by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1760](https://github.com/JetBrains/Exposed/pull/1760) - fix: EXPOSED-64 Fix Detekt SpreadOperator warnings by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1759](https://github.com/JetBrains/Exposed/pull/1759) - feat: Add partial index support (Postgres only) by [@​lure](https://github.com/lure) in [https://github.com/JetBrains/Exposed/pull/1748](https://github.com/JetBrains/Exposed/pull/1748) - add afterStatementPrepared method to StatementInterceptor by [@​lure](https://github.com/lure) in [https://github.com/JetBrains/Exposed/pull/1622](https://github.com/JetBrains/Exposed/pull/1622) - Bump org.jetbrains.kotlin.jvm from 1.7.21 to 1.8.22 by [@​dependabot](https://github.com/dependabot) in [https://github.com/JetBrains/Exposed/pull/1755](https://github.com/JetBrains/Exposed/pull/1755) - Create Documetation Website by [@​e5l](https://github.com/e5l) in [https://github.com/JetBrains/Exposed/pull/1757](https://github.com/JetBrains/Exposed/pull/1757) - feat: EXPOSED-60 Support json/json(b) column types by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1762](https://github.com/JetBrains/Exposed/pull/1762) - feat: EXPOSED-66 Extend partial index to SQLServer and SQLite by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1763](https://github.com/JetBrains/Exposed/pull/1763) - \[EXPOSED-46] Add a possibility to set a delay for the repetition attempts by [@​mgrati](https://github.com/mgrati) in [https://github.com/JetBrains/Exposed/pull/1742](https://github.com/JetBrains/Exposed/pull/1742) - chore: Set up Maven publishing by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1761](https://github.com/JetBrains/Exposed/pull/1761) - feat: EXPOSED-69 Extend json support to H2, Oracle (text) and DAO by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1766](https://github.com/JetBrains/Exposed/pull/1766) - feat: EXPOSED-68 Add more json/json(b) column functions by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1770](https://github.com/JetBrains/Exposed/pull/1770) - chore: remove detekt ClassNaming issues by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1769](https://github.com/JetBrains/Exposed/pull/1769) - deprecate: EXPOSED-84 Raise deprecation levels of API elements by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1771](https://github.com/JetBrains/Exposed/pull/1771) - chore: Fix more detekt issues by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1772](https://github.com/JetBrains/Exposed/pull/1772) - docs: add a point in CONTRIBUTING.md regarding API check by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1776](https://github.com/JetBrains/Exposed/pull/1776) - chore: add detekt IntelliJ plugin configuration to detekt.xml by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1775](https://github.com/JetBrains/Exposed/pull/1775) - test: Add json/jsonb array tests by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1778](https://github.com/JetBrains/Exposed/pull/1778) - test: Add jsonb datetime tests by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1780](https://github.com/JetBrains/Exposed/pull/1780) - QueryBuilder.registerArguments - avoid potentially expensive valueToString call unless we need to sort values by [@​zhurs](https://github.com/zhurs) in [https://github.com/JetBrains/Exposed/pull/1779](https://github.com/JetBrains/Exposed/pull/1779) - [#​623](https://github.com/JetBrains/Exposed/issues/623) Add support of window functions in Exposed DSL by [@​Legohuman](https://github.com/Legohuman) in [https://github.com/JetBrains/Exposed/pull/1651](https://github.com/JetBrains/Exposed/pull/1651) - fix: EXPOSED-50 customEnumeration reference column error by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1785](https://github.com/JetBrains/Exposed/pull/1785) - feat: EXPOSED-89 Support functions in Create Index by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1788](https://github.com/JetBrains/Exposed/pull/1788) - fix: EXPOSED-91 NPE in existingIndices() with function index by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1791](https://github.com/JetBrains/Exposed/pull/1791) - chore: Add blobParam function. by [@​spand](https://github.com/spand) in [https://github.com/JetBrains/Exposed/pull/1672](https://github.com/JetBrains/Exposed/pull/1672) - build(deps): bump org.jetbrains.kotlin.jvm from 1.8.22 to 1.9.0 by [@​dependabot](https://github.com/dependabot) in [https://github.com/JetBrains/Exposed/pull/1784](https://github.com/JetBrains/Exposed/pull/1784) - fix: SQLServerException: The port number -1 is not valid. by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1789](https://github.com/JetBrains/Exposed/pull/1789) - build: run apiDump by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1792](https://github.com/JetBrains/Exposed/pull/1792) - fix: EXPOSED-80 Set repetition policy for suspended transactions by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1774](https://github.com/JetBrains/Exposed/pull/1774) - chore: Modify max_line_length value in .editorconfig to match that of detekt.yml by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1790](https://github.com/JetBrains/Exposed/pull/1790) - build(deps): bump org.jetbrains.kotlin.plugin.serialization from 1.8.22 to 1.9.0 by [@​dependabot](https://github.com/dependabot) in [https://github.com/JetBrains/Exposed/pull/1783](https://github.com/JetBrains/Exposed/pull/1783) - refactor: EXPOSED-88 Remove kotlinx-serialization dep from exposed-core by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1793](https://github.com/JetBrains/Exposed/pull/1793) - chore: Integrate detekt with GitHub Actions by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1765](https://github.com/JetBrains/Exposed/pull/1765) - chore: Remove more detekt issues (part 4) by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1794](https://github.com/JetBrains/Exposed/pull/1794) - fix: Exclude deleted and renamed files from detekt GitHub Action by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1795](https://github.com/JetBrains/Exposed/pull/1795) - fix: EXPOSED-97 Unsigned column types truncate MySQL values by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1796](https://github.com/JetBrains/Exposed/pull/1796) - feat: Add spring mutli container support by [@​FullOfOrange](https://github.com/FullOfOrange) in [https://github.com/JetBrains/Exposed/pull/1781](https://github.com/JetBrains/Exposed/pull/1781) - docs: Reorganize structure and rewrite some pages by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1764](https://github.com/JetBrains/Exposed/pull/1764) - fix: EXPOSED-98: Add instructions to log-in to see and log issues by [@​jasonjmcghee](https://github.com/jasonjmcghee) in [https://github.com/JetBrains/Exposed/pull/1798](https://github.com/JetBrains/Exposed/pull/1798) - test: Add test coverage for column transforms by [@​oharaandrew314](https://github.com/oharaandrew314) in [https://github.com/JetBrains/Exposed/pull/1687](https://github.com/JetBrains/Exposed/pull/1687) - fix: EXPOSED-83 createMissingTablesAndColumns not detecting missing PK by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1797](https://github.com/JetBrains/Exposed/pull/1797) - test: Fix failing exposed-tests in SQL Server by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1801](https://github.com/JetBrains/Exposed/pull/1801) - fix: EXPOSED-54 CaseWhen.Else returns narrow Expression<R> by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1800](https://github.com/JetBrains/Exposed/pull/1800) - chore: Release 0.42.0 by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1804](https://github.com/JetBrains/Exposed/pull/1804) - feat: EXPOSED-43 Add support for timestamp with time zone by [@​joc-a](https://github.com/joc-a) in [https://github.com/JetBrains/Exposed/pull/1787](https://github.com/JetBrains/Exposed/pull/1787) - fix: EXPOSED-99 SchemaUtils incorrectly compares datetime defaults by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1802](https://github.com/JetBrains/Exposed/pull/1802) - test: Fix failing exposed-tests in Oracle by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1803](https://github.com/JetBrains/Exposed/pull/1803) - fix: EXPOSED-82 Inaccurate UShort column type mapping by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1799](https://github.com/JetBrains/Exposed/pull/1799) - test: Fix failing datetime tests in MariaDB by [@​bog-walk](https://github.com/bog-walk) in [https://github.com/JetBrains/Exposed/pull/1805](https://github.com/JetBrains/Exposed/pull/1805) #### New Contributors - [@​forketyfork](https://github.com/forketyfork) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1668](https://github.com/JetBrains/Exposed/pull/1668) - [@​K0zka](https://github.com/K0zka) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1660](https://github.com/JetBrains/Exposed/pull/1660) - [@​simboel](https://github.com/simboel) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1667](https://github.com/JetBrains/Exposed/pull/1667) - [@​Kantis](https://github.com/Kantis) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1654](https://github.com/JetBrains/Exposed/pull/1654) - [@​e5l](https://github.com/e5l) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1719](https://github.com/JetBrains/Exposed/pull/1719) - [@​micheljung](https://github.com/micheljung) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1717](https://github.com/JetBrains/Exposed/pull/1717) - [@​michael-markl](https://github.com/michael-markl) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1716](https://github.com/JetBrains/Exposed/pull/1716) - [@​keta1](https://github.com/keta1) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1709](https://github.com/JetBrains/Exposed/pull/1709) - [@​bog-walk](https://github.com/bog-walk) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1728](https://github.com/JetBrains/Exposed/pull/1728) - [@​eukleshnin](https://github.com/eukleshnin) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1675](https://github.com/JetBrains/Exposed/pull/1675) - [@​timmc](https://github.com/timmc) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1723](https://github.com/JetBrains/Exposed/pull/1723) - [@​johnzeringue](https://github.com/johnzeringue) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1641](https://github.com/JetBrains/Exposed/pull/1641) - [@​mgrati](https://github.com/mgrati) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1742](https://github.com/JetBrains/Exposed/pull/1742) - [@​zhurs](https://github.com/zhurs) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1779](https://github.com/JetBrains/Exposed/pull/1779) - [@​Legohuman](https://github.com/Legohuman) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1651](https://github.com/JetBrains/Exposed/pull/1651) - [@​FullOfOrange](https://github.com/FullOfOrange) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1781](https://github.com/JetBrains/Exposed/pull/1781) - [@​jasonjmcghee](https://github.com/jasonjmcghee) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1798](https://github.com/JetBrains/Exposed/pull/1798) - [@​oharaandrew314](https://github.com/oharaandrew314) made their first contribution in [https://github.com/JetBrains/Exposed/pull/1687](https://github.com/JetBrains/Exposed/pull/1687) **Full Changelog**: JetBrains/Exposed@0.41.1...0.42.0 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View the [repository job log](https://developer.mend.io/github/DonRobo/home-former). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40MzguMCIsInVwZGF0ZWRJblZlciI6IjM3LjQzOC4wIiwidGFyZ2V0QnJhbmNoIjoiZGV2ZWxvcCIsImxhYmVscyI6W119--> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
ALL
andANY
are 2 SQL operators to perform a comparison between a single column value and a range of other values.According to java - PreparedStatement IN clause alternatives? - Stack Overflow, using
= ANY(?)
andPreparedStatement.setArray
if supported can be more efficient than usingIN
(inList
in Exposed) when passing lists of different sizes because a single cached prepared statement can be reused. This is the major motive of this PR.Since according to references online they are called operators not functions, and
CustomOperator
in Exposed has 2 operands, I am not sure whether it is better to extendOp
orCustomFunction
, and so I have implemented both and they are both tested to work. Please help remove the less appropriate one if this PR is accepted.