diff --git a/.editorconfig b/.editorconfig
index e28d8216da..0fa7fc2648 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -6,9 +6,9 @@ end_of_line = lf
indent_size = tab
indent_style = space
insert_final_newline = true
-max_line_length = 150
+max_line_length = 166
tab_width = 4
-ij_formatter_off_tag = @formatter:off
+ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = true
ij_smart_tabs = true
@@ -41,6 +41,5 @@ ij_kotlin_spaces_around_equality_operators = true
ij_any_align_group_field_declarations = false
ij_java_align_group_field_declarations = false
-
[{.github/**/*.yml, .idea/*.xml}]
indent_size = 2
diff --git a/.github/workflows/detekt.yml b/.github/workflows/detekt.yml
new file mode 100644
index 0000000000..19d77e3c3a
--- /dev/null
+++ b/.github/workflows/detekt.yml
@@ -0,0 +1,57 @@
+# This workflow performs a static analysis of your Kotlin source code using detekt.
+#
+# Scans are triggered on every pull request targeting the main branch.
+
+name: detekt
+
+on:
+ # Allows you to run this workflow manually from the Actions tab
+ workflow_dispatch:
+
+ # Triggers the workflow on pull request events targeting the main branch
+ pull_request:
+ branches:
+ - main
+
+# A workflow run is made up of one or more jobs that can run sequentially or in parallel
+jobs:
+ # This workflow contains a single job called "detekt"
+ detekt:
+ # The type of runner that the job will run on
+ runs-on: ubuntu-latest
+ steps:
+ # Checks out your repository under $GITHUB_WORKSPACE, so your job can access it
+ - name: "checkout"
+ uses: actions/checkout@v2
+ # Determines changed files
+ - name: "changed-files"
+ run: |
+ git fetch origin main:refs/remotes/origin/main
+ CHANGED_FILES=$(git --no-pager diff --name-only --diff-filter=dr origin/main HEAD -- . ':!exposed-tests' | grep '\(.*.kt\|.*.kts\)$' | tr '\n' , | rev | cut -c 2- | rev)
+ echo "Changed files: $CHANGED_FILES"
+ echo "CHANGED_FILES=$CHANGED_FILES" >> "$GITHUB_ENV"
+ # Resolves and installs a specific version of detekt on to a GitHub Actions Runner if not already present in the tool cache
+ - name: "set-up-detekt"
+ uses: peter-murray/setup-detekt@v2
+ with:
+ detekt_version: 1.23.1
+ # Runs detekt on changed files
+ - name: "run-detekt"
+ run: |
+ if [ -z "$CHANGED_FILES" ]
+ then
+ echo "No changed Kotlin files found."
+ exit 0
+ fi
+
+ echo "Running detekt check..."
+ DETEKT_ISSUES=$(detekt-cli --build-upon-default-config --config detekt/detekt-config.yml --plugins detekt/detekt-formatting-1.23.1.jar --input $CHANGED_FILES)
+ if [ -n "$DETEKT_ISSUES" ]; then
+ echo "***********************************************"
+ echo "$DETEKT_ISSUES"
+ echo "***********************************************"
+ echo " detekt failed "
+ echo " Please fix the above issues "
+ echo "***********************************************"
+ exit 1
+ fi
diff --git a/.idea/detekt.xml b/.idea/detekt.xml
index 62877118cb..354d38c4b8 100644
--- a/.idea/detekt.xml
+++ b/.idea/detekt.xml
@@ -1,9 +1,20 @@
-
- true
- true
- true
- $PROJECT_DIR$/detekt.yml
-
-
\ No newline at end of file
+
+ true
+ true
+ true
+ $PROJECT_DIR$/detekt/detekt-config.yml
+
+
+
+
+
+
+
+
+
diff --git a/docs/README.md b/README.md
similarity index 63%
rename from docs/README.md
rename to README.md
index 518150d1e7..c7a8eefb47 100644
--- a/docs/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
-
+
[![JetBrains team project](https://jb.gg/badges/team.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
[![Kotlinlang Slack Channel](https://img.shields.io/badge/slack-@kotlinlang/exposed-yellow.svg?logo=slack?style=flat)](https://kotlinlang.slack.com/archives/C0CG7E0A1)
-[![TC Build status](https://teamcity.jetbrains.com/app/rest/builds/buildType:(id:KotlinTools_Exposed_Build)/statusIcon)](https://teamcity.jetbrains.com/viewType.html?buildTypeId=KotlinTools_Exposed_Build&guest=1)
+[![TC Build status](https://exposed.teamcity.com/app/rest/builds/buildType:id:Exposed_Build/statusIcon.svg)](https://exposed.teamcity.com/viewType.html?buildTypeId=Exposed_Build&guest=1)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.jetbrains.exposed/exposed-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.jetbrains.exposed/exposed-core)
[![GitHub License](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg?style=flat)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -13,18 +13,179 @@
Exposed is a lightweight SQL library on top of JDBC driver for Kotlin language.
Exposed has two flavors of database access: typesafe SQL wrapping DSL and lightweight Data Access Objects (DAO).
-With Exposed you can have two levels of databases Access. You would like to use exposed because the database access includes wrapping DSL and a lightweight data access object. Also, our official mascot is Cuttlefish, which is well known for its outstanding mimicry ability that enables it to blend seamlessly in any environment.
+With Exposed, you have two ways for database access: wrapping DSL and a lightweight DAO. Our official mascot is the cuttlefish, which is well-known for its outstanding mimicry ability that enables it to blend seamlessly into any environment.
Similar to our mascot, Exposed can be used to mimic a variety of database engines and help you build applications without dependencies on any specific database engine and switch between them with very little or no changes.
## Supported Databases
-- ![Postgres](https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge&logo=postgresql&logoColor=white) (Also, PostgreSQL using the [pgjdbc-ng](https://github.com/impossibl/pgjdbc-ng) JDBC driver)
-- ![MySQL](https://img.shields.io/badge/mysql-%2300f.svg?style=for-the-badge&logo=mysql&logoColor=white)
-- ![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white)
-- ![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge&logo=sqlite&logoColor=white)
-- H2 (versions 2.x; 1.x version is deprecated and will be removed in future releases)
-- [Oracle](ORACLE.md)
-- [SQL Server](SQLServer.md)
+- H2 (versions 2.x; 1.x version is deprecated and will be removed in future releases)
+- ![MariaDB](https://img.shields.io/badge/MariaDB-003545?style=for-the-badge&logo=mariadb&logoColor=white)
+- ![MySQL](https://img.shields.io/badge/mysql-%2300f.svg?style=for-the-badge&logo=mysql&logoColor=white)
+- [Oracle](docs/ORACLE.md)
+- ![Postgres](https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge&logo=postgresql&logoColor=white) (Also, PostgreSQL using
+ the [pgjdbc-ng](https://github.com/impossibl/pgjdbc-ng) JDBC driver)
+- [SQL Server](docs/SQLServer.md)
+- ![SQLite](https://img.shields.io/badge/sqlite-%2307405e.svg?style=for-the-badge&logo=sqlite&logoColor=white)
+
+## Dependencies
+
+### Maven Central configuration
+
+Releases of Exposed are available in the Maven Central repository. You can declare this repository in your build script as follows:
+
+#### Maven
+
+```xml
+
+
+
+
+ mavenCentral
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+```
+
+#### Gradle Groovy and Kotlin DSL
+
+**Warning:** You might need to set your Kotlin JVM target to 8 and when using Spring to 17 in order for it to work properly
+
+```kotlin
+repositories {
+ // Versions after 0.30.1
+ // Versions before 0.30.1 is unavailable for now
+ mavenCentral()
+}
+```
+
+### Exposed modules
+
+`Exposed` consists of the following modules:
+
+* exposed-core - base module, which contains both DSL api along with mapping
+* exposed-crypt - provides additional column types to store encrypted data in DB and encode/decode it on client-side
+* exposed-dao - DAO api
+* exposed-java-time - date-time extensions based on Java8 Time API
+* exposed-jdbc - transport level implementation based on Java JDBC API
+* exposed-jodatime - date-time extensions based on JodaTime library
+* exposed-json - JSON and JSONB data type extensions
+* exposed-kotlin-datetime - date-time extensions based on kotlinx-datetime
+* exposed-money - extensions to support MonetaryAmount from "javax.money:money-api"
+* exposed-spring-boot-starter - a starter for [Spring Boot](https://spring.io/projects/spring-boot) to utilize Exposed as the ORM instead
+ of [Hibernate](https://hibernate.org/)
+
+```xml
+
+
+
+ org.jetbrains.exposed
+ exposed-core
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-crypt
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-dao
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-java-time
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-jdbc
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-jodatime
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-json
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-kotlin-datetime
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-money
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-spring-boot-starter
+ 0.44.0
+
+
+
+```
+
+#### Gradle Groovy
+
+```groovy
+dependencies {
+ implementation 'org.jetbrains.exposed:exposed-core:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-crypt:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-dao:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-jdbc:0.44.0'
+
+ implementation 'org.jetbrains.exposed:exposed-jodatime:0.44.0'
+ // or
+ implementation 'org.jetbrains.exposed:exposed-java-time:0.44.0'
+ // or
+ implementation 'org.jetbrains.exposed:exposed-kotlin-datetime:0.44.0'
+
+ implementation 'org.jetbrains.exposed:exposed-json:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-money:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-spring-boot-starter:0.44.0'
+}
+```
+
+#### Gradle Kotlin DSL
+
+In `build.gradle.kts`:
+
+```kotlin
+val exposedVersion: String by project
+dependencies {
+ implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-crypt:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion")
+
+ implementation("org.jetbrains.exposed:exposed-jodatime:$exposedVersion")
+ // or
+ implementation("org.jetbrains.exposed:exposed-java-time:$exposedVersion")
+ // or
+ implementation("org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion")
+
+ implementation("org.jetbrains.exposed:exposed-json:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-money:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-spring-boot-starter:$exposedVersion")
+}
+```
+
+and in `gradle.properties`
+
+```
+exposedVersion=0.44.0
+```
+
+## Samples
+
+Check out the [samples](samples/README.md) for a quick start.
## Links
@@ -33,15 +194,16 @@ Currently, Exposed is available for **maven/gradle builds**. Check the [Maven Ce
For more information visit the links below:
- [Wiki](https://github.com/JetBrains/Exposed/wiki) with examples and docs
-- [Roadmap](ROADMAP.md) to see what's coming next
-- [Change log](ChangeLog.md) of improvements and bug fixes
+- [Roadmap](docs/ROADMAP.md) to see what's coming next
+- [Change log](docs/ChangeLog.md) of improvements and bug fixes
+- [Breaking changes](docs/BREAKING_CHANGES.md) and any migration details
- [Slack Channel](https://kotlinlang.slack.com/archives/C0CG7E0A1)
- [Issue Tracker](https://youtrack.jetbrains.com/issues/EXPOSED)
## Filing issues
-Please note that we are moving away from GitHub Issues for reporting of bugs and features. Please log any new requests on [YouTrack](https://youtrack.jetbrains.com/issues/EXPOSED).
+Please note that we are moving away from GitHub Issues for reporting of bugs and features. Please log any new requests on [YouTrack](https://youtrack.jetbrains.com/issues/EXPOSED). You must be logged in to view and log issues, otherwise you will be met with a 404.
## Community
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/DockerTestContainers.kt b/api/exposed.api
similarity index 100%
rename from buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/DockerTestContainers.kt
rename to api/exposed.api
diff --git a/build.gradle.kts b/build.gradle.kts
index 7e4d425166..2c074999a9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,36 +1,50 @@
import io.gitlab.arturbosch.detekt.Detekt
import io.gitlab.arturbosch.detekt.report.ReportMergeTask
+import org.jetbrains.exposed.gradle.*
import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile
plugins {
kotlin("jvm") apply true
- id("io.github.gradle-nexus.publish-plugin") apply true
id("io.gitlab.arturbosch.detekt")
+ id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.13.2"
+
+ id("com.avast.gradle.docker-compose")
+}
+
+repositories {
+ mavenLocal()
+ mavenCentral()
}
allprojects {
- apply(from = rootProject.file("buildScripts/gradle/checkstyle.gradle.kts"))
+ configureDetekt()
if (this.name != "exposed-tests" && this.name != "exposed-bom" && this != rootProject) {
- apply(from = rootProject.file("buildScripts/gradle/publishing.gradle.kts"))
+ configurePublishing()
}
}
+apiValidation {
+ ignoredProjects.addAll(listOf("exposed-tests", "exposed-bom"))
+}
+
val reportMerge by tasks.registering(ReportMergeTask::class) {
output.set(rootProject.buildDir.resolve("reports/detekt/exposed.xml"))
}
subprojects {
dependencies {
- detektPlugins("io.gitlab.arturbosch.detekt", "detekt-formatting", "1.21.0")
+ detektPlugins("io.gitlab.arturbosch.detekt", "detekt-formatting", "1.23.1")
}
tasks.withType().configureEach detekt@{
- enabled = this@subprojects.name !== "exposed-tests"
+ onlyIf { this@subprojects.name !== "exposed-tests" }
+
finalizedBy(reportMerge)
reportMerge.configure {
input.from(this@detekt.xmlReportFile)
}
}
+
tasks.withType().configureEach {
kotlinOptions {
jvmTarget = "1.8"
@@ -40,17 +54,104 @@ subprojects {
}
}
-nexusPublishing {
- repositories {
- sonatype {
- username.set(System.getenv("exposed.sonatype.user"))
- password.set(System.getenv("exposed.sonatype.password"))
- useStaging.set(true)
+subprojects {
+ if (name == "exposed-bom") return@subprojects
+
+ apply(plugin = "org.jetbrains.kotlin.jvm")
+
+ testDb("h2") {
+ withContainer = false
+ dialects("H2", "H2_MYSQL", "H2_PSQL", "H2_MARIADB", "H2_ORACLE", "H2_SQLSERVER")
+
+ dependencies {
+ dependency("com.h2database:h2:${Versions.h2_v2}")
}
}
-}
-repositories {
- mavenLocal()
- mavenCentral()
+ testDb("h2_v1") {
+ withContainer = false
+ dialects("H2", "H2_MYSQL")
+
+ dependencies {
+ dependency("com.h2database:h2:${Versions.h2}")
+ }
+ }
+
+ testDb("sqlite") {
+ withContainer = false
+ dialects("sqlite")
+
+ dependencies {
+ dependency("org.xerial:sqlite-jdbc:${Versions.sqlLite3}")
+ }
+ }
+
+ testDb("mysql") {
+ port = 3001
+ dialects("mysql")
+ dependencies {
+ dependency("mysql:mysql-connector-java:${Versions.mysql51}")
+ }
+ }
+
+ testDb("mysql8") {
+ port = 3002
+ dialects("mysql")
+ dependencies {
+ dependency("mysql:mysql-connector-java:${Versions.mysql80}")
+ }
+ }
+
+ testDb("mariadb_v2") {
+ dialects("mariadb")
+ container = "mariadb"
+ port = 3000
+ dependencies {
+ dependency("org.mariadb.jdbc:mariadb-java-client:${Versions.mariaDB_v2}")
+ }
+ }
+
+ testDb("mariadb_v3") {
+ dialects("mariadb")
+ container = "mariadb"
+ port = 3000
+ dependencies {
+ dependency("org.mariadb.jdbc:mariadb-java-client:${Versions.mariaDB_v3}")
+ }
+ }
+
+ testDb("oracle") {
+ port = 3003
+ colima = true
+ dialects("oracle")
+ dependencies {
+ dependency("com.oracle.database.jdbc:ojdbc8:${Versions.oracle12}")
+ }
+ }
+
+ testDb("postgres") {
+ port = 3004
+ dialects("postgresql")
+ dependencies {
+ dependency("org.postgresql:postgresql:${Versions.postgre}")
+ }
+ }
+
+ testDb("postgresNG") {
+ port = 3004
+ dialects("postgresqlng")
+ container = "postgres"
+ dependencies {
+ dependency("org.postgresql:postgresql:${Versions.postgre}")
+ dependency("com.impossibl.pgjdbc-ng:pgjdbc-ng:${Versions.postgreNG}")
+ }
+ }
+
+ testDb("sqlserver") {
+ port = 3005
+ dialects("sqlserver")
+ dependencies {
+ dependency("com.microsoft.sqlserver:mssql-jdbc:${Versions.sqlserver}")
+ }
+ }
}
diff --git a/buildScripts/docker/docker-compose-mariadb.yml b/buildScripts/docker/docker-compose-mariadb.yml
index b884da7aa3..6cb742943c 100644
--- a/buildScripts/docker/docker-compose-mariadb.yml
+++ b/buildScripts/docker/docker-compose-mariadb.yml
@@ -1,11 +1,11 @@
version: '3.1'
services:
- mariadb:
- image: mariadb
- restart: always
- ports:
- - "3306"
- environment:
- MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
- MYSQL_DATABASE: 'testdb'
+ mariadb:
+ image: mariadb
+ restart: always
+ ports:
+ - "3000:3306"
+ environment:
+ MYSQL_ROOT_PASSWORD: "Exposed_password_1!"
+ MYSQL_DATABASE: "testdb"
diff --git a/buildScripts/docker/docker-compose-mysql.yml b/buildScripts/docker/docker-compose-mysql.yml
index e418594507..6eac6034ff 100644
--- a/buildScripts/docker/docker-compose-mysql.yml
+++ b/buildScripts/docker/docker-compose-mysql.yml
@@ -1,12 +1,12 @@
-version: '3.1'
+version: "3.1"
services:
- mysql:
- platform: linux/x86_64
- image: mysql:5.7
- restart: always
- ports:
- - "3306"
- environment:
- MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
- MYSQL_DATABASE: 'testdb'
+ mysql:
+ platform: linux/x86_64
+ restart: always
+ image: mysql:5.7
+ ports:
+ - "3001:3306"
+ environment:
+ MYSQL_ROOT_PASSWORD: "Exposed_password_1!"
+ MYSQL_DATABASE: "testdb"
diff --git a/buildScripts/docker/docker-compose-mysql8.yml b/buildScripts/docker/docker-compose-mysql8.yml
index 0c912b9254..06ef4602f1 100644
--- a/buildScripts/docker/docker-compose-mysql8.yml
+++ b/buildScripts/docker/docker-compose-mysql8.yml
@@ -1,11 +1,11 @@
version: '3.1'
services:
- mysql8:
- image: mysql:8.0
- restart: always
- ports:
- - "3306"
- environment:
- MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
- MYSQL_DATABASE: 'testdb'
+ mysql8:
+ image: mysql:8.0
+ restart: always
+ ports:
+ - "3002:3306"
+ environment:
+ MYSQL_ROOT_PASSWORD: "Exposed_password_1!"
+ MYSQL_DATABASE: "testdb"
diff --git a/buildScripts/docker/docker-compose-oracle.yml b/buildScripts/docker/docker-compose-oracle.yml
index 79eec9e9d8..4680e623fa 100644
--- a/buildScripts/docker/docker-compose-oracle.yml
+++ b/buildScripts/docker/docker-compose-oracle.yml
@@ -1,13 +1,11 @@
version: '3.1'
services:
- oracle:
- container_name: oracleDB
- image: quillbuilduser/oracle-18-xe:latest
- ports:
- - "1521"
- environment:
- WEB_CONSOLE: "true"
- DBCA_TOTAL_MEMORY: 1024
- PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- USE_UTF8_IF_CHARSET_EMPTY: "true"
\ No newline at end of file
+ oracle:
+ container_name: oracleDB
+ restart: always
+ image: gvenzl/oracle-xe:18-slim-faststart
+ ports:
+ - "3003:1521"
+ environment:
+ ORACLE_PASSWORD: "Oracle18"
diff --git a/buildScripts/docker/docker-compose-postgres.yml b/buildScripts/docker/docker-compose-postgres.yml
new file mode 100644
index 0000000000..ab39ca0f35
--- /dev/null
+++ b/buildScripts/docker/docker-compose-postgres.yml
@@ -0,0 +1,11 @@
+version: '3.1'
+
+services:
+ postgres:
+ image: postgres
+ restart: always
+ ports:
+ - "3004:5432"
+ environment:
+ POSTGRES_USER: "root"
+ POSTGRES_PASSWORD: "Exposed_password_1!"
diff --git a/buildScripts/docker/docker-compose-sqlserver.yml b/buildScripts/docker/docker-compose-sqlserver.yml
index 2692f88e03..1ecf490e57 100644
--- a/buildScripts/docker/docker-compose-sqlserver.yml
+++ b/buildScripts/docker/docker-compose-sqlserver.yml
@@ -1,12 +1,12 @@
version: '3.1'
services:
- sqlserver:
- container_name: SQLServer
- image: mcr.microsoft.com/mssql/server:2017-latest
- ports:
- - "1433"
- environment:
- ACCEPT_EULA: "Y"
- SA_PASSWORD: "yourStrong(!)Password"
- MSSQL_PID: "Express"
+ sqlserver:
+ container_name: SQLServer
+ restart: always
+ image: mcr.microsoft.com/azure-sql-edge:1.0.7
+ ports:
+ - "3005:1433"
+ environment:
+ ACCEPT_EULA: "1"
+ SA_PASSWORD: "Exposed_password_1!"
diff --git a/buildScripts/gradle/checkstyle.gradle.kts b/buildScripts/gradle/checkstyle.gradle.kts
deleted file mode 100644
index 2793fa290d..0000000000
--- a/buildScripts/gradle/checkstyle.gradle.kts
+++ /dev/null
@@ -1,20 +0,0 @@
-import io.gitlab.arturbosch.detekt.extensions.DetektExtension
-import io.gitlab.arturbosch.detekt.DetektPlugin
-
-apply()
-
-configure {
- ignoreFailures = false
- buildUponDefaultConfig = true
- config = files(
- rootDir.resolve("detekt.yml").takeIf { it.isFile },
- projectDir.resolve("detekt.yml").takeIf { it.isFile }
- )
- reports {
- xml.enabled = true
- html.enabled = false
- txt.enabled = false
- sarif.enabled = false
- }
- parallel = true
-}
diff --git a/buildScripts/gradle/publishing.gradle.kts b/buildScripts/gradle/publishing.gradle.kts
deleted file mode 100644
index 5013e67558..0000000000
--- a/buildScripts/gradle/publishing.gradle.kts
+++ /dev/null
@@ -1,23 +0,0 @@
-import org.jetbrains.exposed.gradle.*
-
-apply(plugin = "java-library")
-apply(plugin = "maven-publish")
-apply(plugin = "signing")
-
-_java {
- withJavadocJar()
- withSourcesJar()
-}
-
-_publishing {
- publications {
- create("ExposedJars") {
- artifactId = project.name
- from(project.components["java"])
- pom {
- configureMavenCentralMetadata(project)
- }
- signPublicationIfKeyPresent(project)
- }
- }
-}
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 0d97fa775c..a12ae60935 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -5,10 +5,9 @@ repositories {
dependencies {
gradleApi()
- implementation("org.jetbrains.kotlin.jvm", "org.jetbrains.kotlin.jvm.gradle.plugin", "1.7.21")
- implementation("com.avast.gradle", "gradle-docker-compose-plugin", "0.14.9")
- implementation("io.github.gradle-nexus", "publish-plugin", "1.0.0")
- implementation("io.gitlab.arturbosch.detekt", "detekt-gradle-plugin", "1.21.0")
+ implementation("org.jetbrains.kotlin.jvm", "org.jetbrains.kotlin.jvm.gradle.plugin", "1.9.10")
+ implementation("com.avast.gradle", "gradle-docker-compose-plugin", "0.17.4")
+ implementation("io.gitlab.arturbosch.detekt", "detekt-gradle-plugin", "1.23.1")
}
plugins {
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Accessors.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Accessors.kt
deleted file mode 100644
index f2889641ec..0000000000
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Accessors.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-@file:Suppress("FunctionName")
-
-package org.jetbrains.exposed.gradle
-
-import com.avast.gradle.dockercompose.ComposeExtension
-import org.gradle.api.Project
-import org.gradle.kotlin.dsl.getByName
-
-private inline fun Project.extByName(name: String): T = extensions.getByName(name)
-
-val Project._dockerCompose
- get() = extByName("dockerCompose")
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/DBTestingPlugin.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/DBTestingPlugin.kt
deleted file mode 100644
index c3306e1bcb..0000000000
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/DBTestingPlugin.kt
+++ /dev/null
@@ -1,115 +0,0 @@
-package org.jetbrains.exposed.gradle
-
-import org.gradle.api.Plugin
-import org.gradle.api.Project
-import org.gradle.api.Task
-import org.gradle.api.internal.tasks.testing.filter.DefaultTestFilter
-import org.gradle.api.plugins.JavaPlugin
-import org.gradle.api.tasks.TaskContainer
-import org.gradle.api.tasks.TaskProvider
-import org.gradle.api.tasks.testing.AbstractTestTask
-import org.gradle.api.tasks.testing.Test
-import org.gradle.kotlin.dsl.named
-import org.gradle.kotlin.dsl.register
-import org.jetbrains.exposed.gradle.tasks.DBTest
-import org.jetbrains.exposed.gradle.tasks.DBTestWithDockerCompose
-import org.jetbrains.exposed.gradle.tasks.DBTestWithDockerCompose.Parameters
-
-class DBTestingPlugin : Plugin {
- override fun apply(project: Project) {
- project.pluginManager.apply(JavaPlugin::class.java)
- project.pluginManager.apply("com.avast.gradle.docker-compose")
-
- with(project.tasks) {
- val h2_v1 = register("h2_v1Test", "H2,H2_MYSQL") {
- testRuntimeOnly("com.h2database", "h2", Versions.h2)
- }
- val h2_v2 = register("h2_v2Test", "H2,H2_MYSQL,H2_PSQL,H2_MARIADB,H2_ORACLE,H2_SQLSERVER") {
- testRuntimeOnly("com.h2database", "h2", Versions.h2_v2)
- }
- val h2 = register("h2Test") {
- group = "verification"
- delegatedTo(h2_v1, h2_v2)
- }
-
- val sqlite = register("sqliteTest", "SQLITE") {
- testRuntimeOnly("org.xerial", "sqlite-jdbc", Versions.sqlLite3)
- }
-
- val mysql51 = register("mysql51Test", Parameters("MYSQL", 3306)) {
- testRuntimeOnly("mysql", "mysql-connector-java", Versions.mysql51)
- }
- val mysql80 = register("mysql80Test", Parameters("MYSQL", 3306, "mysql8")) {
- testRuntimeOnly("mysql", "mysql-connector-java", Versions.mysql80)
- }
- val mysql = register("mysqlTest") {
- group = "verification"
- delegatedTo(mysql51, mysql80)
- }
-
- val postgres = register("postgresTest", "POSTGRESQL") {
- testRuntimeOnly("org.postgresql", "postgresql", Versions.postgre)
- }
- val postgresNG = register("postgresNGTest", "POSTGRESQLNG") {
- testRuntimeOnly("org.postgresql", "postgresql", Versions.postgre)
- testRuntimeOnly("com.impossibl.pgjdbc-ng", "pgjdbc-ng", Versions.postgreNG)
- }
-
- val oracle = register("oracleTest", Parameters("ORACLE", 1521)) {
- testRuntimeOnly("com.oracle.database.jdbc", "ojdbc8", Versions.oracle12)
- }
-
- val sqlServer = register("sqlServerTest", Parameters("SQLSERVER", 1433)) {
- testRuntimeOnly("com.microsoft.sqlserver", "mssql-jdbc", Versions.sqlserver)
- }
-
- val mariadb_v2 = register("mariadb_v2Test", Parameters("MARIADB", 3306)) {
- testRuntimeOnly("org.mariadb.jdbc", "mariadb-java-client", Versions.mariaDB_v2)
- }
-
- val mariadb_v3 = register("mariadb_v3Test", Parameters("MARIADB", 3306)) {
- testRuntimeOnly("org.mariadb.jdbc", "mariadb-java-client", Versions.mariaDB_v3)
- }
-
- val mariadb = register("mariadbTest") {
- group = "verification"
- delegatedTo(mariadb_v2, mariadb_v3)
- }
-
- named("test") {
- delegatedTo(
- h2,
- sqlite,
- mysql51,
- postgres,
- postgresNG
- )
- }
- }
- }
-}
-
-/**
- * Defines and configure a new task, which will be created when it is required passing the given arguments to the [javax.inject.Inject]-annotated constructor.
- *
- * @see [TaskContainer.register]
- */
-inline fun TaskContainer.register(name: String, vararg arguments: Any, noinline configuration: T.() -> Unit): TaskProvider =
- register(name, T::class.java, *arguments).apply { configure { configuration() } }
-
-fun Test.delegatedTo(vararg tasks: TaskProvider): Test {
- // don't run tests directly, delegate to other tasks
- filter {
- setExcludePatterns("*")
- isFailOnNoMatchingTests = false
- }
- finalizedBy(tasks)
- //Pass --tests CLI option value into delegates
- doFirst {
- val testsFilter = (filter as DefaultTestFilter).commandLineIncludePatterns.toList()
- tasks.forEach {
- it.configure { setTestNameIncludePatterns(testsFilter) }
- }
- }
- return this
-}
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Detekt.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Detekt.kt
new file mode 100644
index 0000000000..adb6f25624
--- /dev/null
+++ b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Detekt.kt
@@ -0,0 +1,29 @@
+package org.jetbrains.exposed.gradle
+
+import io.gitlab.arturbosch.detekt.DetektPlugin
+import io.gitlab.arturbosch.detekt.extensions.DetektExtension
+import org.gradle.api.Project
+import org.gradle.kotlin.dsl.apply
+import org.gradle.kotlin.dsl.configure
+
+fun Project.configureDetekt() {
+ apply()
+
+ configure {
+ ignoreFailures = false
+ buildUponDefaultConfig = true
+ config = files(
+ rootDir.resolve("detekt/detekt-config.yml").takeIf {
+ it.isFile
+ },
+ projectDir.resolve("detekt/detekt-config.yml").takeIf { it.isFile }
+ )
+ reports {
+ xml.enabled = true
+ html.enabled = false
+ txt.enabled = false
+ sarif.enabled = false
+ }
+ parallel = true
+ }
+}
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Publishing.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Publishing.kt
index bfc5d540eb..1b784e7ad4 100644
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Publishing.kt
+++ b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Publishing.kt
@@ -1,14 +1,16 @@
-@file:Suppress("UnstableApiUsage")
-
package org.jetbrains.exposed.gradle
import org.gradle.api.Project
+import org.gradle.api.plugins.JavaPluginExtension
import org.gradle.api.provider.Property
import org.gradle.api.publish.PublishingExtension
import org.gradle.api.publish.maven.MavenPom
import org.gradle.api.publish.maven.MavenPublication
+import org.gradle.kotlin.dsl.apply
+import org.gradle.kotlin.dsl.create
+import org.gradle.kotlin.dsl.get
+import org.gradle.kotlin.dsl.provideDelegate
import org.gradle.plugins.signing.SigningExtension
-import org.gradle.api.plugins.JavaPluginExtension
infix fun Property.by(value: T) {
set(value)
@@ -55,10 +57,54 @@ fun MavenPublication.signPublicationIfKeyPresent(project: Project) {
}
}
-fun Project._publishing(configure: PublishingExtension.() -> Unit) {
+fun Project.publishing(configure: PublishingExtension.() -> Unit) {
extensions.configure("publishing", configure)
}
-fun Project._java(configure: JavaPluginExtension.() -> Unit) {
+fun Project.java(configure: JavaPluginExtension.() -> Unit) {
extensions.configure("java", configure)
-}
\ No newline at end of file
+}
+
+fun Project.configurePublishing() {
+ apply(plugin = "java-library")
+ apply(plugin = "maven-publish")
+ apply(plugin = "signing")
+
+ java {
+ withJavadocJar()
+ withSourcesJar()
+ }
+
+ val version: String by rootProject
+
+ publishing {
+ publications {
+ create("exposed") {
+ groupId = "org.jetbrains.exposed"
+ artifactId = project.name
+
+ setVersion(version)
+
+ from(components["java"])
+ pom {
+ configureMavenCentralMetadata(project)
+ }
+ signPublicationIfKeyPresent(project)
+ }
+ }
+
+ val publishingUsername: String? = System.getenv("PUBLISHING_USERNAME")
+ val publishingPassword: String? = System.getenv("PUBLISHING_PASSWORD")
+
+ repositories {
+ maven {
+ name = "Exposed"
+ url = uri("https://maven.pkg.jetbrains.space/public/p/exposed/release")
+ credentials {
+ username = publishingUsername
+ password = publishingPassword
+ }
+ }
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt
new file mode 100644
index 0000000000..ae1e7090cb
--- /dev/null
+++ b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/TestDbDsl.kt
@@ -0,0 +1,124 @@
+package org.jetbrains.exposed.gradle
+
+import com.avast.gradle.dockercompose.ComposeExtension
+import org.gradle.api.Project
+import org.gradle.api.internal.tasks.testing.filter.DefaultTestFilter
+import org.gradle.api.tasks.TaskProvider
+import org.gradle.api.tasks.testing.AbstractTestTask
+import org.gradle.api.tasks.testing.Test
+import org.gradle.configurationcache.extensions.capitalized
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.named
+import org.gradle.kotlin.dsl.register
+import java.time.Duration
+
+const val HEALTH_TIMEOUT: Long = 60
+
+class TestDb(val name: String) {
+ internal val dialects = mutableListOf()
+ var port: Int? = null
+ var container: String = name
+ var withContainer: Boolean = true
+ var colima: Boolean = false
+
+ internal val dependencies = mutableListOf()
+
+ inner class DependencyBlock {
+ fun dependency(dependencyNotation: String) {
+ dependencies.add(dependencyNotation)
+ }
+ }
+
+ fun dependencies(block: DependencyBlock.() -> Unit) {
+ DependencyBlock().apply(block)
+ }
+
+ fun dialects(vararg dialects: String) {
+ this.dialects.addAll(dialects)
+ }
+}
+
+fun Project.testDb(name: String, block: TestDb.() -> Unit) {
+ val db = TestDb(name).apply(block)
+ if (db.withContainer) {
+ configureCompose(db)
+ }
+
+ val testTask = tasks.register("test${db.name.capitalized()}") {
+ description = "Runs tests using ${db.name} database"
+ group = "verification"
+ systemProperties["exposed.test.name"] = db.name
+ systemProperties["exposed.test.container"] = if (db.withContainer) db.container else "none"
+ systemProperties["exposed.test.dialects"] = db.dialects.joinToString(",") { it.toUpperCase() }
+ outputs.cacheIf { false }
+
+ if (!db.withContainer) return@register
+ dependsOn(rootProject.tasks.getByName("${db.container}ComposeUp"))
+ }
+
+ dependencies {
+ db.dependencies.forEach {
+ add("testRuntimeOnly", it)
+ }
+ }
+
+ tasks.named("test") {
+ delegatedTo(testTask)
+ }
+}
+
+private fun Project.configureCompose(db: TestDb) {
+ if (rootProject.tasks.findByPath("${db.container}ComposeUp") != null) return
+
+ rootProject.extensions.configure("dockerCompose") {
+ nested(db.container).apply {
+ environment.put("SERVICES_HOST", "127.0.0.1")
+ environment.put("COMPOSE_CONVERT_WINDOWS_PATHS", true)
+
+ val isArm = System.getProperty("os.arch") == "aarch64"
+ if (isArm && db.colima) {
+ val home = System.getProperty("user.home")
+ val dockerHost = "unix://$home/.colima/default/docker.sock"
+ environment.put("DOCKER_HOST", dockerHost)
+ }
+
+ useComposeFiles.set(listOf("buildScripts/docker/docker-compose-${db.container}.yml"))
+ removeVolumes.set(true)
+ stopContainers.set(false)
+
+ waitForHealthyStateTimeout.set(Duration.ofMinutes(HEALTH_TIMEOUT))
+ }
+ }
+
+ val startDb = rootProject.tasks.getByName("${db.container}ComposeUp")
+ val stopDb = rootProject.tasks.getByName("${db.container}ComposeDownForced")
+
+ val startCompose = rootProject.tasks.findByName("startCompose") ?: rootProject.tasks.create("startCompose")
+ val stopCompose = rootProject.tasks.findByName("stopCompose") ?: rootProject.tasks.create("stopCompose")
+
+ startCompose.dependsOn(startDb)
+ stopCompose.dependsOn(stopDb)
+}
+
+/**
+ * Delegates the execution of tests to other tasks.
+ *
+ * @param tasks The tasks to delegate the test execution to.
+ * @return The modified Test object.
+ */
+fun Test.delegatedTo(vararg tasks: TaskProvider): Test {
+ // don't run tests directly, delegate to other tasks
+ filter {
+ setExcludePatterns("*")
+ isFailOnNoMatchingTests = false
+ }
+ finalizedBy(tasks)
+ // Pass --tests CLI option value into delegates
+ doFirst {
+ val testsFilter = (filter as DefaultTestFilter).commandLineIncludePatterns.toList()
+ tasks.forEach {
+ it.configure { setTestNameIncludePatterns(testsFilter) }
+ }
+ }
+ return this
+}
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Versions.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Versions.kt
index fafc243740..22d65dfa28 100644
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Versions.kt
+++ b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/Versions.kt
@@ -1,29 +1,26 @@
package org.jetbrains.exposed.gradle
object Versions {
- const val kotlin = "1.7.21"
- const val kotlinCoroutines = "1.6.4"
+ const val kotlinCoroutines = "1.7.3"
+ const val kotlinxSerialization = "1.5.1"
const val slf4j = "1.7.36"
- const val log4j2 = "2.17.2"
+ const val log4j2 = "2.20.0"
/** JDBC drivers **/
- const val h2 = "1.4.199"
- const val h2_v2 = "2.1.214"
- const val mariaDB_v2 = "2.7.6"
- const val mariaDB_v3 = "3.0.6"
+ const val h2 = "1.4.200"
+ const val h2_v2 = "2.2.220"
+ const val mariaDB_v2 = "2.7.9"
+ const val mariaDB_v3 = "3.1.4"
const val mysql51 = "5.1.49"
const val mysql80 = "8.0.30"
const val oracle12 = "12.2.0.1"
- const val postgre = "42.4.0"
+ const val postgre = "42.6.0"
const val postgreNG = "0.8.9"
- const val sqlLite3 = "3.36.0.3"
+ const val sqlLite3 = "3.43.0.0"
const val sqlserver = "9.4.1.jre8"
/** Spring **/
- const val springFramework = "5.3.22"
- const val springBoot = "2.7.2"
-
- /** Test Dependencies **/
- const val testContainers = "1.17.3"
+ const val springFramework = "6.0.11"
+ const val springBoot = "3.1.3"
}
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTest.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTest.kt
deleted file mode 100644
index ebcfc3b3d3..0000000000
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTest.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.jetbrains.exposed.gradle.tasks
-
-import org.gradle.api.tasks.Input
-import org.gradle.api.tasks.SourceSet
-import org.gradle.api.tasks.SourceSetContainer
-import org.gradle.api.tasks.TaskAction
-import org.gradle.api.tasks.testing.Test
-import org.gradle.kotlin.dsl.create
-import org.gradle.kotlin.dsl.getByName
-import javax.inject.Inject
-
-open class DBTest @Inject constructor(@get:Input val dialect: String) : Test() {
- init {
- group = "verification"
- val projectSourceSets = project.extensions.getByName("sourceSets")
- val projectTestSourceSet = projectSourceSets.getByName(SourceSet.TEST_SOURCE_SET_NAME)
- val projectMainSourceSet = projectSourceSets.getByName(SourceSet.MAIN_SOURCE_SET_NAME)
- testClassesDirs = projectTestSourceSet.output.classesDirs
- classpath = projectMainSourceSet.output + projectTestSourceSet.output + projectTestSourceSet.runtimeClasspath
- }
-
- @TaskAction
- override fun executeTests() {
- withSystemProperties("exposed.test.dialects" to dialect) {
- super.executeTests()
- }
- }
-
- protected fun withSystemProperties(vararg sysProp: Pair, action: DBTest.() -> Unit) {
- val prevValues = sysProp.associate { (name, _) -> name to systemProperties[name] }
- sysProp.forEach { (name, value) -> systemProperty(name, value) }
- action()
- prevValues.forEach { (name, value) -> systemProperty(name, value ?: "") }
- }
-
- fun testRuntimeOnly(group: String, name: String, version: String) {
- classpath += dependencyAsConfiguration(group, name, version)
- }
-
- private fun dependencyAsConfiguration(group: String, name: String, version: String) =
- project.configurations.maybeCreate("${group}_${name}_$version").apply {
- isVisible = false
- defaultDependencies {
- add(project.dependencies.create(group, name).apply { version { strictly(version) } })
- }
- }
-}
-
diff --git a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTestWithDockerCompose.kt b/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTestWithDockerCompose.kt
deleted file mode 100644
index 50de0ce679..0000000000
--- a/buildSrc/src/main/kotlin/org/jetbrains/exposed/gradle/tasks/DBTestWithDockerCompose.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package org.jetbrains.exposed.gradle.tasks
-
-import com.avast.gradle.dockercompose.ComposeSettings
-import org.gradle.api.tasks.Input
-import org.jetbrains.exposed.gradle._dockerCompose
-import java.io.File
-import java.time.Duration
-import javax.inject.Inject
-
-open class DBTestWithDockerCompose(dialect: String, @get:Input val port: Int, @get:Input val dockerComposeServiceName: String) : DBTest(dialect) {
- // Gradle doesn't support injection into constructors with optional parameters (as well as several constructors marked with @Inject)
- // Also IDE's inline hints are abused if parameters are passed as vararg
- // Workaround is to wrap all parameters into a data class and pass it into constructor
- data class Parameters(val dialect: String, val port: Int, val dockerComposeServiceName: String = dialect.toLowerCase())
-
- @Inject
- constructor(parameters: Parameters) : this(parameters.dialect, parameters.port, parameters.dockerComposeServiceName)
-
- private val dockerCompose: ComposeSettings = project._dockerCompose.nested(dockerComposeServiceName).apply {
- environment.put("COMPOSE_CONVERT_WINDOWS_PATHS", true)
- useComposeFiles.add(
- File(project.rootProject.projectDir, "buildScripts/docker/docker-compose-$dockerComposeServiceName.yml").absolutePath
- )
- captureContainersOutput.set(true)
- removeVolumes.set(true)
- waitForHealthyStateTimeout.set(Duration.ofMinutes(60))
- }
-
- override fun executeTests() {
- with(dockerCompose) {
- try {
- upTask.get().up()
- exposeAsEnvironment(this@DBTestWithDockerCompose)
- exposeAsSystemProperties(this@DBTestWithDockerCompose)
- val containerInfo = servicesInfos[dockerComposeServiceName]!!
- withSystemProperties(
- "exposed.test.$dockerComposeServiceName.host" to containerInfo.host,
- "exposed.test.$dockerComposeServiceName.port" to (containerInfo.ports[port] ?: -1)
- ) {
- super.executeTests()
- }
- } finally {
- downTask.get().down()
- }
- }
- }
-}
diff --git a/detekt.yml b/detekt/detekt-config.yml
similarity index 65%
rename from detekt.yml
rename to detekt/detekt-config.yml
index 2443da807f..b7d0727410 100644
--- a/detekt.yml
+++ b/detekt/detekt-config.yml
@@ -4,6 +4,10 @@ build:
maxIssues: 52
formatting:
+ ArgumentListWrapping:
+ active: false
+ EnumEntryNameCase:
+ active: false
MaximumLineLength:
maxLineLength: 166
MultiLineIfElse:
@@ -13,11 +17,20 @@ formatting:
active: true
autoCorrect: true
indentSize: 4
+ maxLineLength: 166
NoWildcardImports:
active: false
NoMultipleSpaces:
active: true
autoCorrect: false
+ PropertyWrapping:
+ active: false
+ SpacingAroundUnaryOperator:
+ active: true
+ autoCorrect: true
+ Wrapping:
+ active: true
+ maxLineLength: 166
style:
MaxLineLength:
@@ -28,7 +41,10 @@ style:
WildcardImport:
active: false
MagicNumber:
+ ignoreNamedArgument: true
ignoreRanges: true
+ ThrowsCount:
+ active: false
complexity:
LongParameterList:
@@ -40,5 +56,11 @@ complexity:
thresholdInClasses: 40
thresholdInFiles: 100
thresholdInObjects: 26
- ComplexMethod:
+ CyclomaticComplexMethod:
threshold: 26
+ LongMethod:
+ threshold: 90
+
+naming:
+ ConstructorParameterNaming:
+ active: false
diff --git a/detekt/detekt-formatting-1.23.1.jar b/detekt/detekt-formatting-1.23.1.jar
new file mode 100644
index 0000000000..3c2d34bc59
Binary files /dev/null and b/detekt/detekt-formatting-1.23.1.jar differ
diff --git a/docs/BREAKING_CHANGES.md b/docs/BREAKING_CHANGES.md
new file mode 100644
index 0000000000..f8e7c3fcf8
--- /dev/null
+++ b/docs/BREAKING_CHANGES.md
@@ -0,0 +1,103 @@
+# Breaking Changes
+
+## 0.44.0
+
+* `SpringTransactionManager` no longer extends `DataSourceTransactionManager`; instead, it directly extends `AbstractPlatformTransactionManager` while retaining the previous basic functionality.
+ The class also no longer implements the Exposed interface `TransactionManager`, as transaction operations are instead delegated to Spring.
+ These changes ensure that Exposed's underlying transaction management no longer interferes with the expected behavior of Spring's transaction management, for example,
+ when using nested transactions or with `@Transactional` elements like `propagation` or `isolation`.
+
+ If integration still requires a `DataSourceTransactionManager`, please add two bean declarations to the configuration: one for `SpringTransactionManager` and one for `DataSourceTransactionManager`.
+ Then define a composite transaction manager that combines these two managers.
+
+ If `TransactionManager` functions were being invoked by a `SpringTransactionManager` instance, please replace these calls with the appropriate Spring annotation
+ or, if necessary, by using the companion object of `TransactionManager` directly (for example, `TransactionManager.currentOrNull()`).
+* `spring-transaction` and `exposed-spring-boot-starter` modules now use Spring Framework 6.0 and Spring Boot 3.0, which require Java 17 as a minimum version.
+* A table that is created with a keyword identifier (a table or column name) now logs a warning that the identifier's case may be lost when it is automatically quoted in generated SQL.
+ This primarily affects H2 and Oracle, both of which support folding identifiers to uppercase, and PostgreSQL, which folds identifiers to lower case.
+
+ To remove these warnings and to ensure that the keyword identifier sent to the database matches the exact case used in the Exposed table object, please set `preserveKeywordCasing = true` in `DatabaseConfig`:
+```kotlin
+object TestTable : Table("table") {
+ val col = integer("select")
+}
+
+// without opt-in (default set to false)
+// H2 generates SQL -> CREATE TABLE IF NOT EXISTS "TABLE" ("SELECT" INT NOT NULL)
+
+// with opt-in
+Database.connect(
+ url = "jdbc:h2:mem:test",
+ driver = "org.h2.Driver",
+ databaseConfig = DatabaseConfig {
+ @OptIn(ExperimentalKeywordApi::class)
+ preserveKeywordCasing = true
+ }
+)
+// H2 generates SQL -> CREATE TABLE IF NOT EXISTS "table" ("select" INT NOT NULL)
+```
+
+**Note:** `preserveKeywordCasing` is an experimental flag and requires `@OptIn`. It may become deprecated in future releases and its behavior when set to `true` may become the default.
+
+## 0.43.0
+
+* In all databases except MySQL, MariaDB, and SQL Server, the `ubyte()` column now maps to data type `SMALLINT` instead of `TINYINT`, which allows the full range of
+`UByte` values to be inserted without any overflow.
+Registering the column on a table also creates a check constraint that restricts inserted data to the range between 0 and `UByte.MAX_VALUE`.
+If a column that only uses 1 byte of storage is needed, but without allowing any non-negative values to be inserted, please use a signed `byte()` column
+instead with a manually created check constraint:
+```kotlin
+byte("number").check { it.between(0, Byte.MAX_VALUE) }
+// OR
+byte("number").check { (it greaterEq 0) and (it lessEq Byte.MAX_VALUE) }
+```
+* In all databases except MySQL and MariaDB, the `uint()` column now maps to data type `BIGINT` instead of `INT`, which allows the full range of `UInt` values to
+be inserted without any overflow.
+Registering the column on a table also creates a check constraint that restricts inserted data to the range between 0 and `UInt.MAX_VALUE`.
+If a column that only uses 4 bytes of storage is needed, but without allowing any non-negative values to be inserted, please use a signed `integer()` column
+instead with a manually created check constraint:
+```kotlin
+integer("number").check { it.between(0, Int.MAX_VALUE) }
+// OR
+integer("number").check { (it greaterEq 0) and (it lessEq Int.MAX_VALUE) }
+```
+
+## 0.42.0
+
+* [SQLite] The table column created using `date()` now uses TEXT datatype instead of DATE (which the database mapped internally to NUMERIC type).
+This applies to the specific `DateColumnType` in all 3 date/time modules and means `LocalDate` comparisons can now be done directly without conversions.
+* [H2, PostgreSQL] Using `replace()` now throws an exception as the REPLACE command is not supported by these databases.
+ If `replace()` was being used to perform an insert or update operation, all usages should instead be switched to `upsert()`.
+[See wiki for UPSERT details](https://github.com/JetBrains/Exposed/wiki/DSL#insert-or-update)
+* Operator classes `exists` and `notExists` have been renamed to `Exists` and `NotExists`.
+The functions `exists()` and `notExists()` have been introduced to return an instance of their respectively-named classes and to avoid unresolved reference issues.
+Any usages of these classes should be renamed to their capitalized forms.
+* `customEnumeration()` now registers a `CustomEnumerationColumnType` to allow referencing by another column.
+The signature of `customEnumeration()` has not changed and table columns initialized using it are still of type `Column`.
+* `Transaction.suspendedTransaction()` has been renamed to `Transaction.withSuspendTransaction()`.
+Please run `Edit -> Find -> Replace in files...` twice with `suspendedTransaction(` and `suspendedTransaction ` as the search options,
+to ensure that both variants are replaced without affecting `suspendedTransactionAsync()` (if used in code).
+* The `repetitionAttempts` parameter in `transaction()` has been removed and replaced with a mutable property in the `Transaction` class.
+Please remove any arguments for this parameter and assign values to the property directly:
+```kotlin
+// before
+transaction(Connection.TRANSACTION_READ_COMMITTED, repetitionAttempts = 10) {
+ // statements
+}
+
+// after
+transaction(Connection.TRANSACTION_READ_COMMITTED) {
+ repetitionAttempts = 10
+ // statements
+}
+```
+* In all databases except MySQL and MariaDB, the `ushort()` column now maps to data type `INT` instead of `SMALLINT`, which allows the full range of `UShort`
+values to be inserted without any overflow.
+Registering the column on a table also creates a check constraint that restricts inserted data to the range between 0 and `UShort.MAX_VALUE`.
+If a column that only uses 2 bytes of storage is needed, but without allowing any non-negative values to be inserted, please use a signed `short()` column
+instead with a manually created check constraint:
+```kotlin
+short("number").check { it.between(0, Short.MAX_VALUE) }
+// OR
+short("number").check { (it greaterEq 0) and (it lessEq Short.MAX_VALUE) }
+```
diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md
index 3edbda0e67..ecb19d81d7 100644
--- a/docs/CONTRIBUTING.md
+++ b/docs/CONTRIBUTING.md
@@ -13,6 +13,30 @@ This project and the corresponding community is governed by
the [JetBrains Open Source and Community Code of Conduct](https://confluence.jetbrains.com/display/ALL/JetBrains+Open+Source+and+Community+Code+of+Conduct).
Independently of how you'd like to contribute, please make sure you read and comply with it.
+## Setup
+
+### Testing on Apple Silicon
+To run Oracle XE tests, you need to install [Colima](https://github.com/abiosoft/colima) container runtime. It will work in pair with your docker installation.
+```shell
+brew install colima
+```
+
+After installing, you need to start the colima daemon in arch x86_64 mode:
+```shel
+colima start --arch x86_64 --memory 4 --network-address
+```
+
+The test task can automatically use colima context when needed, and it's better to use default context for other tasks.
+To switch the context to default, run:
+```shell
+docker context use default
+```
+
+Make sure that default is used as default docker context:
+```shell
+docker context list
+```
+
### Code
#### Pull Requests
@@ -30,6 +54,8 @@ Contributions are made using Github [pull requests](https://help.github.com/en/a
7. If the contribution requires updates to documentation (be it updating existing contents or creating new one), please
file a new ticket on [YouTrack](https://youtrack.jetbrains.com/issues/EXPOSED).
8. Make sure any code contributed is covered by tests and no existing tests are broken. We use Docker containers to run tests.
+9. Finally, make sure to run the `apiCheck` Gradle task. If it's not successful, run the `apiDump` Gradle task. Further information can be
+ found [here](https://github.com/Kotlin/binary-compatibility-validator).
#### Style Guides
diff --git a/docs/ChangeLog.md b/docs/ChangeLog.md
index da09d9aebf..0630a53d61 100644
--- a/docs/ChangeLog.md
+++ b/docs/ChangeLog.md
@@ -1,3 +1,155 @@
+# 0.44.0
+Infrastructure:
+* Kotlin 1.9.10
+* Kotlin Coroutines 1.7.3
+* log4j2 2.20.0
+* h2-database driver 2.2.220
+* MariaDB driver 2.7.9 and 3.1.4
+* MySQL driver 8.0.30
+* PostgreSQL driver 42.6.0
+* SQLite driver 3.43.0.0
+* Spring Framework 6.0.11
+* Spring Boot 3.1.3
+
+Breaking changes:
+* `SpringTransactionManager` no longer extends `DataSourceTransactionManager`; instead, it directly extends `AbstractPlatformTransactionManager`.
+ The class also no longer implements the Exposed interface `TransactionManager`, as transaction operations are instead delegated to Spring.
+* `spring-transaction` and `exposed-spring-boot-starter` modules now use Spring Framework 6.0 and Spring Boot 3.0, which require Java 17 as a minimum version.
+* A table that is created with a keyword identifier now logs a warning that the identifier's case may be lost when it is automatically quoted in generated SQL.
+ `DatabaseConfig` now includes the property `preserveKeywordCasing`, which can be set to `true` to remove these warnings and to ensure that the identifier matches the exact case used.
+* More details at [Breaking changes](BREAKING_CHANGES.md#0440)
+
+Features:
+* feat!: EXPOSED-109 Improve implementation of Spring transaction manager by @FullOfOrange in https://github.com/JetBrains/Exposed/pull/1840
+* feat: EXPOSED-78 Support database-generated values for columns by @joc-a in https://github.com/JetBrains/Exposed/pull/1844
+* feat: EXPOSED-188 Support Propagation in SpringTransactionManager by @FullOfOrange in https://github.com/JetBrains/Exposed/pull/1867
+
+Bug fixes:
+* docs: EXPOSED-159 Add KDocs for EntityClass reference functions by @bog-walk in https://github.com/JetBrains/Exposed/pull/1848
+* fix: EXPOSED-158 avoid SQL syntax error of CASE WHEN using nested CASE by @ymotchi in https://github.com/JetBrains/Exposed/pull/1847
+* Fix how changes are calculated for non-default schema table by @AlexeySoshin in https://github.com/JetBrains/Exposed/pull/1678
+* fix: Fix tables creation depending on each other via foreignKey constraint by @naftalmm in https://github.com/JetBrains/Exposed/pull/1649
+* fix: Verbose logging in test module by @Hakky54 in https://github.com/JetBrains/Exposed/pull/1852
+* fix: EXPOSED-161 SQL Server syntax incorrectly allows CASCADE with dropSchema by @bog-walk in https://github.com/JetBrains/Exposed/pull/1850
+* chore: Reuse Containers in tests; Add Test parameters by @e5l in https://github.com/JetBrains/Exposed/pull/1853
+* docs: EXPOSED-124 Add Spring Boot samples by @FullOfOrange in https://github.com/JetBrains/Exposed/pull/1826
+* fix: EXPOSED-117 Set jvmToolchain to 8 for all modules by @e5l in https://github.com/JetBrains/Exposed/pull/1855
+* chore: Adjust test md files by @joc-a in https://github.com/JetBrains/Exposed/pull/1857
+* fix: EXPOSED-162 SQLite generatedKeys exception by @joc-a in https://github.com/JetBrains/Exposed/pull/1854
+* fix: Unable to download required toolchain on MAC by @joc-a in https://github.com/JetBrains/Exposed/pull/1859
+* fix: EXPOSED-171 Switch from spring.factories to AutoConfiguration.imports by @rbraeunlich in https://github.com/JetBrains/Exposed/pull/1645
+* fix: EXPOSED-179 Unsigned column check constraint is not unique to table by @bog-walk in https://github.com/JetBrains/Exposed/pull/1860
+* fix: EXPOSED-182 Schema name breaks Create Table with default column in SQLServer by @bog-walk in https://github.com/JetBrains/Exposed/pull/1861
+* fix: Exception when using RESTRICT reference option by @joc-a in https://github.com/JetBrains/Exposed/pull/1862
+* fix!: EXPOSED-150 Auto-quoted column names change case across databases by @bog-walk in https://github.com/JetBrains/Exposed/pull/1841
+* docs: EXPOSED-132 Add annotations to spring-boot-starter README samples by @bog-walk in https://github.com/JetBrains/Exposed/pull/1856
+* fix: EXPOSED-173 UPDATE_RULE read incorrectly for Oracle by @joc-a in https://github.com/JetBrains/Exposed/pull/1865
+* chore: EXPOSED-186 Replace JDK 1.7 support in exposed-jodatime classes by @bog-walk in https://github.com/JetBrains/Exposed/pull/1866
+* fix: EXPOSED-178 DELETE_RULE read incorrectly for Oracle by @joc-a in https://github.com/JetBrains/Exposed/pull/1868
+
+# 0.43.0
+Infrastructure:
+* Kotlin 1.9.10
+
+Features:
+* feat: EXPOSED-85 Add support for changing default value in SQL Server by @joc-a in https://github.com/JetBrains/Exposed/pull/1812
+
+Bug fixes:
+* fix: EXPOSED-107 Inaccurate UByte column type mapping by @bog-walk in https://github.com/JetBrains/Exposed/pull/1808
+* fix: EXPOSED-108 Incorrect mapping for UInt data type by @bog-walk in https://github.com/JetBrains/Exposed/pull/1809
+* fix: Inaccurate drop database statement in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1807
+* test: Fix failing datetime comparison tests in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1813
+* fix: EXPOSED-111 Allow check constraint statements in MySQL8 by @bog-walk in https://github.com/JetBrains/Exposed/pull/1817
+* fix: EXPOSED-116 UUID conversion error with upsert in H2 by @bog-walk in https://github.com/JetBrains/Exposed/pull/1823
+* fix: EXPOSED-112 SchemaUtils fails to compare default CURRENT_TIMESTAMP by @bog-walk in https://github.com/JetBrains/Exposed/pull/1819
+* fix: EXPOSED-123 ExposedBlob.getBytes() fails on Oracle with IOException by @bog-walk in https://github.com/JetBrains/Exposed/pull/1824
+* fix: EXPOSED-128 Update with Join and Where clause fails in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1825
+* fix: EXPOSED-135 Oracle does not use setSchema value as currentScheme by @bog-walk in https://github.com/JetBrains/Exposed/pull/1828
+* fix: EXPOSED-122 Fix timestampWithTimeZone tests in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1829
+* fix: EXPOSED-137 SET DEFAULT reference option should not be supported in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1830
+* test: Fix failing Oracle tests in exposed-tests by @bog-walk in https://github.com/JetBrains/Exposed/pull/1831
+* fix: EXPOSED-127 Default values for JSON columns are not quoted by @bog-walk in https://github.com/JetBrains/Exposed/pull/1827
+* fix: EXPOSED-145 Quoted table name breaks CREATE SEQUENCE in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1836
+* fix: EXPOSED-130 Logger throws ClassCastException with JSON and ListSerializer by @bog-walk in https://github.com/JetBrains/Exposed/pull/1835
+* fix: EXPOSED-133 Suspend transactions blocking Hikari connection pool by @bog-walk in https://github.com/JetBrains/Exposed/pull/1837
+* fix: EXPOSED-151 Quoted identifiers cause incorrect schema validation by @bog-walk in https://github.com/JetBrains/Exposed/pull/1842
+* fix: Remove false warning log by @joc-a in https://github.com/JetBrains/Exposed/pull/1843
+
+Breaking changes:
+* [Breaking changes](BREAKING_CHANGES.md)
+
+# 0.42.1
+Infrastructure:
+* Kotlin 1.9.0
+
+Bug fixes:
+* fix: exposed-bom module missing when publishing by @joc-a in https://github.com/JetBrains/Exposed/pull/1818
+
+# 0.42.0
+Infrastructure:
+* Kotlin 1.9.0
+
+Deprecations:
+* deprecate: EXPOSED-84 Raise deprecation levels of API elements by @bog-walk in https://github.com/JetBrains/Exposed/pull/1771
+
+Breaking changes:
+* [Breaking changes](BREAKING_CHANGES.md)
+
+Features:
+* Add CHARINDEX function for sqlserver by @eukleshnin in https://github.com/JetBrains/Exposed/pull/1675
+* feat: EXPOSED-32 Support string function CHAR_LENGTH by @bog-walk in https://github.com/JetBrains/Exposed/pull/1737
+* feat: EXPOSED-37 Support null-safe equality comparison by @bog-walk in https://github.com/JetBrains/Exposed/pull/1739
+* feat: EXPOSED-45 Support single statement UPSERT by @bog-walk in https://github.com/JetBrains/Exposed/pull/1743
+* feat: EXPOSED-52 Support batch UPSERT by @bog-walk in https://github.com/JetBrains/Exposed/pull/1749
+* feat: EXPOSED-47 Add support for SET DEFAULT reference option by @joc-a in https://github.com/JetBrains/Exposed/pull/1744
+* control whether arguments should be inlined or passed in. by @lure in https://github.com/JetBrains/Exposed/pull/1621
+* feat: Add partial index support (Postgres only) by @lure in https://github.com/JetBrains/Exposed/pull/1748
+* add afterStatementPrepared method to StatementInterceptor by @lure in https://github.com/JetBrains/Exposed/pull/1622
+* feat: EXPOSED-60 Support json/json(b) column types by @bog-walk in https://github.com/JetBrains/Exposed/pull/1762
+* feat: EXPOSED-66 Extend partial index to SQLServer and SQLite by @bog-walk in https://github.com/JetBrains/Exposed/pull/1763
+* [EXPOSED-46] Add a possibility to set a delay for the repetition attempts by @mgrati in https://github.com/JetBrains/Exposed/pull/1742
+* feat: EXPOSED-69 Extend json support to H2, Oracle (text) and DAO by @bog-walk in https://github.com/JetBrains/Exposed/pull/1766
+* feat: EXPOSED-68 Add more json/json(b) column functions by @bog-walk in https://github.com/JetBrains/Exposed/pull/1770
+* #623 Add support of window functions in Exposed DSL by @Legohuman in https://github.com/JetBrains/Exposed/pull/1651
+* feat: EXPOSED-89 Support functions in Create Index by @bog-walk in https://github.com/JetBrains/Exposed/pull/1788
+* feat: Add spring mutli container support by @FullOfOrange in https://github.com/JetBrains/Exposed/pull/1781
+* feat: EXPOSED-43 Add support for timestamp with time zone by @joc-a in https://github.com/JetBrains/Exposed/pull/1787
+
+Bug fixes:
+* Fix an error when updating an entity with a foreign key id (issue 880) by @forketyfork in https://github.com/JetBrains/Exposed/pull/1668
+* EXPOSED-15 Fix running mysql tests on M1 by @e5l in https://github.com/JetBrains/Exposed/pull/1719
+* Fix grammar in error message by @micheljung in https://github.com/JetBrains/Exposed/pull/1717
+* Fix: PostgreSQLDialect.modifyColumn is not able to drop default values by @michael-markl in https://github.com/JetBrains/Exposed/pull/1716
+* Fix UInt value out of bounds by @keta1 in https://github.com/JetBrains/Exposed/pull/1709
+* fix: EXPOSED-16 Failed tests in KotlinTimeTests by @joc-a in https://github.com/JetBrains/Exposed/pull/1724
+* EXPOSED-21 Primary key constraint not created by @bog-walk in https://github.com/JetBrains/Exposed/pull/1728
+* EXPOSED-19 Max timestamp in SQLite not working by @joc-a in https://github.com/JetBrains/Exposed/pull/1725
+* fix: EXPOSED-27 Id is not in record set by @joc-a in https://github.com/JetBrains/Exposed/pull/1731
+* fix: EXPOSED-28 Update with join fails on H2 in MySql mode by @bog-walk in https://github.com/JetBrains/Exposed/pull/1732
+* fix: EXPOSED-29 Cannot set nullable composite column in InsertStatement by @joc-a in https://github.com/JetBrains/Exposed/pull/1733
+* fix: EXPOSED-23 H2 unsupported indexing behavior by @bog-walk in https://github.com/JetBrains/Exposed/pull/1734
+* fix: EXPOSED-31 Landing Readme links and demo code by @bog-walk in https://github.com/JetBrains/Exposed/pull/1736
+* fix: EXPOSED-36 LocalDate comparison in SQLite by @bog-walk in https://github.com/JetBrains/Exposed/pull/1741
+* fix: EXPOSED-42 Can't create BLOB column with default value by @joc-a in https://github.com/JetBrains/Exposed/pull/1740
+* fix: EXPOSED-49 Replace statement defined as upsert statement by @bog-walk in https://github.com/JetBrains/Exposed/pull/1747
+* fix: EXPOSED-48 Incorrect statistics aggregate functions by @bog-walk in https://github.com/JetBrains/Exposed/pull/1745
+* Sum batch results for inserts by @johnzeringue in https://github.com/JetBrains/Exposed/pull/1641
+* fix: EXPOSED-57 BatchInsertStatement can't be used with MySQL upsert by @bog-walk in https://github.com/JetBrains/Exposed/pull/1754
+* fix: EXPOSED-50 customEnumeration reference column error by @bog-walk in https://github.com/JetBrains/Exposed/pull/1785
+* fix: EXPOSED-91 NPE in existingIndices() with function index by @bog-walk in https://github.com/JetBrains/Exposed/pull/1791
+* fix: SQLServerException: The port number -1 is not valid. by @joc-a in https://github.com/JetBrains/Exposed/pull/1789
+* fix: EXPOSED-80 Set repetition policy for suspended transactions by @bog-walk in https://github.com/JetBrains/Exposed/pull/1774
+* fix: Exclude deleted and renamed files from detekt GitHub Action by @joc-a in https://github.com/JetBrains/Exposed/pull/1795
+* fix: EXPOSED-97 Unsigned column types truncate MySQL values by @bog-walk in https://github.com/JetBrains/Exposed/pull/1796
+* fix: EXPOSED-98: Add instructions to log-in to see and log issues by @jasonjmcghee in https://github.com/JetBrains/Exposed/pull/1798
+* fix: EXPOSED-83 createMissingTablesAndColumns not detecting missing PK by @bog-walk in https://github.com/JetBrains/Exposed/pull/1797
+* test: Fix failing exposed-tests in SQL Server by @bog-walk in https://github.com/JetBrains/Exposed/pull/1801
+* fix: EXPOSED-54 CaseWhen.Else returns narrow Expression by @bog-walk in https://github.com/JetBrains/Exposed/pull/1800
+* fix: EXPOSED-99 SchemaUtils incorrectly compares datetime defaults by @bog-walk in https://github.com/JetBrains/Exposed/pull/1802
+* test: Fix failing exposed-tests in Oracle by @bog-walk in https://github.com/JetBrains/Exposed/pull/1803
+* fix: EXPOSED-82 Inaccurate UShort column type mapping by @bog-walk in https://github.com/JetBrains/Exposed/pull/1799
+* test: Fix failing datetime tests in MariaDB by @bog-walk in https://github.com/JetBrains/Exposed/pull/1805
+
# 0.41.1
Infrastructure:
* Kotlin 1.7.21
diff --git a/docs/ORACLE.md b/docs/ORACLE.md
index a8322ef81b..1f73807fc7 100644
--- a/docs/ORACLE.md
+++ b/docs/ORACLE.md
@@ -7,9 +7,10 @@
* `insert` with `select` with `limit` not supported (`DMLTests.testInsertSelect01`)
### Running tests locally with Gradle
-* Run `oracleTest` gradle task
+
+* Run `testOracle` gradle task
### Running tests locally with Docker
-* Run Oracle locally, e.g. with `quillbuilduser/oracle-18-xe` Docker image or use `docker-compose -f docker-compose-oracle.yml up`
-* Run tests with `-Dexposed.test.dialects=oracle`,
-(optionally you may need to provide `-Dexposed.test.oracle.host=_YOUR_DOCKER_HOST_ -exposed.test.oracle.port=_SQLSERVER_SERVER_EXPOSED_PORT_`)
+
+* Run Oracle locally with gradle task `oracleComposeUp`
+* Run tests with `testOracle` gradle task
diff --git a/docs/SQLServer.md b/docs/SQLServer.md
index d7e097001d..e4f0e93f3b 100644
--- a/docs/SQLServer.md
+++ b/docs/SQLServer.md
@@ -1,13 +1,10 @@
-## SQL Server dialect
+## SQL Server dialect
### Running tests locally with Gradle
-* Run `sqlServerTest` gradle task
-### Running tests locally with Docker
-* Run SQL Server locally, e.g. with Docker image with command like
-`docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=yourStrong(!)Password' -p 1433:1433 -d microsoft/mssql-server-linux`
-or use `docker-compose -f docker-compose-sqlserver.yml up`
+* Run `testSqlserver` gradle task
-* Run tests with `-Dexposed.test.dialects=sqlserver`,
-(optionally you may need to provide `-Dexposed.test.sqlserver.host=_YOUR_DOCKER_HOST_ -exposed.test.sqlserver.port=_SQLSERVER_SERVER_EXPOSED_PORT_`)
+### Running tests locally with Docker
+* Run SQL Server locally with gradle task `sqlserverComposeUp`
+* Run tests with `testSqlserver` gradle task
diff --git a/documentation-website/Writerside/c.list b/documentation-website/Writerside/c.list
new file mode 100644
index 0000000000..c4bd745d05
--- /dev/null
+++ b/documentation-website/Writerside/c.list
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/documentation-website/Writerside/cfg/buildprofiles.xml b/documentation-website/Writerside/cfg/buildprofiles.xml
new file mode 100644
index 0000000000..4e5ceed97b
--- /dev/null
+++ b/documentation-website/Writerside/cfg/buildprofiles.xml
@@ -0,0 +1,7 @@
+
+
+
+ true
+
+
diff --git a/documentation-website/Writerside/hi.tree b/documentation-website/Writerside/hi.tree
new file mode 100644
index 0000000000..73a79a0d72
--- /dev/null
+++ b/documentation-website/Writerside/hi.tree
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/documentation-website/Writerside/images/completion_procedure.png b/documentation-website/Writerside/images/completion_procedure.png
new file mode 100644
index 0000000000..3535a3f3fa
Binary files /dev/null and b/documentation-website/Writerside/images/completion_procedure.png differ
diff --git a/documentation-website/Writerside/images/completion_procedure_dark.png b/documentation-website/Writerside/images/completion_procedure_dark.png
new file mode 100644
index 0000000000..a65beb0ea1
Binary files /dev/null and b/documentation-website/Writerside/images/completion_procedure_dark.png differ
diff --git a/documentation-website/Writerside/images/convert_table_to_xml.png b/documentation-website/Writerside/images/convert_table_to_xml.png
new file mode 100644
index 0000000000..2518a64cd1
Binary files /dev/null and b/documentation-website/Writerside/images/convert_table_to_xml.png differ
diff --git a/documentation-website/Writerside/images/convert_table_to_xml_dark.png b/documentation-website/Writerside/images/convert_table_to_xml_dark.png
new file mode 100644
index 0000000000..471612264a
Binary files /dev/null and b/documentation-website/Writerside/images/convert_table_to_xml_dark.png differ
diff --git a/documentation-website/Writerside/images/new_topic_options.png b/documentation-website/Writerside/images/new_topic_options.png
new file mode 100644
index 0000000000..ea9744dcf7
Binary files /dev/null and b/documentation-website/Writerside/images/new_topic_options.png differ
diff --git a/documentation-website/Writerside/images/new_topic_options_dark.png b/documentation-website/Writerside/images/new_topic_options_dark.png
new file mode 100644
index 0000000000..c91963872b
Binary files /dev/null and b/documentation-website/Writerside/images/new_topic_options_dark.png differ
diff --git a/documentation-website/Writerside/project.ihp b/documentation-website/Writerside/project.ihp
new file mode 100644
index 0000000000..00b4482d77
--- /dev/null
+++ b/documentation-website/Writerside/project.ihp
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/documentation-website/Writerside/redirection-rules.xml b/documentation-website/Writerside/redirection-rules.xml
new file mode 100644
index 0000000000..4cce403462
--- /dev/null
+++ b/documentation-website/Writerside/redirection-rules.xml
@@ -0,0 +1,44 @@
+
+
+
+
+ page.html
+
+
+ Created after removal of "Introduction" from Exposed Documentation
+ Introduction.html
+
+
+ Created after removal of "Working with Database" from Exposed Documentation
+ Working-with-databases.html
+
+
+ Created after removal of "Working with DataSource" from Exposed Documentation
+ Working-with-data-sources.html
+
+
+ Created after removal of "Working with Transaction" from Exposed Documentation
+ Working-with-transactions.html
+
+
+ " from Exposed Documentation]]>
+ Samples-md.html
+
+
+ Created after removal of "Transactions" from Exposed Documentation
+ Transactions.html
+
+
+
+ " from Exposed Documentation]]>
+ Working-with-Coroutines.html
+
+
+ Created after removal of "DAO API" from Exposed Documentation
+ DAO-API.html
+
+
+ Created after removal of "DSL API" from Exposed Documentation
+ DSL-API.html
+
+
diff --git a/documentation-website/Writerside/topics/Asynchronous-Support.md b/documentation-website/Writerside/topics/Asynchronous-Support.md
new file mode 100644
index 0000000000..ed06fe1b31
--- /dev/null
+++ b/documentation-website/Writerside/topics/Asynchronous-Support.md
@@ -0,0 +1,60 @@
+# Asynchronous Support
+
+## Working with Coroutines
+
+In the modern world, non-blocking and asynchronous code is popular. Kotlin
+has [Coroutines](https://kotlinlang.org/docs/reference/coroutines-overview.html) that give you an imperative way of writing asynchronous code. Most
+Kotlin frameworks (like [ktor](https://ktor.io)) have built-in support for Coroutines while Exposed is mostly blocking. Why? Because Exposed uses JDBC API to interact
+with databases that was designed in an era of blocking APIs. Moreover, Exposed stores some values in
+thread-local variables while coroutines could (and will) be executed in different threads.
+
+Since Exposed 0.15.1, there are bridge functions that will give you a safe way to interact with Exposed within `suspend`
+blocks: `newSuspendedTransaction/Transaction.withSuspendTransaction` have the same parameters as a blocking `transaction` function but will allow you to
+provide a `CoroutineDispatcher` in which the function will be executed. If context is not provided, your code will be executed within the current `coroutineContext`.
+
+Sample usage looks like:
+
+```kotlin
+runBlocking {
+ transaction {
+ SchemaUtils.create(FooTable) // Table will be created on a current thread
+
+ newSuspendedTransaction(Dispatchers.Default) {
+ FooTable.insert { it[id] = 1 } // This insert will be executed in one of Default dispatcher threads
+
+ withSuspendTransaction {
+ val id = FooTable.select { FooTable.id eq 1 }
+ .single()()[FooTable.id] // This select also will be executed on some thread from Default dispatcher using the same transaction
+ }
+ }
+
+ val result = newSuspendedTransaction(Dispatchers.IO) {
+ FooTable.select { FooTable.id eq 1 }
+ .single()[H2Tests.Testing.id] // This select will be executed on some thread from IO dispatcher using the same transaction
+ }
+ }
+}
+
+```
+
+Please note that such code remains blocking (as it still uses JDBC) and you should not try to share a transaction between multiple threads as it will
+lead to undefined behaviour.
+
+If you want to execute some code asynchronously and use the result later in your code, take a look at `suspendedTransactionAsync` function.
+
+```kotlin
+val launchResult = suspendedTransactionAsync(Dispatchers.IO, db = db) {
+ FooTable.insert {}
+
+ FooTable.select { FooTable.id eq 1 }.singleOrNull()?.getOrNull(Testing.id)
+}
+
+println("Result: " + (launchResult.await() ?: - 1))
+
+```
+
+This function will accept the same parameters as `newSuspendedTransaction` above, but returns `Deferred` which you could call `await` on to achieve your
+result.
+
+`suspendedTransactionAsync` is always executed in a new transaction to prevent concurrency issues when queries execution order could be changed
+by `CoroutineDispatcher`.
diff --git a/documentation-website/Writerside/topics/Data-Types.md b/documentation-website/Writerside/topics/Data-Types.md
new file mode 100644
index 0000000000..5eebecdd35
--- /dev/null
+++ b/documentation-website/Writerside/topics/Data-Types.md
@@ -0,0 +1,176 @@
+# Data Types
+
+Exposed supports the following data types in the table definition:
+* `integer` - translates to DB `INT`
+* `short` - translates to DB `SMALLINT`
+* `long` - `BIGINT`
+* `float` - `FLOAT`
+* `decimal` - `DECIMAL` with scale and precision
+* `bool` - `BOOLEAN`
+* `char` - `CHAR`
+* `varchar` - `VARCHAR` with length
+* `text` - `TEXT`
+* `enumeration` - `INT` ordinal value
+* `enumerationByName` - `VARCHAR`
+* `customEnumeration` - see [additional section](#how-to-use-database-enum-types)
+* `blob` - `BLOB`
+* `binary` - `VARBINARY` with length
+* `uuid` - `BINARY(16)`
+* `reference` - a foreign key
+
+The `exposed-java-time` extension (`org.jetbrains.exposed:exposed-java-time:$exposed_version`) provides additional types:
+
+* `date` - `DATETIME`
+* `time` - `TIME`
+* `datetime` - `DATETIME`
+* `timestamp` - `TIMESTAMP`
+* `duration` - `DURATION`
+
+
+Some types are different for specific DB dialect.
+
+
+The `exposed-json` extension (`org.jetbrains.exposed:exposed-json:$exposed_version`) provides additional types
+(see [how to use](#how-to-use-json-and-jsonb-types)):
+
+* `json` - `JSON`
+* `jsonb` - `JSONB`
+
+
+Databases store JSON values either in text or binary format, so Exposed provides two types to account for any potential
+differences, if they exist, for example:
+
+- **PostgreSQL**: `json()` maps to `JSON`, while `jsonb()` maps to `JSONB`.
+- **SQLite**: No native JSON type, so `json()` maps to TEXT, while `jsonb()` throws.
+- **MySQL**: JSON type only supports binary format, so `json()` and `jsonb()` both map to JSON.
+- **Oracle**: Exposed does not currently support the JSON binary format of Oracle 21c; only text format `json()` can be used.
+
+
+## How to use database ENUM types
+Some of the databases (e.g. MySQL, PostgreSQL, H2) support explicit ENUM types. Because keeping such columns in sync with
+Kotlin enumerations using only JDBC metadata could be a huge challenge, Exposed doesn't provide a possibility to manage
+such columns in an automatic way, but that doesn't mean that you can't use such column types.
+You have two options to work with ENUM database types:
+1. Use existing ENUM column from your tables
+2. Create column from Exposed by providing raw definition SQL
+ In both cases, you should use `customEnumeration` function (available since version 0.10.3)
+
+As a jdbc-driver can provide/expect specific classes for Enum type, you must provide from/to transformation functions for
+them when defining a `customEnumeration`.
+
+For such enum `private enum class Foo { Bar, Baz }`, you can use the provided code for your database:
+
+**H2**
+```Kotlin
+val existingEnumColumn = customEnumeration("enumColumn", { Foo.values()[it as Int] }, { it.name })
+val newEnumColumn = customEnumeration("enumColumn", "ENUM('Bar', 'Baz')", { Foo.values()[it as Int] }, { it.name })
+```
+
+**MySQL**
+```Kotlin
+val existingEnumColumn = customEnumeration("enumColumn", { value -> Foo.valueOf(value as String) }, { it.name })
+val newEnumColumn = customEnumeration("enumColumn", "ENUM('Bar', 'Baz')", { value -> Foo.valueOf(value as String) }, { it.name })
+```
+
+**PostgreSQL**
+
+PostgreSQL requires that ENUM is defined as a separate type, so you have to create it before creating your table.
+Also, PostgreSQL JDBC driver returns PGobject instances for such values. The full working sample is provided below:
+```Kotlin
+class PGEnum>(enumTypeName: String, enumValue: T?) : PGobject() {
+ init {
+ value = enumValue?.name
+ type = enumTypeName
+ }
+}
+
+object EnumTable : Table() {
+ val enumColumn = customEnumeration("enumColumn", "FooEnum", {value -> Foo.valueOf(value as String)}, { PGEnum("FooEnum", it) }
+}
+...
+transaction {
+ exec("CREATE TYPE FooEnum AS ENUM ('Bar', 'Baz');")
+ SchemaUtils.create(EnumTable)
+ ...
+}
+```
+
+## How to use Json and JsonB types
+
+Add the following dependencies to your `build.gradle.kts`:
+```kotlin
+val exposedVersion: String by project
+
+dependencies {
+ implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-json:$exposedVersion")
+}
+```
+
+Exposed works together with [kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization) to support
+`@Serializable` classes and JSON serialization/deserialization:
+```kotlin
+@Serializable
+data class Project(val name: String, val language: String, val active: Boolean)
+
+val format = Json { prettyPrint = true }
+
+object Team : Table("team") {
+ val groupId = varchar("group_id", 32)
+ val project = json("project", format) // equivalent to json("project", format, Project.serializer())
+}
+
+transaction {
+ val mainProject = Project("Main", "Java", true)
+ Team.insert {
+ it[groupId] = "A"
+ it[project] = mainProject
+ }
+ Team.update({ Team.groupId eq "A" }) {
+ it[project] = mainProject.copy(language = "Kotlin")
+ }
+
+ Team.selectAll().map { "Team ${it[Team.groupId]} -> ${it[Team.project]}" }.forEach { println(it) }
+ // Team A -> Project(name=Main, language=Kotlin, active=true)
+}
+```
+
+Both column types also support custom serializer and deserializer arguments, using the form:
+```kotlin
+fun json(name: String, serialize: (T) -> String, deserialize: (String) -> T): Column
+```
+
+### Json Functions
+
+JSON path strings can be used to extract values (either as JSON or as a scalar value) at a specific field/key:
+```kotlin
+val projectName = Team.project.extract("name")
+val languageIsKotlin = Team.project.extract("language").lowerCase() eq "kotlin"
+Team.slice(projectName).select { languageIsKotlin }.map { it[projectName] }
+```
+
+
+Databases that support a path context root `$` will have this value appended to the generated SQL path expression
+by default, so it is not necessary to include it in the provided argument String. In the above example, if MySQL is being
+used, the provided path arguments should be `.name` and `.language` respectively.
+
+
+The JSON functions `exists()` and `contains()` are currently supported as well:
+```kotlin
+val hasActiveStatus = Team.project.exists(".active")
+val activeProjects = Team.select { hasActiveStatus }.count()
+
+// Depending on the database, filter paths can be provided instead, as well as optional arguments
+// PostgreSQL example
+val mainId = "Main"
+val hasMainProject = Team.project.exists(".name ? (@ == \$main)", optional = "{\"main\":\"$mainId\"}")
+val mainProjects = Team.select { hasMainProject }.map { it[Team.groupId] }
+
+val usesKotlin = Team.project.contains("{\"language\":\"Kotlin\"}")
+val kotlinTeams = Team.select { usesKotlin }.count()
+
+// Depending on the database, an optional path can be provided too
+// MySQL example
+val usesKotlin = Team.project.contains("\"Kotlin\"", ".language")
+val kotlinTeams = Team.select { usesKotlin }.count()
+```
diff --git a/documentation-website/Writerside/topics/Databases.md b/documentation-website/Writerside/topics/Databases.md
new file mode 100644
index 0000000000..c1b8d356f4
--- /dev/null
+++ b/documentation-website/Writerside/topics/Databases.md
@@ -0,0 +1,7 @@
+# Databases
+
+[Working with Database](Working-with-Database.md)
+
+[Working with DataSource](Working-with-DataSource.md)
+
+[Working with Transaction](Working-with-Transaction.md)
diff --git a/documentation-website/Writerside/topics/Deep-Dive-into-DAO.md b/documentation-website/Writerside/topics/Deep-Dive-into-DAO.md
new file mode 100644
index 0000000000..ae35dd3a9d
--- /dev/null
+++ b/documentation-website/Writerside/topics/Deep-Dive-into-DAO.md
@@ -0,0 +1,351 @@
+# Deep Dive into DAO
+
+## Overview
+The DAO (Data Access Object) API of Exposed, is similar to ORM frameworks like Hibernate with a Kotlin-specific API.
+A DB table is represented by an `object` inherited from `org.jetbrains.exposed.sql.Table` like this:
+```kotlin
+object StarWarsFilms : Table() {
+ val id: Column = integer("id").autoIncrement()
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+ override val primaryKey = PrimaryKey(id, name = "PK_StarWarsFilms_Id") // PK_StarWarsFilms_Id is optional here
+}
+```
+Tables that contain an `Int` id with the name `id` can be declared like this:
+```kotlin
+object StarWarsFilms : IntIdTable() {
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+}
+```
+Note that these Column types will be defined automatically, so you can also just leave them out. This would produce the same result as the example above:
+```kotlin
+object StarWarsFilms : IntIdTable() {
+ val sequelId = integer("sequel_id").uniqueIndex()
+ val name = varchar("name", 50)
+ val director = varchar("director", 50)
+}
+```
+An entity instance or a row in the table is defined as a class instance:
+ ```kotlin
+class StarWarsFilm(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(StarWarsFilms)
+ var sequelId by StarWarsFilms.sequelId
+ var name by StarWarsFilms.name
+ var director by StarWarsFilms.director
+}
+```
+## Basic CRUD operations
+### Create
+```kotlin
+val movie = StarWarsFilm.new {
+ name = "The Last Jedi"
+ sequelId = 8
+ director = "Rian Johnson"
+}
+```
+### Read
+To get entities use one of the following
+```kotlin
+val movies = StarWarsFilm.all()
+val movies = StarWarsFilm.find { StarWarsFilms.sequelId eq 8 }
+val movie = StarWarsFilm.findById(5)
+```
+* For a list of available predicates see [DSL Where expression](https://github.com/JetBrains/Exposed/wiki/DSL#where-expression).
+ Read a value from a property similar to any property in a Kotlin class:
+```kotlin
+val name = movie.name
+```
+#### Sort (Order-by)
+Ascending order:
+```kotlin
+val movies = StarWarsFilm.all().sortedBy { it.sequelId }
+```
+Descending order:
+```kotlin
+val movies = StarWarsFilm.all().sortedByDescending{ it.sequelId }
+```
+### Update
+Update a value of a property similar to any property in a Kotlin class:
+```kotlin
+movie.name = "Episode VIII – The Last Jedi"
+```
+* Note: Exposed doesn't make an immediate update when you set a new value for Entity, it just stores it on the inner map. "Flushing" values to the database occurs at the end of the transaction or before next `select *` from the database.
+### Delete
+```kotlin
+movie.delete()
+```
+## Referencing
+### many-to-one reference
+Let's say you have this table:
+```kotlin
+object Users : IntIdTable() {
+ val name = varchar("name", 50)
+}
+class User(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(Users)
+ var name by Users.name
+}
+```
+And now you want to add a table referencing this table (and other tables!):
+```kotlin
+object UserRatings : IntIdTable() {
+ val value = long("value")
+ val film = reference("film", StarWarsFilms)
+ val user = reference("user", Users)
+}
+class UserRating(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(UserRatings)
+ var value by UserRatings.value
+ var film by StarWarsFilm referencedOn UserRatings.film // use referencedOn for normal references
+ var user by User referencedOn UserRatings.user
+}
+```
+Now you can get the film for a `UserRating` object, `filmRating`, in the same way you would get any other field:
+```kotlin
+filmRating.film // returns a StarWarsFilm object
+```
+Now if you wanted to get all the ratings for a film, you could do that by using the `filmRating.find` function, but it is much easier to just add a `referrersOn` field to the `StarWarsFilm` class:
+```kotlin
+class StarWarsFilm(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(StarWarsFilms)
+ ...
+ val ratings by UserRating referrersOn UserRatings.film // make sure to use val and referrersOn
+ ...
+}
+```
+You can then access this field on a `StarWarsFilm` object, `movie`:
+```kotlin
+movie.ratings // returns all UserRating objects with this movie as film
+```
+Now imagine a scenario where a user only ever rates a single film. If you want to get the single rating for that user, you can add a `backReferencedOn` field to the `User` class to access the `UserRating` table data:
+```kotlin
+class User(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(Users)
+ ...
+ val rating by UserRating backReferencedOn UserRatings.user // make sure to use val and backReferencedOn
+}
+```
+You can then access this field on a `User` object, `user1`:
+```kotlin
+user1.rating // returns a UserRating object
+```
+### Optional reference
+You can also add an optional reference:
+```kotlin
+object UserRatings: IntIdTable() {
+ ...
+ val secondUser = reference("second_user", Users).nullable() // this reference is nullable!
+ ...
+}
+class UserRating(id: EntityID): IntEntity(id) {
+ companion object : IntEntityClass(UserRatings)
+ ...
+ var secondUser by User optionalReferencedOn UserRatings.secondUser // use optionalReferencedOn for nullable references
+ ...
+}
+```
+Now `secondUser` will be a nullable field, and `optionalReferrersOn` should be used instead of `referrersOn` to get all the ratings for a `secondUser`.
+
+```kotlin
+class User(id: EntityID): IntEntity(id) {
+ companion object : IntEntityClass(Users)
+ ...
+ val secondRatings by UserRating optionalReferrersOn UserRatings.secondUser // make sure to use val and optionalReferrersOn
+ ...
+}
+```
+
+### many-to-many reference
+In some cases, a many-to-many reference may be required.
+Let's assume you want to add a reference to the following Actors table to the StarWarsFilm class:
+```kotlin
+object Actors: IntIdTable() {
+ val firstname = varchar("firstname", 50)
+ val lastname = varchar("lastname", 50)
+}
+class Actor(id: EntityID): IntEntity(id) {
+ companion object : IntEntityClass(Actors)
+ var firstname by Actors.firstname
+ var lastname by Actors.lastname
+}
+```
+Create an additional intermediate table to store the references:
+```kotlin
+object StarWarsFilmActors : Table() {
+ val starWarsFilm = reference("starWarsFilm", StarWarsFilms)
+ val actor = reference("actor", Actors)
+ override val primaryKey = PrimaryKey(starWarsFilm, actor, name = "PK_StarWarsFilmActors_swf_act") // PK_StarWarsFilmActors_swf_act is optional here
+}
+```
+Add a reference to `StarWarsFilm`:
+```kotlin
+class StarWarsFilm(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(StarWarsFilms)
+ ...
+ var actors by Actor via StarWarsFilmActors
+ ...
+}
+```
+Note: You can set up IDs manually inside a transaction like this:
+```kotlin
+transaction {
+ //only works with UUIDTable and UUIDEntity
+ StarWarsFilm.new (UUID.randomUUID()){
+ ...
+ actors = SizedCollection(listOf(actor))
+ }
+}
+```
+### Parent-Child reference
+Parent-child reference is very similar to many-to-many version, but an intermediate table contains both references to the same table.
+Let's assume you want to build a hierarchical entity which could have parents and children. Our tables and an entity mapping will look like
+```kotlin
+object NodeTable : IntIdTable() {
+ val name = varchar("name", 50)
+}
+object NodeToNodes : Table() {
+ val parent = reference("parent_node_id", NodeTable)
+ val child = reference("child_user_id", NodeTable)
+}
+class Node(id: EntityID) : IntEntity(id) {
+ companion object : IntEntityClass(NodeTable)
+ var name by NodeTable.name
+ var parents by Node.via(NodeToNodes.child, NodeToNodes.parent)
+ var children by Node.via(NodeToNodes.parent, NodeToNodes.child)
+}
+```
+As you can see `NodeToNodes` columns target only `NodeTable` and another version of `via` function were used.
+Now you can create a hierarchy of nodes.
+```kotlin
+val root = Node.new { name = "root" }
+val child1 = Node.new {
+ name = "child1"
+}
+child1.parents = SizedCollection(root) // assign parent
+val child2 = Node.new { name = "child2" }
+root.children = SizedCollection(listOf(child1, child2)) // assign children
+```
+
+### Eager Loading
+**Available since 0.13.1**.
+References in Exposed are lazily loaded, meaning queries to fetch the data for the reference are made at the moment the reference is first utilised. For scenarios wherefore you know you will require references ahead of time, Exposed can eager load them at the time of the parent query, this is prevents the classic "N+1" problem as references can be aggregated and loaded in a single query.
+To eager load a reference you can call the "load" function and pass the DAO's reference as a KProperty:
+```kotlin
+StarWarsFilm.findById(1).load(StarWarsFilm::actors)
+```
+This works for references of references also, for example if Actors had a rating reference you could:
+```kotlin
+StarWarsFilm.findById(1).load(StarWarsFilm::actors, Actor::rating)
+```
+Similarly you can eager load references on Collections of DAO's such as Lists and SizedIterables, for collections you can use the with function in the same fashion as before, passing the DAO's references as KProperty's.
+```kotlin
+StarWarsFilm.all().with(StarWarsFilm::actors)
+```
+NOTE: References that are eagerly loaded are stored inside the transaction cache; this means that they are not available in other transactions and thus must be loaded and referenced inside the same transaction. As of [0.35.1](https://github.com/JetBrains/Exposed/blob/master/docs/ChangeLog.md#0351:~:text=References%20can%20be%20stored%20within%20an%20Entity%20with%20enabled%20keepLoadedReferencesOutOfTransaction%20config%20parameter.%20It%20will%20allow%20getting%20referenced%20values%20outside%20the%20transaction%20block.), however, enabling `keepLoadedReferencesOutOfTransaction` in `DatabaseConfig` will allow getting referenced values outside the transaction block.
+
+#### Eager loading for Text Fields
+Some database drivers do not load text content immediately (for performance and memory reasons) which means that you can obtain the column value only within the open transaction.
+
+If you desire to make content available outside the transaction, you can use the eagerLoading param when defining the DB Table.
+```kotlin
+object StarWarsFilms : Table() {
+ ...
+ val description = text("name", eagerLoading=true)
+}
+```
+## Advanced CRUD operations
+### Read entity with a join to another table
+Let's imagine that you want to find all users who rated second SW film with more than 5.
+First of all, we should write that query using Exposed DSL.
+```kotlin
+val query = Users.innerJoin(UserRatings).innerJoin(StarWarsFilm)
+ .slice(Users.columns)
+ .select {
+ StarWarsFilms.sequelId eq 2 and (UserRatings.value gt 5)
+ }.withDistinct()
+```
+After that all we have to do is to "wrap" a result with User entity:
+```kotlin
+val users = User.wrapRows(query).toList()
+```
+### Auto-fill created and updated columns on entity change
+See example by @PaulMuriithi [here](https://github.com/PaulMuriithi/ExposedDatesAutoFill/blob/master/src/main/kotlin/app/Models.kt).
+### Use queries as expressions
+Imagine that you want to sort cities by how many users each city has. In order to do so, you can write a sub-query which counts users in each city and order by that number. Though in order to do so you'll have to convert `Query` to `Expression`. This can be done using `wrapAsExpression` function:
+```kotlin
+val expression = wrapAsExpression(Users
+ .slice(Users.id.count())
+ .select {
+ Cities.id eq Users.cityId
+ })
+val cities = Cities
+ .selectAll()
+ .orderBy(expression, SortOrder.DESC)
+ .toList()
+```
+
+### Add computed fields to entity class
+Imagine that you want to use a window function to rank films with each entity fetch. The companion object of the entity class can override any open function in `EntityClass`, but to achieve this functionality only `searchQuery()` needs to
+be overriden. The results of the function can then be accessed using a property of the entity class:
+```kotlin
+object StarWarsFilms : IntIdTable() {
+ val sequelId = integer("sequel_id").uniqueIndex()
+ val name = varchar("name", 50)
+ val rating = double("rating")
+
+ val rank = Rank().over().orderBy(rating, SortOrder.DESC)
+}
+
+class StarWarsFilm(id: EntityID) : IntEntity(id) {
+ var sequelId by StarWarsFilms.sequelId
+ var name by StarWarsFilms.name
+ var rating by StarWarsFilms.rating
+
+ val rank: Long
+ get() = readValues[StarWarsFilms.rank]
+
+ companion object : IntEntityClass(StarWarsFilms) {
+ override fun searchQuery(op: Op): Query {
+ return super.searchQuery(op).adjustSlice {
+ slice(columns + StarWarsFilms.rank)
+ }
+ }
+ }
+}
+
+transaction {
+ StarWarsFilm.new {
+ sequelId = 8
+ name = "The Last Jedi"
+ rating = 4.2
+ }
+ // more insertions ...
+ entityCache.clear()
+
+ // fetch entities with value (or store entities then read value)
+ StarWarsFilm.find { StarWarsFilms.name like "The%" }.map { it.name to it.rank }
+}
+```
+
+## Entities mapping
+### Fields transformation
+As databases could store only basic types like integers and strings it's not always conveniently to keep the same simplicity on DAO level.
+Sometimes you may want to make some transformations like parsing json from a varchar column or get some value from a cache based on value from a database.
+In that case the preferred way is to use column transformations. Assume that we want to define unsigned integer field on Entity, but Exposed doesn't have such column type yet.
+```kotlin
+object TableWithUnsignedInteger : IntIdTable() {
+ val uint = integer("uint")
+}
+class EntityWithUInt : IntEntity() {
+ var uint: UInt by TableWithUnsignedInteger.uint.transform({ it.toInt() }, { it.toUInt() })
+
+ companion object : IntEntityClass()
+}
+```
+`transform` function accept two lambdas to convert values to and from an original column type.
+After that in your code you'll be able to put only `UInt` instances into `uint` field.
+It still possible to insert/update values with negative integers via DAO, but your business code becomes much cleaner.
+Please keep in mind what such transformations will aqure on every access to a field what means that you should avoid heavy transformations here.
diff --git a/documentation-website/Writerside/topics/Deep-Dive-into-DSL.md b/documentation-website/Writerside/topics/Deep-Dive-into-DSL.md
new file mode 100644
index 0000000000..73eb3beeed
--- /dev/null
+++ b/documentation-website/Writerside/topics/Deep-Dive-into-DSL.md
@@ -0,0 +1,583 @@
+# Deep Dive into DSL
+
+## Overview
+
+The DSL (Domain-Specific Language) API of Exposed is similar to actual SQL statements, but with the type safety that Kotlin offers.
+
+A database table is represented by an `object` inherited from `org.jetbrains.exposed.sql.Table` like this:
+
+```kotlin
+object StarWarsFilms : Table() {
+ val id: Column = integer("id").autoIncrement()
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+ override val primaryKey = PrimaryKey(id, name = "PK_StarWarsFilms_Id") // PK_StarWarsFilms_Id is optional here
+}
+```
+
+Tables that contains `Int` id with the name `id` can be declared like this:
+
+```kotlin
+object StarWarsFilms : IntIdTable() {
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+}
+```
+
+## CRUD operations
+
+CRUD stands for Create Read Update Delete, which are four basic operations for a database to support. This section shows how to perform SQL CRUD operations
+using Kotlin DSL.
+
+### Create
+
+To create a new table row, you use the `insert` query. Exposed provides several functions to insert rows into a table:
+
+* `insert` adds a new row. If the same row already exists in the table, it throws an exception.
+ ```kotlin
+ // SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
+ // VALUES ('RUSSIA', 'St. Petersburg', 300)
+ Cities.insert {
+ it[name] = "St. Petersburg"
+ it[country] = Country.RUSSIA
+ it[population] = 500
+ }
+ ```
+* `insertAndGetId` adds a new row and returns its ID. If the same row already exists in the table, it throws an exception. Works only with IntIdTable() tables.
+ ```kotlin
+ // SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION)
+ // VALUES ('RUSSIA', 'St. Petersburg', 300)
+ val id = Cities.insertAndGetId {
+ it[name] = "St. Petersburg"
+ it[country] = Country.RUSSIA
+ it[population] = 500
+ }
+ ```
+* `insertIgnore` adds a new row. If the same row already exists in the table, it ignores it and doesn't throw an exception. This function is supported only for MySQL.
+ ```kotlin
+ // SQL: INSERT IGNORE INTO CITIES (COUNTRY, "NAME", POPULATION)
+ // VALUES ('RUSSIA', 'St. Petersburg', 300)
+ val id = Cities.insertIgnore {
+ it[name] = "St. Petersburg"
+ it[country] = Country.RUSSIA
+ it[population] = 500
+ }
+ ```
+* `insertIgnoreAndGetId` adds a new row and returns its ID. If the same row already exists in the table, it ignores it and doesn't throw an exception. This function
+ is supported only for MySQL. Works only with IntIdTable() tables.
+ ```kotlin
+ // SQL: INSERT IGNORE INTO CITIES (COUNTRY, "NAME", POPULATION)
+ // VALUES ('RUSSIA', 'St. Petersburg', 300)
+ val id = Cities.insertIgnoreAndGetId {
+ it[name] = "St. Petersburg"
+ it[country] = Country.RUSSIA
+ it[population] = 500
+ }
+ ```
+
+```kotlin
+val id = StarWarsFilms.insertAndGetId {
+ it[name] = "The Last Jedi"
+ it[sequelId] = 8
+ it[director] = "Rian Johnson"
+}
+```
+
+### Read
+
+```kotlin
+val query: Query = StarWarsFilms.select { StarWarsFilms.sequelId eq 8 }
+```
+
+`Query` inherit `Iterable` so it is possible to traverse it with map/foreach etc'. For example:
+
+```kotlin
+StarWarsFilms.select { StarWarsFilms.sequelId eq 8 }.forEach {
+ println(it[StarWarsFilms.name])
+}
+```
+
+There is `slice` function which allows you to select specific columns or/and expressions.
+
+```kotlin
+val filmAndDirector = StarWarsFilms.slice(StarWarsFilms.name, StarWarsFilms.director).selectAll().map {
+ it[StarWarsFilms.name] to it[StarWarsFilms.director]
+}
+```
+
+If you want to select only distinct value then use `withDistinct()` function:
+
+```kotlin
+val directors = StarWarsFilms.slice(StarWarsFilms.director).select { StarWarsFilms.sequelId less 5 }.withDistinct().map {
+ it[StarWarsFilms.director]
+}
+```
+
+### Update
+
+```kotlin
+StarWarsFilms.update({ StarWarsFilms.sequelId eq 8 }) {
+ it[StarWarsFilms.name] = "Episode VIII – The Last Jedi"
+}
+```
+
+If you want to update column value with some expression like increment use `update` function or setter:
+
+```kotlin
+StarWarsFilms.update({ StarWarsFilms.sequelId eq 8 }) {
+ with(SqlExpressionBuilder) {
+ it.update(StarWarsFilms.sequelId, StarWarsFilms.sequelId + 1)
+ // or
+ it[StarWarsFilms.sequelId] = StarWarsFilms.sequelId + 1
+ }
+}
+```
+
+### Delete
+
+```kotlin
+StarWarsFilms.deleteWhere { StarWarsFilms.sequelId eq 8 }
+```
+
+## Where expression
+
+Query expression (where) expects a boolean operator (ie: `Op`).
+Allowed conditions are:
+
+```
+eq - (==)
+neq - (!=)
+isNull()
+isNotNull()
+less - (<)
+lessEq - (<=)
+greater - (>)
+greaterEq - (>=)
+like - (=~)
+notLike - (!~)
+exists
+notExists
+regexp
+notRegexp
+inList
+notInList
+between
+match (MySQL MATCH AGAINST)
+isDistinctFrom (null-safe equality comparison)
+isNotDistinctFrom (null-safe equality comparison)
+```
+
+Allowed logical conditions are:
+
+```
+not
+and
+or
+andIfNotNull
+orIfNotNull
+compoundAnd()
+compoundOr()
+```
+
+## Conditional where
+
+It is a rather common case to have a query with a `where` clause that depends on some other code's conditions. Moreover, independent or nested conditions could
+make it more complicated to prepare such `where` clauses.
+Let's imagine that we have a form on a website where a user can optionally filter "Star Wars" films by a director and/or a sequel.
+In Exposed version before 0.8.1 you had to code it like:
+
+```Kotlin
+val condition = when {
+ directorName!=null && sequelId!=null ->
+ Op.build { StarWarsFilms.director eq directorName and (StarWarsFilms.sequelId eq sequelId) }
+ directorName!=null ->
+ Op.build { StarWarsFilms.director eq directorName }
+ sequelId!=null ->
+ Op.build { StarWarsFilms.sequelId eq sequelId }
+ else -> null
+}
+val query = condition?.let { StarWarsFilms.select(condition) } ?: StarWarsFilms.selectAll()
+```
+
+or
+
+```Kotlin
+val query = when {
+ directorName!=null && sequelId!=null ->
+ StarWarsFilms.select { StarWarsFilms.director eq directorName and (StarWarsFilms.sequelId eq sequelId) }
+ directorName!=null ->
+ StarWarsFilms.select { StarWarsFilms.director eq directorName }
+ sequelId!=null ->
+ StarWarsFilms.select { StarWarsFilms.sequelId eq sequelId }
+ else -> StarWarsFilms.selectAll()
+}
+```
+
+This is a very primitive example, but you should get the main idea about the problem.
+Now let's try to write the same query in a more simple way (`andWhere` function available since 0.10.5):
+
+```Kotlin
+val query = StarWarsFilms.selectAll()
+directorName?.let {
+ query.andWhere { StarWarsFilms.director eq it }
+}
+sequelId?.let {
+ query.andWhere { StarWarsFilms.sequelId eq it }
+}
+```
+
+But what if we want to conditionally select from another table and join it only when a condition is true?
+You have to use `adjustColumnSet` and `adjustSlice` functions (available since 0.8.1) which allows to extend and modify `join` and `slice` parts of a query (see kdoc
+on that functions):
+
+```Kotlin
+actorName?.let {
+ query.adjustColumnSet { innerJoin(Actors, { StarWarsFilms.sequelId }, { Actors.sequelId }) }
+ .adjustSlice { slice(fields + Actors.columns) }
+ .andWhere { Actors.name eq actorName }
+}
+```
+
+## Count
+
+`count()` is a method of `Query` that is used like below example:
+
+```kotlin
+val count = StarWarsFilms.select { StarWarsFilms.sequelId eq 8 }.count()
+```
+
+## Order-by
+
+Order-by accepts a list of columns mapped to boolean indicates if sorting should be ascending or descending.
+Example:
+
+```kotlin
+StarWarsFilms.selectAll().orderBy(StarWarsFilms.sequelId to SortOrder.ASC)
+```
+
+## Group-by
+
+In group-by, define fields and their functions (such as `count`) by the `slice()` method.
+
+```kotlin
+StarWarsFilms
+ .slice(StarWarsFilms.sequelId.count(), StarWarsFilms.director)
+ .selectAll()
+ .groupBy(StarWarsFilms.director)
+```
+
+Available functions are:
+
+```
+count
+sum
+max
+min
+average
+...
+```
+
+## Limit
+
+You can use limit function to prevent loading large data sets or use it for pagination with second `offset` parameter.
+
+```kotlin
+// Take 2 films after the first one.
+StarWarsFilms.select { StarWarsFilms.sequelId eq Actors.sequelId }.limit(2, offset = 1)
+```
+
+## Join
+
+For the join examples below, consider the following tables:
+
+```kotlin
+object StarWarsFilms : IntIdTable() {
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+}
+object Actors : IntIdTable() {
+ val sequelId: Column = integer("sequel_id").uniqueIndex()
+ val name: Column = varchar("name", 50)
+}
+object Roles : Table() {
+ val sequelId: Column = integer("sequel_id")
+ val actorId: Column> = reference("actor_id", Actors)
+ val characterName: Column = varchar("name", 50)
+}
+```
+
+Join to count how many actors star in each movie:
+
+```kotlin
+Actors.join(StarWarsFilms, JoinType.INNER, onColumn = Actors.sequelId, otherColumn = StarWarsFilms.sequelId)
+ .slice(Actors.name.count(), StarWarsFilms.name)
+ .selectAll()
+ .groupBy(StarWarsFilms.name)
+```
+
+Instead of specifying `onColumn` and `otherColumn`, `additionalConstraint` can be used (and allows specifying
+other types of join conditions).
+
+```kotlin
+Actors.join(StarWarsFilms, JoinType.INNER, additionalConstraint = { StarWarsFilms.sequelId eq Actors.sequelId })
+ .slice(Actors.name.count(), StarWarsFilms.name)
+ .selectAll()
+ .groupBy(StarWarsFilms.name)
+```
+
+When joining on a foreign key, the more concise `innerJoin` can be used:
+
+```kotlin
+(Actors innerJoin Roles)
+ .slice(Roles.characterName.count(), Actors.name)
+ .selectAll()
+ .groupBy(Actors.name)
+ .toList()
+```
+
+This is equivalent to the following:
+
+```kotlin
+Actors.join(Roles, JoinType.INNER, onColumn = Actors.id, otherColumn = Roles.actorId)
+ .slice(Roles.characterName.count(), Actors.name)
+ .selectAll()
+ .groupBy(Actors.name)
+ .toList()
+```
+
+## Union
+
+You can combine the results of multiple queries using using `.union(...)`.
+Per the SQL specification, the queries must have the same number of columns, and not be marked for update.
+Subqueries may be combined when supported by the database.
+
+```kotlin
+val lucasDirectedQuery = StarWarsFilms.slice(StarWarsFilms.name).select { StarWarsFilms.director eq "George Lucas" }
+val abramsDirectedQuery = StarWarsFilms.slice(StarWarsFilms.name).select { StarWarsFilms.director eq "J.J. Abrams" }
+val filmNames = lucasDirectedQuery.union(abramsDirectedQuery).map { it[StarWarsFilms.name] }
+```
+
+Only unique rows are returned by default. Duplicates may be returned using `.unionAll()`.
+
+```kotlin
+val lucasDirectedQuery = StarWarsFilms.slice(StarWarsFilms.name).select { StarWarsFilms.director eq "George Lucas" }
+val originalTrilogyQuery = StarWarsFilms.slice(StarWarsFilms.name).select { StarWarsFilms.sequelId inList (3..5) }
+val filmNames = lucasDirectedQuery.unionAll(originalTrilogyQuery).map { it[StarWarsFilms.name] }
+```
+
+## Alias
+
+Aliases allow preventing ambiguity between field names and table names.
+Use the aliased var instead of original one:
+
+```Kotlin
+val filmTable1 = StarWarsFilms.alias("ft1")
+filmTable1.selectAll() // can be used in joins etc'
+```
+
+Also, aliases allow you to use the same table in a join multiple times:
+
+```Kotlin
+val sequelTable = StarWarsFilms.alias("sql")
+val originalAndSequelNames = StarWarsFilms
+ .innerJoin(sequelTable, { StarWarsFilms.sequelId }, { sequelTable[StarWarsFilms.id] })
+ .slice(StarWarsFilms.name, sequelTable[StarWarsFilms.name])
+ .selectAll()
+ .map { it[StarWarsFilms.name] to it[sequelTable[StarWarsFilms.name]] }
+```
+
+And they can be used when selecting from sub-queries:
+
+```kotlin
+val starWarsFilms = StarWarsFilms
+ .slice(StarWarsFilms.id, StarWarsFilms.name)
+ .selectAll()
+ .alias("swf")
+val id = starWarsFilms[StarWarsFilms.id]
+val name = starWarsFilms[StarWarsFilms.name]
+starWarsFilms
+ .slice(id, name)
+ .selectAll()
+ .map { it[id] to it[name] }
+```
+
+## Schema
+
+You can create a schema or drop an existing one:
+
+```Kotlin
+val schema = Schema("my_schema") // my_schema is the schema name.
+// Creates a Schema
+SchemaUtils.createSchema(schema)
+// Drops a Schema
+SchemaUtils.dropSchema(schema)
+```
+
+Also, you can specify the schema owner like this (some databases require the explicit owner) :
+
+```Kotlin
+val schema = Schema("my_schema", authorization = "owner")
+```
+
+If you have many schemas and you want to set a default one, you can use:
+
+```Kotlin
+SchemaUtils.setSchema(schema)
+```
+
+## Sequence
+
+If you want to use Sequence, Exposed allows you to:
+
+### Define a Sequence
+
+```Kotlin
+val myseq = Sequence("my_sequence") // my_sequence is the sequence name.
+```
+
+Several parameters can be specified to control the properties of the sequence:
+
+```Kotlin
+private val myseq = Sequence(
+ name = "my_sequence",
+ startWith = 4,
+ incrementBy = 2,
+ minValue = 1,
+ maxValue = 10,
+ cycle = true,
+ cache = 20
+)
+```
+
+### Create and Drop a Sequence
+
+```Kotlin
+// Creates a sequence
+SchemaUtils.createSequence(myseq)
+// Drops a sequence
+SchemaUtils.dropSequence(myseq)
+```
+
+### Use the NextVal function
+
+You can use the nextVal function like this:
+
+```Kotlin
+val nextVal = myseq.nextVal()
+val id = StarWarsFilms.insertAndGetId {
+ it[id] = nextVal
+ it[name] = "The Last Jedi"
+ it[sequelId] = 8
+ it[director] = "Rian Johnson"
+}
+```
+
+```Kotlin
+val firstValue = StarWarsFilms.slice(nextVal).selectAll().single()[nextVal]
+```
+
+## Batch Insert
+
+Batch Insert allow mapping a list of entities into DB raws in one sql statement. It is more efficient than inserting one by one as it initiates only one statement.
+Here is an example:
+
+```kotlin
+val cityNames = listOf("Paris", "Moscow", "Helsinki")
+val allCitiesID = cities.batchInsert(cityNames) { name ->
+ this[cities.name] = name
+}
+```
+
+*NOTE:* The `batchInsert` function will still create multiple `INSERT` statements when interacting with your database. You most likely want to couple this with
+the `rewriteBatchedInserts=true` (or `rewriteBatchedStatements=true`) option of your relevant JDBC driver, which will convert those into a single bulkInsert.
+You can find the documentation for this option for MySQL [here](https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html) and
+PostgreSQL [here](https://jdbc.postgresql.org/documentation/use/).
+
+If you don't need to get the newly generated values (example: auto incremented ID), set the `shouldReturnGeneratedValues` parameter to false, this increases the
+performance of batch inserts by batching them in chunks, instead of always waiting for the database to synchronize the newly inserted object state.
+
+If you want to check if the `rewriteBatchedInserts` + `batchInsert` is working correctly, check how to enable JDBC logging for your driver because Exposed will always
+show the non-rewritten multiple inserts. You can find the documentation for how to enable logging in
+PostgreSQL [here](https://jdbc.postgresql.org/documentation/logging/).
+
+## Insert From Select
+
+If you want to use `INSERT INTO ... SELECT ` SQL clause try Exposed analog `Table.insert(Query)`.
+
+```kotlin
+val substring = users.name.substring(1, 2)
+cities.insert(users.slice(substring).selectAll().orderBy(users.id).limit(2))
+```
+
+By default it will try to insert into all non auto-increment `Table` columns in order they defined in Table instance. If you want to specify columns or change the
+order, provide list of columns as second parameter:
+
+```kotlin
+val userCount = users.selectAll().count()
+users.insert(users.slice(stringParam("Foo"), Random().castTo(VarCharColumnType()).substring(1, 10)).selectAll(), columns = listOf(users.name, users.id))
+```
+
+## Insert Or Ignore
+
+If supported by your specific database, `insertIgnore()` allows insert statements to be executed without throwing any
+ignorable errors. This may be useful, for example, when insertion conflicts are possible:
+```kotlin
+StarWarsFilms.insert {
+ it[sequelId] = 8 // column pre-defined with a unique index
+ it[name] = "The Last Jedi"
+ it[director] = "Rian Johnson"
+}
+// If insert() was used, this would throw a constraint violation exception
+// Instead, this new row is ignored and discarded
+StarWarsFilms.insertIgnore {
+ it[sequelId] = 8
+ it[name] = "The Rise of Skywalker"
+ it[director] = "JJ Abrams"
+}
+```
+
+## Insert Or Update
+
+Insert or update (Upsert) is a database operation that either inserts a new row or updates an existing row if a duplicate
+constraint already exists. The supported functionality of `upsert()` is dependent on the specific database being used.
+For example, MySQL's `INSERT ... ON DUPLICATE KEY UPDATE` statement automatically assesses the primary key and unique indices
+for a duplicate value, so using the function in Exposed would look like this:
+```kotlin
+// inserts a new row
+StarWarsFilms.upsert {
+ it[sequelId] = 9 // column pre-defined with a unique index
+ it[name] = "The Rise of Skywalker"
+ it[director] = "Rian Johnson"
+}
+// updates existing row with the correct [director]
+StarWarsFilms.upsert {
+ it[sequelId] = 9
+ it[name] = "The Rise of Skywalker"
+ it[director] = "JJ Abrams"
+}
+```
+Using another example, PostgreSQL allows more control over which key constraint columns to check for conflict, whether different
+values should be used for an update, and whether the update statement should have a `WHERE` clause:
+```kotlin
+val incrementSequelId = listOf(StarWarsFilms.sequelId to StarWarsFilms.sequelId.plus(1))
+StarWarsFilms.upsert(
+ StarWarsFilms.sequelId,
+ onUpdate = incrementSequelId,
+ where = { StarWarsFilms.director like stringLiteral("JJ%") }
+) {
+ it[sequelId] = 9
+ it[name] = "The Rise of Skywalker"
+ it[director] = "JJ Abrams"
+}
+```
+If a specific database supports user-defined key columns and none are provided, the table's primary key is used. If there
+is no defined primary key, the first unique index is used. If there are no unique indices, each database handles this case
+differently, so it is strongly advised that keys are defined to avoid unexpected results.
+
+
+Databases that do not support a specific upsert command implement the standard `MERGE USING` statement with aliases
+and a derived table. These include Oracle, SQL Server, and H2 compatibility modes (except for MySQL mode).
+
diff --git a/documentation-website/Writerside/topics/Default-topic.md b/documentation-website/Writerside/topics/Default-topic.md
new file mode 100644
index 0000000000..ae3396669a
--- /dev/null
+++ b/documentation-website/Writerside/topics/Default-topic.md
@@ -0,0 +1,80 @@
+# Welcome to Writerside!
+
+
+
+## Add new topics
+You can create empty topics, or choose a template for different types of content that contains some boilerplate structure to help you get started:
+
+![Create new topic options](new_topic_options.png){ width=290 }{border-effect=line}
+
+## Write content
+%product% supports two types of markup: Markdown and XML.
+When you create a new help article, you can choose between two topic types, but this doesn't mean you have to stick to a single format.
+You can author content in Markdown and extend it with semantic attributes or inject entire XML elements.
+
+## Inject XML
+For example, this is how you inject a procedure:
+
+
+
+
Start typing and select a procedure type from the completion suggestions:
+
+
+
+
Press Tab or Enter to insert the markup.
+
+
+
+## Add interactive elements
+
+### Tabs
+To add switchable content, you can make use of tabs (inject them by starting to type `tab` on a new line):
+
+
+
+ ![Alt Text](new_topic_options.png){ width=450 }
+
+
+
+ ]]>
+
+
+
+### Collapsible blocks
+Apart from injecting entire XML elements, you can use attributes to configure the behavior of certain elements.
+For example, you can collapse a chapter that contains non-essential information:
+
+#### Supplementary info {collapsible="true"}
+Content under such header will be collapsed by default, but you can modify the behavior by adding the following attribute:
+`default-state="expanded"`
+
+### Convert selection to XML
+If you need to extend an element with more functions, you can convert selected content from Markdown to semantic markup.
+For example, if you want to merge cells in a table, it's much easier to convert it to XML than do this in Markdown.
+Position the caret anywhere in the table and press Alt+Enter:
+
+
+
+## Feedback and support
+Please report any issues, usability improvements, or feature requests to our
+YouTrack project
+(you will need to register).
+
+You are welcome to join our
+public Slack workspace.
+Before you do, please read our [Code of conduct](https://plugins.jetbrains.com/plugin/20158-writerside/docs/writerside-code-of-conduct.html).
+We assume that you’ve read and acknowledged it before joining.
+
+You can also always send an email to [writerside@jetbrains.com](mailto:writerside@jetbrains.com).
+
+
+
+ Markup reference
+ Reorder topics in the TOC
+ Build and publish
+ Configure Search
+
+
diff --git a/documentation-website/Writerside/topics/Frequently-Asked-Questions.md b/documentation-website/Writerside/topics/Frequently-Asked-Questions.md
new file mode 100644
index 0000000000..f4fbe3460c
--- /dev/null
+++ b/documentation-website/Writerside/topics/Frequently-Asked-Questions.md
@@ -0,0 +1,133 @@
+# Frequently Asked Questions
+
+### Q: [Squash](https://github.com/orangy/squash) is same as Exposed. Where is the difference?
+A: [Ilya Ryzhenkov](https://github.com/orangy/) (Squash maintainer) answers:
+> Squash is an attempt to refactor Exposed (long time ago) to fix DSL issues, extensibility on dialect side, support graph fetching and avoid TLS-stored transactions. Unfortunately, I didn’t have enough time to finish the work, but I still hope to return to it some day. We are talking with Exposed maintainer [@tapac](https://github.com/orangy/) about coordinating efforts and eventually joining forces. Note, that none of these libs are “official” JetBrains Kotlin SQL libs, they are both side projects of their respective authors.
+
+### Q: Can I use multiple Database Connections?
+
+A: Yes. See [[Working with a multiple databases|Transactions#working-with-a-multiple-databases]]
+
+### Q: Is `Array` column type supported?
+
+A: Not at the moment. More info here: https://github.com/JetBrains/Exposed/issues/150
+The complete list of supported data types can be found here: [[Data Types|DataTypes]].
+
+### Q: Is `upsert` supported?
+
+A: Yes. See [[Insert Or Update|DSL#insert-or-update]]
+
+### Q: Is `json` type supported?
+
+A: Yes. See [[How to use Json and JsonB types|DataTypes#how-to-use-json-and-jsonb-types]]
+
+### Q: How to get a plain SQL query which will be executed?
+
+A:
+```kotlin
+val plainSQL = FooTable.select {}.prepareSQL(QueryBuilder(false))
+```
+Use QueryBuiler with `false` - if you want to inline statement arguments, `true` - to see '?' in query.
+
+### Q: Is it possible to use native sql / sql as a string?
+
+A: It is not supported as part of the library but it is possible to implement on top of it and use it like this:
+```kotlin
+fun String.execAndMap(transform : (ResultSet) -> T) : List {
+ val result = arrayListOf()
+ TransactionManager.current().exec(this) { rs ->
+ while (rs.next()) {
+ result += transform(rs)
+ }
+ }
+ return result
+}
+
+"select u.name, c.name from user u inner join city c where blah blah".execAndMap { rs ->
+ rs.getString("u.name") to rs.getString("c.name")
+}
+```
+More info in this issue: https://github.com/JetBrains/Exposed/issues/118
+
+### Q: Is it possible to update a field relative to current field value?
+
+A: Yes. See example here: https://github.com/JetBrains/Exposed/wiki/DSL#update
+
+### Q: How can I add another type of Database?
+
+A: Implement `DatabaseDialect` interface and register it with `Database.registerDialect()`.
+If the implementation adds a lot of value consider contributing it as a PR to Exposed.
+
+### Q: Is it possible to create tables with cross / cyclic reference?
+
+A: Yes, it's possible since Exposed 0.11.1 version
+
+### Q: How can I implement nested queries?
+
+A: See example here: https://github.com/JetBrains/Exposed/issues/248
+
+### Q: How can I use SAVEPOINT?
+A: It possible only through using a raw connection. See example [here](https://github.com/JetBrains/Exposed/issues/320#issuecomment-394825415).
+
+### Q: How to prepare query like: `SELECT * FROM table WHERE (x,y) IN ((1, 2), (3, 4), (5, 6))`
+A: It possible with custom function. See [example](https://github.com/JetBrains/Exposed/issues/373#issuecomment-414123325).
+
+### Q: Where can I find snapshot builds of Exposed
+A: You could use jitpack.io service for that.
+
+Add jitpack.io to repositories:
+```
+repositories {
+ maven { url 'https://jitpack.io' }
+}
+```
+Then add Exposed dependency as stated below:
+```
+dependencies {
+ implementation 'com.github.JetBrains:Exposed:-SNAPSHOT'
+}
+```
+
+### Q: How can I specify a primary key column type e.g StringIdTable?
+A: You need to define your own! See examples:
+[#855](https://github.com/JetBrains/Exposed/issues/855)
+https://stackoverflow.com/a/61940820/1155026
+
+### Q: How create custom collumn type
+A: Just implements [IColumnType](https://github.com/JetBrains/Exposed/blob/76a671e57a0105d6aed79e256c088690bd4a56b6/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/ColumnType.kt#L25)
+and use [registerColumn](https://github.com/JetBrains/Exposed/blob/76a671e57a0105d6aed79e256c088690bd4a56b6/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Table.kt#L387)
+to [extends](https://kotlinlang.org/docs/extensions.html) a [Table](https://github.com/JetBrains/Exposed/blob/76a671e57a0105d6aed79e256c088690bd4a56b6/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Table.kt#L326)
+
+
+eg: **Create custom UUID types (inpired by [@pjagielski article](https://medium.com/@pjagielski/how-we-use-kotlin-with-exposed-at-touk-eacaae4565b5#e4e4))**
+```kotlin
+abstract class TypedId(open val id: UUID): Serializable, Comparable {
+ override fun compareTo(other: TypedId) = this.id.compareTo(other.id)
+}
+
+class TypedUUIDColumnType(val constructor: (UUID) -> T, private val uuidColType: UUIDColumnType = UUIDColumnType()): IColumnType by uuidColType {
+ override fun valueFromDB(value: Any) = constructor(uuidColType.valueFromDB(value))
+ override fun notNullValueToDB(value: Any): Any = uuidColType.notNullValueToDB(valueUnwrap(value))
+ override fun nonNullValueToString(value: Any): String = uuidColType.nonNullValueToString(valueUnwrap(value))
+ private fun valueUnwrap(value: Any) = (value as? TypedId)?.id ?: value
+}
+
+fun Table.typedUuid(name: String, constructor: (UUID) -> T) = registerColumn(name, TypedUUIDColumnType(constructor))
+fun Column.autoGenerate(constructor: (UUID) -> T): Column = clientDefault { constructor(UUID.randomUUID()) }
+
+
+class StarWarsFilmId(id: UUID): TypedId(id)
+
+object StarWarsFilms : Table() {
+ val id = typedUuid("id") { StarWarsFilmId(it) }.autoGenerate{ StarWarsFilmId(it) }
+ val name: Column = varchar("name", 50)
+ val director: Column = varchar("director", 50)
+ final override val primaryKey = PrimaryKey(id)
+}
+```
+
+
+Reference: [#149](https://github.com/JetBrains/Exposed/issues/149)
+
+### More questions on Stack Overflow:
+[https://stackoverflow.com/questions/tagged/kotlin-exposed](https://stackoverflow.com/questions/tagged/kotlin-exposed)
diff --git a/documentation-website/Writerside/topics/Functions.md b/documentation-website/Writerside/topics/Functions.md
new file mode 100644
index 0000000000..6ab686ca1e
--- /dev/null
+++ b/documentation-website/Writerside/topics/Functions.md
@@ -0,0 +1,192 @@
+# Functions
+
+Exposed provides basic support for classic SQL functions. This topic consists of definitions for those functions, and their
+usage examples. It also explains how to define [custom functions](#custom-functions).
+
+## How to use functions
+If you want to retrieve a function result from a query, you have to declare the function as a variable:
+```kotlin
+val lowerCasedName = FooTable.name.lowerCase()
+val lowerCasedNames = FooTable.slice(lowerCasedName).selectAll().map { it[lowerCasedName] }
+
+```
+Also, functions could be chained and combined:
+```kotlin
+val trimmedAndLoweredFullName = Concat(FooTable.firstName, stringLiteral(" "), FooTable.lastName).trim().lowerCase()
+val fullNames = FooTable.slice(trimmedAndLoweredFullName).selectAll().map { it[trimmedAndLoweredFullName] }
+
+```
+
+## String functions
+### LowerCase/UpperCase
+Returns a lower-cased/upper-cased string value.
+```kotlin
+val lowerCasedName = FooTable.name.lowerCase()
+val lowerCasedNames = FooTable.slice(lowerCasedName).selectAll().map { it[lowerCasedName] }
+
+```
+### Substring
+Returns a substring value from the specified start and with the specified length.
+```kotlin
+val shortenedName = FooTable.name.substring(start = 1, length = 3)
+val shortenedNames = FooTable.slice(shortenedName).selectAll().map { it[shortenedName] }
+
+```
+### Concat
+Returns a string value that concatenates the text representations of all non-null input values, separated by an optional separator.
+```kotlin
+val userName = concat(stringLiteral("User - "), FooTable.name)
+val userNames = FooTable.slice(userName).selectAll().map { it[userName] }
+
+```
+### Locate
+Returns the index of the first occurrence of a specified substring or 0.
+```kotlin
+val firstAIndex = FooTable.name.locate("a")
+val firstAIndices = FooTable.slice(firstAIndex).selectAll().map { it[firstAIndex] }
+
+```
+### CharLength
+Returns the length, measured in characters, or `null` if the String value is null.
+```kotlin
+val nameLength = FooTable.name.charLength()
+val nameLengths = FooTable.slice(nameLength).selectAll().map { it[nameLength] }
+
+```
+
+## Aggregating functions
+These functions should be used in queries with [[groupBy|DSL#group-by]].
+### Min/Max/Average
+Returns minimum/maximum/average value and can be applied to any comparable expression:
+```kotlin
+val minId = FooTable.id.min()
+val maxId = FooTable.id.max()
+val averageId = FooTable.id.avg()
+val (min, max, avg) = FooTable.slice(minId, maxId, averageId).selecAll().map {
+ Triple(it[minId], it[maxId], it[averageId])
+}
+
+```
+
+## Custom functions
+If you can't find your most loved function used in your database (as Exposed provides only basic support for classic SQL functions), you can define your own functions.
+
+Since Exposed 0.15.1 there multiple options to define custom functions:
+1. Function without parameters:
+```kotlin
+val sqrt = FooTable.id.function("SQRT")
+```
+In SQL representation it will be `SQRT(FooTable.id)`
+
+2. Function with additional parameters:
+```kotlin
+val replacedName = CustomFunction("REPLACE", VarCharColumnType(), FooTable.name, stringParam("foo"), stringParam("bar"))
+
+```
+`CustomFunction` class accepts a function name as a first parameter and the resulting column type as second. After that, you can provide any amount of parameters separated by a comma.
+
+There are also shortcuts for string, long, and datetime functions:
+* `CustomStringFunction`
+* `CustomLongFunction`
+* `CustomDateTimeFunction`
+
+The code above could be simplified to:
+```kotlin
+val replacedName = CustomStringFunction("REPLACE", FooTable.name, stringParam("foo"), stringParam("bar"))
+
+```
+For example, the following could be used in SQLite to mimic its `date()` function:
+```kotlin
+val lastDayOfMonth = CustomDateFunction(
+ "date",
+ FooTable.dateColumn,
+ stringLiteral("start of month"),
+ stringLiteral("+1 month"),
+ stringLiteral("-1 day")
+)
+```
+3. Function that requires more complex query building:
+
+All functions in Exposed extend the abstract class `Function`, which takes a column type and allows overriding `toQueryBuilder()`. This is what `CustomFunction` actually does, which can be leveraged to create more complex queries.
+
+For example, Exposed provides a `trim()` function that removes leading and trailing whitespace from a String. In MySQL, this is just the default behavior as specifiers can be provided to limit the trim to either leading or trailing, as well as providing a specific substring other than spaces to remove. The custom function below supports this extended behavior:
+```kotlin
+enum class TrimSpecifier { BOTH, LEADING, TRAILING }
+
+class CustomTrim(
+ val expression: Expression,
+ val toRemove: Expression?,
+ val trimSpecifier: TrimSpecifier
+) : Function(TextColumnType()) {
+ override fun toQueryBuilder(queryBuilder: QueryBuilder) {
+ queryBuilder {
+ append("TRIM(")
+ append(trimSpecifier.name)
+ toRemove?.let { +" $it" }
+ append(" FROM ")
+ append(expression)
+ append(")")
+ }
+ }
+}
+
+fun Expression.customTrim(
+ toRemove: Expression? = null,
+ specifier: TrimSpecifier = TrimSpecifier.BOTH
+): CustomTrim = CustomTrim(this, toRemove, specifier)
+
+transaction {
+ FooTable.insert { it[name] = "xxxbarxxx" }
+
+ val leadingXTrim = FooTable.name.customTrim(stringLiteral("x"), TrimSpecifier.LEADING)
+ val trailingXTrim = FooTable.name.customTrim(stringLiteral("x"), TrimSpecifier.TRAILING)
+
+ FooTable.slice(leadingXTrim).selectAll() // barxxx
+ FooTable.slice(trailingXTrim).selectAll() // xxxbar
+}
+
+```
+
+## Window Functions
+
+Window functions allow calculations across a set of table rows that are related to the current row.
+
+Existing aggregate functions (like `sum()`, `avg()`) can be used, as well as new rank and value functions:
+* `cumeDist()`
+* `denseRank()`
+* `firstValue()`
+* `lag()`
+* `lastValue()`
+* `lead()`
+* `nthValue()`
+* `nTile()`
+* `percentRank()`
+* `rank()`
+* `rowNumber()`
+
+To use a window function, include the `OVER` clause by chaining `.over()` after the function call. A `PARTITION BY` and
+`ORDER BY` clause can be optionally chained using `.partitionBy()` and `.orderBy()`, which both take multiple arguments:
+```kotlin
+FooTable.amount.sum().over().partitionBy(FooTable.year, FooTable.product).orderBy(FooTable.amount)
+
+rowNumber().over().partitionBy(FooTable.year, FooTable.product).orderBy(FooTable.amount)
+
+FooTable.amount.sum().over().orderBy(FooTable.year to SortOrder.DESC, FooTable.product to SortOrder.ASC_NULLS_FIRST)
+```
+Frame clause functions (like `rows()`, `range()`, and `groups()`) are also supported and take a `WindowFrameBound` option
+depending on the expected result:
+* `WindowFrameBound.currentRow()`
+* `WindowFrameBound.unboundedPreceding()`
+* `WindowFrameBound.unboundedFollowing()`
+* `WindowFrameBound.offsetPreceding()`
+* `WindowFrameBound.offsetFollowing()`
+```kotlin
+FooTable.amount.sum().over()
+ .partitionBy(FooTable.year, FooTable.product)
+ .orderBy(FooTable.amount)
+ .range(WindowFrameBound.offsetPreceding(2), WindowFrameBound.currentRow())
+```
+
+
+If multiple frame clause functions are chained together, only the last one will be used.
+
diff --git a/documentation-website/Writerside/topics/Getting-Started.md b/documentation-website/Writerside/topics/Getting-Started.md
new file mode 100644
index 0000000000..8dbdaa57b7
--- /dev/null
+++ b/documentation-website/Writerside/topics/Getting-Started.md
@@ -0,0 +1,269 @@
+# Getting Started
+
+## Adding the Exposed dependency
+
+
+
+
+
+
+ mavenCentral
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+
+
+
+ org.jetbrains.exposed
+ exposed-core
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-dao
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-jdbc
+ 0.44.0
+
+
+]]>
+
+
+
+
+
+
+
+
+
+- Note: There are other modules. Detailed information is located in [Modules Documentation](Modules-Documentation.md) section.
+
+## Starting a transaction
+
+Every database access using Exposed is started by obtaining a connection and creating a transaction.
+
+To get a connection:
+
+```kotlin
+Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
+```
+
+It is also possible to provide `javax.sql.DataSource` for advanced behaviors such as connection pooling:
+
+```kotlin
+Database.connect(dataSource)
+```
+
+More details in [Databases](Databases.md)
+
+After obtaining a connection, all SQL statements should be placed inside a transaction:
+
+```kotlin
+transaction {
+ // Statements here
+}
+```
+
+To see the actual database calls, add a logger:
+
+```kotlin
+transaction {
+ // print SQL to stdout
+ addLogger(StdOutSqlLogger)
+}
+```
+
+## Access Layers
+
+Exposed comes in two flavors: DSL and DAO.
+
+- DSL stands for Domain-Specific Language, and for Exposed it means type-safe syntax similar to SQL statements to access a database. For more
+ information, see [Deep Dive into DSL](Deep-Dive-into-DSL.md).
+
+- DAO means Data Access Object, and it allows treating the data from database as entities and performing CRUD operations. For more information, see
+ [Deep Dive into DAO](Deep-Dive-into-DAO.md).
+
+To get an idea of the difference, compare the following code samples and corresponding SQL outputs:
+
+
+
+
+
+
+
+
+
+ = integer("population").uniqueIndex()
+val country = Cities.customEnumeration(
+"country",
+"ENUM('RUSSIA', 'CHINA', 'USA', 'UNKNOWN')",
+{ Country.values()[it as Int] },
+{ it.name }
+).default(Country.UNKNOWN)
+override val primaryKey = PrimaryKey(id, name = "Cities_ID")
+}
+class City(id: EntityID) : IntEntity(id) {
+companion object : IntEntityClass(Cities)
+
+ var name by Cities.name
+ var country by Cities.country
+ var population by Cities.population
+
+}
+
+enum class Country {
+RUSSIA, CHINA, USA, UNKNOWN
+}
+
+fun init() {
+Database.connect(
+"jdbc:h2:mem:test;DB_CLOSE_DELAY=-1",
+driver = "org.h2.Driver"
+)
+
+ transaction {
+ // print sql calls to stdout
+ addLogger(StdOutSqlLogger)
+
+ // create a table Cities
+ SchemaUtils.create(Cities)
+
+ // insert a new city
+ val ny = City.new {
+ name = "New York"
+ country = Country.USA
+ population = 1000
+ }
+
+ // insert a new city
+ val mos = City.new {
+ name = "Moscow"
+ country = Country.RUSSIA
+ population = 500
+ }
+
+ // insert a new city
+ val stPet = City.new {
+ name = "St. Petersburg"
+ country = Country.RUSSIA
+ population = 300
+ }
+ }
+
+}
+
+fun main() {
+init()
+}
+]]>
+
+
+
+
+SQL output:
+
+
+SQL: SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME = 'MODE'
+SQL: CREATE TABLE IF NOT EXISTS CITIES (
+ ID INT AUTO_INCREMENT,
+ "NAME" VARCHAR(50) DEFAULT 'Unknown' NOT NULL,
+ POPULATION INT NULL,
+ COUNTRY ENUM('RUSSIA', 'CHINA', 'USA') NULL,
+ CONSTRAINT Cities_ID PRIMARY KEY (ID)
+)
+SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION) VALUES ('USA', 'New York', 1000)
+SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION) VALUES ('RUSSIA', 'Moscow', 500)
+SQL: INSERT INTO CITIES (COUNTRY, "NAME", POPULATION) VALUES ('RUSSIA', 'St. Petersburg', 300)
+
+
+More on [DSL](Deep-Dive-into-DSL.md) and [DAO](Deep-Dive-into-DAO.md).
diff --git a/documentation-website/Writerside/topics/Introduction.md b/documentation-website/Writerside/topics/Introduction.md
new file mode 100644
index 0000000000..6f331aed8e
--- /dev/null
+++ b/documentation-website/Writerside/topics/Introduction.md
@@ -0,0 +1,24 @@
+# Introduction
+
+Welcome to the Exposed documentation!
+
+Exposed is a lightweight SQL library on top of JDBC driver for Kotlin.
+It has two flavors of database access: type-safe SQL wrapping DSL (Domain-Specific Language) and lightweight DAO (Data Access Object).
+
+Exposed supports the following databases:
+
+* H2
+* MariaDB
+* MySQL
+* Oracle
+* PostgreSQL
+* SQL Server
+* SQLite
+
+Exposed requires Java 6 or later versions. To check the version of Java you have installed, run the following command from the terminal:
+
+```shell
+java -version
+```
+
+Exposed is an open-source project and is available on GitHub.
diff --git a/documentation-website/Writerside/topics/Migration-Guide.md b/documentation-website/Writerside/topics/Migration-Guide.md
new file mode 100644
index 0000000000..aa6c16bc0f
--- /dev/null
+++ b/documentation-website/Writerside/topics/Migration-Guide.md
@@ -0,0 +1,3 @@
+# Migration Guide
+
+Start typing here...
\ No newline at end of file
diff --git a/documentation-website/Writerside/topics/Modules-Documentation.md b/documentation-website/Writerside/topics/Modules-Documentation.md
new file mode 100644
index 0000000000..04611fed7b
--- /dev/null
+++ b/documentation-website/Writerside/topics/Modules-Documentation.md
@@ -0,0 +1,213 @@
+# Modules Documentation
+
+## Dependencies
+
+Exposed modules are available from Maven Central repository.
+To use them you have to add appropriate dependency into your repositories mapping.
+
+#### Maven
+
+```xml
+
+
+
+
+ mavenCentral
+ mavenCentral
+ https://repo1.maven.org/maven2/
+
+
+```
+
+#### Gradle Groovy and Kotlin DSL
+
+```kotlin
+repositories {
+ // Versions after 0.30.1
+ // Versions before 0.30.1 is unavailable for now
+ mavenCentral()
+}
+```
+
+## Base Modules
+
+### Exposed 0.17.x and lower
+
+Prior Exposed 0.18.1 there was only one base module `exposed` which contains everything you may need including JodaTime as date-time library.
+To add `Exposed` framework of that version you had to use:
+
+#### Maven
+
+```xml
+
+
+
+ org.jetbrains.exposed
+ exposed
+ 0.17.7
+
+
+
+```
+
+#### Gradle Groovy
+
+```groovy
+dependencies {
+ implementation 'org.jetbrains.exposed:exposed:0.17.7'
+}
+```
+
+#### Gradle Kotlin DSL
+
+```kotlin
+dependencies {
+ implementation("org.jetbrains.exposed", "exposed", "0.17.7")
+}
+```
+
+### Exposed 0.18.1 and higher
+
+To move forward and support such features as Java 8 Time, async drivers, and so on, it was decided to split Exposed into more specific modules. It will allow you to
+take the only modules you need and will add flexibility in the future.
+
+`Exposed` consists of the following modules:
+
+* exposed-core - base module, which contains both DSL api along with mapping
+* exposed-crypt - provides additional column types to store encrypted data in DB and encode/decode it on client-side
+* exposed-dao - DAO api
+* exposed-java-time - date-time extensions based on Java8 Time API
+* exposed-jdbc - transport level implementation based on Java JDBC API
+* exposed-jodatime - date-time extensions based on JodaTime library
+* exposed-json - JSON and JSONB data type extensions
+* exposed-kotlin-datetime - date-time extensions based on kotlinx-datetime
+* exposed-money - extensions to support MonetaryAmount from "javax.money:money-api"
+* exposed-spring-boot-starter - a starter for [Spring Boot](https://spring.io/projects/spring-boot) to utilize Exposed as the ORM instead
+ of [Hibernate](https://hibernate.org/)
+
+Dependencies mapping listed below is similar (by functionality) to the previous versions:
+
+#### Maven
+
+```xml
+
+
+
+ org.jetbrains.exposed
+ exposed-core
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-crypt
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-dao
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-java-time
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-jdbc
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-jodatime
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-json
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-kotlin-datetime
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-money
+ 0.44.0
+
+
+ org.jetbrains.exposed
+ exposed-spring-boot-starter
+ 0.44.0
+
+
+
+```
+
+#### Gradle Groovy
+
+```groovy
+dependencies {
+ implementation 'org.jetbrains.exposed:exposed-core:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-crypt:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-dao:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-jdbc:0.44.0'
+
+ implementation 'org.jetbrains.exposed:exposed-jodatime:0.44.0'
+ // or
+ implementation 'org.jetbrains.exposed:exposed-java-time:0.44.0'
+ // or
+ implementation 'org.jetbrains.exposed:exposed-kotlin-datetime:0.44.0'
+
+ implementation 'org.jetbrains.exposed:exposed-json:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-money:0.44.0'
+ implementation 'org.jetbrains.exposed:exposed-spring-boot-starter:0.44.0'
+}
+```
+
+#### Gradle Kotlin DSL
+
+In `build.gradle.kts`:
+
+```kotlin
+val exposedVersion: String by project
+dependencies {
+ implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-crypt:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-jdbc:$exposedVersion")
+
+ implementation("org.jetbrains.exposed:exposed-jodatime:$exposedVersion")
+ // or
+ implementation("org.jetbrains.exposed:exposed-java-time:$exposedVersion")
+ // or
+ implementation("org.jetbrains.exposed:exposed-kotlin-datetime:$exposedVersion")
+
+ implementation("org.jetbrains.exposed:exposed-json:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-money:$exposedVersion")
+ implementation("org.jetbrains.exposed:exposed-spring-boot-starter:$exposedVersion")
+}
+```
+
+and in `gradle.properties`
+
+```
+exposedVersion=0.44.0
+```
+
+### JDBC driver and logging
+
+You also need a JDBC driver for the database system you are using (see [Databases](Databases.md)) and a logger for `addLogger(StdOutSqlLogger)`. Example (Gradle
+syntax):
+
+```kotlin
+dependencies {
+ // for H2
+ implementation("com.h2database:h2:2.1.214")
+ // for logging (StdOutSqlLogger), see
+ // http://www.slf4j.org/codes.html#StaticLoggerBinder
+ implementation("org.slf4j:slf4j-nop:1.7.30")
+}
+```
diff --git a/documentation-website/Writerside/topics/Samples.md b/documentation-website/Writerside/topics/Samples.md
new file mode 100644
index 0000000000..49d4c8e5b8
--- /dev/null
+++ b/documentation-website/Writerside/topics/Samples.md
@@ -0,0 +1,3 @@
+# Samples
+
+Samples can be found [here](https://github.com/JetBrains/Exposed/tree/main/samples).
diff --git a/documentation-website/Writerside/topics/Schemas.md b/documentation-website/Writerside/topics/Schemas.md
new file mode 100644
index 0000000000..15e4f5237d
--- /dev/null
+++ b/documentation-website/Writerside/topics/Schemas.md
@@ -0,0 +1,7 @@
+# Schemas
+
+[Table Definition](Table-Definition.md)
+
+[Data Types](Data-Types.md)
+
+[Functions](Functions.md)
diff --git a/documentation-website/Writerside/topics/Table-Definition.md b/documentation-website/Writerside/topics/Table-Definition.md
new file mode 100644
index 0000000000..9a03061be2
--- /dev/null
+++ b/documentation-website/Writerside/topics/Table-Definition.md
@@ -0,0 +1,196 @@
+# Table Definition
+
+This topic shows what table types Exposed supports and how to define and create tables. Also, it contains tips on configuring
+constraints, such as `PRIMARY KEY`, `DEFAULT`, `INDEX` and so on.
+
+## Table Types
+
+The most primitive table type is `Table()`. It's located in **org.jetbrains.exposed.sql** package and has `NOT NULL` SQL constraint
+configured by default on all columns. To configure a custom name for the table, which will be used in actual SQL queries, pass
+it to the `name` parameter of the `Table()` constructor. Otherwise, Exposed will generate it from a class name.
+
+For example, to create a simple table called `"citiesTable"` with integer `id` column and string `name` column, use the
+following code.
+```kotlin
+// SQL: CREATE TABLE IF NOT EXISTS CITIESTABLE (
+// ID INT NOT NULL,
+// "NAME" VARCHAR(50) NOT NULL
+// )
+object Cities : Table(name = "citiesTable") {
+ val id = integer("id")
+ val name = varchar("name", 50)
+}
+```
+Also, Exposed provides `IdTable` class which is inherited by `IntIdTable()`, `LongIdTable()`, and `UUIDTable(`) classes from
+**org.jetbrains.exposed.dao.id** package of **exposed-core** module. These tables could be declared without the `id` attribute.
+IDs of appropriate type will be generated automatically when creating new table rows. To configure a custom name
+for the `id` attribute, pass it to the `columnName` parameter of the appropriate table constructor.
+
+Depending on what DBMS you use, types of columns could be different in actual SQL queries. We use H2 database in our examples.
+
+## Constraints
+
+### Nullable
+
+The `NOT NULL` SQL constraint restricts the column to accept the `null` value. By default, Exposed applies this constraint to
+all the columns. To allow the column to be nullable, apply the `nullable()` method to a definition of an appropriate column.
+
+For example, to make the population column `nullable`, use the following code:
+```kotlin
+// SQL: POPULATION INT NULL
+val population: Column = integer("population").nullable()
+```
+
+### Default
+
+The `DEFAULT` SQL constraint provides the default value for the column. Exposed supports three methods for configuring
+default values:
+
+* `default(defaultValue: T)` accepts a value with a type of the column.
+* `defaultExpression(defaultValue: Expression)` accepts an expression.
+* `clientDefault(defaultValue: () -> T)` accepts a function.
+
+For example, to configure the default value for the `name` column, use the following code:
+```kotlin
+// SQL: "NAME" VARCHAR(50) DEFAULT 'Unknown'
+val name: Column = varchar("name", 50).default("Unknown")
+```
+
+### Index
+
+The `INDEX` SQL constraint makes traversing through tables quicker. Exposed supports the `index()` method.
+It has six parameters, most of which are optional:
+
+* `val customIndexName: String? = null` is a custom name for the index, which will be used in actual SQL queries.
+* `val unique: Boolean` defines whether the index is unique or not.
+* `val columns: List>` defines a column set.
+* `val functions: List>? = null` defines functional key parts.
+* `val indexType: String? = null` is a custom type. Can be `"BTREE"` or `"HASH"`.
+* `val filterCondition: (SqlExpressionBuilder.() -> Op)? = null` defines a condition used to create a partial index.
+
+The simplest way to create an index is to use an extension function directly on a column. For example, to apply a non-unique
+`INDEX` constraint to the `name` column, use the following code:
+```kotlin
+val name = varchar("name", 50).index()
+```
+If the parameter `customIndexName` is not set, the name of the index is determined by the table and column names.
+
+Also, Exposed supports complex indexes. If you have a frequent query for two columns, Exposed can perform it more efficiently.
+It creates a tree from the first column with the references to the second one. For example, to create a non-unique complex
+index on the `name` and `population` columns, paste the following code:
+```kotlin
+val indexName = index("indexName", false, *arrayOf(name, population))
+// or inside an init block within the table object
+init {
+ index("indexName", isUnique = false, name, population)
+}
+```
+
+Exposed also supports creating an index with a custom type. For example, to retrieve data from the `name` column faster
+with a hash function for traversing, use the following code:
+```kotlin
+val indexName = index("indexName", false, *arrayOf(name), indexType = "HASH")
+```
+
+Some databases support functional key parts that index expressions instead of columns directly:
+```kotlin
+init {
+ index(functions = listOf(name.lowerCase(), address.substring(1, 5)))
+ uniqueIndex(columns = arrayOf(name), functions = listOf(Coalesce(address, stringLiteral("*"))))
+}
+```
+Operator expressions, like `plus()`, are also accepted by the `functions` parameter.
+
+Some databases support creating a partial index by defining a filter expression to improve querying performance. The
+created index will only contain entries for the table rows that match this predicate:
+```kotlin
+init {
+ index(columns = arrayOf(name, flag)) { flag eq true }
+ index(columns = arrayOf(name, population)) { (name like "A%") and (population greaterEq 10) }
+}
+```
+
+Once a table has been created, the list of its indices can be accessed using the property `Table.indices`. Table indices
+are represented by the data class `Index`, so its properties can be checked in the following manner, for example:
+```kotlin
+Table.indices.map { it.indexName to it.createStatement().first() }
+```
+
+
+An instance of the `Index` data class can be created directly using its public constructor, for the purpose of
+evaluating or using create/modify/drop statements, for example. Doing so will not add the instance to an existing table's
+list of indices in the way that using `index()` would. Also, if an instance is created with arguments provided to the
+`functions` parameter, a `functionsTable` argument must also be provided.
+
+
+### Unique
+
+The `UNIQUE` SQL constraint restricts duplicates within this column. Exposed supports the `uniqueIndex()` method which
+creates a unique index for the column. This method is the composition of `UNIQUE` and `INDEX` constraint, the quicker
+modification of `UNIQUE` constraint.
+
+For example, to apply `UNIQUE` and `INDEX` constraint to the `name` column, use the following code:
+```kotlin
+val name = varchar("name", 50).uniqueIndex()
+```
+
+### Primary Key
+
+The `PRIMARY KEY` SQL constraint applied to columns means each value in a column identifies the row. It's the composition
+of `NOT NULL` and `UNIQUE` constraints. Each kind of table in Exposed, inherited from `IdTable()`, has the `primaryKey`
+field. For example, the `IntIdTable` has default integer `id` primary key. If you want to change column set, add columns,
+or change primary key name to a custom one, you need to override this field of the appropriate table class.
+
+For example, if you want to define the `name` column as a primary key, use the following code. The "Cities_name" string
+will be used in actual SQL query.
+```kotlin
+// SQL: CONSTRAINT Cities_name PRIMARY KEY ("NAME")
+override val primaryKey = PrimaryKey(name, name = "Cities_name")
+```
+
+### Foreign Key
+
+The `FOREIGN KEY` SQL constraint links two tables. Foreign key is a column from one table that refers to the primary key
+or columns with a unique index from another table. To configure the foreign key, use `reference()` or `optReference()`
+method. The second one let the foreign key accept the `null` value.
+
+`reference()` and `optReference()` methods have several parameters:
+
+* `name: String` is a name for foreign key column, which will be used in actual SQL queries.
+* `ref: Column` is a target column from another parent table.
+* `onDelete: ReferenceOption? = null` is an action to the case when linked row from a parent table can be deleted.
+* `onUpdate: ReferenceOption? = null` is an action to the case when value in a referenced column can be changed.
+* `fkName: String? = null` is a foreign key constraint name.
+
+Enum class `ReferenceOption` has four values:
+
+* `RESTRICT` is an option that restricts changes on a referenced column, and the default option for MySQL dialect.
+* `NO_ACTION` is the same as RESTRICT, and the default option for Oracle and SQL Server dialects.
+* `CASCADE` is an option that allows updating or deleting the referring rows.
+* `SET_NULL` is an option that sets the referring column values to null.
+* `SET_DEFAULT` is an option that sets the referring column values to the default value.
+
+Consider the following `Citizens` table. This table has the `name` and `city` columns. Since the `Cities` table has
+configured `name` primary key, the `Citizens` table can refer to it by its `city` column, which is a foreign key. To
+configure such reference and make it nullable, use the `optReference()` method:
+```kotlin
+object Citizens : IntIdTable() {
+ val name = varchar("name", 50)
+ val city = optReference("city", Cities.name, onDelete=ReferenceOption.CASCADE)
+}
+```
+
+If any `Cities` row will be deleted, the appropriate `Citizens` row will be deleted too.
+
+### Check
+
+The `CHECK` SQL constraint checks that all values in a column match some condition. Exposed supports the `check()` method.
+You apply this method to a column and pass the appropriate condition to it.
+
+For example, to check that the `name` column contains strings that begin with a capital letter, use the following code:
+```kotlin
+// SQL: CONSTRAINT check_Cities_0 CHECK (REGEXP_LIKE("NAME", '^[A-Z].*', 'c')))
+val name = varchar("name", 50).check { it regexp "^[A-Z].*" }
+```
+
+Some databases, like older MySQL versions, may not support `CHECK` constraints. For more information, consult the relevant documentation.
diff --git a/documentation-website/Writerside/topics/Tutorials-and-Samples.md b/documentation-website/Writerside/topics/Tutorials-and-Samples.md
new file mode 100644
index 0000000000..aef50b7579
--- /dev/null
+++ b/documentation-website/Writerside/topics/Tutorials-and-Samples.md
@@ -0,0 +1,7 @@
+# Tutorials and Samples
+
+This section will demonstrate how to get started with Exposed.
+
+[Getting Started](Getting-Started.md)
+
+[Samples](Samples.md)
diff --git a/documentation-website/Writerside/topics/Working-with-DataSource.md b/documentation-website/Writerside/topics/Working-with-DataSource.md
new file mode 100644
index 0000000000..58bdb4bfe1
--- /dev/null
+++ b/documentation-website/Writerside/topics/Working-with-DataSource.md
@@ -0,0 +1,31 @@
+# Working with DataSource
+
+It is also possible to provide a `javax.sql.DataSource` to the `Database.connect` function. This allows you to use more advanced features like
+connection pooling, and lets you set configuration options like maximum number of connections, connection timeouts, etc.
+
+```kotlin
+val db = Database.connect(dataSource)
+```
+
+## MariaDB/MySQL with latest JDBC driver + Hikari pooling
+
+Add dependency:
+
+```kotlin
+implementation("mysql:mysql-connector-java:8.0.19")
+implementation("com.zaxxer:HikariCP:3.4.2")
+```
+
+Connect to database:
+
+```kotlin
+val config = HikariConfig().apply {
+ jdbcUrl = "jdbc:mysql://localhost/dbname"
+ driverClassName = "com.mysql.cj.jdbc.Driver"
+ username = "user"
+ password = "password"
+ maximumPoolSize = 10
+}
+val dataSource = HikariDataSource(config)
+Database.connect(dataSource)
+```
diff --git a/documentation-website/Writerside/topics/Working-with-Database.md b/documentation-website/Writerside/topics/Working-with-Database.md
new file mode 100644
index 0000000000..16c8d8a1e2
--- /dev/null
+++ b/documentation-website/Writerside/topics/Working-with-Database.md
@@ -0,0 +1,181 @@
+# Working with Database
+
+In Exposed, the `Database` class represents a database instance, and encapsulates the necessary connection
+details and configuration required to interact with a specific database.
+
+## Connecting to a Database
+
+To connect to a database using `Database`, you need to provide the appropriate JDBC driver and connection URL. Here's an example of how to establish a
+connection:
+
+```kotlin
+val db = Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver")
+```
+
+The `Database.connect` function tells Exposed _how_ to connect to a database, but won't _create_ a database connection. It only provides a
+descriptor for future usage. A connection will be created later by calling the `transaction` lambda (see [Transaction](Working-with-Transaction.md) for more
+details).
+
+
+Starting from Exposed 0.10, executing this code more than once per database will create leaks in your application; hence, it is recommended to
+ store it for later use.
+
+
+Creating a database only when it is accessed for the first time can be done like this:
+
+```kotlin
+object DbSettings {
+ val db by lazy {
+ Database.connect(/* setup connection */)
+ }
+}
+```
+
+### H2
+
+In order to use H2, you need to add the H2 driver dependency:
+
+```kotlin
+implementation("com.h2database:h2:2.1.214")
+```
+
+Then connect to a database:
+
+```kotlin
+Database.connect("jdbc:h2:./myh2file", "org.h2.Driver")
+```
+
+Or in-memory database:
+
+```kotlin
+Database.connect("jdbc:h2:mem:regular", "org.h2.Driver")
+```
+
+By default, H2 closes the database when the last connection is closed. If you want to keep the database open, you can use the `DB_CLOSE_DELAY=-1`
+option:
+
+```kotlin
+Database.connect("jdbc:h2:mem:regular;DB_CLOSE_DELAY=-1;", "org.h2.Driver")
+```
+
+### MariaDB/MySQL
+
+Add dependency:
+
+```kotlin
+implementation("mysql:mysql-connector-java:8.0.2")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect(
+ "jdbc:mysql://localhost:3306/test",
+ driver = "com.mysql.cj.jdbc.Driver",
+ user = "user",
+ password = "password"
+)
+```
+
+### Oracle
+
+Add dependency:
+
+```kotlin
+implementation("com.oracle.database.jdbc:ojdbc8:12.2.0.1")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect(
+ "jdbc:oracle:thin:@//localhost:1521/test",
+ driver = "oracle.jdbc.OracleDriver",
+ user = "user",
+ password = "password"
+)
+```
+
+### PostgreSQL
+
+Add dependency:
+
+```kotlin
+implementation("org.postgresql:postgresql:42.2.2")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect(
+ "jdbc:postgresql://localhost:12346/test",
+ driver = "org.postgresql.Driver",
+ user = "user",
+ password = "password"
+)
+```
+
+### PostgreSQL using the pgjdbc-ng JDBC driver
+
+Add dependency:
+
+```kotlin
+implementation("com.impossibl.pgjdbc-ng", "pgjdbc-ng", "0.8.3")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect(
+ "jdbc:pgsql://localhost:12346/test",
+ driver = "com.impossibl.postgres.jdbc.PGDriver",
+ user = "user",
+ password = "password"
+)
+```
+
+### SQL Server
+
+Add dependency:
+
+```kotlin
+implementation("com.microsoft.sqlserver:mssql-jdbc:6.4.0.jre7")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect(
+ "jdbc:sqlserver://localhost:32768;databaseName=test",
+ "com.microsoft.sqlserver.jdbc.SQLServerDriver",
+ user = "user",
+ password = "password"
+)
+```
+
+### SQLite
+
+Add the dependency:
+
+```kotlin
+implementation("org.xerial:sqlite-jdbc:3.30.1")
+```
+
+Connect to database:
+
+```kotlin
+Database.connect("jdbc:sqlite:/data/data.db", "org.sqlite.JDBC")
+```
+
+Or in-memory database:
+
+```kotlin
+Database.connect("jdbc:sqlite:file:test?mode=memory&cache=shared", "org.sqlite.JDBC")
+```
+
+For both: set SQLite compatible isolation level: [FAQ](Frequently-Asked-Questions.md).
+
+```kotlin
+TransactionManager.manager.defaultIsolationLevel = Connection.TRANSACTION_SERIALIZABLE
+// or Connection.TRANSACTION_READ_UNCOMMITTED
+```
diff --git a/documentation-website/Writerside/topics/Working-with-Transaction.md b/documentation-website/Writerside/topics/Working-with-Transaction.md
new file mode 100644
index 0000000000..a294bcbc2c
--- /dev/null
+++ b/documentation-website/Writerside/topics/Working-with-Transaction.md
@@ -0,0 +1,140 @@
+# Working with Transaction
+
+## Overview
+
+CRUD operations in Exposed must be called from within a _transaction._ Transactions encapsulate a set of DSL operations. To create and execute a
+transaction with default parameters, simply pass a function block to the `transaction` function:
+
+```kotlin
+transaction {
+ // DSL/DAO operations go here
+}
+```
+
+Transactions are executed synchronously on the current thread, so they _will block_ other parts of your application! If you need to execute a
+transaction asynchronously, consider running it on a [separate thread](Asynchronous-Support.md).
+
+### Accessing returned values
+
+Although you can modify variables from your code within the `transaction` block, `transaction` supports returning a value directly, enabling
+immutability:
+
+```kotlin
+val jamesList = transaction {
+ Users.select { Users.firstName eq "James" }.toList()
+}
+// jamesList is now a List containing Users data
+```
+
+
+`Blob` and `text` fields won't be available outside of a transaction if you don't load them directly. For `text` fields you can also use
+the `eagerLoading` param when defining the Table to make the text fields available outside of the transaction.
+
+
+```kotlin
+// without eagerLoading
+val idsAndContent = transaction {
+ Documents.selectAll().limit(10).map { it[Documents.id] to it[Documents.content] }
+}
+
+// with eagerLoading for text fields
+object Documents : Table() {
+ val content = text("content", eagerLoading = true)
+}
+
+val documentsWithContent = transaction {
+ Documents.selectAll().limit(10)
+}
+```
+
+### Working with multiple databases
+
+If you want to work with different databases, you have to store the database reference returned by `Database.connect()` and provide it
+to `transaction` function as the first parameter. The `transaction` block without parameters will work with the latest connected database.
+
+```kotlin
+val db1 = connect("jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;", "org.h2.Driver", "root", "")
+val db2 = connect("jdbc:h2:mem:db2;DB_CLOSE_DELAY=-1;", "org.h2.Driver", "root", "")
+transaction(db1) {
+ val result = transaction(db2) {
+ Table1.select { }.map { it[Table1.name] }
+ }
+
+ val count = Table2.select { Table2.name inList result }.count()
+}
+```
+
+Entities (see [DAO](Deep-Dive-into-DAO.md) page) _stick_ to the transaction that was used to load that entity. That means that all changes persist to the same
+database and cross-database references are prohibited and will throw exceptions.
+
+### Setting default database
+
+The `transaction` block without parameters will use the default database.
+Before 0.10.1, this will be the latest _connected_ database.
+It is also possible to set the default database explicitly.
+
+```kotlin
+val db = Database.connect()
+TransactionManager.defaultDatabase = db
+```
+
+### Using nested transactions
+
+Since Exposed 0.16.1, it is possible to use nested transactions. To enable this feature, you should set `useNestedTransactions` on the desired `Database`
+instance to `true`.
+
+After that, any exception that happens within the `transaction` block will not rollback the whole transaction but only the code inside the
+current `transaction`.
+Exposed uses SQL `SAVEPOINT` functionality to mark the current transaction at the beginning of the `transaction` block and release it on exit from it.
+
+Using `SAVEPOINT` could affect performance, so please read the documentation of the DBMS you use for more details.
+
+```kotlin
+val db = Database.connect()
+db.useNestedTransactions = true
+
+transaction {
+ FooTable.insert { it[id] = 1 }
+
+ var idToInsert = 0
+ transaction { // nested transaction
+ idToInsert ++
+ // On the first insert it will fail with unique constraint exception and will rollback to the `nested transaction` and then insert a new record with id = 2
+ FooTable.insert { it[id] = idToInsert }
+ }
+}
+```
+
+### Advanced parameters and usage
+
+For specific functionality, transactions can be created with additional parameters: `transactionIsolation` and `db`.
+The following properties can be set inside the `transaction` lambda:
+
+* `repetitionAttempts`: The number of retries that will be made inside this `transaction` block if SQLException happens
+* `minRepetitionDelay`: The minimum number of milliseconds to wait before retrying this `transaction` if SQLException happens
+* `maxRepetitionDelay`: The maximum number of milliseconds to wait before retrying this `transaction` if SQLException happens
+
+```kotlin
+transaction(Connection.TRANSACTION_SERIALIZABLE, db) {
+ repetitionAttempts = 2
+ // DSL/DAO operations go here
+}
+```
+
+**Transaction Isolation**: This parameter, defined in the SQL standard, specifies what is supposed to happen when multiple transactions execute
+concurrently on the database. This value does NOT affect Exposed operations directly, but is sent to the database, where it is expected to be obeyed.
+Allowable values are defined in `java.sql.Connection` and are as follows:
+
+* **TRANSACTION_NONE**: Transactions are not supported.
+* **TRANSACTION_READ_UNCOMMITTED**: The most lenient setting. Allows uncommitted changes from one transaction to affect a read in another
+ transaction (a "dirty read").
+* **TRANSACTION_READ_COMMITTED**: This setting prevents dirty reads from occurring, but still allows non-repeatable reads to occur. A _non-repeatable
+ read_ is when a transaction ("Transaction A") reads a row from the database, another transaction ("Transaction B") changes the row, and Transaction
+ A reads the row again, resulting in an inconsistency.
+* **TRANSACTION_REPEATABLE_READ**: The default setting for Exposed transactions. Prevents both dirty and non-repeatable reads, but still allows for
+ phantom reads. A _phantom read_ is when a transaction ("Transaction A") selects a list of rows through a `WHERE` clause, another transaction ("
+ Transaction B") performs an `INSERT` or `DELETE` with a row that satisfies Transaction A's `WHERE` clause, and Transaction A selects using the same
+ WHERE clause again, resulting in an inconsistency.
+* **TRANSACTION_SERIALIZABLE**: The strictest setting. Prevents dirty reads, non-repeatable reads, and phantom reads.
+
+**db** parameter is optional and used to select the database where the transaction should be settled (see section above).
diff --git a/documentation-website/Writerside/v.list b/documentation-website/Writerside/v.list
new file mode 100644
index 0000000000..bdf1b0e432
--- /dev/null
+++ b/documentation-website/Writerside/v.list
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/exposed-bom/README.md b/exposed-bom/README.md
index b910f1a233..42765d8d9b 100644
--- a/exposed-bom/README.md
+++ b/exposed-bom/README.md
@@ -17,7 +17,7 @@ Bill of Materials for all Exposed modules
org.jetbrains.exposedexposed-bom
- 0.41.1
+ 0.44.0pomimport
@@ -46,12 +46,12 @@ Bill of Materials for all Exposed modules
# Gradle
```kotlin
repositories {
- // Versions after 0.33.1
- mavenCentral()
+ // Versions after 0.33.1
+ mavenCentral()
}
dependencies {
- implementation(platform("org.jetbrains.exposed:exposed-bom:0.41.1"))
+ implementation(platform("org.jetbrains.exposed:exposed-bom:0.44.0"))
implementation("org.jetbrains.exposed", "exposed-core")
implementation("org.jetbrains.exposed", "exposed-dao")
implementation("org.jetbrains.exposed", "exposed-jdbc")
diff --git a/exposed-bom/build.gradle.kts b/exposed-bom/build.gradle.kts
index 8d75683368..f9e78b7d65 100644
--- a/exposed-bom/build.gradle.kts
+++ b/exposed-bom/build.gradle.kts
@@ -31,8 +31,13 @@ dependencies {
}
publishing {
+ val version: String by rootProject
+
publications {
create("bom") {
+ groupId = "org.jetbrains.exposed"
+ artifactId = project.name
+ this.version = version
from(components.getByName("javaPlatform"))
pom {
configureMavenCentralMetadata(project)
@@ -40,4 +45,18 @@ publishing {
signPublicationIfKeyPresent(project)
}
}
+
+ val publishingUsername: String? = System.getenv("PUBLISHING_USERNAME")
+ val publishingPassword: String? = System.getenv("PUBLISHING_PASSWORD")
+
+ repositories {
+ maven {
+ name = "Exposed"
+ url = uri("https://maven.pkg.jetbrains.space/public/p/exposed/release")
+ credentials {
+ username = publishingUsername
+ password = publishingPassword
+ }
+ }
+ }
}
diff --git a/exposed-core/api/exposed-core.api b/exposed-core/api/exposed-core.api
new file mode 100644
index 0000000000..8523674d6f
--- /dev/null
+++ b/exposed-core/api/exposed-core.api
@@ -0,0 +1,3609 @@
+public class org/jetbrains/exposed/dao/id/EntityID : java/lang/Comparable {
+ public fun (Ljava/lang/Comparable;Lorg/jetbrains/exposed/dao/id/IdTable;)V
+ protected fun (Lorg/jetbrains/exposed/dao/id/IdTable;Ljava/lang/Comparable;)V
+ public synthetic fun compareTo (Ljava/lang/Object;)I
+ public fun compareTo (Lorg/jetbrains/exposed/dao/id/EntityID;)I
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getTable ()Lorg/jetbrains/exposed/dao/id/IdTable;
+ public final fun getValue ()Ljava/lang/Comparable;
+ public final fun get_value ()Ljava/lang/Object;
+ public fun hashCode ()I
+ protected fun invokeOnNoValue ()V
+ public final fun set_value (Ljava/lang/Object;)V
+ public fun toString ()Ljava/lang/String;
+}
+
+public abstract interface class org/jetbrains/exposed/dao/id/EntityIDFactory {
+ public abstract fun createEntityID (Ljava/lang/Comparable;Lorg/jetbrains/exposed/dao/id/IdTable;)Lorg/jetbrains/exposed/dao/id/EntityID;
+}
+
+public final class org/jetbrains/exposed/dao/id/EntityIDFunctionProvider {
+ public static final field INSTANCE Lorg/jetbrains/exposed/dao/id/EntityIDFunctionProvider;
+ public final fun createEntityID (Ljava/lang/Comparable;Lorg/jetbrains/exposed/dao/id/IdTable;)Lorg/jetbrains/exposed/dao/id/EntityID;
+}
+
+public abstract class org/jetbrains/exposed/dao/id/IdTable : org/jetbrains/exposed/sql/Table {
+ public fun ()V
+ public fun (Ljava/lang/String;)V
+ public synthetic fun (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public abstract fun getId ()Lorg/jetbrains/exposed/sql/Column;
+}
+
+public class org/jetbrains/exposed/dao/id/IntIdTable : org/jetbrains/exposed/dao/id/IdTable {
+ public fun ()V
+ public fun (Ljava/lang/String;Ljava/lang/String;)V
+ public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getId ()Lorg/jetbrains/exposed/sql/Column;
+ public final fun getPrimaryKey ()Lorg/jetbrains/exposed/sql/Table$PrimaryKey;
+}
+
+public class org/jetbrains/exposed/dao/id/LongIdTable : org/jetbrains/exposed/dao/id/IdTable {
+ public fun ()V
+ public fun (Ljava/lang/String;Ljava/lang/String;)V
+ public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getId ()Lorg/jetbrains/exposed/sql/Column;
+ public final fun getPrimaryKey ()Lorg/jetbrains/exposed/sql/Table$PrimaryKey;
+}
+
+public class org/jetbrains/exposed/dao/id/UUIDTable : org/jetbrains/exposed/dao/id/IdTable {
+ public fun ()V
+ public fun (Ljava/lang/String;Ljava/lang/String;)V
+ public synthetic fun (Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getId ()Lorg/jetbrains/exposed/sql/Column;
+ public final fun getPrimaryKey ()Lorg/jetbrains/exposed/sql/Table$PrimaryKey;
+}
+
+public final class org/jetbrains/exposed/exceptions/DuplicateColumnException : java/lang/ExceptionInInitializerError {
+ public fun (Ljava/lang/String;Ljava/lang/String;)V
+}
+
+public final class org/jetbrains/exposed/exceptions/ExposedSQLException : java/sql/SQLException {
+ public fun (Ljava/lang/Throwable;Ljava/util/List;Lorg/jetbrains/exposed/sql/Transaction;)V
+ public final fun causedByQueries ()Ljava/util/List;
+ public final fun getContexts ()Ljava/util/List;
+ public fun getErrorCode ()I
+ public fun getSQLState ()Ljava/lang/String;
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/exceptions/LongQueryException : java/lang/RuntimeException {
+ public fun ()V
+}
+
+public final class org/jetbrains/exposed/exceptions/UnsupportedByDialectException : java/lang/UnsupportedOperationException {
+ public fun (Ljava/lang/String;Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;)V
+ public final fun getDialect ()Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;
+}
+
+public abstract class org/jetbrains/exposed/sql/AbstractQuery : org/jetbrains/exposed/sql/statements/Statement, org/jetbrains/exposed/sql/SizedIterable {
+ public static final field Companion Lorg/jetbrains/exposed/sql/AbstractQuery$Companion;
+ public fun (Ljava/util/List;)V
+ public synthetic fun arguments ()Ljava/lang/Iterable;
+ public fun arguments ()Ljava/util/List;
+ protected final fun copyTo (Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+ public final fun fetchSize (I)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public fun forUpdate (Lorg/jetbrains/exposed/sql/vendors/ForUpdateOption;)Lorg/jetbrains/exposed/sql/SizedIterable;
+ protected final fun getCount ()Z
+ public final fun getFetchSize ()Ljava/lang/Integer;
+ public final fun getLimit ()Ljava/lang/Integer;
+ public final fun getOffset ()J
+ public final fun getOrderByExpressions ()Ljava/util/List;
+ protected abstract fun getQueryToExecute ()Lorg/jetbrains/exposed/sql/statements/Statement;
+ public abstract fun getSet ()Lorg/jetbrains/exposed/sql/FieldSet;
+ protected final fun getTransaction ()Lorg/jetbrains/exposed/sql/Transaction;
+ public fun iterator ()Ljava/util/Iterator;
+ public fun limit (IJ)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public synthetic fun limit (IJ)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun notForUpdate ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public final fun orderBy (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/SortOrder;)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public fun orderBy ([Lkotlin/Pair;)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public synthetic fun orderBy ([Lkotlin/Pair;)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public static synthetic fun orderBy$default (Lorg/jetbrains/exposed/sql/AbstractQuery;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/SortOrder;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public abstract fun prepareSQL (Lorg/jetbrains/exposed/sql/QueryBuilder;)Ljava/lang/String;
+ public fun prepareSQL (Lorg/jetbrains/exposed/sql/Transaction;Z)Ljava/lang/String;
+ protected final fun setCount (Z)V
+ protected final fun setLimit (Ljava/lang/Integer;)V
+ public abstract fun withDistinct (Z)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public static synthetic fun withDistinct$default (Lorg/jetbrains/exposed/sql/AbstractQuery;ZILjava/lang/Object;)Lorg/jetbrains/exposed/sql/AbstractQuery;
+}
+
+public final class org/jetbrains/exposed/sql/AbstractQuery$Companion {
+}
+
+public final class org/jetbrains/exposed/sql/Alias : org/jetbrains/exposed/sql/Table {
+ public fun (Lorg/jetbrains/exposed/sql/Table;Ljava/lang/String;)V
+ public fun createStatement ()Ljava/lang/Void;
+ public synthetic fun createStatement ()Ljava/util/List;
+ public fun dropStatement ()Ljava/lang/Void;
+ public synthetic fun dropStatement ()Ljava/util/List;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun get (Lorg/jetbrains/exposed/sql/Column;)Lorg/jetbrains/exposed/sql/Column;
+ public final fun getAlias ()Ljava/lang/String;
+ public fun getColumns ()Ljava/util/List;
+ public final fun getDelegate ()Lorg/jetbrains/exposed/sql/Table;
+ public fun getFields ()Ljava/util/List;
+ public fun getTableName ()Ljava/lang/String;
+ public final fun getTableNameWithAlias ()Ljava/lang/String;
+ public fun hashCode ()I
+ public fun modifyStatement ()Ljava/lang/Void;
+ public synthetic fun modifyStatement ()Ljava/util/List;
+ public final fun originalColumn (Lorg/jetbrains/exposed/sql/Column;)Lorg/jetbrains/exposed/sql/Column;
+}
+
+public final class org/jetbrains/exposed/sql/AliasKt {
+ public static final fun alias (Lorg/jetbrains/exposed/sql/AbstractQuery;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/QueryAlias;
+ public static final fun alias (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/ExpressionAlias;
+ public static final fun alias (Lorg/jetbrains/exposed/sql/Table;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/Alias;
+ public static final fun getLastQueryAlias (Lorg/jetbrains/exposed/sql/Join;)Lorg/jetbrains/exposed/sql/QueryAlias;
+ public static final fun joinQuery (Lorg/jetbrains/exposed/sql/Join;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/exposed/sql/JoinType;Lkotlin/jvm/functions/Function0;)Lorg/jetbrains/exposed/sql/Join;
+ public static final fun joinQuery (Lorg/jetbrains/exposed/sql/Table;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/exposed/sql/JoinType;Lkotlin/jvm/functions/Function0;)Lorg/jetbrains/exposed/sql/Join;
+ public static synthetic fun joinQuery$default (Lorg/jetbrains/exposed/sql/Join;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/exposed/sql/JoinType;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Join;
+ public static synthetic fun joinQuery$default (Lorg/jetbrains/exposed/sql/Table;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/exposed/sql/JoinType;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Join;
+ public static final fun wrapAsExpression (Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/Expression;
+}
+
+public final class org/jetbrains/exposed/sql/AndBitOp : org/jetbrains/exposed/sql/ExpressionWithColumnType {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/IColumnType;)V
+ public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+ public final fun getExpr1 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getExpr2 ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/AndOp : org/jetbrains/exposed/sql/CompoundBooleanOp {
+ public fun (Ljava/util/List;)V
+}
+
+public final class org/jetbrains/exposed/sql/AutoIncColumnType : org/jetbrains/exposed/sql/IColumnType {
+ public fun (Lorg/jetbrains/exposed/sql/ColumnType;Ljava/lang/String;Ljava/lang/String;)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getAutoincSeq ()Ljava/lang/String;
+ public final fun getDelegate ()Lorg/jetbrains/exposed/sql/ColumnType;
+ public final fun getNextValExpression ()Lorg/jetbrains/exposed/sql/NextVal;
+ public fun getNullable ()Z
+ public fun hashCode ()I
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun setNullable (Z)V
+ public fun setParameter (Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;ILjava/lang/Object;)V
+ public fun sqlType ()Ljava/lang/String;
+ public fun validateValueBeforeUpdate (Ljava/lang/Object;)V
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueToString (Ljava/lang/Object;)Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/Avg : org/jetbrains/exposed/sql/Function, org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;I)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public class org/jetbrains/exposed/sql/BasicBinaryColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/Between : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getFrom ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getTo ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public abstract class org/jetbrains/exposed/sql/BiCompositeColumn : org/jetbrains/exposed/sql/CompositeColumn {
+ public fun (Lorg/jetbrains/exposed/sql/Column;Lorg/jetbrains/exposed/sql/Column;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;)V
+ protected final fun getColumn1 ()Lorg/jetbrains/exposed/sql/Column;
+ protected final fun getColumn2 ()Lorg/jetbrains/exposed/sql/Column;
+ public fun getRealColumns ()Ljava/util/List;
+ public fun getRealColumnsWithValues (Ljava/lang/Object;)Ljava/util/Map;
+ public final fun getTransformFromValue ()Lkotlin/jvm/functions/Function1;
+ public final fun getTransformToValue ()Lkotlin/jvm/functions/Function2;
+ public fun restoreValueFromParts (Ljava/util/Map;)Ljava/lang/Object;
+}
+
+public class org/jetbrains/exposed/sql/BinaryColumnType : org/jetbrains/exposed/sql/BasicBinaryColumnType {
+ public fun (I)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getLength ()I
+ public fun hashCode ()I
+ public fun sqlType ()Ljava/lang/String;
+ public fun validateValueBeforeUpdate (Ljava/lang/Object;)V
+}
+
+public final class org/jetbrains/exposed/sql/BlobColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public synthetic fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun readObject (Ljava/sql/ResultSet;I)Lorg/jetbrains/exposed/sql/statements/api/ExposedBlob;
+ public fun setParameter (Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;ILjava/lang/Object;)V
+ public fun sqlType ()Ljava/lang/String;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueFromDB (Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/statements/api/ExposedBlob;
+}
+
+public final class org/jetbrains/exposed/sql/BooleanColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public static final field Companion Lorg/jetbrains/exposed/sql/BooleanColumnType$Companion;
+ public fun ()V
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Boolean;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/BooleanColumnType$Companion {
+}
+
+public final class org/jetbrains/exposed/sql/ByteColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Byte;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/Case {
+ public fun ()V
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/Expression;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun When (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/CaseWhen;
+ public final fun getValue ()Lorg/jetbrains/exposed/sql/Expression;
+}
+
+public final class org/jetbrains/exposed/sql/CaseWhen {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun Else (Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public final fun When (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/CaseWhen;
+ public final fun getCases ()Ljava/util/List;
+ public final fun getValue ()Lorg/jetbrains/exposed/sql/Expression;
+}
+
+public final class org/jetbrains/exposed/sql/CaseWhenElse : org/jetbrains/exposed/sql/ExpressionWithColumnType, org/jetbrains/exposed/sql/ComplexExpression {
+ public fun (Lorg/jetbrains/exposed/sql/CaseWhen;Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getCaseWhen ()Lorg/jetbrains/exposed/sql/CaseWhen;
+ public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+ public final fun getElseResult ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Cast : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/IColumnType;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public class org/jetbrains/exposed/sql/CharColumnType : org/jetbrains/exposed/sql/StringColumnType {
+ public fun ()V
+ public fun (ILjava/lang/String;)V
+ public synthetic fun (ILjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getColLength ()I
+ public fun hashCode ()I
+ public fun sqlType ()Ljava/lang/String;
+ public fun validateValueBeforeUpdate (Ljava/lang/Object;)V
+}
+
+public final class org/jetbrains/exposed/sql/CharLength : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/CharacterColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Character;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/CheckConstraint : org/jetbrains/exposed/sql/DdlAware {
+ public static final field Companion Lorg/jetbrains/exposed/sql/CheckConstraint$Companion;
+ public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+ public final fun component1 ()Ljava/lang/String;
+ public final fun component2 ()Ljava/lang/String;
+ public final fun component3 ()Ljava/lang/String;
+ public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/CheckConstraint;
+ public static synthetic fun copy$default (Lorg/jetbrains/exposed/sql/CheckConstraint;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/CheckConstraint;
+ public fun createStatement ()Ljava/util/List;
+ public fun dropStatement ()Ljava/util/List;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getCheckName ()Ljava/lang/String;
+ public final fun getCheckOp ()Ljava/lang/String;
+ public final fun getTableName ()Ljava/lang/String;
+ public fun hashCode ()I
+ public fun modifyStatement ()Ljava/util/List;
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/CheckConstraint$Companion {
+}
+
+public final class org/jetbrains/exposed/sql/Coalesce : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;[Lorg/jetbrains/exposed/sql/Expression;)V
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Column : org/jetbrains/exposed/sql/ExpressionWithColumnType, java/lang/Comparable, org/jetbrains/exposed/sql/DdlAware {
+ public fun (Lorg/jetbrains/exposed/sql/Table;Ljava/lang/String;Lorg/jetbrains/exposed/sql/IColumnType;)V
+ public synthetic fun compareTo (Ljava/lang/Object;)I
+ public fun compareTo (Lorg/jetbrains/exposed/sql/Column;)I
+ public fun createStatement ()Ljava/util/List;
+ public final fun defaultValueInDb ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun descriptionDdl (Z)Ljava/lang/String;
+ public static synthetic fun descriptionDdl$default (Lorg/jetbrains/exposed/sql/Column;ZILjava/lang/Object;)Ljava/lang/String;
+ public fun dropStatement ()Ljava/util/List;
+ public fun equals (Ljava/lang/Object;)Z
+ public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+ public final fun getDdl ()Ljava/util/List;
+ public final fun getDefaultValueFun ()Lkotlin/jvm/functions/Function0;
+ public final fun getForeignKey ()Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;
+ public final fun getName ()Ljava/lang/String;
+ public final fun getReferee ()Lorg/jetbrains/exposed/sql/Column;
+ public final fun getTable ()Lorg/jetbrains/exposed/sql/Table;
+ public fun hashCode ()I
+ public fun modifyStatement ()Ljava/util/List;
+ public final fun modifyStatements (Lorg/jetbrains/exposed/sql/ColumnDiff;)Ljava/util/List;
+ public final fun nameInDatabaseCase ()Ljava/lang/String;
+ public final fun nameUnquoted ()Ljava/lang/String;
+ public final fun referee ()Lorg/jetbrains/exposed/sql/Column;
+ public final fun setDefaultValueFun (Lkotlin/jvm/functions/Function0;)V
+ public final fun setForeignKey (Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;)V
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+ public fun toString ()Ljava/lang/String;
+ public final fun withColumnType (Lorg/jetbrains/exposed/sql/IColumnType;)Lorg/jetbrains/exposed/sql/Column;
+}
+
+public final class org/jetbrains/exposed/sql/ColumnDiff {
+ public static final field Companion Lorg/jetbrains/exposed/sql/ColumnDiff$Companion;
+ public fun (ZZZZ)V
+ public final fun component1 ()Z
+ public final fun component2 ()Z
+ public final fun component3 ()Z
+ public final fun component4 ()Z
+ public final fun copy (ZZZZ)Lorg/jetbrains/exposed/sql/ColumnDiff;
+ public static synthetic fun copy$default (Lorg/jetbrains/exposed/sql/ColumnDiff;ZZZZILjava/lang/Object;)Lorg/jetbrains/exposed/sql/ColumnDiff;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getAutoInc ()Z
+ public final fun getCaseSensitiveName ()Z
+ public final fun getDefaults ()Z
+ public final fun getNullability ()Z
+ public final fun hasDifferences ()Z
+ public fun hashCode ()I
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/ColumnDiff$Companion {
+ public final fun getAllChanged ()Lorg/jetbrains/exposed/sql/ColumnDiff;
+ public final fun getNoneChanged ()Lorg/jetbrains/exposed/sql/ColumnDiff;
+}
+
+public abstract class org/jetbrains/exposed/sql/ColumnSet : org/jetbrains/exposed/sql/FieldSet {
+ public fun ()V
+ public abstract fun crossJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public abstract fun describe (Lorg/jetbrains/exposed/sql/Transaction;Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+ public abstract fun fullJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public abstract fun getColumns ()Ljava/util/List;
+ public fun getFields ()Ljava/util/List;
+ public fun getRealFields ()Ljava/util/List;
+ public fun getSource ()Lorg/jetbrains/exposed/sql/ColumnSet;
+ public abstract fun innerJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public abstract fun join (Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/JoinType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Join;
+ public static synthetic fun join$default (Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/JoinType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Join;
+ public abstract fun leftJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public abstract fun rightJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public final fun slice (Ljava/util/List;)Lorg/jetbrains/exposed/sql/FieldSet;
+ public final fun slice (Lorg/jetbrains/exposed/sql/Expression;[Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/FieldSet;
+}
+
+public abstract class org/jetbrains/exposed/sql/ColumnType : org/jetbrains/exposed/sql/IColumnType {
+ public fun ()V
+ public fun (Z)V
+ public synthetic fun (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun equals (Ljava/lang/Object;)Z
+ public fun getNullable ()Z
+ public fun hashCode ()I
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun setNullable (Z)V
+ public fun setParameter (Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;ILjava/lang/Object;)V
+ public fun toString ()Ljava/lang/String;
+ public fun validateValueBeforeUpdate (Ljava/lang/Object;)V
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueToString (Ljava/lang/Object;)Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/ColumnTypeKt {
+ public static final fun getAutoIncColumnType (Lorg/jetbrains/exposed/sql/Column;)Lorg/jetbrains/exposed/sql/AutoIncColumnType;
+ public static final fun isAutoInc (Lorg/jetbrains/exposed/sql/IColumnType;)Z
+}
+
+public abstract class org/jetbrains/exposed/sql/ComparisonOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)V
+ public final fun getExpr1 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getExpr2 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getOpSign ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public abstract interface class org/jetbrains/exposed/sql/ComplexExpression {
+}
+
+public abstract class org/jetbrains/exposed/sql/CompositeColumn : org/jetbrains/exposed/sql/Expression {
+ public fun ()V
+ public abstract fun getRealColumns ()Ljava/util/List;
+ public abstract fun getRealColumnsWithValues (Ljava/lang/Object;)Ljava/util/Map;
+ public abstract fun restoreValueFromParts (Ljava/util/Map;)Ljava/lang/Object;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/CompositeSqlLogger : org/jetbrains/exposed/sql/SqlLogger, org/jetbrains/exposed/sql/statements/StatementInterceptor {
+ public fun ()V
+ public final fun addLogger (Lorg/jetbrains/exposed/sql/SqlLogger;)V
+ public fun afterCommit (Lorg/jetbrains/exposed/sql/Transaction;)V
+ public fun afterExecution (Lorg/jetbrains/exposed/sql/Transaction;Ljava/util/List;Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;)V
+ public fun afterRollback (Lorg/jetbrains/exposed/sql/Transaction;)V
+ public fun afterStatementPrepared (Lorg/jetbrains/exposed/sql/Transaction;Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;)V
+ public fun beforeCommit (Lorg/jetbrains/exposed/sql/Transaction;)V
+ public fun beforeExecution (Lorg/jetbrains/exposed/sql/Transaction;Lorg/jetbrains/exposed/sql/statements/StatementContext;)V
+ public fun beforeRollback (Lorg/jetbrains/exposed/sql/Transaction;)V
+ public fun keepUserDataInTransactionStoreOnCommit (Ljava/util/Map;)Ljava/util/Map;
+ public fun log (Lorg/jetbrains/exposed/sql/statements/StatementContext;Lorg/jetbrains/exposed/sql/Transaction;)V
+ public final fun removeLogger (Lorg/jetbrains/exposed/sql/SqlLogger;)V
+}
+
+public abstract class org/jetbrains/exposed/sql/CompoundBooleanOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public synthetic fun (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Concat : org/jetbrains/exposed/sql/Function {
+ public fun (Ljava/lang/String;[Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()[Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getSeparator ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Count : org/jetbrains/exposed/sql/Function, org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Z)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/Expression;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getDistinct ()Z
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/CumeDist : org/jetbrains/exposed/sql/WindowFunction {
+ public fun ()V
+ public fun (I)V
+ public synthetic fun (IILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public abstract interface class org/jetbrains/exposed/sql/CurrentOrFollowing : org/jetbrains/exposed/sql/WindowFrameBound {
+}
+
+public abstract interface class org/jetbrains/exposed/sql/CurrentOrPreceding : org/jetbrains/exposed/sql/WindowFrameBound {
+}
+
+public final class org/jetbrains/exposed/sql/CurrentRowWindowFrameBound : org/jetbrains/exposed/sql/CurrentOrFollowing, org/jetbrains/exposed/sql/CurrentOrPreceding, org/jetbrains/exposed/sql/WindowFrameBound {
+ public static final field INSTANCE Lorg/jetbrains/exposed/sql/CurrentRowWindowFrameBound;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/CustomEnumerationColumnType : org/jetbrains/exposed/sql/StringColumnType {
+ public fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)V
+ public final fun getFromDb ()Lkotlin/jvm/functions/Function1;
+ public final fun getName ()Ljava/lang/String;
+ public final fun getSql ()Ljava/lang/String;
+ public final fun getToDb ()Lkotlin/jvm/functions/Function1;
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Enum;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public class org/jetbrains/exposed/sql/CustomFunction : org/jetbrains/exposed/sql/Function {
+ public fun (Ljava/lang/String;Lorg/jetbrains/exposed/sql/IColumnType;[Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()[Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getFunctionName ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public class org/jetbrains/exposed/sql/CustomOperator : org/jetbrains/exposed/sql/Function {
+ public fun (Ljava/lang/String;Lorg/jetbrains/exposed/sql/IColumnType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr1 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getExpr2 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getOperatorName ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Database {
+ public static final field Companion Lorg/jetbrains/exposed/sql/Database$Companion;
+ public synthetic fun (Ljava/lang/String;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun defaultFetchSize (I)Lorg/jetbrains/exposed/sql/Database;
+ public final fun getConfig ()Lorg/jetbrains/exposed/sql/DatabaseConfig;
+ public final fun getConnector ()Lkotlin/jvm/functions/Function0;
+ public final fun getDefaultFetchSize ()Ljava/lang/Integer;
+ public final fun getDialect ()Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;
+ public final fun getIdentifierManager ()Lorg/jetbrains/exposed/sql/statements/api/IdentifierManagerApi;
+ public final fun getSupportsAlterTableWithAddColumn ()Z
+ public final fun getSupportsMultipleResultSets ()Z
+ public final fun getUrl ()Ljava/lang/String;
+ public final fun getUseNestedTransactions ()Z
+ public final fun getVendor ()Ljava/lang/String;
+ public final fun getVersion ()Ljava/math/BigDecimal;
+ public final fun isVersionCovers (Ljava/math/BigDecimal;)Z
+ public final fun setUseNestedTransactions (Z)V
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/Database$Companion {
+ public final fun connect (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Database;
+ public final fun connect (Ljavax/sql/DataSource;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Database;
+ public final fun connect (Lkotlin/jvm/functions/Function0;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Database;
+ public static synthetic fun connect$default (Lorg/jetbrains/exposed/sql/Database$Companion;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Database;
+ public static synthetic fun connect$default (Lorg/jetbrains/exposed/sql/Database$Companion;Ljavax/sql/DataSource;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Database;
+ public static synthetic fun connect$default (Lorg/jetbrains/exposed/sql/Database$Companion;Lkotlin/jvm/functions/Function0;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Database;
+ public final fun connectPool (Ljavax/sql/ConnectionPoolDataSource;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Database;
+ public static synthetic fun connectPool$default (Lorg/jetbrains/exposed/sql/Database$Companion;Ljavax/sql/ConnectionPoolDataSource;Lkotlin/jvm/functions/Function1;Lorg/jetbrains/exposed/sql/DatabaseConfig;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Database;
+ public final fun getDefaultIsolationLevel (Lorg/jetbrains/exposed/sql/Database;)I
+ public final fun getDialectName (Ljava/lang/String;)Ljava/lang/String;
+ public final fun registerDialect (Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V
+ public final fun registerJdbcDriver (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
+}
+
+public final class org/jetbrains/exposed/sql/DatabaseConfig {
+ public static final field Companion Lorg/jetbrains/exposed/sql/DatabaseConfig$Companion;
+ public synthetic fun (Lorg/jetbrains/exposed/sql/SqlLogger;ZLjava/lang/Integer;IIJJZLjava/lang/Long;IZLorg/jetbrains/exposed/sql/vendors/DatabaseDialect;Lorg/jetbrains/exposed/sql/Schema;IZLkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getDefaultFetchSize ()Ljava/lang/Integer;
+ public final fun getDefaultIsolationLevel ()I
+ public final fun getDefaultMaxRepetitionDelay ()J
+ public final fun getDefaultMinRepetitionDelay ()J
+ public final fun getDefaultReadOnly ()Z
+ public final fun getDefaultRepetitionAttempts ()I
+ public final fun getDefaultSchema ()Lorg/jetbrains/exposed/sql/Schema;
+ public final fun getExplicitDialect ()Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;
+ public final fun getKeepLoadedReferencesOutOfTransaction ()Z
+ public final fun getLogTooMuchResultSetsThreshold ()I
+ public final fun getMaxEntitiesToStoreInCachePerEntity ()I
+ public final fun getPreserveKeywordCasing ()Z
+ public final fun getSqlLogger ()Lorg/jetbrains/exposed/sql/SqlLogger;
+ public final fun getUseNestedTransactions ()Z
+ public final fun getWarnLongQueriesDuration ()Ljava/lang/Long;
+}
+
+public final class org/jetbrains/exposed/sql/DatabaseConfig$Builder {
+ public fun ()V
+ public fun (Lorg/jetbrains/exposed/sql/SqlLogger;ZLjava/lang/Integer;IIJJZLjava/lang/Long;IZLorg/jetbrains/exposed/sql/vendors/DatabaseDialect;Lorg/jetbrains/exposed/sql/Schema;IZ)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/SqlLogger;ZLjava/lang/Integer;IIJJZLjava/lang/Long;IZLorg/jetbrains/exposed/sql/vendors/DatabaseDialect;Lorg/jetbrains/exposed/sql/Schema;IZILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getDefaultFetchSize ()Ljava/lang/Integer;
+ public final fun getDefaultIsolationLevel ()I
+ public final fun getDefaultMaxRepetitionDelay ()J
+ public final fun getDefaultMinRepetitionDelay ()J
+ public final fun getDefaultReadOnly ()Z
+ public final fun getDefaultRepetitionAttempts ()I
+ public final fun getDefaultSchema ()Lorg/jetbrains/exposed/sql/Schema;
+ public final fun getExplicitDialect ()Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;
+ public final fun getKeepLoadedReferencesOutOfTransaction ()Z
+ public final fun getLogTooMuchResultSetsThreshold ()I
+ public final fun getMaxEntitiesToStoreInCachePerEntity ()I
+ public final fun getPreserveKeywordCasing ()Z
+ public final fun getSqlLogger ()Lorg/jetbrains/exposed/sql/SqlLogger;
+ public final fun getUseNestedTransactions ()Z
+ public final fun getWarnLongQueriesDuration ()Ljava/lang/Long;
+ public final fun setDefaultFetchSize (Ljava/lang/Integer;)V
+ public final fun setDefaultIsolationLevel (I)V
+ public final fun setDefaultMaxRepetitionDelay (J)V
+ public final fun setDefaultMinRepetitionDelay (J)V
+ public final fun setDefaultReadOnly (Z)V
+ public final fun setDefaultRepetitionAttempts (I)V
+ public final fun setDefaultSchema (Lorg/jetbrains/exposed/sql/Schema;)V
+ public final fun setExplicitDialect (Lorg/jetbrains/exposed/sql/vendors/DatabaseDialect;)V
+ public final fun setKeepLoadedReferencesOutOfTransaction (Z)V
+ public final fun setLogTooMuchResultSetsThreshold (I)V
+ public final fun setMaxEntitiesToStoreInCachePerEntity (I)V
+ public final fun setPreserveKeywordCasing (Z)V
+ public final fun setSqlLogger (Lorg/jetbrains/exposed/sql/SqlLogger;)V
+ public final fun setUseNestedTransactions (Z)V
+ public final fun setWarnLongQueriesDuration (Ljava/lang/Long;)V
+}
+
+public final class org/jetbrains/exposed/sql/DatabaseConfig$Companion {
+ public final fun invoke (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/DatabaseConfig;
+ public static synthetic fun invoke$default (Lorg/jetbrains/exposed/sql/DatabaseConfig$Companion;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/DatabaseConfig;
+}
+
+public abstract interface class org/jetbrains/exposed/sql/DatabaseConnectionAutoRegistration : kotlin/jvm/functions/Function1 {
+}
+
+public final class org/jetbrains/exposed/sql/DatabaseKt {
+ public static final fun getName (Lorg/jetbrains/exposed/sql/Database;)Ljava/lang/String;
+}
+
+public abstract interface class org/jetbrains/exposed/sql/DdlAware {
+ public abstract fun createStatement ()Ljava/util/List;
+ public abstract fun dropStatement ()Ljava/util/List;
+ public abstract fun modifyStatement ()Ljava/util/List;
+}
+
+public final class org/jetbrains/exposed/sql/DecimalColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public static final field Companion Lorg/jetbrains/exposed/sql/DecimalColumnType$Companion;
+ public fun (II)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getPrecision ()I
+ public final fun getScale ()I
+ public fun hashCode ()I
+ public fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/math/BigDecimal;
+}
+
+public final class org/jetbrains/exposed/sql/DecimalColumnType$Companion {
+}
+
+public final class org/jetbrains/exposed/sql/DenseRank : org/jetbrains/exposed/sql/WindowFunction {
+ public fun ()V
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/DivideOp : org/jetbrains/exposed/sql/CustomOperator {
+ public static final field Companion Lorg/jetbrains/exposed/sql/DivideOp$Companion;
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/IColumnType;)V
+}
+
+public final class org/jetbrains/exposed/sql/DivideOp$Companion {
+ public final fun withScale (Lorg/jetbrains/exposed/sql/DivideOp;I)Lorg/jetbrains/exposed/sql/DivideOp;
+}
+
+public final class org/jetbrains/exposed/sql/DoubleColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Double;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/EmptySizedIterable : java/util/Iterator, kotlin/jvm/internal/markers/KMappedMarker, org/jetbrains/exposed/sql/SizedIterable {
+ public fun ()V
+ public fun copy ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun count ()J
+ public fun empty ()Z
+ public fun forUpdate (Lorg/jetbrains/exposed/sql/vendors/ForUpdateOption;)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun hasNext ()Z
+ public fun iterator ()Ljava/util/Iterator;
+ public fun limit (IJ)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun next ()Ljava/lang/Object;
+ public fun notForUpdate ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun orderBy ([Lkotlin/Pair;)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun remove ()V
+}
+
+public final class org/jetbrains/exposed/sql/EntityIDColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun (Lorg/jetbrains/exposed/sql/Column;)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getIdColumn ()Lorg/jetbrains/exposed/sql/Column;
+ public fun hashCode ()I
+ public fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueFromDB (Ljava/lang/Object;)Lorg/jetbrains/exposed/dao/id/EntityID;
+}
+
+public final class org/jetbrains/exposed/sql/EnumerationColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun (Lkotlin/reflect/KClass;)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getKlass ()Lkotlin/reflect/KClass;
+ public fun hashCode ()I
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Integer;
+ public synthetic fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Enum;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/EnumerationNameColumnType : org/jetbrains/exposed/sql/VarCharColumnType {
+ public fun (Lkotlin/reflect/KClass;I)V
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getKlass ()Lkotlin/reflect/KClass;
+ public fun hashCode ()I
+ public fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Enum;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/EqOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/EqSubQueryOp : org/jetbrains/exposed/sql/SubQueryOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+}
+
+public final class org/jetbrains/exposed/sql/Except : org/jetbrains/exposed/sql/SetOperation {
+ public fun (Lorg/jetbrains/exposed/sql/AbstractQuery;Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+ public fun copy ()Lorg/jetbrains/exposed/sql/Intersect;
+ public synthetic fun copy ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun getOperationName ()Ljava/lang/String;
+ public synthetic fun withDistinct (Z)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public fun withDistinct (Z)Lorg/jetbrains/exposed/sql/SetOperation;
+}
+
+public final class org/jetbrains/exposed/sql/Exists : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+ public final fun getQuery ()Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public abstract interface annotation class org/jetbrains/exposed/sql/ExperimentalKeywordApi : java/lang/annotation/Annotation {
+}
+
+public abstract class org/jetbrains/exposed/sql/Expression {
+ public static final field Companion Lorg/jetbrains/exposed/sql/Expression$Companion;
+ public fun ()V
+ public fun equals (Ljava/lang/Object;)Z
+ public fun hashCode ()I
+ public abstract fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/Expression$Companion {
+ public final fun build (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Expression;
+}
+
+public final class org/jetbrains/exposed/sql/ExpressionAlias : org/jetbrains/exposed/sql/Expression {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)V
+ public final fun aliasOnlyExpression ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getAlias ()Ljava/lang/String;
+ public final fun getDelegate ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/ExpressionKt {
+ public static final fun append (Lorg/jetbrains/exposed/sql/QueryBuilder;[Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/QueryBuilder;
+ public static final fun appendTo (Ljava/lang/Iterable;Lorg/jetbrains/exposed/sql/QueryBuilder;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function2;)Lorg/jetbrains/exposed/sql/QueryBuilder;
+ public static synthetic fun appendTo$default (Ljava/lang/Iterable;Lorg/jetbrains/exposed/sql/QueryBuilder;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/QueryBuilder;
+}
+
+public abstract class org/jetbrains/exposed/sql/ExpressionWithColumnType : org/jetbrains/exposed/sql/Expression {
+ public fun ()V
+ public abstract fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+}
+
+public abstract interface class org/jetbrains/exposed/sql/FieldSet {
+ public abstract fun getFields ()Ljava/util/List;
+ public abstract fun getRealFields ()Ljava/util/List;
+ public abstract fun getSource ()Lorg/jetbrains/exposed/sql/ColumnSet;
+}
+
+public final class org/jetbrains/exposed/sql/FieldSet$DefaultImpls {
+ public static fun getRealFields (Lorg/jetbrains/exposed/sql/FieldSet;)Ljava/util/List;
+}
+
+public final class org/jetbrains/exposed/sql/FirstValue : org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/FloatColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Float;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/ForeignKeyConstraint : org/jetbrains/exposed/sql/DdlAware {
+ public fun (Ljava/util/Map;Lorg/jetbrains/exposed/sql/ReferenceOption;Lorg/jetbrains/exposed/sql/ReferenceOption;Ljava/lang/String;)V
+ public fun (Lorg/jetbrains/exposed/sql/Column;Lorg/jetbrains/exposed/sql/Column;Lorg/jetbrains/exposed/sql/ReferenceOption;Lorg/jetbrains/exposed/sql/ReferenceOption;Ljava/lang/String;)V
+ public final fun component1 ()Ljava/util/Map;
+ public final fun copy (Ljava/util/Map;Lorg/jetbrains/exposed/sql/ReferenceOption;Lorg/jetbrains/exposed/sql/ReferenceOption;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;
+ public static synthetic fun copy$default (Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;Ljava/util/Map;Lorg/jetbrains/exposed/sql/ReferenceOption;Lorg/jetbrains/exposed/sql/ReferenceOption;Ljava/lang/String;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;
+ public fun createStatement ()Ljava/util/List;
+ public fun dropStatement ()Ljava/util/List;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getCustomFkName ()Ljava/lang/String;
+ public final fun getDeleteRule ()Lorg/jetbrains/exposed/sql/ReferenceOption;
+ public final fun getFkName ()Ljava/lang/String;
+ public final fun getFrom ()Ljava/util/LinkedHashSet;
+ public final fun getFromTable ()Lorg/jetbrains/exposed/sql/Table;
+ public final fun getFromTableName ()Ljava/lang/String;
+ public final fun getReferences ()Ljava/util/Map;
+ public final fun getTarget ()Ljava/util/LinkedHashSet;
+ public final fun getTargetTable ()Lorg/jetbrains/exposed/sql/Table;
+ public final fun getTargetTableName ()Ljava/lang/String;
+ public final fun getUpdateRule ()Lorg/jetbrains/exposed/sql/ReferenceOption;
+ public fun hashCode ()I
+ public fun modifyStatement ()Ljava/util/List;
+ public final fun plus (Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;)Lorg/jetbrains/exposed/sql/ForeignKeyConstraint;
+ public final fun targetOf (Lorg/jetbrains/exposed/sql/Column;)Lorg/jetbrains/exposed/sql/Column;
+ public fun toString ()Ljava/lang/String;
+}
+
+public abstract class org/jetbrains/exposed/sql/Function : org/jetbrains/exposed/sql/ExpressionWithColumnType {
+ public fun (Lorg/jetbrains/exposed/sql/IColumnType;)V
+ public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+}
+
+public final class org/jetbrains/exposed/sql/GreaterEqOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/GreaterOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/GroupConcat : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;Z[Lkotlin/Pair;)V
+ public final fun getDistinct ()Z
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getOrderBy ()[Lkotlin/Pair;
+ public final fun getSeparator ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public abstract interface class org/jetbrains/exposed/sql/IColumnType {
+ public abstract fun getNullable ()Z
+ public abstract fun nonNullValueToString (Ljava/lang/Object;)Ljava/lang/String;
+ public abstract fun notNullValueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public abstract fun readObject (Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public abstract fun setNullable (Z)V
+ public abstract fun setParameter (Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;ILjava/lang/Object;)V
+ public abstract fun sqlType ()Ljava/lang/String;
+ public abstract fun validateValueBeforeUpdate (Ljava/lang/Object;)V
+ public abstract fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public abstract fun valueToDB (Ljava/lang/Object;)Ljava/lang/Object;
+ public abstract fun valueToString (Ljava/lang/Object;)Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/IColumnType$DefaultImpls {
+ public static fun nonNullValueToString (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)Ljava/lang/String;
+ public static fun notNullValueToDB (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)Ljava/lang/Object;
+ public static fun readObject (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/sql/ResultSet;I)Ljava/lang/Object;
+ public static fun setParameter (Lorg/jetbrains/exposed/sql/IColumnType;Lorg/jetbrains/exposed/sql/statements/api/PreparedStatementApi;ILjava/lang/Object;)V
+ public static fun validateValueBeforeUpdate (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)V
+ public static fun valueFromDB (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)Ljava/lang/Object;
+ public static fun valueToDB (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)Ljava/lang/Object;
+ public static fun valueToString (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)Ljava/lang/String;
+}
+
+public abstract interface class org/jetbrains/exposed/sql/IDateColumnType {
+ public abstract fun getHasTimePart ()Z
+}
+
+public abstract interface class org/jetbrains/exposed/sql/ISqlExpressionBuilder {
+ public abstract fun asLiteral (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/LiteralOp;
+ public abstract fun between (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Between;
+ public abstract fun bitwiseAnd (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/AndBitOp;
+ public abstract fun bitwiseAnd (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/AndBitOp;
+ public abstract fun bitwiseOr (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/OrBitOp;
+ public abstract fun bitwiseOr (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/OrBitOp;
+ public abstract fun bitwiseXor (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/XorBitOp;
+ public abstract fun bitwiseXor (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/XorBitOp;
+ public abstract fun case (Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Case;
+ public abstract fun coalesce (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;[Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Coalesce;
+ public abstract fun concat (Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/exposed/sql/Concat;
+ public abstract fun concat ([Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Concat;
+ public abstract fun cumeDist ()Lorg/jetbrains/exposed/sql/CumeDist;
+ public abstract fun denseRank ()Lorg/jetbrains/exposed/sql/DenseRank;
+ public abstract fun div (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/DivideOp;
+ public abstract fun div (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/DivideOp;
+ public abstract fun eq (Lorg/jetbrains/exposed/sql/CompositeColumn;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun eq (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun eq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun eq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun eqSubQuery (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/EqSubQueryOp;
+ public abstract fun firstValue (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/FirstValue;
+ public abstract fun greater (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public abstract fun greater (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public abstract fun greaterEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public abstract fun greaterEq (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public abstract fun greaterEq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public abstract fun greaterEqEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public abstract fun hasFlag (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/EqOp;
+ public abstract fun hasFlag (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/EqOp;
+ public abstract fun inList (Lkotlin/Pair;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun inList (Lkotlin/Triple;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun inList (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun inListIds (Lorg/jetbrains/exposed/sql/Column;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun inSubQuery (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/InSubQueryOp;
+ public abstract fun intToDecimal (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/NoOpConversion;
+ public abstract fun isDistinctFrom (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public abstract fun isDistinctFrom (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public abstract fun isDistinctFromEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public abstract fun isNotDistinctFrom (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public abstract fun isNotDistinctFrom (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public abstract fun isNotDistinctFromEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public abstract fun isNotNull (Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNotNullOp;
+ public abstract fun isNull (Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNullOp;
+ public abstract fun lag (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Lag;
+ public abstract fun lastValue (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LastValue;
+ public abstract fun lead (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Lead;
+ public abstract fun less (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/LessOp;
+ public abstract fun less (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessOp;
+ public abstract fun lessEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessOp;
+ public abstract fun lessEq (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public abstract fun lessEq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public abstract fun lessEqEntityID (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public abstract fun like (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun like (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun like (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun likeWithEntityID (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun likeWithEntityID (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun likeWithEntityIDAndExpression (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun match (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun match (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;Lorg/jetbrains/exposed/sql/vendors/FunctionProvider$MatchMode;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun minus (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/MinusOp;
+ public abstract fun minus (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/MinusOp;
+ public abstract fun mod (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ModOp;
+ public abstract fun mod (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ModOp;
+ public abstract fun modWithEntityId (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun modWithEntityId2 (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun modWithEntityId3 (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun neq (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun neq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun neq (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public abstract fun notEqSubQuery (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/NotEqSubQueryOp;
+ public abstract fun notInList (Lkotlin/Pair;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun notInList (Lkotlin/Triple;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun notInList (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun notInListIds (Lorg/jetbrains/exposed/sql/Column;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public abstract fun notInSubQuery (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/NotInSubQueryOp;
+ public abstract fun notLike (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun notLike (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun notLike (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun notLikeWithEntityID (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun notLikeWithEntityID (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun notLikeWithEntityIDAndExpression (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public abstract fun nthValue (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/NthValue;
+ public abstract fun ntile (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Ntile;
+ public abstract fun percentRank ()Lorg/jetbrains/exposed/sql/PercentRank;
+ public abstract fun plus (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/PlusOp;
+ public abstract fun plus (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/PlusOp;
+ public abstract fun rank ()Lorg/jetbrains/exposed/sql/Rank;
+ public abstract fun regexp (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/RegexpOp;
+ public abstract fun regexp (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Z)Lorg/jetbrains/exposed/sql/RegexpOp;
+ public abstract fun rem (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ModOp;
+ public abstract fun rem (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ModOp;
+ public abstract fun remWithEntityId (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun remWithEntityId2 (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun remWithEntityId3 (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public abstract fun rowNumber ()Lorg/jetbrains/exposed/sql/RowNumber;
+ public abstract fun times (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/TimesOp;
+ public abstract fun times (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/TimesOp;
+ public abstract fun wrap (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/QueryParameter;
+}
+
+public final class org/jetbrains/exposed/sql/ISqlExpressionBuilder$DefaultImpls {
+ public static fun asLiteral (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/LiteralOp;
+ public static fun between (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Between;
+ public static fun bitwiseAnd (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/AndBitOp;
+ public static fun bitwiseAnd (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/AndBitOp;
+ public static fun bitwiseOr (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/OrBitOp;
+ public static fun bitwiseOr (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/OrBitOp;
+ public static fun bitwiseXor (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/XorBitOp;
+ public static fun bitwiseXor (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/XorBitOp;
+ public static fun case (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Case;
+ public static synthetic fun case$default (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Case;
+ public static fun coalesce (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;[Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Coalesce;
+ public static fun concat (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Ljava/lang/String;Ljava/util/List;)Lorg/jetbrains/exposed/sql/Concat;
+ public static fun concat (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;[Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Concat;
+ public static synthetic fun concat$default (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Concat;
+ public static fun cumeDist (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;)Lorg/jetbrains/exposed/sql/CumeDist;
+ public static fun denseRank (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;)Lorg/jetbrains/exposed/sql/DenseRank;
+ public static fun div (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/DivideOp;
+ public static fun div (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/DivideOp;
+ public static fun eq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/CompositeColumn;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun eq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun eq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun eq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun eqSubQuery (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/EqSubQueryOp;
+ public static fun firstValue (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/FirstValue;
+ public static fun greater (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public static fun greater (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public static fun greaterEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterOp;
+ public static fun greaterEq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public static fun greaterEq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public static fun greaterEqEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/GreaterEqOp;
+ public static fun hasFlag (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/EqOp;
+ public static fun hasFlag (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/EqOp;
+ public static fun inList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lkotlin/Pair;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun inList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lkotlin/Triple;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun inList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun inListIds (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Column;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun inSubQuery (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/InSubQueryOp;
+ public static fun intToDecimal (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/NoOpConversion;
+ public static fun isDistinctFrom (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public static fun isDistinctFrom (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public static fun isDistinctFromEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsDistinctFromOp;
+ public static fun isNotDistinctFrom (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public static fun isNotDistinctFrom (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public static fun isNotDistinctFromEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/IsNotDistinctFromOp;
+ public static fun isNotNull (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNotNullOp;
+ public static fun isNull (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/IsNullOp;
+ public static fun lag (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Lag;
+ public static synthetic fun lag$default (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Lag;
+ public static fun lastValue (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LastValue;
+ public static fun lead (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Lead;
+ public static synthetic fun lead$default (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Lead;
+ public static fun less (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/LessOp;
+ public static fun less (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessOp;
+ public static fun lessEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessOp;
+ public static fun lessEq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public static fun lessEq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public static fun lessEqEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/LessEqOp;
+ public static fun like (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun like (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun like (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun likeWithEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun likeWithEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun likeWithEntityIDAndExpression (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun match (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun match (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;Lorg/jetbrains/exposed/sql/vendors/FunctionProvider$MatchMode;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun minus (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/MinusOp;
+ public static fun minus (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/MinusOp;
+ public static fun mod (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ModOp;
+ public static fun mod (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ModOp;
+ public static fun modWithEntityId (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun modWithEntityId2 (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun modWithEntityId3 (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun neq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun neq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Comparable;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun neq (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/Op;
+ public static fun notEqSubQuery (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/NotEqSubQueryOp;
+ public static fun notInList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lkotlin/Pair;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun notInList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lkotlin/Triple;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun notInList (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun notInListIds (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Column;Ljava/lang/Iterable;)Lorg/jetbrains/exposed/sql/ops/InListOrNotInListBaseOp;
+ public static fun notInSubQuery (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)Lorg/jetbrains/exposed/sql/NotInSubQueryOp;
+ public static fun notLike (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun notLike (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun notLike (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun notLikeWithEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun notLikeWithEntityID (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun notLikeWithEntityIDAndExpression (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/LikeEscapeOp;
+ public static fun nthValue (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/NthValue;
+ public static fun ntile (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/Ntile;
+ public static fun percentRank (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;)Lorg/jetbrains/exposed/sql/PercentRank;
+ public static fun plus (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/PlusOp;
+ public static fun plus (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/PlusOp;
+ public static fun rank (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;)Lorg/jetbrains/exposed/sql/Rank;
+ public static fun regexp (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)Lorg/jetbrains/exposed/sql/RegexpOp;
+ public static fun regexp (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Z)Lorg/jetbrains/exposed/sql/RegexpOp;
+ public static synthetic fun regexp$default (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;ZILjava/lang/Object;)Lorg/jetbrains/exposed/sql/RegexpOp;
+ public static fun rem (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ModOp;
+ public static fun rem (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ModOp;
+ public static fun remWithEntityId (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Number;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun remWithEntityId2 (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun remWithEntityId3 (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public static fun rowNumber (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;)Lorg/jetbrains/exposed/sql/RowNumber;
+ public static fun times (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/TimesOp;
+ public static fun times (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/Expression;)Lorg/jetbrains/exposed/sql/TimesOp;
+ public static fun wrap (Lorg/jetbrains/exposed/sql/ISqlExpressionBuilder;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Ljava/lang/Object;)Lorg/jetbrains/exposed/sql/QueryParameter;
+}
+
+public final class org/jetbrains/exposed/sql/InSubQueryOp : org/jetbrains/exposed/sql/SubQueryOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+}
+
+public final class org/jetbrains/exposed/sql/Index : org/jetbrains/exposed/sql/DdlAware {
+ public fun (Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;Lorg/jetbrains/exposed/sql/Op;Ljava/util/List;Lorg/jetbrains/exposed/sql/Table;)V
+ public synthetic fun (Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;Lorg/jetbrains/exposed/sql/Op;Ljava/util/List;Lorg/jetbrains/exposed/sql/Table;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun component1 ()Ljava/util/List;
+ public final fun component2 ()Z
+ public final fun component3 ()Ljava/lang/String;
+ public final fun component4 ()Ljava/lang/String;
+ public final fun component5 ()Lorg/jetbrains/exposed/sql/Op;
+ public final fun component6 ()Ljava/util/List;
+ public final fun component7 ()Lorg/jetbrains/exposed/sql/Table;
+ public final fun copy (Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;Lorg/jetbrains/exposed/sql/Op;Ljava/util/List;Lorg/jetbrains/exposed/sql/Table;)Lorg/jetbrains/exposed/sql/Index;
+ public static synthetic fun copy$default (Lorg/jetbrains/exposed/sql/Index;Ljava/util/List;ZLjava/lang/String;Ljava/lang/String;Lorg/jetbrains/exposed/sql/Op;Ljava/util/List;Lorg/jetbrains/exposed/sql/Table;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/Index;
+ public fun createStatement ()Ljava/util/List;
+ public fun dropStatement ()Ljava/util/List;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getColumns ()Ljava/util/List;
+ public final fun getCustomName ()Ljava/lang/String;
+ public final fun getFilterCondition ()Lorg/jetbrains/exposed/sql/Op;
+ public final fun getFunctions ()Ljava/util/List;
+ public final fun getFunctionsTable ()Lorg/jetbrains/exposed/sql/Table;
+ public final fun getIndexName ()Ljava/lang/String;
+ public final fun getIndexType ()Ljava/lang/String;
+ public final fun getTable ()Lorg/jetbrains/exposed/sql/Table;
+ public final fun getUnique ()Z
+ public fun hashCode ()I
+ public fun modifyStatement ()Ljava/util/List;
+ public final fun onlyNameDiffer (Lorg/jetbrains/exposed/sql/Index;)Z
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/IntegerColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Integer;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/Intersect : org/jetbrains/exposed/sql/SetOperation {
+ public fun (Lorg/jetbrains/exposed/sql/AbstractQuery;Lorg/jetbrains/exposed/sql/AbstractQuery;)V
+ public fun copy ()Lorg/jetbrains/exposed/sql/Intersect;
+ public synthetic fun copy ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public synthetic fun withDistinct (Z)Lorg/jetbrains/exposed/sql/AbstractQuery;
+ public fun withDistinct (Z)Lorg/jetbrains/exposed/sql/SetOperation;
+}
+
+public final class org/jetbrains/exposed/sql/IsDistinctFromOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpression1 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getExpression2 ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/IsNotDistinctFromOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpression1 ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getExpression2 ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/IsNotNullOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/IsNullOp : org/jetbrains/exposed/sql/Op, org/jetbrains/exposed/sql/ComplexExpression, org/jetbrains/exposed/sql/Op$OpBoolean {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/IterableExKt {
+ public static final fun emptySized ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public static final fun mapLazy (Lorg/jetbrains/exposed/sql/SizedIterable;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/SizedIterable;
+}
+
+public final class org/jetbrains/exposed/sql/Join : org/jetbrains/exposed/sql/ColumnSet {
+ public fun (Lorg/jetbrains/exposed/sql/ColumnSet;)V
+ public fun (Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/JoinType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function1;)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/JoinType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function1;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun alreadyInJoin (Lorg/jetbrains/exposed/sql/Table;)Z
+ public fun crossJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public fun describe (Lorg/jetbrains/exposed/sql/Transaction;Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+ public fun fullJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public fun getColumns ()Ljava/util/List;
+ public final fun getTable ()Lorg/jetbrains/exposed/sql/ColumnSet;
+ public fun innerJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public fun join (Lorg/jetbrains/exposed/sql/ColumnSet;Lorg/jetbrains/exposed/sql/JoinType;Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/exposed/sql/Join;
+ public fun leftJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+ public fun rightJoin (Lorg/jetbrains/exposed/sql/ColumnSet;)Lorg/jetbrains/exposed/sql/Join;
+}
+
+public final class org/jetbrains/exposed/sql/JoinType : java/lang/Enum {
+ public static final field CROSS Lorg/jetbrains/exposed/sql/JoinType;
+ public static final field FULL Lorg/jetbrains/exposed/sql/JoinType;
+ public static final field INNER Lorg/jetbrains/exposed/sql/JoinType;
+ public static final field LEFT Lorg/jetbrains/exposed/sql/JoinType;
+ public static final field RIGHT Lorg/jetbrains/exposed/sql/JoinType;
+ public static fun valueOf (Ljava/lang/String;)Lorg/jetbrains/exposed/sql/JoinType;
+ public static fun values ()[Lorg/jetbrains/exposed/sql/JoinType;
+}
+
+public abstract interface class org/jetbrains/exposed/sql/JsonColumnMarker {
+ public abstract fun getUsesBinaryFormat ()Z
+}
+
+public final class org/jetbrains/exposed/sql/Key {
+ public fun ()V
+}
+
+public final class org/jetbrains/exposed/sql/Lag : org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getDefaultValue ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public final fun getOffset ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public class org/jetbrains/exposed/sql/LargeTextColumnType : org/jetbrains/exposed/sql/TextColumnType {
+ public fun ()V
+ public fun (Ljava/lang/String;Z)V
+ public synthetic fun (Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun preciseType ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/LastValue : org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/LazySizedCollection : org/jetbrains/exposed/sql/SizedIterable {
+ public fun (Lorg/jetbrains/exposed/sql/SizedIterable;)V
+ public fun copy ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun count ()J
+ public fun empty ()Z
+ public fun forUpdate (Lorg/jetbrains/exposed/sql/vendors/ForUpdateOption;)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public final fun getWrapper ()Ljava/util/List;
+ public final fun isLoaded ()Z
+ public fun iterator ()Ljava/util/Iterator;
+ public fun limit (IJ)Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun notForUpdate ()Lorg/jetbrains/exposed/sql/SizedIterable;
+ public fun orderBy ([Lkotlin/Pair;)Lorg/jetbrains/exposed/sql/SizedIterable;
+}
+
+public final class org/jetbrains/exposed/sql/Lead : org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;)V
+ public synthetic fun (Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun getDefaultValue ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public final fun getOffset ()Lorg/jetbrains/exposed/sql/ExpressionWithColumnType;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/LessEqOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/LessOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/LikeEscapeOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;ZLjava/lang/Character;)V
+ public final fun getEscapeChar ()Ljava/lang/Character;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/LikeOp : org/jetbrains/exposed/sql/ComparisonOp {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/Expression;)V
+}
+
+public final class org/jetbrains/exposed/sql/LikePattern {
+ public static final field Companion Lorg/jetbrains/exposed/sql/LikePattern$Companion;
+ public fun (Ljava/lang/String;Ljava/lang/Character;)V
+ public synthetic fun (Ljava/lang/String;Ljava/lang/Character;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public final fun component1 ()Ljava/lang/String;
+ public final fun component2 ()Ljava/lang/Character;
+ public final fun copy (Ljava/lang/String;Ljava/lang/Character;)Lorg/jetbrains/exposed/sql/LikePattern;
+ public static synthetic fun copy$default (Lorg/jetbrains/exposed/sql/LikePattern;Ljava/lang/String;Ljava/lang/Character;ILjava/lang/Object;)Lorg/jetbrains/exposed/sql/LikePattern;
+ public fun equals (Ljava/lang/Object;)Z
+ public final fun getEscapeChar ()Ljava/lang/Character;
+ public final fun getPattern ()Ljava/lang/String;
+ public fun hashCode ()I
+ public final fun plus (Ljava/lang/String;)Lorg/jetbrains/exposed/sql/LikePattern;
+ public final fun plus (Lorg/jetbrains/exposed/sql/LikePattern;)Lorg/jetbrains/exposed/sql/LikePattern;
+ public fun toString ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/LikePattern$Companion {
+ public final fun ofLiteral (Ljava/lang/String;C)Lorg/jetbrains/exposed/sql/LikePattern;
+ public static synthetic fun ofLiteral$default (Lorg/jetbrains/exposed/sql/LikePattern$Companion;Ljava/lang/String;CILjava/lang/Object;)Lorg/jetbrains/exposed/sql/LikePattern;
+}
+
+public final class org/jetbrains/exposed/sql/LiteralOp : org/jetbrains/exposed/sql/ExpressionWithColumnType {
+ public fun (Lorg/jetbrains/exposed/sql/IColumnType;Ljava/lang/Object;)V
+ public fun getColumnType ()Lorg/jetbrains/exposed/sql/IColumnType;
+ public final fun getValue ()Ljava/lang/Object;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Locate : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Ljava/lang/String;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public final fun getSubstring ()Ljava/lang/String;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/LongColumnType : org/jetbrains/exposed/sql/ColumnType {
+ public fun ()V
+ public fun sqlType ()Ljava/lang/String;
+ public fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Long;
+ public synthetic fun valueFromDB (Ljava/lang/Object;)Ljava/lang/Object;
+}
+
+public final class org/jetbrains/exposed/sql/LowerCase : org/jetbrains/exposed/sql/Function {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public final class org/jetbrains/exposed/sql/Max : org/jetbrains/exposed/sql/Function, org/jetbrains/exposed/sql/WindowFunction {
+ public fun (Lorg/jetbrains/exposed/sql/Expression;Lorg/jetbrains/exposed/sql/IColumnType;)V
+ public final fun getExpr ()Lorg/jetbrains/exposed/sql/Expression;
+ public fun over ()Lorg/jetbrains/exposed/sql/WindowFunctionDefinition;
+ public fun toQueryBuilder (Lorg/jetbrains/exposed/sql/QueryBuilder;)V
+}
+
+public class org/jetbrains/exposed/sql/MediumTextColumnType : org/jetbrains/exposed/sql/TextColumnType {
+ public fun ()V
+ public fun (Ljava/lang/String;Z)V
+ public synthetic fun (Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V
+ public fun preciseType ()Ljava/lang/String;
+}
+
+public final class org/jetbrains/exposed/sql/Min : org/jetbrains/exposed/sql/Function, org/jetbrains/exposed/sql/WindowFunction {
+ public fun