mirror of
https://github.com/hibernate/hibernate-orm
synced 2025-02-16 08:05:05 +00:00
HHH-14693, HHH-10668 Move non-supported dialects to the hibernate-community-dialects artifact and add the SQLite dialect originally contributed by Vlad Mihalcea which was adapted for Hibernate 6. Also add HSQLDB, MySQL and Sybase ASE configurations and a CI job config
This commit is contained in:
parent
16db356ba8
commit
6447ca9b26
18
.github/workflows/contributor-build.yml
vendored
18
.github/workflows/contributor-build.yml
vendored
@ -29,18 +29,24 @@ jobs:
|
|||||||
include:
|
include:
|
||||||
- rdbms: h2
|
- rdbms: h2
|
||||||
experimental: false
|
experimental: false
|
||||||
|
- rdbms: hsqldb
|
||||||
|
experimental: false
|
||||||
- rdbms: derby
|
- rdbms: derby
|
||||||
experimental: true
|
experimental: false
|
||||||
|
- rdbms: mysql
|
||||||
|
experimental: false
|
||||||
- rdbms: mariadb
|
- rdbms: mariadb
|
||||||
experimental: true
|
experimental: false
|
||||||
- rdbms: postgresql
|
- rdbms: postgresql
|
||||||
experimental: true
|
experimental: false
|
||||||
- rdbms: oracle
|
- rdbms: oracle
|
||||||
experimental: true
|
experimental: false
|
||||||
- rdbms: db2
|
- rdbms: db2
|
||||||
experimental: true
|
experimental: false
|
||||||
- rdbms: mssql
|
- rdbms: mssql
|
||||||
experimental: true
|
experimental: false
|
||||||
|
- rdbms: sybase
|
||||||
|
experimental: false
|
||||||
# Running with HANA requires at least 8GB memory just for the database, which we don't have on GH Actions runners
|
# Running with HANA requires at least 8GB memory just for the database, which we don't have on GH Actions runners
|
||||||
# - rdbms: hana
|
# - rdbms: hana
|
||||||
# experimental: true
|
# experimental: true
|
||||||
|
@ -3,6 +3,10 @@
|
|||||||
goal=
|
goal=
|
||||||
if [ "$RDBMS" == "derby" ]; then
|
if [ "$RDBMS" == "derby" ]; then
|
||||||
goal="-Pdb=derby"
|
goal="-Pdb=derby"
|
||||||
|
elif [ "$RDBMS" == "hsqldb" ]; then
|
||||||
|
goal="-Pdb=hsqldb"
|
||||||
|
elif [ "$RDBMS" == "mysql" ]; then
|
||||||
|
goal="-Pdb=mysql_ci"
|
||||||
elif [ "$RDBMS" == "mariadb" ]; then
|
elif [ "$RDBMS" == "mariadb" ]; then
|
||||||
goal="-Pdb=mariadb_ci"
|
goal="-Pdb=mariadb_ci"
|
||||||
elif [ "$RDBMS" == "postgresql" ]; then
|
elif [ "$RDBMS" == "postgresql" ]; then
|
||||||
@ -16,6 +20,8 @@ elif [ "$RDBMS" == "mssql" ]; then
|
|||||||
goal="-Pdb=mssql_ci"
|
goal="-Pdb=mssql_ci"
|
||||||
elif [ "$RDBMS" == "hana" ]; then
|
elif [ "$RDBMS" == "hana" ]; then
|
||||||
goal="-Pdb=hana_ci"
|
goal="-Pdb=hana_ci"
|
||||||
|
elif [ "$RDBMS" == "sybase" ]; then
|
||||||
|
goal="-Pdb=sybase_ci"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
exec ./gradlew check ${goal} -Plog-test-progress=true --stacktrace
|
exec ./gradlew check ${goal} -Plog-test-progress=true --stacktrace
|
||||||
|
@ -18,4 +18,6 @@ elif [ "$RDBMS" == 'mssql' ]; then
|
|||||||
bash $DIR/../docker_db.sh mssql
|
bash $DIR/../docker_db.sh mssql
|
||||||
elif [ "$RDBMS" == 'hana' ]; then
|
elif [ "$RDBMS" == 'hana' ]; then
|
||||||
bash $DIR/../docker_db.sh hana
|
bash $DIR/../docker_db.sh hana
|
||||||
|
elif [ "$RDBMS" == 'sybase' ]; then
|
||||||
|
bash $DIR/../docker_db.sh sybase
|
||||||
fi
|
fi
|
65
dialects.adoc
Normal file
65
dialects.adoc
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
= Dialects
|
||||||
|
|
||||||
|
A dialect is a class that provides information about the specifics of a database and translators for the SQL dialect of the database.
|
||||||
|
|
||||||
|
== Supported dialects
|
||||||
|
|
||||||
|
Hibernate supports a wide range of dialects out of the box. The following is list of officially supported databases:
|
||||||
|
|
||||||
|
* Apache Derby
|
||||||
|
* Cockroach
|
||||||
|
* Google Spanner
|
||||||
|
* H2
|
||||||
|
* HSQLDB
|
||||||
|
* IBM DB2 LUW
|
||||||
|
* IBM DB2 iSeries
|
||||||
|
* IBM DB2 z/OS
|
||||||
|
* MariaDB
|
||||||
|
* MySQL
|
||||||
|
* Oracle
|
||||||
|
* PostgreSQL
|
||||||
|
* Postgres Plus
|
||||||
|
* SAP HANA
|
||||||
|
* SQL Server
|
||||||
|
* Sybase ASE
|
||||||
|
|
||||||
|
Usually, Hibernate supports at least the database version that is also still supported by the respective vendor.
|
||||||
|
In many cases though, Hibernate supports even older versions of the databases,
|
||||||
|
but the support for these versions is not guaranteed.
|
||||||
|
|
||||||
|
Apart from the Hibernate team supported dialects, there are also community dialects.
|
||||||
|
|
||||||
|
== Community dialects
|
||||||
|
|
||||||
|
As of Hibernate 6.0, the Hibernate team decided to provide a clear way forward for community contributed dialects.
|
||||||
|
The `hibernate-core` artifact had many legacy dialects before 6.0 that were only tested and maintained on a best effort basis.
|
||||||
|
|
||||||
|
More and more database vendors requested to integrate a dialect for their database and even provided a PR with a dialect,
|
||||||
|
but the Hibernate team didn't want to add new dialects for databases that might not have a wide adoption
|
||||||
|
or any automated testing into the `hibernate-core` artifact. Even though the dialect was supposedly maintained by the vendor,
|
||||||
|
the Hibernate team was burdened with reviewing questions, issues and PRs that relate to these dialects.
|
||||||
|
|
||||||
|
To give database vendors and the community a clear way forward, the Hibernate team decided to introduce a new artifact,
|
||||||
|
called `hibernate-community-dialects` which is the new home for dialects that are maintained by vendors or individuals.
|
||||||
|
Starting with Hibernate 6.0 the `hibernate-core` artifact will only contain dialects that are supported and tested by the Hibernate team.
|
||||||
|
All the legacy dialects are moved to the `hibernate-community-dialects` artifact to have a clear separation based on the quality of the dialect.
|
||||||
|
|
||||||
|
Issues with dialects in the `hibernate-community-dialects` are usually not considered by the Hibernate team,
|
||||||
|
as the community is responsible for providing fixes and improving the dialects for newer database versions or ORM capabilities.
|
||||||
|
|
||||||
|
== Requirements for moving to hibernate-core
|
||||||
|
|
||||||
|
If a database vendor wants their database dialect to be included in the `hibernate-core` artifact,
|
||||||
|
several requirements have to be fulfilled:
|
||||||
|
|
||||||
|
* The vendor must provide access to a dedicated database server that can be used for testing
|
||||||
|
* The vendor must provide contact details to at least one employee who is mainly responsible for the maintenance of the dialect
|
||||||
|
* The responsible employee of the vendor must actively monitor and react to failures of the testsuite against the respective database
|
||||||
|
* The responsible employee of the vendor must ensure the testsuite is configured correctly in order for it to succeed on the respective database
|
||||||
|
* If the responsible employee of the vendor leaves the company, the vendor must provide contact details to a new responsible employee
|
||||||
|
|
||||||
|
In case the responsible employee is unreachable for a longer period or issues with the dialect are not attended to in a timely manner,
|
||||||
|
the Hibernate team will move the dialect back to the `hibernate-community-dialects` artifact.
|
||||||
|
|
||||||
|
Get in touch with the Hibernate team on https://hibernate.zulipchat.com/#narrow/stream/132096-hibernate-user[Zulip]
|
||||||
|
if you want to request the move of your dialect to hibernate-core.
|
156
docker_db.sh
156
docker_db.sh
@ -2,17 +2,17 @@
|
|||||||
|
|
||||||
mysql_5_7() {
|
mysql_5_7() {
|
||||||
docker rm -f mysql || true
|
docker rm -f mysql || true
|
||||||
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:5.7 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_8_0() {
|
mysql_8_0() {
|
||||||
docker rm -f mysql || true
|
docker rm -f mysql || true
|
||||||
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:8.0.21 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
docker run --name mysql -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mysql:8.0.21 --character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci
|
||||||
}
|
}
|
||||||
|
|
||||||
mariadb() {
|
mariadb() {
|
||||||
docker rm -f mariadb || true
|
docker rm -f mariadb || true
|
||||||
docker run --name mariadb -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mariadb:10.5.8 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
docker run --name mariadb -e MYSQL_USER=hibernate_orm_test -e MYSQL_PASSWORD=hibernate_orm_test -e MYSQL_DATABASE=hibernate_orm_test -e MYSQL_ROOT_PASSWORD=hibernate_orm_test -p3306:3306 -d mariadb:10.5.8 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
|
||||||
}
|
}
|
||||||
|
|
||||||
postgresql_9_5() {
|
postgresql_9_5() {
|
||||||
@ -26,8 +26,14 @@ postgresql_13() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
postgis(){
|
postgis(){
|
||||||
docker rm -f postgis || true
|
docker rm -f postgis || true
|
||||||
docker run --name postgis -e POSTGRES_USER=hibernate_orm_test -e POSTGRES_PASSWORD=hibernate_orm_test -e POSTGRES_DB=hibernate_orm_test -p5432:5432 -d postgis/postgis:11-2.5
|
docker run --name postgis -e POSTGRES_USER=hibernate_orm_test -e POSTGRES_PASSWORD=hibernate_orm_test -e POSTGRES_DB=hibernate_orm_test -p5432:5432 -d postgis/postgis:11-2.5
|
||||||
|
}
|
||||||
|
|
||||||
|
edb() {
|
||||||
|
#docker login containers.enterprisedb.com
|
||||||
|
docker rm -f edb || true
|
||||||
|
docker run --name edb -e ACCEPT_EULA=Yes -e DATABASE_USER=hibernate_orm_test -e DATABASE_USER_PASSWORD=hibernate_orm_test -e ENTERPRISEDB_PASSWORD=hibernate_orm_test -e DATABASE_NAME=hibernate_orm_test -e PGPORT=5433 -p 5433:5433 --mount type=tmpfs,destination=/edbvolume -d containers.enterprisedb.com/edb/edb-as-lite:v11
|
||||||
}
|
}
|
||||||
|
|
||||||
db2() {
|
db2() {
|
||||||
@ -123,6 +129,126 @@ mssql() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sybase() {
|
||||||
|
docker rm -f sybase || true
|
||||||
|
# Yup, that sucks, but on ubuntu we need to use -T11889 as per: https://github.com/DataGrip/docker-env/issues/12
|
||||||
|
docker run -d -p 5000:5000 -p 5001:5001 --name sybase --entrypoint /bin/bash nguoianphu/docker-sybase -c "source /opt/sybase/SYBASE.sh
|
||||||
|
/opt/sybase/ASE-16_0/bin/dataserver \
|
||||||
|
-d/opt/sybase/data/master.dat \
|
||||||
|
-e/opt/sybase/ASE-16_0/install/MYSYBASE.log \
|
||||||
|
-c/opt/sybase/ASE-16_0/MYSYBASE.cfg \
|
||||||
|
-M/opt/sybase/ASE-16_0 \
|
||||||
|
-N/opt/sybase/ASE-16_0/sysam/MYSYBASE.properties \
|
||||||
|
-i/opt/sybase \
|
||||||
|
-sMYSYBASE \
|
||||||
|
-T11889
|
||||||
|
RET=\$?
|
||||||
|
exit 0
|
||||||
|
"
|
||||||
|
|
||||||
|
sybase_check() {
|
||||||
|
docker exec sybase bash -c "source /opt/sybase/SYBASE.sh;
|
||||||
|
/opt/sybase/OCS-16_0/bin/isql -Usa -P myPassword -S MYSYBASE <<EOF
|
||||||
|
Select name from sysdatabases where status2 & 48 > 0
|
||||||
|
go
|
||||||
|
quit
|
||||||
|
EOF
|
||||||
|
"
|
||||||
|
}
|
||||||
|
START_STATUS=0
|
||||||
|
j=1
|
||||||
|
while (( $j < 30 )); do
|
||||||
|
echo "Waiting for Sybase to start..."
|
||||||
|
sleep 1
|
||||||
|
j=$((j+1))
|
||||||
|
START_STATUS=$(sybase_check | grep '(0 rows affected)' | wc -c)
|
||||||
|
if (( $START_STATUS > 0 )); then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if (( $j == 30 )); then
|
||||||
|
echo "Failed starting Sybase"
|
||||||
|
docker ps -a
|
||||||
|
docker logs sybase
|
||||||
|
sybase_check
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
export SYBASE_DB=hibernate_orm_test
|
||||||
|
export SYBASE_USER=hibernate_orm_test
|
||||||
|
export SYBASE_PASSWORD=hibernate_orm_test
|
||||||
|
docker exec sybase bash -c "source /opt/sybase/SYBASE.sh;
|
||||||
|
cat <<-EOSQL > init1.sql
|
||||||
|
use master
|
||||||
|
go
|
||||||
|
disk resize name='master', size='256m'
|
||||||
|
go
|
||||||
|
create database $SYBASE_DB on master = '96m'
|
||||||
|
go
|
||||||
|
sp_dboption $SYBASE_DB, \"single user\", true
|
||||||
|
go
|
||||||
|
alter database $SYBASE_DB log on master = '50m'
|
||||||
|
go
|
||||||
|
use $SYBASE_DB
|
||||||
|
go
|
||||||
|
exec sp_extendsegment logsegment, $SYBASE_DB, master
|
||||||
|
go
|
||||||
|
use master
|
||||||
|
go
|
||||||
|
sp_dboption $SYBASE_DB, \"single user\", false
|
||||||
|
go
|
||||||
|
use $SYBASE_DB
|
||||||
|
go
|
||||||
|
checkpoint
|
||||||
|
go
|
||||||
|
use master
|
||||||
|
go
|
||||||
|
create login $SYBASE_USER with password $SYBASE_PASSWORD
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'abort tran on log full', true
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'allow nulls by default', true
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'ddl in tran', true
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'trunc log on chkpt', true
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'full logging for select into', true
|
||||||
|
go
|
||||||
|
exec sp_dboption $SYBASE_DB, 'full logging for alter table', true
|
||||||
|
go
|
||||||
|
sp_dboption $SYBASE_DB, \"select into\", true
|
||||||
|
go
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
/opt/sybase/OCS-16_0/bin/isql -Usa -P myPassword -S MYSYBASE -i ./init1.sql
|
||||||
|
|
||||||
|
echo =============== CREATING DB ==========================
|
||||||
|
cat <<-EOSQL > init2.sql
|
||||||
|
use $SYBASE_DB
|
||||||
|
go
|
||||||
|
sp_adduser '$SYBASE_USER', '$SYBASE_USER', null
|
||||||
|
go
|
||||||
|
grant create default to $SYBASE_USER
|
||||||
|
go
|
||||||
|
grant create table to $SYBASE_USER
|
||||||
|
go
|
||||||
|
grant create view to $SYBASE_USER
|
||||||
|
go
|
||||||
|
grant create rule to $SYBASE_USER
|
||||||
|
go
|
||||||
|
grant create function to $SYBASE_USER
|
||||||
|
go
|
||||||
|
grant create procedure to $SYBASE_USER
|
||||||
|
go
|
||||||
|
commit
|
||||||
|
go
|
||||||
|
EOSQL
|
||||||
|
|
||||||
|
/opt/sybase/OCS-16_0/bin/isql -Usa -P myPassword -S MYSYBASE -i ./init2.sql"
|
||||||
|
echo "Sybase successfully started"
|
||||||
|
}
|
||||||
|
|
||||||
oracle() {
|
oracle() {
|
||||||
docker rm -f oracle || true
|
docker rm -f oracle || true
|
||||||
# We need to use the defaults
|
# We need to use the defaults
|
||||||
@ -158,6 +284,7 @@ EOF\""
|
|||||||
}
|
}
|
||||||
|
|
||||||
oracle_ee() {
|
oracle_ee() {
|
||||||
|
#docker login
|
||||||
docker rm -f oracle || true
|
docker rm -f oracle || true
|
||||||
# We need to use the defaults
|
# We need to use the defaults
|
||||||
# sys as sysdba/Oradoc_db1
|
# sys as sysdba/Oradoc_db1
|
||||||
@ -244,18 +371,21 @@ EOF
|
|||||||
if [ -z ${1} ]; then
|
if [ -z ${1} ]; then
|
||||||
echo "No db name provided"
|
echo "No db name provided"
|
||||||
echo "Provide one of:"
|
echo "Provide one of:"
|
||||||
|
echo -e "\tcockroachdb"
|
||||||
|
echo -e "\tdb2"
|
||||||
|
echo -e "\tdb2_spatial"
|
||||||
|
echo -e "\tedb"
|
||||||
|
echo -e "\thana"
|
||||||
|
echo -e "\tmariadb"
|
||||||
|
echo -e "\tmssql"
|
||||||
echo -e "\tmysql_5_7"
|
echo -e "\tmysql_5_7"
|
||||||
echo -e "\tmysql_8_0"
|
echo -e "\tmysql_8_0"
|
||||||
echo -e "\tmariadb"
|
|
||||||
echo -e "\tpostgresql_9_5"
|
|
||||||
echo -e "\tpostgresql_13"
|
|
||||||
echo -e "\tdb2"
|
|
||||||
echo -e "\tmssql"
|
|
||||||
echo -e "\toracle"
|
echo -e "\toracle"
|
||||||
|
echo -e "\toracle_ee"
|
||||||
echo -e "\tpostgis"
|
echo -e "\tpostgis"
|
||||||
echo -e "\tdb2_spatial"
|
echo -e "\tpostgresql_13"
|
||||||
echo -e "\thana"
|
echo -e "\tpostgresql_9_5"
|
||||||
echo -e "\tcockroachdb"
|
echo -e "\tsybase"
|
||||||
else
|
else
|
||||||
${1}
|
${1}
|
||||||
fi
|
fi
|
||||||
|
@ -59,14 +59,6 @@ dependencies {
|
|||||||
testImplementation libraries.mockito_inline
|
testImplementation libraries.mockito_inline
|
||||||
|
|
||||||
testRuntimeOnly libraries.wildfly_transaction_client
|
testRuntimeOnly libraries.wildfly_transaction_client
|
||||||
testRuntimeOnly libraries.h2
|
|
||||||
testRuntimeOnly libraries.hsqldb
|
|
||||||
testRuntimeOnly libraries.postgresql
|
|
||||||
testRuntimeOnly libraries.mysql
|
|
||||||
testRuntimeOnly libraries.mariadb
|
|
||||||
testRuntimeOnly libraries.mssql
|
|
||||||
testRuntimeOnly libraries.hana
|
|
||||||
testRuntimeOnly libraries.cockroachdb
|
|
||||||
testRuntimeOnly libraries.ehcache3
|
testRuntimeOnly libraries.ehcache3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
package org.hibernate.userguide.mapping.basic;
|
package org.hibernate.userguide.mapping.basic;
|
||||||
|
|
||||||
import java.util.BitSet;
|
import java.util.BitSet;
|
||||||
|
import javax.persistence.Column;
|
||||||
import javax.persistence.ColumnResult;
|
import javax.persistence.ColumnResult;
|
||||||
import javax.persistence.ConstructorResult;
|
import javax.persistence.ConstructorResult;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
@ -94,7 +95,7 @@ protected boolean isCleanupTestDataRequired() {
|
|||||||
query =
|
query =
|
||||||
"SELECT " +
|
"SELECT " +
|
||||||
" pr.id AS \"pr.id\", " +
|
" pr.id AS \"pr.id\", " +
|
||||||
" pr.bitset AS \"pr.bitset\" " +
|
" pr.bitset_col AS \"pr.bitset\" " +
|
||||||
"FROM Product pr " +
|
"FROM Product pr " +
|
||||||
"WHERE pr.id = :id",
|
"WHERE pr.id = :id",
|
||||||
resultSetMapping = "Person"
|
resultSetMapping = "Person"
|
||||||
@ -117,6 +118,7 @@ public static class Product {
|
|||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
||||||
@Type( type = "bitset" )
|
@Type( type = "bitset" )
|
||||||
|
@Column(name = "bitset_col")
|
||||||
private BitSet bitSet;
|
private BitSet bitSet;
|
||||||
|
|
||||||
//Constructors, getters, and setters are omitted for brevity
|
//Constructors, getters, and setters are omitted for brevity
|
||||||
|
@ -14,8 +14,10 @@
|
|||||||
import javax.persistence.Temporal;
|
import javax.persistence.Temporal;
|
||||||
import javax.persistence.TemporalType;
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
|
|
||||||
|
import org.hibernate.testing.SkipForDialect;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||||
@ -33,6 +35,7 @@ protected Class<?>[] getAnnotatedClasses() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@SkipForDialect(value = SybaseDialect.class, comment = "The jTDS driver doesn't allow setting a timestamp through setTime")
|
||||||
public void testLifecycle() {
|
public void testLifecycle() {
|
||||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||||
DateEvent dateEvent = new DateEvent( new Date() );
|
DateEvent dateEvent = new DateEvent( new Date() );
|
||||||
|
@ -10,11 +10,8 @@
|
|||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
||||||
import org.hibernate.annotations.Nationalized;
|
import org.hibernate.annotations.Nationalized;
|
||||||
import org.hibernate.dialect.DerbyDialect;
|
|
||||||
import org.hibernate.dialect.PostgreSQL81Dialect;
|
|
||||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||||
|
|
||||||
import org.hibernate.testing.SkipForDialect;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||||
@ -23,13 +20,6 @@
|
|||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
||||||
*/
|
*/
|
||||||
@SkipForDialect(
|
|
||||||
value = {
|
|
||||||
PostgreSQL81Dialect.class,
|
|
||||||
DerbyDialect.class
|
|
||||||
},
|
|
||||||
comment = "@see https://hibernate.atlassian.net/browse/HHH-10693 and Derby doesn't support nationalized type"
|
|
||||||
)
|
|
||||||
public class NationalizedTest extends BaseEntityManagerFunctionalTestCase {
|
public class NationalizedTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
import org.hibernate.annotations.Subselect;
|
import org.hibernate.annotations.Subselect;
|
||||||
import org.hibernate.annotations.Synchronize;
|
import org.hibernate.annotations.Synchronize;
|
||||||
import org.hibernate.dialect.DerbyDialect;
|
import org.hibernate.dialect.DerbyDialect;
|
||||||
|
import org.hibernate.dialect.SybaseASEDialect;
|
||||||
|
|
||||||
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
|
||||||
import org.hibernate.testing.orm.junit.Jpa;
|
import org.hibernate.testing.orm.junit.Jpa;
|
||||||
@ -37,6 +38,7 @@
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
@SkipForDialect( dialectClass = DerbyDialect.class, reason = "Derby doesn't support a CONCAT function" )
|
@SkipForDialect( dialectClass = DerbyDialect.class, reason = "Derby doesn't support a CONCAT function" )
|
||||||
|
@SkipForDialect( dialectClass = SybaseASEDialect.class, reason = "Sybase doesn't support a CONCAT function" )
|
||||||
public class SubselectTest {
|
public class SubselectTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -97,7 +97,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## TimesTen
|
## TimesTen
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.TimesTenDialect
|
#hibernate.dialect org.hibernate.community.dialect.TimesTenDialect
|
||||||
#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
|
#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
|
||||||
#hibernate.connection.url jdbc:timesten:direct:test
|
#hibernate.connection.url jdbc:timesten:direct:test
|
||||||
#hibernate.connection.username
|
#hibernate.connection.username
|
||||||
@ -138,7 +138,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## SAP MaxDB
|
## SAP MaxDB
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.MaxDBDialect
|
#hibernate.dialect org.hibernate.community.dialect.MaxDBDialect
|
||||||
#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
|
#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
|
||||||
#hibernate.connection.url jdbc:sapdb://localhost/TST
|
#hibernate.connection.url jdbc:sapdb://localhost/TST
|
||||||
#hibernate.connection.username TEST
|
#hibernate.connection.username TEST
|
||||||
@ -181,7 +181,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## older versions (before Ingress 2006)
|
## older versions (before Ingress 2006)
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.IngresDialect
|
#hibernate.dialect org.hibernate.community.dialect.IngresDialect
|
||||||
#hibernate.connection.driver_class ca.edbc.jdbc.EdbcDriver
|
#hibernate.connection.driver_class ca.edbc.jdbc.EdbcDriver
|
||||||
#hibernate.connection.url jdbc:edbc://localhost:II7/database
|
#hibernate.connection.url jdbc:edbc://localhost:II7/database
|
||||||
#hibernate.connection.username user
|
#hibernate.connection.username user
|
||||||
@ -189,7 +189,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## Ingres 2006 or later
|
## Ingres 2006 or later
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.IngresDialect
|
#hibernate.dialect org.hibernate.community.dialect.IngresDialect
|
||||||
#hibernate.connection.driver_class com.ingres.jdbc.IngresDriver
|
#hibernate.connection.driver_class com.ingres.jdbc.IngresDriver
|
||||||
#hibernate.connection.url jdbc:ingres://localhost:II7/database;CURSOR=READONLY;auto=multi
|
#hibernate.connection.url jdbc:ingres://localhost:II7/database;CURSOR=READONLY;auto=multi
|
||||||
#hibernate.connection.username user
|
#hibernate.connection.username user
|
||||||
@ -197,7 +197,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## Mimer SQL
|
## Mimer SQL
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.MimerSQLDialect
|
#hibernate.dialect org.hibernate.community.dialect.MimerSQLDialect
|
||||||
#hibernate.connection.driver_class com.mimer.jdbc.Driver
|
#hibernate.connection.driver_class com.mimer.jdbc.Driver
|
||||||
#hibernate.connection.url jdbc:mimer:multi1
|
#hibernate.connection.url jdbc:mimer:multi1
|
||||||
#hibernate.connection.username hibernate
|
#hibernate.connection.username hibernate
|
||||||
@ -206,7 +206,7 @@ hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
|
|||||||
|
|
||||||
## InterSystems Cache
|
## InterSystems Cache
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.Cache71Dialect
|
#hibernate.dialect org.hibernate.community.dialect.Cache71Dialect
|
||||||
#hibernate.connection.driver_class com.intersys.jdbc.CacheDriver
|
#hibernate.connection.driver_class com.intersys.jdbc.CacheDriver
|
||||||
#hibernate.connection.username _SYSTEM
|
#hibernate.connection.username _SYSTEM
|
||||||
#hibernate.connection.password SYS
|
#hibernate.connection.password SYS
|
||||||
|
@ -80,7 +80,7 @@ hibernate.connection.url @DB_URL@
|
|||||||
|
|
||||||
## TimesTen (not supported yet)
|
## TimesTen (not supported yet)
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.TimesTenDialect
|
#hibernate.dialect org.hibernate.community.dialect.TimesTenDialect
|
||||||
#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
|
#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
|
||||||
#hibernate.connection.url jdbc:timesten:direct:test
|
#hibernate.connection.url jdbc:timesten:direct:test
|
||||||
#hibernate.connection.username
|
#hibernate.connection.username
|
||||||
@ -121,7 +121,7 @@ hibernate.connection.url @DB_URL@
|
|||||||
|
|
||||||
## SAP MaxDB
|
## SAP MaxDB
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.MaxDBDialect
|
#hibernate.dialect org.hibernate.community.dialect.MaxDBDialect
|
||||||
#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
|
#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
|
||||||
#hibernate.connection.url jdbc:sapdb://localhost/TST
|
#hibernate.connection.url jdbc:sapdb://localhost/TST
|
||||||
#hibernate.connection.username TEST
|
#hibernate.connection.username TEST
|
||||||
@ -158,7 +158,7 @@ hibernate.connection.url @DB_URL@
|
|||||||
|
|
||||||
## Ingres
|
## Ingres
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.IngresDialect
|
#hibernate.dialect org.hibernate.community.dialect.IngresDialect
|
||||||
#hibernate.connection.driver_class ca.edbc.jdbc.EdbcDriver
|
#hibernate.connection.driver_class ca.edbc.jdbc.EdbcDriver
|
||||||
#hibernate.connection.url jdbc:edbc://localhost:II7/database
|
#hibernate.connection.url jdbc:edbc://localhost:II7/database
|
||||||
#hibernate.connection.username user
|
#hibernate.connection.username user
|
||||||
@ -167,7 +167,7 @@ hibernate.connection.url @DB_URL@
|
|||||||
|
|
||||||
## Mimer SQL
|
## Mimer SQL
|
||||||
|
|
||||||
#hibernate.dialect org.hibernate.dialect.MimerSQLDialect
|
#hibernate.dialect org.hibernate.community.dialect.MimerSQLDialect
|
||||||
#hibernate.connection.driver_class com.mimer.jdbc.Driver
|
#hibernate.connection.driver_class com.mimer.jdbc.Driver
|
||||||
#hibernate.connection.url jdbc:mimer:multi1
|
#hibernate.connection.url jdbc:mimer:multi1
|
||||||
#hibernate.connection.username hibernate
|
#hibernate.connection.username hibernate
|
||||||
|
@ -57,16 +57,39 @@ ext {
|
|||||||
// Disable prepared statement caching due to https://www.postgresql.org/message-id/CAEcMXhmmRd4-%2BNQbnjDT26XNdUoXdmntV9zdr8%3DTu8PL9aVCYg%40mail.gmail.com
|
// Disable prepared statement caching due to https://www.postgresql.org/message-id/CAEcMXhmmRd4-%2BNQbnjDT26XNdUoXdmntV9zdr8%3DTu8PL9aVCYg%40mail.gmail.com
|
||||||
'jdbc.url' : 'jdbc:postgresql://' + dbHost + '/hibernate_orm_test?preparedStatementCacheQueries=0'
|
'jdbc.url' : 'jdbc:postgresql://' + dbHost + '/hibernate_orm_test?preparedStatementCacheQueries=0'
|
||||||
],
|
],
|
||||||
|
edb_ci : [
|
||||||
|
'db.dialect' : 'org.hibernate.dialect.PostgresPlusDialect',
|
||||||
|
'jdbc.driver': 'org.postgresql.Driver',
|
||||||
|
'jdbc.user' : 'hibernate_orm_test',
|
||||||
|
'jdbc.pass' : 'hibernate_orm_test',
|
||||||
|
// Disable prepared statement caching due to https://www.postgresql.org/message-id/CAEcMXhmmRd4-%2BNQbnjDT26XNdUoXdmntV9zdr8%3DTu8PL9aVCYg%40mail.gmail.com
|
||||||
|
'jdbc.url' : 'jdbc:postgresql://' + dbHost + '/hibernate_orm_test?preparedStatementCacheQueries=0'
|
||||||
|
],
|
||||||
|
sybase_ci : [
|
||||||
|
'db.dialect' : 'org.hibernate.dialect.SybaseASEDialect',
|
||||||
|
'jdbc.driver': 'net.sourceforge.jtds.jdbc.Driver',
|
||||||
|
'jdbc.user' : 'hibernate_orm_test',
|
||||||
|
'jdbc.pass' : 'hibernate_orm_test',
|
||||||
|
// Disable prepared statement caching to avoid issues with changing schemas
|
||||||
|
'jdbc.url' : 'jdbc:jtds:sybase://' + dbHost + ':5000/hibernate_orm_test;maxStatements=0;cacheMetaData=false'
|
||||||
|
],
|
||||||
mysql : [
|
mysql : [
|
||||||
'db.dialect' : 'org.hibernate.dialect.MySQLDialect',
|
'db.dialect' : 'org.hibernate.dialect.MySQLDialect',
|
||||||
'jdbc.driver': 'com.mysql.jdbc.Driver',
|
'jdbc.driver': 'com.mysql.cj.jdbc.Driver',
|
||||||
'jdbc.user' : 'hibernateormtest',
|
'jdbc.user' : 'hibernateormtest',
|
||||||
'jdbc.pass' : 'hibernateormtest',
|
'jdbc.pass' : 'hibernateormtest',
|
||||||
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test'
|
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test'
|
||||||
],
|
],
|
||||||
mysql_docker : [
|
mysql_docker : [
|
||||||
'db.dialect' : 'org.hibernate.dialect.MySQLDialect',
|
'db.dialect' : 'org.hibernate.dialect.MySQLDialect',
|
||||||
'jdbc.driver': 'com.mysql.jdbc.Driver',
|
'jdbc.driver': 'com.mysql.cj.jdbc.Driver',
|
||||||
|
'jdbc.user' : 'hibernate_orm_test',
|
||||||
|
'jdbc.pass' : 'hibernate_orm_test',
|
||||||
|
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test?useSSL=false'
|
||||||
|
],
|
||||||
|
mysql_ci : [
|
||||||
|
'db.dialect' : 'org.hibernate.dialect.MySQLDialect',
|
||||||
|
'jdbc.driver': 'com.mysql.cj.jdbc.Driver',
|
||||||
'jdbc.user' : 'hibernate_orm_test',
|
'jdbc.user' : 'hibernate_orm_test',
|
||||||
'jdbc.pass' : 'hibernate_orm_test',
|
'jdbc.pass' : 'hibernate_orm_test',
|
||||||
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test?useSSL=false'
|
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test?useSSL=false'
|
||||||
@ -77,7 +100,7 @@ ext {
|
|||||||
'jdbc.driver': 'com.mysql.cj.jdbc.Driver',
|
'jdbc.driver': 'com.mysql.cj.jdbc.Driver',
|
||||||
'jdbc.user' : 'hibernate_orm_test',
|
'jdbc.user' : 'hibernate_orm_test',
|
||||||
'jdbc.pass' : 'hibernate_orm_test',
|
'jdbc.pass' : 'hibernate_orm_test',
|
||||||
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test?allowPublicKeyRetrieval=true&useSSL=false'
|
'jdbc.url' : 'jdbc:mysql://' + dbHost + '/hibernate_orm_test?useSSL=false'
|
||||||
],
|
],
|
||||||
mariadb : [
|
mariadb : [
|
||||||
'db.dialect' : 'org.hibernate.dialect.MariaDBDialect',
|
'db.dialect' : 'org.hibernate.dialect.MariaDBDialect',
|
||||||
|
@ -89,9 +89,9 @@ dependencies {
|
|||||||
testRuntimeOnly libraries.mariadb
|
testRuntimeOnly libraries.mariadb
|
||||||
testRuntimeOnly libraries.mssql
|
testRuntimeOnly libraries.mssql
|
||||||
testRuntimeOnly libraries.informix
|
testRuntimeOnly libraries.informix
|
||||||
testRuntimeOnly libraries.hana
|
|
||||||
testRuntimeOnly libraries.cockroachdb
|
testRuntimeOnly libraries.cockroachdb
|
||||||
testRuntimeOnly libraries.oracle
|
testRuntimeOnly libraries.oracle
|
||||||
|
testRuntimeOnly libraries.sybase
|
||||||
|
|
||||||
// Since both the DB2 driver and HANA have a package "net.jpountz" we have to add dependencies conditionally
|
// Since both the DB2 driver and HANA have a package "net.jpountz" we have to add dependencies conditionally
|
||||||
// This is due to the "no split-packages" requirement of Java 9+
|
// This is due to the "no split-packages" requirement of Java 9+
|
||||||
|
@ -139,7 +139,7 @@ ext {
|
|||||||
byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}",
|
byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}",
|
||||||
byteman_bmunit: "org.jboss.byteman:byteman-bmunit:${bytemanVersion}",
|
byteman_bmunit: "org.jboss.byteman:byteman-bmunit:${bytemanVersion}",
|
||||||
h2: "com.h2database:h2:${h2Version}",
|
h2: "com.h2database:h2:${h2Version}",
|
||||||
hsqldb: "org.hsqldb:hsqldb:2.3.2",
|
hsqldb: "org.hsqldb:hsqldb:2.3.6",
|
||||||
derby: "org.apache.derby:derby:10.11.1.1",
|
derby: "org.apache.derby:derby:10.11.1.1",
|
||||||
postgresql: 'org.postgresql:postgresql:42.2.16',
|
postgresql: 'org.postgresql:postgresql:42.2.16',
|
||||||
mysql: 'mysql:mysql-connector-java:8.0.17',
|
mysql: 'mysql:mysql-connector-java:8.0.17',
|
||||||
@ -150,6 +150,7 @@ ext {
|
|||||||
mssql: 'com.microsoft.sqlserver:mssql-jdbc:7.2.1.jre8',
|
mssql: 'com.microsoft.sqlserver:mssql-jdbc:7.2.1.jre8',
|
||||||
db2: 'com.ibm.db2:jcc:11.5.4.0',
|
db2: 'com.ibm.db2:jcc:11.5.4.0',
|
||||||
hana: 'com.sap.cloud.db.jdbc:ngdbc:2.4.59',
|
hana: 'com.sap.cloud.db.jdbc:ngdbc:2.4.59',
|
||||||
|
sybase: 'net.sourceforge.jtds:jtds:1.3.1',
|
||||||
|
|
||||||
jodaTime: "joda-time:joda-time:${jodaTimeVersion}",
|
jodaTime: "joda-time:joda-time:${jodaTimeVersion}",
|
||||||
|
|
||||||
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
description = 'Hibernate\'s community supported dialects'
|
||||||
|
|
||||||
|
apply from: rootProject.file( 'gradle/published-java-module.gradle' )
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api( project( ':hibernate-core' ) ) {
|
||||||
|
// Exclude access to this to avoid future use.
|
||||||
|
// todo (6.0) : this should no longer be transitive from core. Come back and verify this
|
||||||
|
exclude group: "org.javassist", module: "javassist"
|
||||||
|
}
|
||||||
|
|
||||||
|
implementation libraries.commons_annotations
|
||||||
|
|
||||||
|
// TODO HHH-13703: get rid of this dependency
|
||||||
|
implementation libraries.dom4j
|
||||||
|
|
||||||
|
testImplementation project( ':hibernate-testing' )
|
||||||
|
testImplementation project( path: ':hibernate-core', configuration: 'tests' )
|
||||||
|
}
|
||||||
|
|
||||||
|
//test {
|
||||||
|
// dependsOn project(':hibernate-core').tasks.compileTestJava
|
||||||
|
// test.testClassesDirs = project(':hibernate-core').tasks.test.testClassesDirs
|
||||||
|
//}
|
@ -4,16 +4,18 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.OracleDialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.identity.CUBRIDIdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.CUBRIDIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.LimitLimitHandler;
|
import org.hibernate.dialect.pagination.LimitLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.CUBRIDSequenceSupport;
|
import org.hibernate.community.dialect.sequence.CUBRIDSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.jdbc.Size;
|
import org.hibernate.engine.jdbc.Size;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
@ -25,7 +27,7 @@
|
|||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorCUBRIDDatabaseImpl;
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorCUBRIDDatabaseImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeDescriptorRegistry;
|
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeDescriptorRegistry;
|
||||||
@ -288,6 +290,16 @@ public boolean supportsTupleDistinctCounts() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsTemporaryTables() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
return new StandardSqlAstTranslatorFactory() {
|
return new StandardSqlAstTranslatorFactory() {
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Caché 2007.1 dialect.
|
* Caché 2007.1 dialect.
|
||||||
@ -69,7 +69,7 @@
|
|||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>hibernate.dialect</td>
|
* <td>hibernate.dialect</td>
|
||||||
* <td>org.hibernate.dialect.Cache71Dialect</td>
|
* <td>org.hibernate.community.dialect.Cache71Dialect</td>
|
||||||
* </tr>
|
* </tr>
|
||||||
* <tr>
|
* <tr>
|
||||||
* <td>hibernate.connection.driver_class</td>
|
* <td>hibernate.connection.driver_class</td>
|
||||||
@ -104,7 +104,7 @@
|
|||||||
* <br>
|
* <br>
|
||||||
* <p/>
|
* <p/>
|
||||||
* <ol>
|
* <ol>
|
||||||
* <li>org.hibernate.dialect.Cache71Dialect (requires Caché
|
* <li>org.hibernate.community.dialect.Cache71Dialect (requires Caché
|
||||||
* 2007.1 or above)</li>
|
* 2007.1 or above)</li>
|
||||||
* <p/>
|
* <p/>
|
||||||
* </ol>
|
* </ol>
|
@ -4,17 +4,19 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.OracleDialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.identity.CacheIdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.CacheIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.lock.*;
|
import org.hibernate.dialect.lock.*;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.TopLimitHandler;
|
import org.hibernate.dialect.pagination.TopLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.CacheSequenceSupport;
|
import org.hibernate.community.dialect.sequence.CacheSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.exception.ConstraintViolationException;
|
import org.hibernate.exception.ConstraintViolationException;
|
||||||
@ -26,7 +28,6 @@
|
|||||||
import org.hibernate.persister.entity.Lockable;
|
import org.hibernate.persister.entity.Lockable;
|
||||||
import org.hibernate.query.TemporalUnit;
|
import org.hibernate.query.TemporalUnit;
|
||||||
import org.hibernate.query.spi.QueryEngine;
|
import org.hibernate.query.spi.QueryEngine;
|
||||||
import org.hibernate.sql.CacheJoinFragment;
|
|
||||||
import org.hibernate.sql.JoinFragment;
|
import org.hibernate.sql.JoinFragment;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslator;
|
import org.hibernate.sql.ast.SqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
||||||
@ -400,6 +401,12 @@ public boolean areStringComparisonsCaseInsensitive() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOrderByInSubquery() {
|
||||||
|
// This is just a guess
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() {
|
public boolean supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() {
|
||||||
return false;
|
return false;
|
@ -1,26 +1,28 @@
|
|||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.sql;
|
package org.hibernate.community.dialect;
|
||||||
import org.hibernate.AssertionFailure;
|
import org.hibernate.AssertionFailure;
|
||||||
|
import org.hibernate.sql.ANSIJoinFragment;
|
||||||
/**
|
import org.hibernate.sql.JoinType;
|
||||||
* A Caché dialect join. Differs from ANSI only in that full outer join
|
|
||||||
* is not supported.
|
/**
|
||||||
*
|
* A Caché dialect join. Differs from ANSI only in that full outer join
|
||||||
* @author Jeff Miller
|
* is not supported.
|
||||||
* @author Jonathan Levinson
|
*
|
||||||
*/
|
* @author Jeff Miller
|
||||||
public class CacheJoinFragment extends ANSIJoinFragment {
|
* @author Jonathan Levinson
|
||||||
|
*/
|
||||||
public void addJoin(String rhsTableName, String rhsAlias, String[] lhsColumns, String[] rhsColumns, JoinType joinType, String on) {
|
public class CacheJoinFragment extends ANSIJoinFragment {
|
||||||
if ( joinType == JoinType.FULL_JOIN ) {
|
|
||||||
throw new AssertionFailure( "Cache does not support full outer joins" );
|
public void addJoin(String rhsTableName, String rhsAlias, String[] lhsColumns, String[] rhsColumns, JoinType joinType, String on) {
|
||||||
}
|
if ( joinType == JoinType.FULL_JOIN ) {
|
||||||
super.addJoin( rhsTableName, rhsAlias, lhsColumns, rhsColumns, joinType, on );
|
throw new AssertionFailure( "Cache does not support full outer joins" );
|
||||||
}
|
}
|
||||||
|
super.addJoin( rhsTableName, rhsAlias, lhsColumns, rhsColumns, joinType, on );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -54,14 +54,14 @@ protected boolean needsRowsToSkip() {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void visitSqlSelections(SelectClause selectClause) {
|
protected void visitSqlSelections(SelectClause selectClause) {
|
||||||
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true );
|
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true, true );
|
||||||
super.visitSqlSelections( selectClause );
|
super.visitSqlSelections( selectClause );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderTopClause(QuerySpec querySpec, boolean addOffset) {
|
protected void renderTopClause(QuerySpec querySpec, boolean addOffset, boolean needsParenthesis) {
|
||||||
assertRowsOnlyFetchClauseType( querySpec );
|
assertRowsOnlyFetchClauseType( querySpec );
|
||||||
super.renderTopClause( querySpec, addOffset );
|
super.renderTopClause( querySpec, addOffset, needsParenthesis );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -0,0 +1,238 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.Database;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A list of community maintained relational database systems for which Hibernate can resolve a {@link Dialect}.
|
||||||
|
*
|
||||||
|
* However, Hibernate can work with other database systems that are not listed by the {@link Database}
|
||||||
|
* enumeration, as long as a {@link Dialect} implementation class is provided via the {@code hibernate.dialect}
|
||||||
|
* configuration property.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
*/
|
||||||
|
public enum CommunityDatabase {
|
||||||
|
|
||||||
|
SQLITE {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new SQLiteDialect( info );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.startsWith( "SQLite" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
INGRES {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new IngresDialect( info );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.toLowerCase().startsWith( "ingres" );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "com.ingres.jdbc.IngresDriver";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
INFORMIX {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new InformixDialect( info );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
//usually "Informix Dynamic Server"
|
||||||
|
return databaseName.toLowerCase().startsWith( "informix" );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "com.informix.jdbc.IfxDriver" ;
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getUrlPrefix() {
|
||||||
|
return "jdbc:informix-";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
FIREBIRD {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new FirebirdDialect( info );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.startsWith( "Firebird" );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "org.firebirdsql.jdbc.FBDriver";
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getUrlPrefix() {
|
||||||
|
return "jdbc:firebirdsql:";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
CACHE {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new CacheDialect();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.startsWith( "Cache" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
CUBRID {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new CUBRIDDialect();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return "CUBRID".equalsIgnoreCase( databaseName );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "cubrid.jdbc.driver.CUBRIDDriver";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
MIMER {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new MimerSQLDialect();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.startsWith( "Mimer SQL" );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "com.mimer.jdbc.Driver";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
MAXDB {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new MaxDBDialect();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.toLowerCase().startsWith( "sap db" )
|
||||||
|
|| databaseName.toLowerCase().startsWith( "maxdb" );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "com.sap.dbtech.jdbc.DriverSapDB";
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getUrlPrefix() {
|
||||||
|
return "jdbc:sapdb:";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
SYBASE_ANYWHERE {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
final String databaseName = info.getDatabaseName();
|
||||||
|
if ( isASA( databaseName ) ) {
|
||||||
|
return new SybaseAnywhereDialect( info );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
private boolean isASA(String databaseName) {
|
||||||
|
return databaseName.startsWith( "Adaptive Server Anywhere" )
|
||||||
|
|| "SQL Anywhere".equals( databaseName );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String productName) {
|
||||||
|
return isASA( productName );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean matchesUrl(String jdbcUrl) {
|
||||||
|
return jdbcUrl.startsWith( "jdbc:sybase:" )
|
||||||
|
|| jdbcUrl.startsWith( "jdbc:sqlanywhere:" );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
TERADATA {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new TeradataDialect( info );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return "Teradata".equals( databaseName );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return "com.teradata.jdbc.TeraDriver";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
TIMESTEN {
|
||||||
|
@Override
|
||||||
|
public Dialect createDialect(DialectResolutionInfo info) {
|
||||||
|
return new TimesTenDialect();
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public boolean productNameMatches(String databaseName) {
|
||||||
|
return databaseName.toLowerCase().startsWith( "timesten" );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this database match the given metadata?
|
||||||
|
*/
|
||||||
|
public boolean matchesResolutionInfo(DialectResolutionInfo info) {
|
||||||
|
return productNameMatches( info.getDatabaseName() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this database have the given product name?
|
||||||
|
*/
|
||||||
|
public abstract boolean productNameMatches(String productName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a {@link Dialect} for the given metadata.
|
||||||
|
*/
|
||||||
|
public abstract Dialect createDialect(DialectResolutionInfo info);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the name of the JDBC driver class for this database,
|
||||||
|
* or null if we're not too sure what it should be.
|
||||||
|
*/
|
||||||
|
public String getDriverClassName(String jdbcUrl) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the JDBC URL prefix used by this database.
|
||||||
|
*/
|
||||||
|
public String getUrlPrefix() {
|
||||||
|
return "jdbc:" + toString().toLowerCase() + ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the given JDBC URL connect to this database?
|
||||||
|
*/
|
||||||
|
public boolean matchesUrl(String jdbcUrl) {
|
||||||
|
return jdbcUrl.toLowerCase().startsWith( getUrlPrefix() );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The DialectResolver implementation for community maintained dialects
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
*/
|
||||||
|
public class CommunityDialectResolver implements DialectResolver {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialect resolveDialect(DialectResolutionInfo info) {
|
||||||
|
for ( CommunityDatabase database : CommunityDatabase.values() ) {
|
||||||
|
if ( database.matchesResolutionInfo( info ) ) {
|
||||||
|
return database.createDialect( info );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.boot.registry.selector.spi.DialectSelector;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
|
||||||
|
public class CommunityDialectSelector implements DialectSelector {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends Dialect> resolve(String name) {
|
||||||
|
Objects.requireNonNull( name );
|
||||||
|
if ( name.isEmpty() ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
switch ( name ) {
|
||||||
|
case "Cache":
|
||||||
|
return CacheDialect.class;
|
||||||
|
case "Cache71":
|
||||||
|
return Cache71Dialect.class;
|
||||||
|
case "CUBRID":
|
||||||
|
return CUBRIDDialect.class;
|
||||||
|
case "Firebird":
|
||||||
|
return FirebirdDialect.class;
|
||||||
|
case "Informix":
|
||||||
|
return InformixDialect.class;
|
||||||
|
case "Informix10":
|
||||||
|
return Informix10Dialect.class;
|
||||||
|
case "Ingres":
|
||||||
|
return IngresDialect.class;
|
||||||
|
case "Ingres9":
|
||||||
|
return Ingres9Dialect.class;
|
||||||
|
case "Ingres10":
|
||||||
|
return Ingres10Dialect.class;
|
||||||
|
case "MimerSQL":
|
||||||
|
return MimerSQLDialect.class;
|
||||||
|
case "RDMSOS2200":
|
||||||
|
return RDMSOS2200Dialect.class;
|
||||||
|
case "SAPDB":
|
||||||
|
return SAPDBDialect.class;
|
||||||
|
case "MaxDB":
|
||||||
|
return MaxDBDialect.class;
|
||||||
|
case "SybaseAnywhere":
|
||||||
|
return SybaseAnywhereDialect.class;
|
||||||
|
case "Teradata":
|
||||||
|
return TeradataDialect.class;
|
||||||
|
case "Teradata14":
|
||||||
|
return Teradata14Dialect.class;
|
||||||
|
case "TimesTen":
|
||||||
|
return TimesTenDialect.class;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,20 +4,22 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.NotYetImplementedFor6Exception;
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
|
import org.hibernate.dialect.BooleanDecoder;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.query.NullOrdering;
|
import org.hibernate.query.NullOrdering;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.identity.FirebirdIdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.FirebirdIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
|
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
|
||||||
import org.hibernate.dialect.pagination.SkipFirstLimitHandler;
|
import org.hibernate.community.dialect.pagination.SkipFirstLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.FirebirdSequenceSupport;
|
import org.hibernate.community.dialect.sequence.FirebirdSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.InterbaseSequenceSupport;
|
import org.hibernate.community.dialect.sequence.InterbaseSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.jdbc.Size;
|
import org.hibernate.engine.jdbc.Size;
|
||||||
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
@ -46,7 +48,7 @@
|
|||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorFirebirdDatabaseImpl;
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorFirebirdDatabaseImpl;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceNameExtractorImpl;
|
import org.hibernate.tool.schema.extract.internal.SequenceNameExtractorImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
@ -317,6 +319,11 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsTruncateWithCast(){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Firebird 2.5 doesn't have a real {@link java.sql.Types#BOOLEAN}
|
* Firebird 2.5 doesn't have a real {@link java.sql.Types#BOOLEAN}
|
||||||
* type, so...
|
* type, so...
|
||||||
@ -665,6 +672,21 @@ public boolean supportsNullPrecedence() {
|
|||||||
return getVersion() >= 150;
|
return getVersion() >= 150;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsValuesListForInsert() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWindowFunctions() {
|
||||||
|
return getVersion() >= 300;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String translateExtractField(TemporalUnit unit) {
|
public String translateExtractField(TemporalUnit unit) {
|
||||||
switch ( unit ) {
|
switch ( unit ) {
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
@ -1,21 +1,21 @@
|
|||||||
/*
|
/*
|
||||||
* Hibernate, Relational Persistence for Idiomatic Java
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
*
|
*
|
||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dialect for Informix 10
|
* Dialect for Informix 10
|
||||||
*
|
*
|
||||||
* @deprecated use {@code InformixDialect(10)}
|
* @deprecated use {@code InformixDialect(10)}
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public class Informix10Dialect extends InformixDialect {
|
public class Informix10Dialect extends InformixDialect {
|
||||||
|
|
||||||
public Informix10Dialect() {
|
public Informix10Dialect() {
|
||||||
super(10);
|
super(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -4,21 +4,25 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.boot.TempTableDdlTransactionHandling;
|
import org.hibernate.boot.TempTableDdlTransactionHandling;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.GroupByConstantRenderingStrategy;
|
||||||
|
import org.hibernate.dialect.Replacer;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.function.CaseLeastGreatestEmulation;
|
import org.hibernate.dialect.function.CaseLeastGreatestEmulation;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.InformixIdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.InformixIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.FirstLimitHandler;
|
import org.hibernate.community.dialect.pagination.FirstLimitHandler;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.SkipFirstLimitHandler;
|
import org.hibernate.community.dialect.pagination.SkipFirstLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.InformixSequenceSupport;
|
import org.hibernate.community.dialect.sequence.InformixSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.dialect.unique.InformixUniqueDelegate;
|
import org.hibernate.community.dialect.unique.InformixUniqueDelegate;
|
||||||
import org.hibernate.dialect.unique.UniqueDelegate;
|
import org.hibernate.dialect.unique.UniqueDelegate;
|
||||||
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
|
import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
|
||||||
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
|
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
|
||||||
@ -27,17 +31,26 @@
|
|||||||
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
||||||
import org.hibernate.query.TemporalUnit;
|
import org.hibernate.query.TemporalUnit;
|
||||||
import org.hibernate.query.spi.QueryEngine;
|
import org.hibernate.query.spi.QueryEngine;
|
||||||
|
import org.hibernate.query.spi.QueryOptions;
|
||||||
|
import org.hibernate.query.spi.QueryParameterBindings;
|
||||||
|
import org.hibernate.query.sqm.internal.DomainParameterXref;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.AfterUseAction;
|
import org.hibernate.query.sqm.mutation.internal.idtable.AfterUseAction;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.IdTable;
|
import org.hibernate.query.sqm.mutation.internal.idtable.IdTable;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.LocalTemporaryTableStrategy;
|
import org.hibernate.query.sqm.mutation.internal.idtable.LocalTemporaryTableStrategy;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
||||||
|
import org.hibernate.query.sqm.sql.SqmTranslator;
|
||||||
|
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
|
||||||
|
import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory;
|
||||||
|
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslator;
|
import org.hibernate.sql.ast.SqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.select.SelectStatement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorInformixDatabaseImpl;
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorInformixDatabaseImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
|
|
||||||
@ -165,6 +178,29 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
|
|||||||
queryEngine.getSqmFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) );
|
queryEngine.getSqmFunctionRegistry().register( "greatest", new CaseLeastGreatestEmulation( false ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqmTranslatorFactory getSqmTranslatorFactory() {
|
||||||
|
return new StandardSqmTranslatorFactory() {
|
||||||
|
@Override
|
||||||
|
public SqmTranslator<SelectStatement> createSelectTranslator(
|
||||||
|
SqmSelectStatement<?> sqmSelectStatement,
|
||||||
|
QueryOptions queryOptions,
|
||||||
|
DomainParameterXref domainParameterXref,
|
||||||
|
QueryParameterBindings domainParameterBindings,
|
||||||
|
LoadQueryInfluencers loadQueryInfluencers,
|
||||||
|
SqlAstCreationContext creationContext) {
|
||||||
|
return new InformixSqmToSqlAstConverter<>(
|
||||||
|
sqmSelectStatement,
|
||||||
|
queryOptions,
|
||||||
|
domainParameterXref,
|
||||||
|
domainParameterBindings,
|
||||||
|
loadQueryInfluencers,
|
||||||
|
creationContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
return new StandardSqlAstTranslatorFactory() {
|
return new StandardSqlAstTranslatorFactory() {
|
||||||
@ -294,6 +330,12 @@ public boolean supportsSelectQueryWithoutFromClause() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOrderByInSubquery() {
|
||||||
|
// This is just a guess
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
|
public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
|
||||||
return EXTRACTOR;
|
return EXTRACTOR;
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -114,11 +114,8 @@ protected void renderPartitionItem(Expression expression) {
|
|||||||
// We render an empty group instead of literals as some DBs don't support grouping by literals
|
// We render an empty group instead of literals as some DBs don't support grouping by literals
|
||||||
// Note that integer literals, which refer to select item positions, are handled in #visitGroupByClause
|
// Note that integer literals, which refer to select item positions, are handled in #visitGroupByClause
|
||||||
if ( expression instanceof Literal ) {
|
if ( expression instanceof Literal ) {
|
||||||
// todo (6.0): We need to introduce a dummy from clause item
|
// Note that this depends on the SqmToSqlAstConverter to add a dummy table group
|
||||||
// String fromItem = ", (select 1 x " + dialect.getFromDual() + ") dummy";
|
appendSql( "dummy_.x" );
|
||||||
// sqlBuffer.insert( fromEndIndex, fromItem );
|
|
||||||
// appendSql( "dummy.x" );
|
|
||||||
throw new UnsupportedOperationException( "Column reference strategy is not yet implemented!" );
|
|
||||||
}
|
}
|
||||||
else if ( expression instanceof Summarization ) {
|
else if ( expression instanceof Summarization ) {
|
||||||
// This could theoretically be emulated by rendering all grouping variations of the query and
|
// This could theoretically be emulated by rendering all grouping variations of the query and
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
|
import org.hibernate.query.spi.QueryOptions;
|
||||||
|
import org.hibernate.query.spi.QueryParameterBindings;
|
||||||
|
import org.hibernate.query.sqm.internal.DomainParameterXref;
|
||||||
|
import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter;
|
||||||
|
import org.hibernate.query.sqm.tree.SqmStatement;
|
||||||
|
import org.hibernate.query.sqm.tree.expression.SqmExpression;
|
||||||
|
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||||
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Literal;
|
||||||
|
import org.hibernate.sql.ast.tree.from.StandardTableGroup;
|
||||||
|
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||||
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SQM to SQL AST translator for Informix.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
*/
|
||||||
|
public class InformixSqmToSqlAstConverter<T extends Statement> extends BaseSqmToSqlAstConverter<T> {
|
||||||
|
|
||||||
|
private boolean needsDummyTableGroup;
|
||||||
|
|
||||||
|
public InformixSqmToSqlAstConverter(
|
||||||
|
SqmStatement<?> statement,
|
||||||
|
QueryOptions queryOptions,
|
||||||
|
DomainParameterXref domainParameterXref,
|
||||||
|
QueryParameterBindings domainParameterBindings,
|
||||||
|
LoadQueryInfluencers fetchInfluencers,
|
||||||
|
SqlAstCreationContext creationContext) {
|
||||||
|
super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
|
||||||
|
final boolean needsDummy = this.needsDummyTableGroup;
|
||||||
|
this.needsDummyTableGroup = false;
|
||||||
|
try {
|
||||||
|
final QuerySpec querySpec = super.visitQuerySpec( sqmQuerySpec );
|
||||||
|
if ( this.needsDummyTableGroup ) {
|
||||||
|
querySpec.getFromClause().addRoot(
|
||||||
|
new StandardTableGroup(
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
new TableReference(
|
||||||
|
"(select 1)",
|
||||||
|
"dummy_(x)",
|
||||||
|
false,
|
||||||
|
getCreationContext().getSessionFactory()
|
||||||
|
),
|
||||||
|
null,
|
||||||
|
getCreationContext().getSessionFactory()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return querySpec;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
this.needsDummyTableGroup = needsDummy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Expression resolveGroupOrOrderByExpression(SqmExpression<?> groupByClauseExpression) {
|
||||||
|
final Expression expression = super.resolveGroupOrOrderByExpression( groupByClauseExpression );
|
||||||
|
if ( expression instanceof Literal ) {
|
||||||
|
// Note that SqlAstTranslator.renderPartitionItem depends on this
|
||||||
|
this.needsDummyTableGroup = true;
|
||||||
|
}
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A SQL dialect for Ingres 10 and later versions.
|
* A SQL dialect for Ingres 10 and later versions.
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A SQL dialect for Ingres 9.3 and later versions.
|
* A SQL dialect for Ingres 9.3 and later versions.
|
@ -4,33 +4,47 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.GroupByConstantRenderingStrategy;
|
||||||
|
import org.hibernate.dialect.MySQLDialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.Ingres10IdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.Ingres10IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.Ingres9IdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.Ingres9IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.FirstLimitHandler;
|
import org.hibernate.community.dialect.pagination.FirstLimitHandler;
|
||||||
import org.hibernate.dialect.pagination.IngresLimitHandler;
|
import org.hibernate.community.dialect.pagination.IngresLimitHandler;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.sequence.ANSISequenceSupport;
|
import org.hibernate.dialect.sequence.ANSISequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
||||||
|
import org.hibernate.query.FetchClauseType;
|
||||||
import org.hibernate.query.TemporalUnit;
|
import org.hibernate.query.TemporalUnit;
|
||||||
import org.hibernate.query.spi.QueryEngine;
|
import org.hibernate.query.spi.QueryEngine;
|
||||||
|
import org.hibernate.query.spi.QueryOptions;
|
||||||
|
import org.hibernate.query.spi.QueryParameterBindings;
|
||||||
|
import org.hibernate.query.sqm.internal.DomainParameterXref;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.AfterUseAction;
|
import org.hibernate.query.sqm.mutation.internal.idtable.AfterUseAction;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.GlobalTemporaryTableStrategy;
|
import org.hibernate.query.sqm.mutation.internal.idtable.GlobalTemporaryTableStrategy;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.IdTable;
|
import org.hibernate.query.sqm.mutation.internal.idtable.IdTable;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
||||||
|
import org.hibernate.query.sqm.sql.SqmTranslator;
|
||||||
|
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
|
||||||
|
import org.hibernate.query.sqm.sql.StandardSqmTranslatorFactory;
|
||||||
|
import org.hibernate.query.sqm.tree.select.SqmSelectStatement;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslator;
|
import org.hibernate.sql.ast.SqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.select.SelectStatement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceNameExtractorImpl;
|
import org.hibernate.tool.schema.extract.internal.SequenceNameExtractorImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
@ -240,6 +254,29 @@ public void initializeFunctionRegistry(QueryEngine queryEngine) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqmTranslatorFactory getSqmTranslatorFactory() {
|
||||||
|
return new StandardSqmTranslatorFactory() {
|
||||||
|
@Override
|
||||||
|
public SqmTranslator<SelectStatement> createSelectTranslator(
|
||||||
|
SqmSelectStatement<?> sqmSelectStatement,
|
||||||
|
QueryOptions queryOptions,
|
||||||
|
DomainParameterXref domainParameterXref,
|
||||||
|
QueryParameterBindings domainParameterBindings,
|
||||||
|
LoadQueryInfluencers loadQueryInfluencers,
|
||||||
|
SqlAstCreationContext creationContext) {
|
||||||
|
return new IngresSqmToSqlAstConverter<>(
|
||||||
|
sqmSelectStatement,
|
||||||
|
queryOptions,
|
||||||
|
domainParameterXref,
|
||||||
|
domainParameterBindings,
|
||||||
|
loadQueryInfluencers,
|
||||||
|
creationContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
return new StandardSqlAstTranslatorFactory() {
|
return new StandardSqlAstTranslatorFactory() {
|
||||||
@ -385,6 +422,24 @@ public boolean supportsUnionAll() {
|
|||||||
return getVersion() >= 930;
|
return getVersion() >= 930;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsUnionInSubquery() {
|
||||||
|
// At least not according to HHH-3637
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsSubqueryInSelect() {
|
||||||
|
// At least according to HHH-4961
|
||||||
|
return getVersion() >= 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOrderByInSubquery() {
|
||||||
|
// This is just a guess
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// Informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -453,4 +508,8 @@ public GroupByConstantRenderingStrategy getGroupByConstantRenderingStrategy() {
|
|||||||
return GroupByConstantRenderingStrategy.COLUMN_REFERENCE;
|
return GroupByConstantRenderingStrategy.COLUMN_REFERENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsFetchClause(FetchClauseType type) {
|
||||||
|
return getVersion() >= 930;
|
||||||
|
}
|
||||||
}
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -119,11 +119,8 @@ protected void renderSelectTupleComparison(
|
|||||||
@Override
|
@Override
|
||||||
protected void renderPartitionItem(Expression expression) {
|
protected void renderPartitionItem(Expression expression) {
|
||||||
if ( expression instanceof Literal ) {
|
if ( expression instanceof Literal ) {
|
||||||
// todo (6.0): We need to introduce a dummy from clause item
|
// Note that this depends on the SqmToSqlAstConverter to add a dummy table group
|
||||||
// String fromItem = ", (select 1 x " + dialect.getFromDual() + ") dummy";
|
appendSql( "dummy_.x" );
|
||||||
// sqlBuffer.insert( fromEndIndex, fromItem );
|
|
||||||
// appendSql( "dummy.x" );
|
|
||||||
throw new UnsupportedOperationException( "Column reference strategy is not yet implemented!" );
|
|
||||||
}
|
}
|
||||||
else if ( expression instanceof Summarization ) {
|
else if ( expression instanceof Summarization ) {
|
||||||
// This could theoretically be emulated by rendering all grouping variations of the query and
|
// This could theoretically be emulated by rendering all grouping variations of the query and
|
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.LoadQueryInfluencers;
|
||||||
|
import org.hibernate.query.spi.QueryOptions;
|
||||||
|
import org.hibernate.query.spi.QueryParameterBindings;
|
||||||
|
import org.hibernate.query.sqm.internal.DomainParameterXref;
|
||||||
|
import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter;
|
||||||
|
import org.hibernate.query.sqm.tree.SqmStatement;
|
||||||
|
import org.hibernate.query.sqm.tree.expression.SqmExpression;
|
||||||
|
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
|
||||||
|
import org.hibernate.sql.ast.spi.SqlAstCreationContext;
|
||||||
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Literal;
|
||||||
|
import org.hibernate.sql.ast.tree.from.StandardTableGroup;
|
||||||
|
import org.hibernate.sql.ast.tree.from.TableReference;
|
||||||
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SQM to SQL AST translator for Ingres.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
*/
|
||||||
|
public class IngresSqmToSqlAstConverter<T extends Statement> extends BaseSqmToSqlAstConverter<T> {
|
||||||
|
|
||||||
|
private boolean needsDummyTableGroup;
|
||||||
|
|
||||||
|
public IngresSqmToSqlAstConverter(
|
||||||
|
SqmStatement<?> statement,
|
||||||
|
QueryOptions queryOptions,
|
||||||
|
DomainParameterXref domainParameterXref,
|
||||||
|
QueryParameterBindings domainParameterBindings,
|
||||||
|
LoadQueryInfluencers fetchInfluencers,
|
||||||
|
SqlAstCreationContext creationContext) {
|
||||||
|
super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public QuerySpec visitQuerySpec(SqmQuerySpec<?> sqmQuerySpec) {
|
||||||
|
final boolean needsDummy = this.needsDummyTableGroup;
|
||||||
|
this.needsDummyTableGroup = false;
|
||||||
|
try {
|
||||||
|
final QuerySpec querySpec = super.visitQuerySpec( sqmQuerySpec );
|
||||||
|
if ( this.needsDummyTableGroup ) {
|
||||||
|
querySpec.getFromClause().addRoot(
|
||||||
|
new StandardTableGroup(
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
new TableReference(
|
||||||
|
"(select 1)",
|
||||||
|
"dummy_(x)",
|
||||||
|
false,
|
||||||
|
getCreationContext().getSessionFactory()
|
||||||
|
),
|
||||||
|
null,
|
||||||
|
getCreationContext().getSessionFactory()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return querySpec;
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
this.needsDummyTableGroup = needsDummy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Expression resolveGroupOrOrderByExpression(SqmExpression<?> groupByClauseExpression) {
|
||||||
|
final Expression expression = super.resolveGroupOrOrderByExpression( groupByClauseExpression );
|
||||||
|
if ( expression instanceof Literal ) {
|
||||||
|
// Note that SqlAstTranslator.renderPartitionItem depends on this
|
||||||
|
this.needsDummyTableGroup = true;
|
||||||
|
}
|
||||||
|
return expression;
|
||||||
|
}
|
||||||
|
}
|
@ -4,14 +4,16 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.NotYetImplementedFor6Exception;
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.AbstractTransactSQLDialect;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
|
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.MaxDBSequenceSupport;
|
import org.hibernate.community.dialect.sequence.MaxDBSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
@ -26,7 +28,7 @@
|
|||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorSAPDBDatabaseImpl;
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorSAPDBDatabaseImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
@ -154,7 +156,7 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String trimPattern(TrimSpec specification, char character) {
|
public String trimPattern(TrimSpec specification, char character) {
|
||||||
return AbstractTransactSQLDialect.replaceLtrimRtrim(specification, character);
|
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, character);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -232,6 +234,11 @@ public boolean supportsSelectQueryWithoutFromClause() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public CaseFragment createCaseFragment() {
|
public CaseFragment createCaseFragment() {
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -4,15 +4,19 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.HibernateException;
|
import org.hibernate.HibernateException;
|
||||||
import org.hibernate.NotYetImplementedFor6Exception;
|
import org.hibernate.NotYetImplementedFor6Exception;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.community.dialect.identity.MimerSQLIdentityColumnSupport;
|
||||||
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorMimerSQLDatabaseImpl;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
|
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.MimerSequenceSupport;
|
import org.hibernate.community.dialect.sequence.MimerSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.jdbc.Size;
|
import org.hibernate.engine.jdbc.Size;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
@ -24,7 +28,6 @@
|
|||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorMimerSQLDatabaseImpl;
|
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
|
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
@ -261,6 +264,11 @@ public boolean supportsOuterJoinForUpdate() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String translateDatetimeFormat(String format) {
|
public String translateDatetimeFormat(String format) {
|
||||||
throw new NotYetImplementedFor6Exception("format() function not supported on Mimer SQL");
|
throw new NotYetImplementedFor6Exception("format() function not supported on Mimer SQL");
|
||||||
@ -270,4 +278,9 @@ public String translateDatetimeFormat(String format) {
|
|||||||
public boolean useInputStreamToInsertBlob() {
|
public boolean useInputStreamToInsertBlob() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IdentityColumnSupport getIdentityColumnSupport() {
|
||||||
|
return new MimerSQLIdentityColumnSupport();
|
||||||
|
}
|
||||||
}
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -4,14 +4,17 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
|
import org.hibernate.dialect.AbstractTransactSQLDialect;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.OracleDialect;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.lock.*;
|
import org.hibernate.dialect.lock.*;
|
||||||
import org.hibernate.dialect.pagination.FetchLimitHandler;
|
import org.hibernate.dialect.pagination.FetchLimitHandler;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.sequence.RDMSSequenceSupport;
|
import org.hibernate.community.dialect.sequence.RDMSSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
@ -330,6 +333,12 @@ public boolean supportsSelectQueryWithoutFromClause() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOrderByInSubquery() {
|
||||||
|
// This is just a guess
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) {
|
public LockingStrategy getLockingStrategy(Lockable lockable, LockMode lockMode) {
|
||||||
// RDMS has no known variation of a "SELECT ... FOR UPDATE" syntax...
|
// RDMS has no known variation of a "SELECT ... FOR UPDATE" syntax...
|
||||||
@ -367,6 +376,6 @@ public String translateDatetimeFormat(String format) {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String trimPattern(TrimSpec specification, char character) {
|
public String trimPattern(TrimSpec specification, char character) {
|
||||||
return AbstractTransactSQLDialect.replaceLtrimRtrim(specification, character);
|
return AbstractTransactSQLDialect.replaceLtrimRtrim( specification, character);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated use {@link MaxDBDialect}
|
* @deprecated use {@link MaxDBDialect}
|
@ -0,0 +1,617 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import java.sql.Types;
|
||||||
|
import javax.persistence.TemporalType;
|
||||||
|
|
||||||
|
import org.hibernate.ScrollMode;
|
||||||
|
import org.hibernate.community.dialect.identity.SQLiteIdentityColumnSupport;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.NationalizationSupport;
|
||||||
|
import org.hibernate.dialect.Replacer;
|
||||||
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
|
import org.hibernate.dialect.pagination.LimitOffsetLimitHandler;
|
||||||
|
import org.hibernate.dialect.unique.DefaultUniqueDelegate;
|
||||||
|
import org.hibernate.dialect.unique.UniqueDelegate;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.exception.DataException;
|
||||||
|
import org.hibernate.exception.JDBCConnectionException;
|
||||||
|
import org.hibernate.exception.LockAcquisitionException;
|
||||||
|
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
|
||||||
|
import org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor;
|
||||||
|
import org.hibernate.exception.spi.ViolatedConstraintNameExtractor;
|
||||||
|
import org.hibernate.internal.util.JdbcExceptionHelper;
|
||||||
|
import org.hibernate.mapping.Column;
|
||||||
|
import org.hibernate.query.NullOrdering;
|
||||||
|
import org.hibernate.query.SemanticException;
|
||||||
|
import org.hibernate.query.TemporalUnit;
|
||||||
|
import org.hibernate.query.TrimSpec;
|
||||||
|
import org.hibernate.query.spi.QueryEngine;
|
||||||
|
import org.hibernate.query.sqm.produce.function.StandardFunctionReturnTypeResolvers;
|
||||||
|
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
|
||||||
|
import org.hibernate.sql.ast.SqlAstTranslator;
|
||||||
|
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
|
||||||
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.BlobTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.ClobTypeDescriptor;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
|
|
||||||
|
import static org.hibernate.exception.spi.TemplatedViolatedConstraintNameExtractor.extractUsingTemplate;
|
||||||
|
import static org.hibernate.query.TemporalUnit.DAY;
|
||||||
|
import static org.hibernate.query.TemporalUnit.EPOCH;
|
||||||
|
import static org.hibernate.query.TemporalUnit.MONTH;
|
||||||
|
import static org.hibernate.query.TemporalUnit.QUARTER;
|
||||||
|
import static org.hibernate.query.TemporalUnit.YEAR;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An SQL dialect for SQLite.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
* @author Vlad Mihalcea
|
||||||
|
*/
|
||||||
|
public class SQLiteDialect extends Dialect {
|
||||||
|
|
||||||
|
private static final SQLiteIdentityColumnSupport IDENTITY_COLUMN_SUPPORT = new SQLiteIdentityColumnSupport();
|
||||||
|
|
||||||
|
private final UniqueDelegate uniqueDelegate;
|
||||||
|
private final int version;
|
||||||
|
|
||||||
|
public SQLiteDialect(DialectResolutionInfo info) {
|
||||||
|
this( info.getDatabaseMajorVersion() * 100 + info.getDatabaseMinorVersion() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLiteDialect() {
|
||||||
|
this( 200 );
|
||||||
|
}
|
||||||
|
|
||||||
|
public SQLiteDialect(int version) {
|
||||||
|
super();
|
||||||
|
this.version = version;
|
||||||
|
|
||||||
|
if ( version < 300 ) {
|
||||||
|
registerColumnType( Types.DECIMAL, "numeric($p,$s)" );
|
||||||
|
registerColumnType( Types.CHAR, "char" );
|
||||||
|
registerColumnType( Types.NCHAR, "nchar" );
|
||||||
|
}
|
||||||
|
// No precision support
|
||||||
|
registerColumnType( Types.FLOAT, "float" );
|
||||||
|
registerColumnType( Types.TIMESTAMP, "timestamp" );
|
||||||
|
registerColumnType( Types.TIMESTAMP_WITH_TIMEZONE, "timestamp" );
|
||||||
|
registerColumnType( Types.TIME_WITH_TIMEZONE, "time" );
|
||||||
|
|
||||||
|
registerColumnType( Types.BINARY, "blob" );
|
||||||
|
registerColumnType( Types.VARBINARY, "blob" );
|
||||||
|
registerColumnType( Types.LONGVARBINARY, "blob" );
|
||||||
|
uniqueDelegate = new SQLiteUniqueDelegate( this );
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SQLiteUniqueDelegate extends DefaultUniqueDelegate {
|
||||||
|
public SQLiteUniqueDelegate(Dialect dialect) {
|
||||||
|
super( dialect );
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public String getColumnDefinitionUniquenessFragment(Column column) {
|
||||||
|
return " unique";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public UniqueDelegate getUniqueDelegate() {
|
||||||
|
return uniqueDelegate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getVersion() {
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@code extract()} function returns {@link TemporalUnit#DAY_OF_WEEK}
|
||||||
|
* numbered from 0 to 6. This isn't consistent with what most other
|
||||||
|
* databases do, so here we adjust the result by generating
|
||||||
|
* {@code (extract(dow,arg)+1))}.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String extractPattern(TemporalUnit unit) {
|
||||||
|
switch ( unit ) {
|
||||||
|
case SECOND:
|
||||||
|
return "cast(strftime('%S.%f', ?2) as double)";
|
||||||
|
case MINUTE:
|
||||||
|
return "strftime('%M', ?2)";
|
||||||
|
case HOUR:
|
||||||
|
return "strftime('%H', ?2)";
|
||||||
|
case DAY:
|
||||||
|
case DAY_OF_MONTH:
|
||||||
|
return "(strftime('%d', ?2)+1)";
|
||||||
|
case MONTH:
|
||||||
|
return "strftime('%m', ?2)";
|
||||||
|
case YEAR:
|
||||||
|
return "strftime('%Y', ?2)";
|
||||||
|
case DAY_OF_WEEK:
|
||||||
|
return "(strftime('%w', ?2)+1)";
|
||||||
|
case DAY_OF_YEAR:
|
||||||
|
return "strftime('%j', ?2)";
|
||||||
|
case EPOCH:
|
||||||
|
return "strftime('%s', ?2)";
|
||||||
|
case WEEK:
|
||||||
|
// Thanks https://stackoverflow.com/questions/15082584/sqlite-return-wrong-week-number-for-2013
|
||||||
|
return "((strftime('%j', date(?2, '-3 days', 'weekday 4'))-1)/7+1)";
|
||||||
|
default:
|
||||||
|
return super.extractPattern(unit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String timestampaddPattern(TemporalUnit unit, TemporalType temporalType) {
|
||||||
|
final String function = temporalType == TemporalType.DATE ? "date" : "datetime";
|
||||||
|
switch ( unit ) {
|
||||||
|
case NANOSECOND:
|
||||||
|
case NATIVE:
|
||||||
|
return "datetime(?3, '+?2 seconds')";
|
||||||
|
case QUARTER: //quarter is not supported in interval literals
|
||||||
|
return function + "(?3, '+'||(?2*3)||' months')";
|
||||||
|
case WEEK: //week is not supported in interval literals
|
||||||
|
return function + "(?3, '+'||(?2*7)||' days')";
|
||||||
|
default:
|
||||||
|
return function + "(?3, '+?2 ?1s')";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String timestampdiffPattern(TemporalUnit unit, TemporalType fromTemporalType, TemporalType toTemporalType) {
|
||||||
|
final StringBuilder pattern = new StringBuilder();
|
||||||
|
switch ( unit ) {
|
||||||
|
case YEAR:
|
||||||
|
extractField( pattern, YEAR, unit );
|
||||||
|
break;
|
||||||
|
case QUARTER:
|
||||||
|
pattern.append( "(" );
|
||||||
|
extractField( pattern, YEAR, unit );
|
||||||
|
pattern.append( "+" );
|
||||||
|
extractField( pattern, QUARTER, unit );
|
||||||
|
pattern.append( ")" );
|
||||||
|
break;
|
||||||
|
case MONTH:
|
||||||
|
pattern.append( "(" );
|
||||||
|
extractField( pattern, YEAR, unit );
|
||||||
|
pattern.append( "+" );
|
||||||
|
extractField( pattern, MONTH, unit );
|
||||||
|
pattern.append( ")" );
|
||||||
|
break;
|
||||||
|
case WEEK: //week is not supported by extract() when the argument is a duration
|
||||||
|
case DAY:
|
||||||
|
extractField( pattern, DAY, unit );
|
||||||
|
break;
|
||||||
|
//in order to avoid multiple calls to extract(),
|
||||||
|
//we use extract(epoch from x - y) * factor for
|
||||||
|
//all the following units:
|
||||||
|
case HOUR:
|
||||||
|
case MINUTE:
|
||||||
|
case SECOND:
|
||||||
|
case NANOSECOND:
|
||||||
|
case NATIVE:
|
||||||
|
extractField( pattern, EPOCH, unit );
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new SemanticException( "unrecognized field: " + unit );
|
||||||
|
}
|
||||||
|
return pattern.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void extractField(
|
||||||
|
StringBuilder pattern,
|
||||||
|
TemporalUnit unit,
|
||||||
|
TemporalUnit toUnit) {
|
||||||
|
final String rhs = extractPattern( unit );
|
||||||
|
final String lhs = rhs.replace( "?2", "?3" );
|
||||||
|
pattern.append( '(');
|
||||||
|
pattern.append( lhs );
|
||||||
|
pattern.append( '-' );
|
||||||
|
pattern.append( rhs );
|
||||||
|
pattern.append(")").append( unit.conversionFactor( toUnit, this ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void initializeFunctionRegistry(QueryEngine queryEngine) {
|
||||||
|
super.initializeFunctionRegistry( queryEngine );
|
||||||
|
|
||||||
|
CommonFunctionFactory.mod_operator( queryEngine );
|
||||||
|
CommonFunctionFactory.leftRight_substr( queryEngine );
|
||||||
|
CommonFunctionFactory.concat_pipeOperator( queryEngine );
|
||||||
|
CommonFunctionFactory.characterLength_length( queryEngine, SqlAstNodeRenderingMode.DEFAULT );
|
||||||
|
CommonFunctionFactory.leastGreatest_minMax( queryEngine );
|
||||||
|
|
||||||
|
CommonFunctionFactory.radians( queryEngine );
|
||||||
|
CommonFunctionFactory.degrees( queryEngine );
|
||||||
|
CommonFunctionFactory.trunc( queryEngine );
|
||||||
|
CommonFunctionFactory.log( queryEngine );
|
||||||
|
CommonFunctionFactory.trim2( queryEngine );
|
||||||
|
CommonFunctionFactory.substr( queryEngine );
|
||||||
|
CommonFunctionFactory.substring_substr( queryEngine );
|
||||||
|
CommonFunctionFactory.chr_char( queryEngine );
|
||||||
|
|
||||||
|
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
|
||||||
|
"locate",
|
||||||
|
StandardBasicTypes.INTEGER,
|
||||||
|
"instr(?2, ?1)",
|
||||||
|
"instr(?2, ?1, ?3)"
|
||||||
|
).setArgumentListSignature("(pattern, string[, start])");
|
||||||
|
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
|
||||||
|
"lpad",
|
||||||
|
StandardBasicTypes.STRING,
|
||||||
|
"(substr(replace(hex(zeroblob(?2)), '00', ' '), 1, ?2 - length(?1))||?1)",
|
||||||
|
"(substr(replace(hex(zeroblob(?2)), '00', ?3), 1, ?2 - length(?1))||?1)"
|
||||||
|
).setArgumentListSignature("(string, length[, padding])");
|
||||||
|
queryEngine.getSqmFunctionRegistry().registerBinaryTernaryPattern(
|
||||||
|
"rpad",
|
||||||
|
StandardBasicTypes.STRING,
|
||||||
|
"(?1||substr(replace(hex(zeroblob(?2)), '00', ' '), 1, ?2 - length(?1)))",
|
||||||
|
"(?1||substr(replace(hex(zeroblob(?2)), '00', ?3), 1, ?2 - length(?1)))"
|
||||||
|
).setArgumentListSignature("(string, length[, padding])");
|
||||||
|
|
||||||
|
queryEngine.getSqmFunctionRegistry().namedDescriptorBuilder("format", "strftime")
|
||||||
|
.setInvariantType( StandardBasicTypes.STRING )
|
||||||
|
.setExactArgumentCount( 2 )
|
||||||
|
.setArgumentListSignature("(datetime as pattern)")
|
||||||
|
.register();
|
||||||
|
|
||||||
|
if (!supportsMathFunctions() ) {
|
||||||
|
queryEngine.getSqmFunctionRegistry().patternDescriptorBuilder(
|
||||||
|
"floor",
|
||||||
|
"(cast(?1 as int) - (?1 < cast(?1 as int)))"
|
||||||
|
).setReturnTypeResolver( StandardFunctionReturnTypeResolvers.useArgType( 1 ) )
|
||||||
|
.setExactArgumentCount( 1 )
|
||||||
|
.register();
|
||||||
|
queryEngine.getSqmFunctionRegistry().patternDescriptorBuilder(
|
||||||
|
"ceiling",
|
||||||
|
"(cast(?1 as int) + (?1 > cast(?1 as int)))"
|
||||||
|
).setReturnTypeResolver( StandardFunctionReturnTypeResolvers.useArgType( 1 ) )
|
||||||
|
.setExactArgumentCount( 1 )
|
||||||
|
.register();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String trimPattern(TrimSpec specification, char character) {
|
||||||
|
switch ( specification ) {
|
||||||
|
case BOTH:
|
||||||
|
return character == ' '
|
||||||
|
? "trim(?1)"
|
||||||
|
: "trim(?1, '" + character + "')";
|
||||||
|
case LEADING:
|
||||||
|
return character == ' '
|
||||||
|
? "ltrim(?1)"
|
||||||
|
: "ltrim(?1, '" + character + "')";
|
||||||
|
case TRAILING:
|
||||||
|
return character == ' '
|
||||||
|
? "rtrim(?1)"
|
||||||
|
: "rtrim(?1, '" + character + "')";
|
||||||
|
}
|
||||||
|
throw new UnsupportedOperationException( "Unsupported specification: " + specification );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean supportsMathFunctions() {
|
||||||
|
// Math functions have to be enabled through a compile time option: https://www.sqlite.org/lang_mathfunc.html
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JdbcTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode) {
|
||||||
|
switch (sqlCode) {
|
||||||
|
case Types.BLOB:
|
||||||
|
return BlobTypeDescriptor.PRIMITIVE_ARRAY_BINDING;
|
||||||
|
case Types.CLOB:
|
||||||
|
return ClobTypeDescriptor.STRING_BINDING;
|
||||||
|
default:
|
||||||
|
return super.getSqlTypeDescriptorOverride( sqlCode );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public LimitHandler getLimitHandler() {
|
||||||
|
return LimitOffsetLimitHandler.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsLockTimeouts() {
|
||||||
|
// may be http://sqlite.org/c3ref/db_mutex.html ?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getForUpdateString() {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOuterJoinForUpdate() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsNullPrecedence() {
|
||||||
|
return getVersion() >= 330;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NullOrdering getNullOrdering() {
|
||||||
|
return NullOrdering.SMALLEST;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SqlAstTranslatorFactory getSqlAstTranslatorFactory() {
|
||||||
|
return new StandardSqlAstTranslatorFactory() {
|
||||||
|
@Override
|
||||||
|
protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(
|
||||||
|
SessionFactoryImplementor sessionFactory, Statement statement) {
|
||||||
|
return new SQLiteSqlAstTranslator<>( sessionFactory, statement );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int SQLITE_BUSY = 5;
|
||||||
|
private static final int SQLITE_LOCKED = 6;
|
||||||
|
private static final int SQLITE_IOERR = 10;
|
||||||
|
private static final int SQLITE_CORRUPT = 11;
|
||||||
|
private static final int SQLITE_NOTFOUND = 12;
|
||||||
|
private static final int SQLITE_FULL = 13;
|
||||||
|
private static final int SQLITE_CANTOPEN = 14;
|
||||||
|
private static final int SQLITE_PROTOCOL = 15;
|
||||||
|
private static final int SQLITE_TOOBIG = 18;
|
||||||
|
private static final int SQLITE_CONSTRAINT = 19;
|
||||||
|
private static final int SQLITE_MISMATCH = 20;
|
||||||
|
private static final int SQLITE_NOTADB = 26;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ViolatedConstraintNameExtractor getViolatedConstraintNameExtractor() {
|
||||||
|
return EXTRACTOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final ViolatedConstraintNameExtractor EXTRACTOR =
|
||||||
|
new TemplatedViolatedConstraintNameExtractor( sqle -> {
|
||||||
|
final int errorCode = JdbcExceptionHelper.extractErrorCode( sqle );
|
||||||
|
if (errorCode == SQLITE_CONSTRAINT) {
|
||||||
|
return extractUsingTemplate( "constraint ", " failed", sqle.getMessage() );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
} );
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SQLExceptionConversionDelegate buildSQLExceptionConversionDelegate() {
|
||||||
|
return (sqlException, message, sql) -> {
|
||||||
|
final int errorCode = JdbcExceptionHelper.extractErrorCode( sqlException );
|
||||||
|
switch ( errorCode ) {
|
||||||
|
case SQLITE_TOOBIG:
|
||||||
|
case SQLITE_MISMATCH:
|
||||||
|
return new DataException( message, sqlException, sql );
|
||||||
|
case SQLITE_BUSY:
|
||||||
|
case SQLITE_LOCKED:
|
||||||
|
return new LockAcquisitionException( message, sqlException, sql );
|
||||||
|
case SQLITE_NOTADB:
|
||||||
|
return new JDBCConnectionException( message, sqlException, sql );
|
||||||
|
default:
|
||||||
|
if ( errorCode >= SQLITE_IOERR && errorCode <= SQLITE_PROTOCOL ) {
|
||||||
|
return new JDBCConnectionException( message, sqlException, sql );
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsEmptyInList() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// DDL support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean canCreateSchema() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasAlterTable() {
|
||||||
|
// As specified in NHibernate dialect
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean dropConstraints() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean qualifyIndexName() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDropForeignKeyString() {
|
||||||
|
throw new UnsupportedOperationException( "No drop foreign key syntax supported by SQLiteDialect" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAddForeignKeyConstraintString(
|
||||||
|
String constraintName,
|
||||||
|
String[] foreignKey,
|
||||||
|
String referencedTable,
|
||||||
|
String[] primaryKey,
|
||||||
|
boolean referencesPrimaryKey) {
|
||||||
|
throw new UnsupportedOperationException( "No add foreign key syntax supported by SQLiteDialect" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getAddPrimaryKeyConstraintString(String constraintName) {
|
||||||
|
throw new UnsupportedOperationException( "No add primary key syntax supported by SQLiteDialect" );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsCommentOn() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsIfExistsBeforeTableName() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean doesReadCommittedCauseWritersToBlockReaders() {
|
||||||
|
// TODO Validate (WAL mode...)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean doesRepeatableReadCauseReadersToBlockWriters() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsTupleDistinctCounts() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getInExpressionCountLimit() {
|
||||||
|
// Compile/runtime time option: http://sqlite.org/limits.html#max_variable_number
|
||||||
|
return 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWindowFunctions() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IdentityColumnSupport getIdentityColumnSupport() {
|
||||||
|
return IDENTITY_COLUMN_SUPPORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSelectGUIDString() {
|
||||||
|
return "select hex(randomblob(16))";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ScrollMode defaultScrollMode() {
|
||||||
|
return ScrollMode.FORWARD_ONLY;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNoColumnsInsertString() {
|
||||||
|
return "default values";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NationalizationSupport getNationalizationSupport() {
|
||||||
|
return NationalizationSupport.IMPLICIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentDate() {
|
||||||
|
return "date('now')";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTime() {
|
||||||
|
return "time('now')";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String currentTimestamp() {
|
||||||
|
return "datetime('now')";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translateDatetimeFormat(String format) {
|
||||||
|
return datetimeFormat( format ).result();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Replacer datetimeFormat(String format) {
|
||||||
|
return new Replacer( format, "'", "" )
|
||||||
|
.replace("%", "%%")
|
||||||
|
|
||||||
|
//year
|
||||||
|
.replace("yyyy", "%Y")
|
||||||
|
.replace("yyy", "%Y")
|
||||||
|
.replace("yy", "%y") //?????
|
||||||
|
.replace("y", "%y") //?????
|
||||||
|
|
||||||
|
//month of year
|
||||||
|
.replace("MMMM", "%B") //?????
|
||||||
|
.replace("MMM", "%b") //?????
|
||||||
|
.replace("MM", "%m")
|
||||||
|
.replace("M", "%m") //?????
|
||||||
|
|
||||||
|
//day of week
|
||||||
|
.replace("EEEE", "%A") //?????
|
||||||
|
.replace("EEE", "%a") //?????
|
||||||
|
.replace("ee", "%w")
|
||||||
|
.replace("e", "%w") //?????
|
||||||
|
|
||||||
|
//day of month
|
||||||
|
.replace("dd", "%d")
|
||||||
|
.replace("d", "%d") //?????
|
||||||
|
|
||||||
|
//am pm
|
||||||
|
.replace("aa", "%p") //?????
|
||||||
|
.replace("a", "%p") //?????
|
||||||
|
|
||||||
|
//hour
|
||||||
|
.replace("hh", "%I") //?????
|
||||||
|
.replace("HH", "%H")
|
||||||
|
.replace("h", "%I") //?????
|
||||||
|
.replace("H", "%H") //?????
|
||||||
|
|
||||||
|
//minute
|
||||||
|
.replace("mm", "%M")
|
||||||
|
.replace("m", "%M") //?????
|
||||||
|
|
||||||
|
//second
|
||||||
|
.replace("ss", "%S")
|
||||||
|
.replace("s", "%S") //?????
|
||||||
|
|
||||||
|
//fractional seconds
|
||||||
|
.replace("SSSSSS", "%f") //5 is the max
|
||||||
|
.replace("SSSSS", "%f")
|
||||||
|
.replace("SSSS", "%f")
|
||||||
|
.replace("SSS", "%f")
|
||||||
|
.replace("SS", "%f")
|
||||||
|
.replace("S", "%f");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String translateExtractField(TemporalUnit unit) {
|
||||||
|
// All units should be handled in extractPattern so we should never hit this method
|
||||||
|
throw new UnsupportedOperationException( "Unsupported unit: " + unit );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String wrapDateLiteral(String date) {
|
||||||
|
return "date(" + date + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String wrapTimeLiteral(String time) {
|
||||||
|
return "time(" + time + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected String wrapTimestampLiteral(String timestamp) {
|
||||||
|
return "datetime(" + timestamp + ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
|
import org.hibernate.query.ComparisonOperator;
|
||||||
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
|
import org.hibernate.sql.ast.tree.cte.CteMaterialization;
|
||||||
|
import org.hibernate.sql.ast.tree.cte.CteStatement;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Any;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Every;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Expression;
|
||||||
|
import org.hibernate.sql.ast.tree.expression.Summarization;
|
||||||
|
import org.hibernate.sql.ast.tree.select.QueryGroup;
|
||||||
|
import org.hibernate.sql.ast.tree.select.QueryPart;
|
||||||
|
import org.hibernate.sql.ast.tree.select.QuerySpec;
|
||||||
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A SQL AST translator for SQLite.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
* @author Vlad Mihalcea
|
||||||
|
*/
|
||||||
|
public class SQLiteSqlAstTranslator<T extends JdbcOperation> extends AbstractSqlAstTranslator<T> {
|
||||||
|
|
||||||
|
public SQLiteSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
|
||||||
|
super( sessionFactory, statement );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected LockStrategy determineLockingStrategy(
|
||||||
|
QuerySpec querySpec,
|
||||||
|
ForUpdateClause forUpdateClause,
|
||||||
|
Boolean followOnLocking) {
|
||||||
|
return LockStrategy.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderForUpdateClause(QuerySpec querySpec, ForUpdateClause forUpdateClause) {
|
||||||
|
// SQLite does not support the FOR UPDATE clause
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderMaterializationHint(CteMaterialization materialization) {
|
||||||
|
if ( getDialect().getVersion() >= 335 ) {
|
||||||
|
if ( materialization == CteMaterialization.NOT_MATERIALIZED ) {
|
||||||
|
appendSql( "not " );
|
||||||
|
}
|
||||||
|
appendSql( "materialized " );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsFilterClause() {
|
||||||
|
return getDialect().getVersion() >= 330;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean supportsQuantifiedPredicates() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean shouldEmulateFetchClause(QueryPart queryPart) {
|
||||||
|
// Check if current query part is already row numbering to avoid infinite recursion
|
||||||
|
// We also have to emulate this if a fetch clause type other than rows only is used
|
||||||
|
return getQueryPartForRowNumbering() != queryPart && !isRowsOnlyFetchClauseType( queryPart );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitQueryGroup(QueryGroup queryGroup) {
|
||||||
|
if ( shouldEmulateFetchClause( queryGroup ) ) {
|
||||||
|
emulateFetchOffsetWithWindowFunctions( queryGroup, true );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitQueryGroup( queryGroup );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitQuerySpec(QuerySpec querySpec) {
|
||||||
|
if ( shouldEmulateFetchClause( querySpec ) ) {
|
||||||
|
emulateFetchOffsetWithWindowFunctions( querySpec, true );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.visitQuerySpec( querySpec );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitOffsetFetchClause(QueryPart queryPart) {
|
||||||
|
if ( !isRowNumberingCurrentQueryPart() ) {
|
||||||
|
renderLimitOffsetClause( queryPart );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderSearchClause(CteStatement cte) {
|
||||||
|
// SQLite does not support this, but it's just a hint anyway
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderCycleClause(CteStatement cte) {
|
||||||
|
// SQLite does not support this, but it can be emulated
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderComparison(Expression lhs, ComparisonOperator operator, Expression rhs) {
|
||||||
|
if ( rhs instanceof Any ) {
|
||||||
|
emulateSubQueryRelationalRestrictionPredicate(
|
||||||
|
null,
|
||||||
|
false,
|
||||||
|
( (Any) rhs ).getSubquery(),
|
||||||
|
lhs,
|
||||||
|
this::renderSelectSimpleComparison,
|
||||||
|
operator
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else if ( rhs instanceof Every ) {
|
||||||
|
emulateSubQueryRelationalRestrictionPredicate(
|
||||||
|
null,
|
||||||
|
true,
|
||||||
|
( (Every) rhs ).getSubquery(),
|
||||||
|
lhs,
|
||||||
|
this::renderSelectSimpleComparison,
|
||||||
|
operator.negated()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
renderComparisonDistinctOperator( lhs, operator, rhs );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderPartitionItem(Expression expression) {
|
||||||
|
if ( expression instanceof Summarization ) {
|
||||||
|
// This could theoretically be emulated by rendering all grouping variations of the query and
|
||||||
|
// connect them via union all but that's probably pretty inefficient and would have to happen
|
||||||
|
// on the query spec level
|
||||||
|
throw new UnsupportedOperationException( "Summarization is not supported by DBMS!" );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
expression.accept( this );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,12 +4,15 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
|
import org.hibernate.dialect.GroupByConstantRenderingStrategy;
|
||||||
|
import org.hibernate.dialect.RowLockStrategy;
|
||||||
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.SybaseAnywhereIdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.SybaseAnywhereIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.TopLimitHandler;
|
import org.hibernate.dialect.pagination.TopLimitHandler;
|
||||||
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
@ -31,15 +34,18 @@
|
|||||||
public class SybaseAnywhereDialect extends SybaseDialect {
|
public class SybaseAnywhereDialect extends SybaseDialect {
|
||||||
|
|
||||||
public SybaseAnywhereDialect() {
|
public SybaseAnywhereDialect() {
|
||||||
this( 800 );
|
this( 800, false );
|
||||||
}
|
}
|
||||||
|
|
||||||
public SybaseAnywhereDialect(DialectResolutionInfo info){
|
public SybaseAnywhereDialect(DialectResolutionInfo info){
|
||||||
this( info.getDatabaseMajorVersion() * 100 + info.getDatabaseMinorVersion() * 10 );
|
this(
|
||||||
|
info.getDatabaseMajorVersion() * 100 + info.getDatabaseMinorVersion() * 10,
|
||||||
|
info.getDriverName() != null && info.getDriverName().contains( "jTDS" )
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
public SybaseAnywhereDialect(int version) {
|
public SybaseAnywhereDialect(int version, boolean jtdsDriver) {
|
||||||
super( version );
|
super( version, jtdsDriver );
|
||||||
|
|
||||||
registerColumnType( Types.BIGINT, "bigint" );
|
registerColumnType( Types.BIGINT, "bigint" );
|
||||||
registerColumnType( Types.DATE, "date" );
|
registerColumnType( Types.DATE, "date" );
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ protected void renderFetchPlusOffsetExpression(
|
|||||||
@Override
|
@Override
|
||||||
protected void visitSqlSelections(SelectClause selectClause) {
|
protected void visitSqlSelections(SelectClause selectClause) {
|
||||||
if ( getDialect().getVersion() < 900 ) {
|
if ( getDialect().getVersion() < 900 ) {
|
||||||
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true );
|
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true, true );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
renderTopStartAtClause( (QuerySpec) getQueryPartStack().getCurrent() );
|
renderTopStartAtClause( (QuerySpec) getQueryPartStack().getCurrent() );
|
||||||
@ -81,9 +81,9 @@ protected void visitSqlSelections(SelectClause selectClause) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderTopClause(QuerySpec querySpec, boolean addOffset) {
|
protected void renderTopClause(QuerySpec querySpec, boolean addOffset, boolean needsParenthesis) {
|
||||||
assertRowsOnlyFetchClauseType( querySpec );
|
assertRowsOnlyFetchClauseType( querySpec );
|
||||||
super.renderTopClause( querySpec, addOffset );
|
super.renderTopClause( querySpec, addOffset, needsParenthesis );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A dialect for the Teradata 14
|
* A dialect for the Teradata 14
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.boot.Metadata;
|
import org.hibernate.boot.Metadata;
|
||||||
@ -12,9 +12,11 @@
|
|||||||
import org.hibernate.boot.model.relational.QualifiedNameImpl;
|
import org.hibernate.boot.model.relational.QualifiedNameImpl;
|
||||||
import org.hibernate.boot.model.relational.QualifiedTableName;
|
import org.hibernate.boot.model.relational.QualifiedTableName;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.GroupByConstantRenderingStrategy;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
import org.hibernate.dialect.identity.IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.identity.Teradata14IdentityColumnSupport;
|
import org.hibernate.community.dialect.identity.Teradata14IdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.TopLimitHandler;
|
import org.hibernate.dialect.pagination.TopLimitHandler;
|
||||||
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
@ -65,7 +67,7 @@
|
|||||||
*/
|
*/
|
||||||
public class TeradataDialect extends Dialect {
|
public class TeradataDialect extends Dialect {
|
||||||
|
|
||||||
private int version;
|
private final int version;
|
||||||
|
|
||||||
private static final int PARAM_LIST_SIZE_LIMIT = 1024;
|
private static final int PARAM_LIST_SIZE_LIMIT = 1024;
|
||||||
|
|
||||||
@ -348,6 +350,12 @@ public boolean supportsEmptyInList() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOrderByInSubquery() {
|
||||||
|
// This is just a guess
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSelectClauseNullString(int sqlType) {
|
public String getSelectClauseNullString(int sqlType) {
|
||||||
String v = "null";
|
String v = "null";
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ protected void renderFetchPlusOffsetExpression(
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void visitSqlSelections(SelectClause selectClause) {
|
protected void visitSqlSelections(SelectClause selectClause) {
|
||||||
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true );
|
renderTopClause( (QuerySpec) getQueryPartStack().getCurrent(), true, true );
|
||||||
super.visitSqlSelections( selectClause );
|
super.visitSqlSelections( selectClause );
|
||||||
}
|
}
|
||||||
|
|
@ -4,17 +4,19 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import org.hibernate.LockMode;
|
import org.hibernate.LockMode;
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.cfg.Environment;
|
import org.hibernate.cfg.Environment;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.RowLockStrategy;
|
||||||
import org.hibernate.dialect.function.CommonFunctionFactory;
|
import org.hibernate.dialect.function.CommonFunctionFactory;
|
||||||
import org.hibernate.dialect.lock.*;
|
import org.hibernate.dialect.lock.*;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.TimesTenLimitHandler;
|
import org.hibernate.community.dialect.pagination.TimesTenLimitHandler;
|
||||||
import org.hibernate.dialect.sequence.SequenceSupport;
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.TimesTenSequenceSupport;
|
import org.hibernate.community.dialect.sequence.TimesTenSequenceSupport;
|
||||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||||
import org.hibernate.metamodel.mapping.EntityMappingType;
|
import org.hibernate.metamodel.mapping.EntityMappingType;
|
||||||
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
|
||||||
@ -31,7 +33,7 @@
|
|||||||
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
import org.hibernate.sql.exec.spi.JdbcOperation;
|
import org.hibernate.sql.exec.spi.JdbcOperation;
|
||||||
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorTimesTenDatabaseImpl;
|
import org.hibernate.community.dialect.sequence.SequenceInformationExtractorTimesTenDatabaseImpl;
|
||||||
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
import org.hibernate.tool.schema.extract.spi.SequenceInformationExtractor;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
@ -279,6 +281,11 @@ public boolean supportsTableCheck() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public LimitHandler getLimitHandler() {
|
public LimitHandler getLimitHandler() {
|
||||||
return TimesTenLimitHandler.INSTANCE;
|
return TimesTenLimitHandler.INSTANCE;
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -12,6 +12,7 @@
|
|||||||
import org.hibernate.query.ComparisonOperator;
|
import org.hibernate.query.ComparisonOperator;
|
||||||
import org.hibernate.query.IllegalQueryOperationException;
|
import org.hibernate.query.IllegalQueryOperationException;
|
||||||
import org.hibernate.query.SemanticException;
|
import org.hibernate.query.SemanticException;
|
||||||
|
import org.hibernate.sql.ast.SqlAstJoinType;
|
||||||
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
import org.hibernate.sql.ast.spi.AbstractSqlAstTranslator;
|
||||||
import org.hibernate.sql.ast.spi.SqlSelection;
|
import org.hibernate.sql.ast.spi.SqlSelection;
|
||||||
import org.hibernate.sql.ast.tree.Statement;
|
import org.hibernate.sql.ast.tree.Statement;
|
||||||
@ -54,6 +55,16 @@ protected LockStrategy determineLockingStrategy(
|
|||||||
return strategy;
|
return strategy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void renderJoinType(SqlAstJoinType joinType) {
|
||||||
|
if ( joinType == SqlAstJoinType.CROSS ) {
|
||||||
|
appendSql( ", " );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
super.renderJoinType( joinType );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void renderSearchClause(CteStatement cte) {
|
protected void renderSearchClause(CteStatement cte) {
|
||||||
// TimesTen does not support this, but it's just a hint anyway
|
// TimesTen does not support this, but it's just a hint anyway
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,9 +4,10 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mark Rotteveel
|
* @author Mark Rotteveel
|
@ -4,11 +4,12 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
import java.sql.Types;
|
import java.sql.Types;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,25 +4,35 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* See https://sqlite.org/autoinc.html and
|
||||||
|
* https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Dialect/SQLiteDialect.cs for details.
|
||||||
|
*
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
||||||
*/
|
*/
|
||||||
public class JDataStoreIdentityColumnSupport extends IdentityColumnSupportImpl {
|
public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsIdentityColumns() {
|
public boolean supportsIdentityColumns() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIdentitySelectString(String table, String column, int type) {
|
public boolean hasDataTypeInIdentityColumn() {
|
||||||
// NOT_SUPPORTED_SHOULD_USE_JDBC3_PreparedStatement.getGeneratedKeys_method
|
return false;
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIdentityColumnString(int type) {
|
public String getIdentityColumnString(int type) {
|
||||||
return "autoincrement";
|
return "integer";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIdentitySelectString(String table, String column, int type) {
|
||||||
|
return "select last_insert_rowid()";
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.AbstractTransactSQLIdentityColumnSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.identity;
|
package org.hibernate.community.dialect.identity;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.identity.IdentityColumnSupportImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Andrea Boriero
|
* @author Andrea Boriero
|
@ -4,7 +4,10 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.pagination;
|
package org.hibernate.community.dialect.pagination;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.pagination.AbstractNoOffsetLimitHandler;
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link LimitHandler} for older versions of Informix, Ingres,
|
* A {@link LimitHandler} for older versions of Informix, Ingres,
|
@ -4,10 +4,13 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.pagination;
|
package org.hibernate.community.dialect.pagination;
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
|
import org.hibernate.dialect.pagination.OffsetFetchLimitHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link LimitHandler} for Ingres. According to the
|
* A {@link LimitHandler} for Ingres. According to the
|
||||||
* documentation for Ingres 10.2, Ingres supports the
|
* documentation for Ingres 10.2, Ingres supports the
|
||||||
@ -32,10 +35,10 @@ public IngresLimitHandler() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
boolean isIngres() {
|
protected boolean renderOffsetRowsKeyword() {
|
||||||
//Ingres doesn't like "rows" in the
|
//Ingres doesn't like "rows" in the
|
||||||
//ANSI-standard syntax 'offset n rows'
|
//ANSI-standard syntax 'offset n rows'
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String[] WITH_OPTIONS = {
|
private static final String[] WITH_OPTIONS = {
|
@ -4,10 +4,13 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.pagination;
|
package org.hibernate.community.dialect.pagination;
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.pagination.AbstractSimpleLimitHandler;
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
|
|
||||||
import static java.util.regex.Pattern.CASE_INSENSITIVE;
|
import static java.util.regex.Pattern.CASE_INSENSITIVE;
|
||||||
import static java.util.regex.Pattern.compile;
|
import static java.util.regex.Pattern.compile;
|
||||||
|
|
@ -4,8 +4,10 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.pagination;
|
package org.hibernate.community.dialect.pagination;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.pagination.AbstractLimitHandler;
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.engine.spi.RowSelection;
|
import org.hibernate.engine.spi.RowSelection;
|
||||||
import org.hibernate.query.Limit;
|
import org.hibernate.query.Limit;
|
||||||
|
|
||||||
@ -17,7 +19,7 @@ public class SkipFirstLimitHandler extends AbstractLimitHandler {
|
|||||||
|
|
||||||
public static final SkipFirstLimitHandler INSTANCE = new SkipFirstLimitHandler(true);
|
public static final SkipFirstLimitHandler INSTANCE = new SkipFirstLimitHandler(true);
|
||||||
|
|
||||||
private boolean variableLimit;
|
private final boolean variableLimit;
|
||||||
|
|
||||||
public SkipFirstLimitHandler(boolean variableLimit) {
|
public SkipFirstLimitHandler(boolean variableLimit) {
|
||||||
this.variableLimit = variableLimit;
|
this.variableLimit = variableLimit;
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.pagination;
|
package org.hibernate.community.dialect.pagination;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A {@link LimitHandler} for TimesTen, which uses {@code ROWS n},
|
* A {@link LimitHandler} for TimesTen, which uses {@code ROWS n},
|
@ -4,10 +4,12 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.CUBRIDDialect}.
|
* Sequence support for {@link org.hibernate.community.dialect.CUBRIDDialect}.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
@ -20,6 +22,11 @@ public String getSelectSequenceNextValString(String sequenceName) {
|
|||||||
return sequenceName + ".next_value";
|
return sequenceName + ".next_value";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSelectSequencePreviousValString(String sequenceName) {
|
||||||
|
return sequenceName + ".current_value";
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getFromDual() {
|
public String getFromDual() {
|
||||||
//TODO: is this really needed?
|
//TODO: is this really needed?
|
@ -4,10 +4,12 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.CacheDialect}.
|
* Sequence support for {@link org.hibernate.community.dialect.CacheDialect}.
|
||||||
*
|
*
|
||||||
* Use of sequences on Cache is not recommended.
|
* Use of sequences on Cache is not recommended.
|
||||||
*
|
*
|
@ -4,10 +4,14 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.dialect.sequence.ANSISequenceSupport;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.FirebirdDialect}
|
* Sequence support for {@link org.hibernate.community.dialect.FirebirdDialect}
|
||||||
* on Firebird 3.
|
* on Firebird 3.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
@ -52,4 +56,9 @@ public String getFromDual() {
|
|||||||
return " from rdb$database";
|
return " from rdb$database";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSelectSequencePreviousValString(String sequenceName) throws MappingException {
|
||||||
|
return "gen_id(" + sequenceName + ",0)";
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -4,10 +4,13 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.sequence.NextvalSequenceSupport;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.InformixDialect}.
|
* Sequence support for {@link org.hibernate.community.dialect.InformixDialect}.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
@ -4,10 +4,12 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.FirebirdDialect}
|
* Sequence support for {@link org.hibernate.community.dialect.FirebirdDialect}
|
||||||
* on Firebird 2.
|
* on Firebird 2.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
@ -35,6 +37,11 @@ public String getSelectSequenceNextValString(String sequenceName, int increment)
|
|||||||
return "gen_id(" + sequenceName + "," + increment + ")";
|
return "gen_id(" + sequenceName + "," + increment + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getSelectSequencePreviousValString(String sequenceName) {
|
||||||
|
return getSelectSequenceNextValString( sequenceName, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize) {
|
public String[] getCreateSequenceStrings(String sequenceName, int initialValue, int incrementSize) {
|
||||||
return initialValue == 1
|
return initialValue == 1
|
@ -4,9 +4,11 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
import org.hibernate.dialect.MaxDBDialect;
|
import org.hibernate.community.dialect.MaxDBDialect;
|
||||||
|
import org.hibernate.dialect.sequence.NextvalSequenceSupport;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link MaxDBDialect}.
|
* Sequence support for {@link MaxDBDialect}.
|
@ -4,10 +4,14 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.community.dialect.MimerSQLDialect;
|
||||||
|
import org.hibernate.dialect.sequence.ANSISequenceSupport;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.MimerSQLDialect}.
|
* Sequence support for {@link MimerSQLDialect}.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
@ -4,12 +4,13 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
import org.hibernate.MappingException;
|
import org.hibernate.MappingException;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.RDMSOS2200Dialect}.
|
* Sequence support for {@link org.hibernate.community.dialect.RDMSOS2200Dialect}.
|
||||||
*
|
*
|
||||||
* Note that RDMS doesn't really have sequences as such, but it does
|
* Note that RDMS doesn't really have sequences as such, but it does
|
||||||
* have the GUID-like {@code permuted_id()} and {@code unique_id()}
|
* have the GUID-like {@code permuted_id()} and {@code unique_id()}
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Mark Rotteveel
|
* @author Mark Rotteveel
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,7 +4,9 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.tool.schema.extract.internal;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Vlad Mihalcea
|
* @author Vlad Mihalcea
|
@ -4,10 +4,13 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.sequence;
|
package org.hibernate.community.dialect.sequence;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.sequence.NextvalSequenceSupport;
|
||||||
|
import org.hibernate.dialect.sequence.SequenceSupport;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sequence support for {@link org.hibernate.dialect.TimesTenDialect}.
|
* Sequence support for {@link org.hibernate.community.dialect.TimesTenDialect}.
|
||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
@ -4,10 +4,11 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.dialect.unique;
|
package org.hibernate.community.dialect.unique;
|
||||||
|
|
||||||
import org.hibernate.boot.Metadata;
|
import org.hibernate.boot.Metadata;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.dialect.unique.DefaultUniqueDelegate;
|
||||||
import org.hibernate.mapping.UniqueKey;
|
import org.hibernate.mapping.UniqueKey;
|
||||||
|
|
||||||
/**
|
/**
|
@ -0,0 +1 @@
|
|||||||
|
org.hibernate.community.dialect.CommunityDialectSelector
|
@ -0,0 +1 @@
|
|||||||
|
org.hibernate.community.dialect.CommunityDialectResolver
|
@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import org.hibernate.boot.registry.BootstrapServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||||
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource;
|
||||||
|
import org.hibernate.engine.jdbc.dialect.spi.DialectResolver;
|
||||||
|
import org.hibernate.orm.test.dialect.resolver.TestingDialectResolutionInfo;
|
||||||
|
import org.hibernate.service.spi.ServiceRegistryImplementor;
|
||||||
|
|
||||||
|
import org.hibernate.testing.junit4.BaseUnitTestCase;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Steve Ebersole
|
||||||
|
*/
|
||||||
|
public class CommunityDialectFactoryTest extends BaseUnitTestCase {
|
||||||
|
private StandardServiceRegistry registry;
|
||||||
|
private DialectFactoryImpl dialectFactory;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
final BootstrapServiceRegistry bootReg = new BootstrapServiceRegistryBuilder().applyClassLoader(
|
||||||
|
CommunityDialectFactoryTest.class.getClassLoader()
|
||||||
|
).build();
|
||||||
|
registry = new StandardServiceRegistryBuilder( bootReg ).build();
|
||||||
|
|
||||||
|
dialectFactory = new DialectFactoryImpl();
|
||||||
|
dialectFactory.injectServices( (ServiceRegistryImplementor) registry );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testPreregisteredDialects() {
|
||||||
|
DialectResolver resolver = new CommunityDialectResolver();
|
||||||
|
testDetermination( "Ingres", IngresDialect.class, resolver );
|
||||||
|
testDetermination( "ingres", IngresDialect.class, resolver );
|
||||||
|
testDetermination( "INGRES", IngresDialect.class, resolver );
|
||||||
|
testDetermination( "Adaptive Server Anywhere", SybaseAnywhereDialect.class, resolver );
|
||||||
|
testDetermination( "Informix Dynamic Server", InformixDialect.class, resolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDetermination(String databaseName, Class expected, DialectResolver resolver) {
|
||||||
|
testDetermination( databaseName, -9999, expected, resolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDetermination(String databaseName, int databaseMajorVersion, Class expected, DialectResolver resolver) {
|
||||||
|
testDetermination( databaseName, databaseMajorVersion, -9999, expected, resolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDetermination(
|
||||||
|
final String databaseName,
|
||||||
|
final int majorVersion,
|
||||||
|
final int minorVersion,
|
||||||
|
Class expected,
|
||||||
|
DialectResolver resolver) {
|
||||||
|
testDetermination( databaseName, null, majorVersion, minorVersion, expected, resolver );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDetermination(
|
||||||
|
final String databaseName,
|
||||||
|
final String driverName,
|
||||||
|
final int majorVersion,
|
||||||
|
final int minorVersion,
|
||||||
|
Class expected,
|
||||||
|
DialectResolver resolver) {
|
||||||
|
dialectFactory.setDialectResolver( resolver );
|
||||||
|
Dialect resolved = dialectFactory.buildDialect(
|
||||||
|
new Properties(),
|
||||||
|
new DialectResolutionInfoSource() {
|
||||||
|
@Override
|
||||||
|
public DialectResolutionInfo getDialectResolutionInfo() {
|
||||||
|
return TestingDialectResolutionInfo.forDatabaseInfo( databaseName, driverName, majorVersion, minorVersion );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assertEquals( expected, resolved.getClass() );
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class CommunityDialectSelectorTest {
|
||||||
|
|
||||||
|
private final CommunityDialectSelector strategySelector = new CommunityDialectSelector();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void verifyAllDialectNamingResolve() {
|
||||||
|
testDialectNamingResolution( Cache71Dialect.class );
|
||||||
|
testDialectNamingResolution( CUBRIDDialect.class );
|
||||||
|
testDialectNamingResolution( FirebirdDialect.class );
|
||||||
|
testDialectNamingResolution( InformixDialect.class );
|
||||||
|
testDialectNamingResolution( IngresDialect.class );
|
||||||
|
testDialectNamingResolution( Ingres9Dialect.class );
|
||||||
|
testDialectNamingResolution( Ingres10Dialect.class );
|
||||||
|
testDialectNamingResolution( MimerSQLDialect.class );
|
||||||
|
testDialectNamingResolution( SAPDBDialect.class );
|
||||||
|
testDialectNamingResolution( SybaseAnywhereDialect.class );
|
||||||
|
testDialectNamingResolution( TeradataDialect.class );
|
||||||
|
testDialectNamingResolution( TimesTenDialect.class );
|
||||||
|
}
|
||||||
|
|
||||||
|
private void testDialectNamingResolution(final Class<?> dialectClass) {
|
||||||
|
String simpleName = dialectClass.getSimpleName();
|
||||||
|
if ( simpleName.endsWith( "Dialect" ) ) {
|
||||||
|
simpleName = simpleName.substring( 0, simpleName.length() - "Dialect".length() );
|
||||||
|
}
|
||||||
|
Class<? extends Dialect> aClass = strategySelector.resolve( simpleName );
|
||||||
|
Assert.assertNotNull( aClass );
|
||||||
|
Assert.assertEquals( dialectClass, aClass );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,14 +4,11 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.dialect;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||||
import org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl;
|
|
||||||
import org.hibernate.cfg.AvailableSettings;
|
|
||||||
import org.hibernate.dialect.InformixDialect;
|
|
||||||
import org.hibernate.jpa.JpaComplianceStub;
|
import org.hibernate.jpa.JpaComplianceStub;
|
||||||
import org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl;
|
import org.hibernate.metamodel.model.domain.internal.JpaMetamodelImpl;
|
||||||
import org.hibernate.query.criteria.ValueHandlingMode;
|
import org.hibernate.query.criteria.ValueHandlingMode;
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
|
||||||
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.query.hql;
|
package org.hibernate.community.dialect;
|
||||||
|
|
||||||
import java.sql.Timestamp;
|
import java.sql.Timestamp;
|
||||||
import java.util.Calendar;
|
import java.util.Calendar;
|
||||||
@ -14,8 +14,6 @@
|
|||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
|
||||||
import org.hibernate.dialect.InformixDialect;
|
|
||||||
|
|
||||||
import org.hibernate.testing.TestForIssue;
|
import org.hibernate.testing.TestForIssue;
|
||||||
import org.hibernate.testing.orm.junit.DomainModel;
|
import org.hibernate.testing.orm.junit.DomainModel;
|
||||||
import org.hibernate.testing.orm.junit.RequiresDialect;
|
import org.hibernate.testing.orm.junit.RequiresDialect;
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.dialect.functional.cache;
|
package org.hibernate.community.dialect.functional.cache;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@ -17,7 +17,7 @@
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.hibernate.LockOptions;
|
import org.hibernate.LockOptions;
|
||||||
import org.hibernate.dialect.CacheDialect;
|
import org.hibernate.community.dialect.CacheDialect;
|
||||||
import org.hibernate.query.Query;
|
import org.hibernate.query.Query;
|
||||||
import org.hibernate.ScrollableResults;
|
import org.hibernate.ScrollableResults;
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
@ -9,7 +9,7 @@
|
|||||||
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
|
||||||
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
|
||||||
|
|
||||||
<hibernate-mapping package="org.hibernate.test.dialect.functional.cache" >
|
<hibernate-mapping package="org.hibernate.community.dialect.functional.cache" >
|
||||||
|
|
||||||
<class name="TestInterSystemsFunctionsClass" table="SQLUser.TestInterSystemsFunctionsClass">
|
<class name="TestInterSystemsFunctionsClass" table="SQLUser.TestInterSystemsFunctionsClass">
|
||||||
<id name="id" type="long" column="id_">
|
<id name="id" type="long" column="id_">
|
@ -4,7 +4,7 @@
|
|||||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
*/
|
*/
|
||||||
package org.hibernate.orm.test.dialect.functional.cache;
|
package org.hibernate.community.dialect.functional.cache;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
@ -0,0 +1,45 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.boot.registry.selector.internal;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
import org.hibernate.boot.registry.selector.spi.DialectSelector;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
|
||||||
|
public class AggregatedDialectSelector implements DialectSelector {
|
||||||
|
|
||||||
|
private final List<DialectSelector> dialectSelectors;
|
||||||
|
|
||||||
|
public AggregatedDialectSelector(Iterable<DialectSelector> dialectSelectorProvider) {
|
||||||
|
final List<DialectSelector> dialectSelectors = new ArrayList<>();
|
||||||
|
for ( DialectSelector dialectSelector : dialectSelectorProvider ) {
|
||||||
|
dialectSelectors.add( dialectSelector );
|
||||||
|
}
|
||||||
|
dialectSelectors.add( new DefaultDialectSelector() );
|
||||||
|
this.dialectSelectors = dialectSelectors;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Class<? extends Dialect> resolve(final String name) {
|
||||||
|
Objects.requireNonNull( name );
|
||||||
|
if ( name.isEmpty() ) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for ( DialectSelector dialectSelector : dialectSelectors ) {
|
||||||
|
final Class<? extends Dialect> dialectClass = dialectSelector.resolve( name );
|
||||||
|
if ( dialectClass != null ) {
|
||||||
|
return dialectClass;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -8,9 +8,7 @@
|
|||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import org.hibernate.dialect.CUBRIDDialect;
|
import org.hibernate.boot.registry.selector.spi.DialectSelector;
|
||||||
import org.hibernate.dialect.Cache71Dialect;
|
|
||||||
import org.hibernate.dialect.CacheDialect;
|
|
||||||
import org.hibernate.dialect.CockroachDialect;
|
import org.hibernate.dialect.CockroachDialect;
|
||||||
import org.hibernate.dialect.DB2390Dialect;
|
import org.hibernate.dialect.DB2390Dialect;
|
||||||
import org.hibernate.dialect.DB2390V8Dialect;
|
import org.hibernate.dialect.DB2390V8Dialect;
|
||||||
@ -25,24 +23,16 @@
|
|||||||
import org.hibernate.dialect.DerbyTenSevenDialect;
|
import org.hibernate.dialect.DerbyTenSevenDialect;
|
||||||
import org.hibernate.dialect.DerbyTenSixDialect;
|
import org.hibernate.dialect.DerbyTenSixDialect;
|
||||||
import org.hibernate.dialect.Dialect;
|
import org.hibernate.dialect.Dialect;
|
||||||
import org.hibernate.dialect.FirebirdDialect;
|
|
||||||
import org.hibernate.dialect.H2Dialect;
|
import org.hibernate.dialect.H2Dialect;
|
||||||
import org.hibernate.dialect.HANACloudColumnStoreDialect;
|
import org.hibernate.dialect.HANACloudColumnStoreDialect;
|
||||||
import org.hibernate.dialect.HANAColumnStoreDialect;
|
import org.hibernate.dialect.HANAColumnStoreDialect;
|
||||||
import org.hibernate.dialect.HANARowStoreDialect;
|
import org.hibernate.dialect.HANARowStoreDialect;
|
||||||
import org.hibernate.dialect.HSQLDialect;
|
import org.hibernate.dialect.HSQLDialect;
|
||||||
import org.hibernate.dialect.Informix10Dialect;
|
|
||||||
import org.hibernate.dialect.InformixDialect;
|
|
||||||
import org.hibernate.dialect.Ingres10Dialect;
|
|
||||||
import org.hibernate.dialect.Ingres9Dialect;
|
|
||||||
import org.hibernate.dialect.IngresDialect;
|
|
||||||
import org.hibernate.dialect.MariaDB102Dialect;
|
import org.hibernate.dialect.MariaDB102Dialect;
|
||||||
import org.hibernate.dialect.MariaDB103Dialect;
|
import org.hibernate.dialect.MariaDB103Dialect;
|
||||||
import org.hibernate.dialect.MariaDB10Dialect;
|
import org.hibernate.dialect.MariaDB10Dialect;
|
||||||
import org.hibernate.dialect.MariaDB53Dialect;
|
import org.hibernate.dialect.MariaDB53Dialect;
|
||||||
import org.hibernate.dialect.MariaDBDialect;
|
import org.hibernate.dialect.MariaDBDialect;
|
||||||
import org.hibernate.dialect.MaxDBDialect;
|
|
||||||
import org.hibernate.dialect.MimerSQLDialect;
|
|
||||||
import org.hibernate.dialect.MySQL55Dialect;
|
import org.hibernate.dialect.MySQL55Dialect;
|
||||||
import org.hibernate.dialect.MySQL57Dialect;
|
import org.hibernate.dialect.MySQL57Dialect;
|
||||||
import org.hibernate.dialect.MySQL5Dialect;
|
import org.hibernate.dialect.MySQL5Dialect;
|
||||||
@ -63,8 +53,6 @@
|
|||||||
import org.hibernate.dialect.PostgreSQL9Dialect;
|
import org.hibernate.dialect.PostgreSQL9Dialect;
|
||||||
import org.hibernate.dialect.PostgreSQLDialect;
|
import org.hibernate.dialect.PostgreSQLDialect;
|
||||||
import org.hibernate.dialect.PostgresPlusDialect;
|
import org.hibernate.dialect.PostgresPlusDialect;
|
||||||
import org.hibernate.dialect.RDMSOS2200Dialect;
|
|
||||||
import org.hibernate.dialect.SAPDBDialect;
|
|
||||||
import org.hibernate.dialect.SQLServer2005Dialect;
|
import org.hibernate.dialect.SQLServer2005Dialect;
|
||||||
import org.hibernate.dialect.SQLServer2008Dialect;
|
import org.hibernate.dialect.SQLServer2008Dialect;
|
||||||
import org.hibernate.dialect.SQLServer2012Dialect;
|
import org.hibernate.dialect.SQLServer2012Dialect;
|
||||||
@ -74,29 +62,19 @@
|
|||||||
import org.hibernate.dialect.SybaseASE157Dialect;
|
import org.hibernate.dialect.SybaseASE157Dialect;
|
||||||
import org.hibernate.dialect.SybaseASE15Dialect;
|
import org.hibernate.dialect.SybaseASE15Dialect;
|
||||||
import org.hibernate.dialect.SybaseASEDialect;
|
import org.hibernate.dialect.SybaseASEDialect;
|
||||||
import org.hibernate.dialect.SybaseAnywhereDialect;
|
|
||||||
import org.hibernate.dialect.SybaseDialect;
|
import org.hibernate.dialect.SybaseDialect;
|
||||||
import org.hibernate.dialect.Teradata14Dialect;
|
|
||||||
import org.hibernate.dialect.TeradataDialect;
|
|
||||||
import org.hibernate.dialect.TimesTenDialect;
|
|
||||||
|
|
||||||
public class DefaultDialectSelector implements LazyServiceResolver<Dialect> {
|
public class DefaultDialectSelector implements DialectSelector {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Class<? extends Dialect> resolve(final String name) {
|
public Class<? extends Dialect> resolve(final String name) {
|
||||||
Objects.requireNonNull( name);
|
Objects.requireNonNull( name );
|
||||||
if ( name.isEmpty() ) {
|
if ( name.isEmpty() ) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
switch ( name ) {
|
switch ( name ) {
|
||||||
case "Cache":
|
|
||||||
return CacheDialect.class;
|
|
||||||
case "Cache71":
|
|
||||||
return Cache71Dialect.class;
|
|
||||||
case "Cockroach":
|
case "Cockroach":
|
||||||
return CockroachDialect.class;
|
return CockroachDialect.class;
|
||||||
case "CUBRID":
|
|
||||||
return CUBRIDDialect.class;
|
|
||||||
case "DB2":
|
case "DB2":
|
||||||
return DB2Dialect.class;
|
return DB2Dialect.class;
|
||||||
case "DB2i":
|
case "DB2i":
|
||||||
@ -121,8 +99,6 @@ public Class<? extends Dialect> resolve(final String name) {
|
|||||||
return DerbyTenSixDialect.class;
|
return DerbyTenSixDialect.class;
|
||||||
case "DerbyTenSeven":
|
case "DerbyTenSeven":
|
||||||
return DerbyTenSevenDialect.class;
|
return DerbyTenSevenDialect.class;
|
||||||
case "Firebird":
|
|
||||||
return FirebirdDialect.class;
|
|
||||||
case "H2":
|
case "H2":
|
||||||
return H2Dialect.class;
|
return H2Dialect.class;
|
||||||
case "HANACloudColumnStore":
|
case "HANACloudColumnStore":
|
||||||
@ -133,16 +109,6 @@ public Class<? extends Dialect> resolve(final String name) {
|
|||||||
return HANARowStoreDialect.class;
|
return HANARowStoreDialect.class;
|
||||||
case "HSQL":
|
case "HSQL":
|
||||||
return HSQLDialect.class;
|
return HSQLDialect.class;
|
||||||
case "Informix":
|
|
||||||
return InformixDialect.class;
|
|
||||||
case "Informix10":
|
|
||||||
return Informix10Dialect.class;
|
|
||||||
case "Ingres":
|
|
||||||
return IngresDialect.class;
|
|
||||||
case "Ingres9":
|
|
||||||
return Ingres9Dialect.class;
|
|
||||||
case "Ingres10":
|
|
||||||
return Ingres10Dialect.class;
|
|
||||||
case "MariaDB":
|
case "MariaDB":
|
||||||
return MariaDBDialect.class;
|
return MariaDBDialect.class;
|
||||||
case "MariaDB53":
|
case "MariaDB53":
|
||||||
@ -153,10 +119,6 @@ public Class<? extends Dialect> resolve(final String name) {
|
|||||||
return MariaDB102Dialect.class;
|
return MariaDB102Dialect.class;
|
||||||
case "MariaDB103":
|
case "MariaDB103":
|
||||||
return MariaDB103Dialect.class;
|
return MariaDB103Dialect.class;
|
||||||
case "MaxDB":
|
|
||||||
return MaxDBDialect.class;
|
|
||||||
case "MimerSQL":
|
|
||||||
return MimerSQLDialect.class;
|
|
||||||
case "MySQL":
|
case "MySQL":
|
||||||
return MySQLDialect.class;
|
return MySQLDialect.class;
|
||||||
case "MySQL5":
|
case "MySQL5":
|
||||||
@ -197,10 +159,6 @@ public Class<? extends Dialect> resolve(final String name) {
|
|||||||
return PostgreSQL94Dialect.class;
|
return PostgreSQL94Dialect.class;
|
||||||
case "PostgreSQL95":
|
case "PostgreSQL95":
|
||||||
return PostgreSQL95Dialect.class;
|
return PostgreSQL95Dialect.class;
|
||||||
case "RDMSOS2200":
|
|
||||||
return RDMSOS2200Dialect.class;
|
|
||||||
case "SAPDB":
|
|
||||||
return SAPDBDialect.class;
|
|
||||||
case "Spanner":
|
case "Spanner":
|
||||||
return SpannerDialect.class;
|
return SpannerDialect.class;
|
||||||
case "SQLServer":
|
case "SQLServer":
|
||||||
@ -215,20 +173,12 @@ public Class<? extends Dialect> resolve(final String name) {
|
|||||||
return SybaseDialect.class;
|
return SybaseDialect.class;
|
||||||
case "Sybase11":
|
case "Sybase11":
|
||||||
return Sybase11Dialect.class;
|
return Sybase11Dialect.class;
|
||||||
case "SybaseAnywhere":
|
|
||||||
return SybaseAnywhereDialect.class;
|
|
||||||
case "SybaseASE":
|
case "SybaseASE":
|
||||||
return SybaseASEDialect.class;
|
return SybaseASEDialect.class;
|
||||||
case "SybaseASE15":
|
case "SybaseASE15":
|
||||||
return SybaseASE15Dialect.class;
|
return SybaseASE15Dialect.class;
|
||||||
case "SybaseASE157":
|
case "SybaseASE157":
|
||||||
return SybaseASE157Dialect.class;
|
return SybaseASE157Dialect.class;
|
||||||
case "Teradata":
|
|
||||||
return TeradataDialect.class;
|
|
||||||
case "Teradata14":
|
|
||||||
return Teradata14Dialect.class;
|
|
||||||
case "TimesTen":
|
|
||||||
return TimesTenDialect.class;
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
import org.hibernate.boot.registry.selector.SimpleStrategyRegistrationImpl;
|
import org.hibernate.boot.registry.selector.SimpleStrategyRegistrationImpl;
|
||||||
import org.hibernate.boot.registry.selector.StrategyRegistration;
|
import org.hibernate.boot.registry.selector.StrategyRegistration;
|
||||||
import org.hibernate.boot.registry.selector.StrategyRegistrationProvider;
|
import org.hibernate.boot.registry.selector.StrategyRegistrationProvider;
|
||||||
|
import org.hibernate.boot.registry.selector.spi.DialectSelector;
|
||||||
import org.hibernate.boot.registry.selector.spi.StrategySelectionException;
|
import org.hibernate.boot.registry.selector.spi.StrategySelectionException;
|
||||||
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
import org.hibernate.boot.registry.selector.spi.StrategySelector;
|
||||||
import org.hibernate.cache.internal.DefaultCacheKeysFactory;
|
import org.hibernate.cache.internal.DefaultCacheKeysFactory;
|
||||||
@ -97,7 +98,10 @@ public StrategySelector buildSelector(ClassLoaderService classLoaderService) {
|
|||||||
final StrategySelectorImpl strategySelector = new StrategySelectorImpl( classLoaderService );
|
final StrategySelectorImpl strategySelector = new StrategySelectorImpl( classLoaderService );
|
||||||
|
|
||||||
// build the baseline...
|
// build the baseline...
|
||||||
strategySelector.registerStrategyLazily( Dialect.class, new DefaultDialectSelector() );
|
strategySelector.registerStrategyLazily(
|
||||||
|
Dialect.class,
|
||||||
|
new AggregatedDialectSelector( classLoaderService.loadJavaServices( DialectSelector.class ) )
|
||||||
|
);
|
||||||
strategySelector.registerStrategyLazily( JtaPlatform.class, new DefaultJtaPlatformSelector() );
|
strategySelector.registerStrategyLazily( JtaPlatform.class, new DefaultJtaPlatformSelector() );
|
||||||
addTransactionCoordinatorBuilders( strategySelector );
|
addTransactionCoordinatorBuilders( strategySelector );
|
||||||
addSqmMultiTableMutationStrategies( strategySelector );
|
addSqmMultiTableMutationStrategies( strategySelector );
|
||||||
|
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Hibernate, Relational Persistence for Idiomatic Java
|
||||||
|
*
|
||||||
|
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||||
|
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||||
|
*/
|
||||||
|
package org.hibernate.boot.registry.selector.spi;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
|
import org.hibernate.boot.registry.selector.internal.LazyServiceResolver;
|
||||||
|
import org.hibernate.dialect.Dialect;
|
||||||
|
import org.hibernate.service.Service;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Service which acts as a registry for named strategy implementations.
|
||||||
|
* <p/>
|
||||||
|
* Strategies are more open ended than services, though a strategy managed here might very well also be a service. The
|
||||||
|
* strategy is any interface that has multiple, (possibly short) named implementations.
|
||||||
|
* <p/>
|
||||||
|
* StrategySelector manages resolution of particular implementation by (possibly short) name via the
|
||||||
|
* {@link #selectStrategyImplementor} method, which is the main contract here. As indicated in the docs of that
|
||||||
|
* method the given name might be either a short registered name or the implementation FQN. As an example, consider
|
||||||
|
* resolving the {@link org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder} implementation to use. To use the
|
||||||
|
* JDBC-based TransactionCoordinatorBuilder the passed name might be either {@code "jdbc"} or
|
||||||
|
* {@code "org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorBuilderImpl"} (which is the FQN).
|
||||||
|
* <p/>
|
||||||
|
* Strategy implementations can be managed by {@link #registerStrategyImplementor} and
|
||||||
|
* {@link #unRegisterStrategyImplementor}. Originally designed to help the OSGi use case, though no longer used there.
|
||||||
|
* <p/>
|
||||||
|
* The service also exposes a general typing API via {@link #resolveStrategy} and {@link #resolveDefaultableStrategy}
|
||||||
|
* which accept implementation references rather than implementation names, allowing for a multitude of interpretations
|
||||||
|
* of said "implementation reference". See the docs for {@link #resolveDefaultableStrategy} for details.
|
||||||
|
*
|
||||||
|
* @author Christian Beikov
|
||||||
|
*/
|
||||||
|
public interface DialectSelector extends Service, LazyServiceResolver<Dialect> {
|
||||||
|
}
|
@ -1523,6 +1523,16 @@ public int registerResultSetOutParameter(CallableStatement statement, String nam
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWindowFunctions() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsNoWait() {
|
public boolean supportsNoWait() {
|
||||||
return true;
|
return true;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
import org.hibernate.query.sqm.mutation.internal.idtable.LocalTemporaryTableStrategy;
|
import org.hibernate.query.sqm.mutation.internal.idtable.LocalTemporaryTableStrategy;
|
||||||
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
import org.hibernate.query.sqm.mutation.internal.idtable.TempIdTableExporter;
|
||||||
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
|
||||||
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
import org.hibernate.type.descriptor.jdbc.JdbcTypeDescriptor;
|
||||||
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeDescriptorRegistry;
|
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeDescriptorRegistry;
|
||||||
|
|
||||||
@ -39,7 +40,7 @@
|
|||||||
*
|
*
|
||||||
* @author Gavin King
|
* @author Gavin King
|
||||||
*/
|
*/
|
||||||
abstract class AbstractTransactSQLDialect extends Dialect {
|
public abstract class AbstractTransactSQLDialect extends Dialect {
|
||||||
public AbstractTransactSQLDialect() {
|
public AbstractTransactSQLDialect() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@ -122,7 +123,7 @@ public String trimPattern(TrimSpec specification, char character) {
|
|||||||
return replaceLtrimRtrim(specification, character);
|
return replaceLtrimRtrim(specification, character);
|
||||||
}
|
}
|
||||||
|
|
||||||
static String replaceLtrimRtrim(TrimSpec specification, char character) {
|
public static String replaceLtrimRtrim(TrimSpec specification, char character) {
|
||||||
boolean blank = character == ' ';
|
boolean blank = character == ' ';
|
||||||
switch ( specification ) {
|
switch ( specification ) {
|
||||||
case LEADING:
|
case LEADING:
|
||||||
@ -314,4 +315,9 @@ public IdentityColumnSupport getIdentityColumnSupport() {
|
|||||||
public boolean supportsPartitionBy() {
|
public boolean supportsPartitionBy() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String formatBinaryLiteral(byte[] bytes) {
|
||||||
|
return "0x" + StandardBasicTypes.BINARY.toString( bytes );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -481,6 +481,16 @@ public boolean supportsOuterJoinForUpdate() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsOffsetInSubquery() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean supportsWindowFunctions() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean supportsNoWait() {
|
public boolean supportsNoWait() {
|
||||||
return getVersion() >= 2010;
|
return getVersion() >= 2010;
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user