From 638b43f04bcd82868431b87b3b7b31e5b9b3e802 Mon Sep 17 00:00:00 2001 From: Gail Badner Date: Wed, 11 Feb 2009 05:34:52 +0000 Subject: [PATCH] HHH-3712 - Reorganize the Sybase dialect class hierarchy, add SybaseASE15Dialect, and mark SybaseDialect as deprecated git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@15934 1b8cb986-b30d-0410-93ca-fae66ebed9b2 --- .../dialect/AbstractTransactSQLDialect.java | 263 ++++++++++++++++++ .../hibernate/dialect/SQLServerDialect.java | 12 +- .../hibernate/dialect/Sybase11Dialect.java | 2 +- .../hibernate/dialect/SybaseASE15Dialect.java | 67 +++++ .../dialect/SybaseAnywhereDialect.java | 2 +- .../org/hibernate/dialect/SybaseDialect.java | 256 +---------------- testsuite/pom.xml | 21 +- .../connections/AggressiveReleaseTest.java | 2 +- .../lockhint/SybaseASE15LockHintsTest.java | 56 ++++ ...mestampGeneratedValuesWithCachingTest.java | 8 +- .../test/hql/ASTParserLoadingTest.java | 7 +- .../java/org/hibernate/test/hql/HQLTest.java | 16 +- .../interfaceproxy/InterfaceProxyTest.java | 2 +- .../org/hibernate/test/legacy/FooBarTest.java | 5 +- .../test/legacy/SQLFunctionsTest.java | 9 +- .../test/lob/SerializableTypeTest.java | 8 +- .../org/hibernate/test/mixed/MixedTest.java | 4 +- .../org/hibernate/test/stats/StatsTest.java | 2 +- 18 files changed, 466 insertions(+), 276 deletions(-) create mode 100644 core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java create mode 100644 core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java create mode 100644 testsuite/src/test/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java diff --git a/core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java b/core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java new file mode 100644 index 0000000000..ccfd3a46fa --- /dev/null +++ b/core/src/main/java/org/hibernate/dialect/AbstractTransactSQLDialect.java @@ -0,0 +1,263 @@ +//$Id: $ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + * + */ +package org.hibernate.dialect; + +import java.sql.CallableStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Map; +import java.util.Iterator; + +import org.hibernate.Hibernate; +import org.hibernate.LockMode; +import org.hibernate.cfg.Environment; +import org.hibernate.dialect.function.CharIndexFunction; +import org.hibernate.dialect.function.NoArgSQLFunction; +import org.hibernate.dialect.function.SQLFunctionTemplate; +import org.hibernate.dialect.function.StandardSQLFunction; +import org.hibernate.dialect.function.VarArgsSQLFunction; + +/** + * An abstract base class for Sybase and MS SQL Server dialects. + * @author Gavin King + */ + +/* package-private */ +abstract class AbstractTransactSQLDialect extends Dialect { + public AbstractTransactSQLDialect() { + super(); + registerColumnType( Types.BIT, "tinyint" ); //Sybase BIT type does not support null values + registerColumnType( Types.BIGINT, "numeric(19,0)" ); + registerColumnType( Types.SMALLINT, "smallint" ); + registerColumnType( Types.TINYINT, "tinyint" ); + registerColumnType( Types.INTEGER, "int" ); + registerColumnType( Types.CHAR, "char(1)" ); + registerColumnType( Types.VARCHAR, "varchar($l)" ); + registerColumnType( Types.FLOAT, "float" ); + registerColumnType( Types.DOUBLE, "double precision" ); + registerColumnType( Types.DATE, "datetime" ); + registerColumnType( Types.TIME, "datetime" ); + registerColumnType( Types.TIMESTAMP, "datetime" ); + registerColumnType( Types.VARBINARY, "varbinary($l)" ); + registerColumnType( Types.NUMERIC, "numeric($p,$s)" ); + registerColumnType( Types.BLOB, "image" ); + registerColumnType( Types.CLOB, "text" ); + + registerFunction( "ascii", new StandardSQLFunction("ascii", Hibernate.INTEGER) ); + registerFunction( "char", new StandardSQLFunction("char", Hibernate.CHARACTER) ); + registerFunction( "len", new StandardSQLFunction("len", Hibernate.LONG) ); + registerFunction( "lower", new StandardSQLFunction("lower") ); + registerFunction( "upper", new StandardSQLFunction("upper") ); + registerFunction( "str", new StandardSQLFunction("str", Hibernate.STRING) ); + registerFunction( "ltrim", new StandardSQLFunction("ltrim") ); + registerFunction( "rtrim", new StandardSQLFunction("rtrim") ); + registerFunction( "reverse", new StandardSQLFunction("reverse") ); + registerFunction( "space", new StandardSQLFunction("space", Hibernate.STRING) ); + + registerFunction( "user", new NoArgSQLFunction("user", Hibernate.STRING) ); + + registerFunction( "current_timestamp", new NoArgSQLFunction("getdate", Hibernate.TIMESTAMP) ); + registerFunction( "current_time", new NoArgSQLFunction("getdate", Hibernate.TIME) ); + registerFunction( "current_date", new NoArgSQLFunction("getdate", Hibernate.DATE) ); + + registerFunction( "getdate", new NoArgSQLFunction("getdate", Hibernate.TIMESTAMP) ); + registerFunction( "getutcdate", new NoArgSQLFunction("getutcdate", Hibernate.TIMESTAMP) ); + registerFunction( "day", new StandardSQLFunction("day", Hibernate.INTEGER) ); + registerFunction( "month", new StandardSQLFunction("month", Hibernate.INTEGER) ); + registerFunction( "year", new StandardSQLFunction("year", Hibernate.INTEGER) ); + registerFunction( "datename", new StandardSQLFunction("datename", Hibernate.STRING) ); + + registerFunction( "abs", new StandardSQLFunction("abs") ); + registerFunction( "sign", new StandardSQLFunction("sign", Hibernate.INTEGER) ); + + registerFunction( "acos", new StandardSQLFunction("acos", Hibernate.DOUBLE) ); + registerFunction( "asin", new StandardSQLFunction("asin", Hibernate.DOUBLE) ); + registerFunction( "atan", new StandardSQLFunction("atan", Hibernate.DOUBLE) ); + registerFunction( "cos", new StandardSQLFunction("cos", Hibernate.DOUBLE) ); + registerFunction( "cot", new StandardSQLFunction("cot", Hibernate.DOUBLE) ); + registerFunction( "exp", new StandardSQLFunction("exp", Hibernate.DOUBLE) ); + registerFunction( "log", new StandardSQLFunction( "log", Hibernate.DOUBLE) ); + registerFunction( "log10", new StandardSQLFunction("log10", Hibernate.DOUBLE) ); + registerFunction( "sin", new StandardSQLFunction("sin", Hibernate.DOUBLE) ); + registerFunction( "sqrt", new StandardSQLFunction("sqrt", Hibernate.DOUBLE) ); + registerFunction( "tan", new StandardSQLFunction("tan", Hibernate.DOUBLE) ); + registerFunction( "pi", new NoArgSQLFunction("pi", Hibernate.DOUBLE) ); + registerFunction( "square", new StandardSQLFunction("square") ); + registerFunction( "rand", new StandardSQLFunction("rand", Hibernate.FLOAT) ); + + registerFunction("radians", new StandardSQLFunction("radians", Hibernate.DOUBLE) ); + registerFunction("degrees", new StandardSQLFunction("degrees", Hibernate.DOUBLE) ); + + registerFunction( "round", new StandardSQLFunction("round") ); + registerFunction( "ceiling", new StandardSQLFunction("ceiling") ); + registerFunction( "floor", new StandardSQLFunction("floor") ); + + registerFunction( "isnull", new StandardSQLFunction("isnull") ); + + registerFunction( "concat", new VarArgsSQLFunction( Hibernate.STRING, "(","+",")" ) ); + + registerFunction( "length", new StandardSQLFunction( "len", Hibernate.INTEGER ) ); + registerFunction( "trim", new SQLFunctionTemplate( Hibernate.STRING, "ltrim(rtrim(?1))") ); + registerFunction( "locate", new CharIndexFunction() ); + + getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, NO_BATCH); + } + + public String getAddColumnString() { + return "add"; + } + public String getNullColumnString() { + return " null"; + } + public boolean qualifyIndexName() { + return false; + } + + public String getForUpdateString() { + return ""; + } + + public boolean supportsIdentityColumns() { + return true; + } + public String getIdentitySelectString() { + return "select @@identity"; + } + public String getIdentityColumnString() { + return "identity not null"; //starts with 1, implicitly + } + + public boolean supportsInsertSelectIdentity() { + return true; + } + + public String appendIdentitySelectToInsert(String insertSQL) { + return insertSQL + "\nselect @@identity"; + } + + public String appendLockHint(LockMode mode, String tableName) { + if ( mode.greaterThan( LockMode.READ ) ) { + return tableName + " holdlock"; + } + else { + return tableName; + } + } + + public String applyLocksToSql(String sql, Map aliasedLockModes, Map keyColumnNames) { + Iterator itr = aliasedLockModes.entrySet().iterator(); + StringBuffer buffer = new StringBuffer( sql ); + int correction = 0; + while ( itr.hasNext() ) { + final Map.Entry entry = ( Map.Entry ) itr.next(); + final LockMode lockMode = ( LockMode ) entry.getValue(); + if ( lockMode.greaterThan( LockMode.READ ) ) { + final String alias = ( String ) entry.getKey(); + int start = -1, end = -1; + if ( sql.endsWith( " " + alias ) ) { + start = ( sql.length() - alias.length() ) + correction; + end = start + alias.length(); + } + else { + int position = sql.indexOf( " " + alias + " " ); + if ( position <= -1 ) { + position = sql.indexOf( " " + alias + "," ); + } + if ( position > -1 ) { + start = position + correction + 1; + end = start + alias.length(); + } + } + + if ( start > -1 ) { + final String lockHint = appendLockHint( lockMode, alias ); + buffer.replace( start, end, lockHint ); + correction += ( lockHint.length() - alias.length() ); + } + } + } + return buffer.toString(); + } + + public int registerResultSetOutParameter(CallableStatement statement, int col) throws SQLException { + return col; // sql server just returns automatically + } + + public ResultSet getResultSet(CallableStatement ps) throws SQLException { + boolean isResultSet = ps.execute(); +// This assumes you will want to ignore any update counts + while ( !isResultSet && ps.getUpdateCount() != -1 ) { + isResultSet = ps.getMoreResults(); + } +// You may still have other ResultSets or update counts left to process here +// but you can't do it now or the ResultSet you just got will be closed + return ps.getResultSet(); + } + + public boolean supportsCurrentTimestampSelection() { + return true; + } + + public boolean isCurrentTimestampSelectStringCallable() { + return false; + } + + public String getCurrentTimestampSelectString() { + return "select getdate()"; + } + + public boolean supportsTemporaryTables() { + return true; + } + + public String generateTemporaryTableName(String baseTableName) { + return "#" + baseTableName; + } + + public boolean dropTemporaryTableAfterUse() { + return true; // sql-server, at least needed this dropped after use; strange! + } + + + // Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + public boolean supportsEmptyInList() { + return false; + } + + public boolean supportsExistsInSelect() { + return false; + } + + public boolean doesReadCommittedCauseWritersToBlockReaders() { + return true; + } + + public boolean doesRepeatableReadCauseReadersToBlockWriters() { + return true; + } +} diff --git a/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java b/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java index 5f6e430708..f248a88afc 100644 --- a/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java +++ b/core/src/main/java/org/hibernate/dialect/SQLServerDialect.java @@ -43,8 +43,12 @@ public class SQLServerDialect extends SybaseDialect { registerColumnType( Types.VARBINARY, "image" ); registerColumnType( Types.VARBINARY, 8000, "varbinary($l)" ); + registerFunction( "second", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(second, ?1)" ) ); + registerFunction( "minute", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(minute, ?1)" ) ); + registerFunction( "hour", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(hour, ?1)" ) ); registerFunction( "locate", new StandardSQLFunction( "charindex", Hibernate.INTEGER ) ); + registerFunction( "extract", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(?1, ?3)" ) ); registerFunction( "mod", new SQLFunctionTemplate( Hibernate.INTEGER, "?1 % ?2" ) ); registerFunction( "bit_length", new SQLFunctionTemplate( Hibernate.INTEGER, "datalength(?1) * 8" ) ); @@ -134,10 +138,6 @@ public class SQLServerDialect extends SybaseDialect { return false; } - public boolean supportsCascadeDelete() { - return true; - } - public boolean supportsCircularCascadeDeleteConstraints() { // SQL Server (at least up through 2005) does not support defining // cascade delete constraints which can circel back to the mutating @@ -145,10 +145,6 @@ public class SQLServerDialect extends SybaseDialect { return false; } - public boolean supportsExpectedLobUsagePattern() { - return true; - } - public boolean supportsLobValueChangePropogation() { // note: at least my local SQL Server 2005 Express shows this not working... return false; diff --git a/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java b/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java index 7ea4f444e1..db89359738 100644 --- a/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java +++ b/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java @@ -31,7 +31,7 @@ import org.hibernate.sql.Sybase11JoinFragment; * A SQL dialect suitable for use with Sybase 11.9.2 (specifically: avoids ANSI JOIN syntax) * @author Colm O' Flaherty */ -public class Sybase11Dialect extends SybaseDialect { +public class Sybase11Dialect extends AbstractTransactSQLDialect { public Sybase11Dialect() { super(); } diff --git a/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java b/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java new file mode 100644 index 0000000000..7a7cb1b1f3 --- /dev/null +++ b/core/src/main/java/org/hibernate/dialect/SybaseASE15Dialect.java @@ -0,0 +1,67 @@ +//$Id $ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + * + */ +package org.hibernate.dialect; + +import java.sql.CallableStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Map; +import java.util.Iterator; + +import org.hibernate.Hibernate; +import org.hibernate.LockMode; +import org.hibernate.cfg.Environment; +import org.hibernate.dialect.function.CharIndexFunction; +import org.hibernate.dialect.function.NoArgSQLFunction; +import org.hibernate.dialect.function.SQLFunctionTemplate; +import org.hibernate.dialect.function.StandardSQLFunction; +import org.hibernate.dialect.function.VarArgsSQLFunction; + +/** + * An SQL dialect compatible with Sybase and MS SQL Server. + * @author Gavin King + */ + +public class SybaseASE15Dialect extends AbstractTransactSQLDialect { + public SybaseASE15Dialect() { + super(); + registerFunction( "second", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(second, ?1)") ); + registerFunction( "minute", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(minute, ?1)") ); + registerFunction( "hour", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(hour, ?1)") ); + registerFunction( "extract", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(?1, ?3)" ) ); + } + + // Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + public boolean supportsCascadeDelete() { + return false; + } + + public boolean supportsExpectedLobUsagePattern() { + return false; + } +} diff --git a/core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java b/core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java index 139685fd6f..0aa84ae067 100644 --- a/core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java +++ b/core/src/main/java/org/hibernate/dialect/SybaseAnywhereDialect.java @@ -30,7 +30,7 @@ package org.hibernate.dialect; * (Tested on ASA 8.x) * @author ? */ -public class SybaseAnywhereDialect extends SybaseDialect { +public class SybaseAnywhereDialect extends AbstractTransactSQLDialect { /** * Sybase Anywhere syntax would require a "DEFAULT" for each column specified, diff --git a/core/src/main/java/org/hibernate/dialect/SybaseDialect.java b/core/src/main/java/org/hibernate/dialect/SybaseDialect.java index aa78d7c1af..e99f892952 100644 --- a/core/src/main/java/org/hibernate/dialect/SybaseDialect.java +++ b/core/src/main/java/org/hibernate/dialect/SybaseDialect.java @@ -1,3 +1,4 @@ +//$Id $ /* * Hibernate, Relational Persistence for Idiomatic Java * @@ -24,253 +25,16 @@ */ package org.hibernate.dialect; -import java.sql.CallableStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Types; -import java.util.Map; -import java.util.Iterator; - -import org.hibernate.Hibernate; -import org.hibernate.LockMode; -import org.hibernate.cfg.Environment; -import org.hibernate.dialect.function.CharIndexFunction; -import org.hibernate.dialect.function.NoArgSQLFunction; -import org.hibernate.dialect.function.SQLFunctionTemplate; -import org.hibernate.dialect.function.StandardSQLFunction; -import org.hibernate.dialect.function.VarArgsSQLFunction; - /** - * An SQL dialect compatible with Sybase and MS SQL Server. - * @author Gavin King + * SybaseDialect is being deprecated. + * + * AbstractTransactSQLDialect should be used as a base + * class for Sybase and MS SQL Server dialects. + * + * @author Gail Badner + * @deprecated SybaseASE15Dialect or SQLServerDialect should be + * used instead. */ -public class SybaseDialect extends Dialect { - public SybaseDialect() { - super(); - registerColumnType( Types.BIT, "tinyint" ); //Sybase BIT type does not support null values - registerColumnType( Types.BIGINT, "numeric(19,0)" ); - registerColumnType( Types.SMALLINT, "smallint" ); - registerColumnType( Types.TINYINT, "tinyint" ); - registerColumnType( Types.INTEGER, "int" ); - registerColumnType( Types.CHAR, "char(1)" ); - registerColumnType( Types.VARCHAR, "varchar($l)" ); - registerColumnType( Types.FLOAT, "float" ); - registerColumnType( Types.DOUBLE, "double precision" ); - registerColumnType( Types.DATE, "datetime" ); - registerColumnType( Types.TIME, "datetime" ); - registerColumnType( Types.TIMESTAMP, "datetime" ); - registerColumnType( Types.VARBINARY, "varbinary($l)" ); - registerColumnType( Types.NUMERIC, "numeric($p,$s)" ); - registerColumnType( Types.BLOB, "image" ); - registerColumnType( Types.CLOB, "text" ); - - registerFunction( "ascii", new StandardSQLFunction("ascii", Hibernate.INTEGER) ); - registerFunction( "char", new StandardSQLFunction("char", Hibernate.CHARACTER) ); - registerFunction( "len", new StandardSQLFunction("len", Hibernate.LONG) ); - registerFunction( "lower", new StandardSQLFunction("lower") ); - registerFunction( "upper", new StandardSQLFunction("upper") ); - registerFunction( "str", new StandardSQLFunction("str", Hibernate.STRING) ); - registerFunction( "ltrim", new StandardSQLFunction("ltrim") ); - registerFunction( "rtrim", new StandardSQLFunction("rtrim") ); - registerFunction( "reverse", new StandardSQLFunction("reverse") ); - registerFunction( "space", new StandardSQLFunction("space", Hibernate.STRING) ); - - registerFunction( "user", new NoArgSQLFunction("user", Hibernate.STRING) ); - - registerFunction( "current_timestamp", new NoArgSQLFunction("getdate", Hibernate.TIMESTAMP) ); - registerFunction( "current_time", new NoArgSQLFunction("getdate", Hibernate.TIME) ); - registerFunction( "current_date", new NoArgSQLFunction("getdate", Hibernate.DATE) ); - - registerFunction( "getdate", new NoArgSQLFunction("getdate", Hibernate.TIMESTAMP) ); - registerFunction( "getutcdate", new NoArgSQLFunction("getutcdate", Hibernate.TIMESTAMP) ); - registerFunction( "day", new StandardSQLFunction("day", Hibernate.INTEGER) ); - registerFunction( "month", new StandardSQLFunction("month", Hibernate.INTEGER) ); - registerFunction( "year", new StandardSQLFunction("year", Hibernate.INTEGER) ); - registerFunction( "datename", new StandardSQLFunction("datename", Hibernate.STRING) ); - registerFunction( "second", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(second, ?1)") ); - registerFunction( "minute", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(minute, ?1)") ); - registerFunction( "hour", new SQLFunctionTemplate(Hibernate.INTEGER, "datepart(hour, ?1)") ); - registerFunction( "extract", new SQLFunctionTemplate( Hibernate.INTEGER, "datepart(?1, ?3)" ) ); - - registerFunction( "abs", new StandardSQLFunction("abs") ); - registerFunction( "sign", new StandardSQLFunction("sign", Hibernate.INTEGER) ); - - registerFunction( "acos", new StandardSQLFunction("acos", Hibernate.DOUBLE) ); - registerFunction( "asin", new StandardSQLFunction("asin", Hibernate.DOUBLE) ); - registerFunction( "atan", new StandardSQLFunction("atan", Hibernate.DOUBLE) ); - registerFunction( "cos", new StandardSQLFunction("cos", Hibernate.DOUBLE) ); - registerFunction( "cot", new StandardSQLFunction("cot", Hibernate.DOUBLE) ); - registerFunction( "exp", new StandardSQLFunction("exp", Hibernate.DOUBLE) ); - registerFunction( "log", new StandardSQLFunction( "log", Hibernate.DOUBLE) ); - registerFunction( "log10", new StandardSQLFunction("log10", Hibernate.DOUBLE) ); - registerFunction( "sin", new StandardSQLFunction("sin", Hibernate.DOUBLE) ); - registerFunction( "sqrt", new StandardSQLFunction("sqrt", Hibernate.DOUBLE) ); - registerFunction( "tan", new StandardSQLFunction("tan", Hibernate.DOUBLE) ); - registerFunction( "pi", new NoArgSQLFunction("pi", Hibernate.DOUBLE) ); - registerFunction( "square", new StandardSQLFunction("square") ); - registerFunction( "rand", new StandardSQLFunction("rand", Hibernate.FLOAT) ); - - registerFunction("radians", new StandardSQLFunction("radians", Hibernate.DOUBLE) ); - registerFunction("degrees", new StandardSQLFunction("degrees", Hibernate.DOUBLE) ); - - registerFunction( "round", new StandardSQLFunction("round") ); - registerFunction( "ceiling", new StandardSQLFunction("ceiling") ); - registerFunction( "floor", new StandardSQLFunction("floor") ); - - registerFunction( "isnull", new StandardSQLFunction("isnull") ); - - registerFunction( "concat", new VarArgsSQLFunction( Hibernate.STRING, "(","+",")" ) ); - - registerFunction( "length", new StandardSQLFunction( "len", Hibernate.INTEGER ) ); - registerFunction( "trim", new SQLFunctionTemplate( Hibernate.STRING, "ltrim(rtrim(?1))") ); - registerFunction( "locate", new CharIndexFunction() ); - - registerFunction( "mod", new SQLFunctionTemplate( Hibernate.INTEGER, "?1 % ?2" ) ); - registerFunction( "bit_length", new SQLFunctionTemplate( Hibernate.INTEGER, "datalength(?1) * 8" ) ); - - getDefaultProperties().setProperty(Environment.STATEMENT_BATCH_SIZE, NO_BATCH); - } - - public String getAddColumnString() { - return "add"; - } - public String getNullColumnString() { - return " null"; - } - public boolean qualifyIndexName() { - return false; - } - - public String getForUpdateString() { - return ""; - } - - public boolean supportsIdentityColumns() { - return true; - } - public String getIdentitySelectString() { - return "select @@identity"; - } - public String getIdentityColumnString() { - return "identity not null"; //starts with 1, implicitly - } - - public boolean supportsInsertSelectIdentity() { - return true; - } - - public String appendIdentitySelectToInsert(String insertSQL) { - return insertSQL + "\nselect @@identity"; - } - - public String appendLockHint(LockMode mode, String tableName) { - if ( mode.greaterThan( LockMode.READ ) ) { - return tableName + " holdlock"; - } - else { - return tableName; - } - } - - public String applyLocksToSql(String sql, Map aliasedLockModes, Map keyColumnNames) { - Iterator itr = aliasedLockModes.entrySet().iterator(); - StringBuffer buffer = new StringBuffer( sql ); - int correction = 0; - while ( itr.hasNext() ) { - final Map.Entry entry = ( Map.Entry ) itr.next(); - final LockMode lockMode = ( LockMode ) entry.getValue(); - if ( lockMode.greaterThan( LockMode.READ ) ) { - final String alias = ( String ) entry.getKey(); - int start = -1, end = -1; - if ( sql.endsWith( " " + alias ) ) { - start = ( sql.length() - alias.length() ) + correction; - end = start + alias.length(); - } - else { - int position = sql.indexOf( " " + alias + " " ); - if ( position <= -1 ) { - position = sql.indexOf( " " + alias + "," ); - } - if ( position > -1 ) { - start = position + correction + 1; - end = start + alias.length(); - } - } - - if ( start > -1 ) { - final String lockHint = appendLockHint( lockMode, alias ); - buffer.replace( start, end, lockHint ); - correction += ( lockHint.length() - alias.length() ); - } - } - } - return buffer.toString(); - } - - public int registerResultSetOutParameter(CallableStatement statement, int col) throws SQLException { - return col; // sql server just returns automatically - } - - public ResultSet getResultSet(CallableStatement ps) throws SQLException { - boolean isResultSet = ps.execute(); -// This assumes you will want to ignore any update counts - while ( !isResultSet && ps.getUpdateCount() != -1 ) { - isResultSet = ps.getMoreResults(); - } -// You may still have other ResultSets or update counts left to process here -// but you can't do it now or the ResultSet you just got will be closed - return ps.getResultSet(); - } - - public boolean supportsCurrentTimestampSelection() { - return true; - } - - public boolean isCurrentTimestampSelectStringCallable() { - return false; - } - - public String getCurrentTimestampSelectString() { - return "select getdate()"; - } - - public boolean supportsTemporaryTables() { - return true; - } - - public String generateTemporaryTableName(String baseTableName) { - return "#" + baseTableName; - } - - public boolean dropTemporaryTableAfterUse() { - return true; // sql-server, at least needed this dropped after use; strange! - } - - - // Overridden informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - public boolean supportsCascadeDelete() { - return false; - } - - public boolean supportsExpectedLobUsagePattern() { - return false; - } - - public boolean supportsEmptyInList() { - return false; - } - - public boolean supportsExistsInSelect() { - return false; - } - - public boolean doesReadCommittedCauseWritersToBlockReaders() { - return true; - } - - public boolean doesRepeatableReadCauseReadersToBlockWriters() { - return true; - } +public class SybaseDialect extends AbstractTransactSQLDialect { } diff --git a/testsuite/pom.xml b/testsuite/pom.xml index 3d3d278a9e..ac8ce7c415 100644 --- a/testsuite/pom.xml +++ b/testsuite/pom.xml @@ -283,6 +283,25 @@ + + sybase15 + + + com.sybase + jconnect + 6.0.5 + + + + org.hibernate.dialect.SybaseASE15Dialect + com.sybase.jdbc3.jdbc.SybDriver + jdbc:sybase:Tds:dev77.qa.atl2.redhat.com:5000/hibernate + hibernate + hibernate + + + + sqlserver-jtds @@ -324,4 +343,4 @@ - \ No newline at end of file + diff --git a/testsuite/src/test/java/org/hibernate/test/connections/AggressiveReleaseTest.java b/testsuite/src/test/java/org/hibernate/test/connections/AggressiveReleaseTest.java index 550459ec7a..e4133bd901 100644 --- a/testsuite/src/test/java/org/hibernate/test/connections/AggressiveReleaseTest.java +++ b/testsuite/src/test/java/org/hibernate/test/connections/AggressiveReleaseTest.java @@ -107,7 +107,7 @@ public class AggressiveReleaseTest extends ConnectionManagementTestCase { // expected behavior } - // getting the first row only because Sybase throws NullPointerException + // getting the first row only because SybaseASE15Dialect throws NullPointerException // if data is not read before closing the ResultSet sr.next(); diff --git a/testsuite/src/test/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java b/testsuite/src/test/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java new file mode 100644 index 0000000000..0613148579 --- /dev/null +++ b/testsuite/src/test/java/org/hibernate/test/dialect/unit/lockhint/SybaseASE15LockHintsTest.java @@ -0,0 +1,56 @@ +//$Id $ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * Copyright (c) 2009, Red Hat Middleware LLC or third-party contributors as + * indicated by the @author tags or express copyright attribution + * statements applied by the authors. All third-party contributions are + * distributed under license by Red Hat Middleware LLC. + * + * This copyrighted material is made available to anyone wishing to use, modify, + * copy, or redistribute it subject to the terms and conditions of the GNU + * Lesser General Public License, as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License + * for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this distribution; if not, write to: + * Free Software Foundation, Inc. + * 51 Franklin Street, Fifth Floor + * Boston, MA 02110-1301 USA + * + */ +package org.hibernate.test.dialect.unit.lockhint; + +import junit.framework.TestSuite; + +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; + +/** + * {@inheritDoc} + * + * @author Gail Badner + */ +public class SybaseASE15LockHintsTest extends AbstractLockHintTest { + public static final Dialect DIALECT = new SybaseASE15Dialect(); + + public SybaseASE15LockHintsTest(String string) { + super( string ); + } + + protected String getLockHintUsed() { + return "holdlock"; + } + + protected Dialect getDialectUnderTest() { + return DIALECT; + } + + public static TestSuite suite() { + return new TestSuite( SybaseASE15LockHintsTest.class ); + } +} diff --git a/testsuite/src/test/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java b/testsuite/src/test/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java index 2d2d04aa7c..bcdb0c08d0 100644 --- a/testsuite/src/test/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java +++ b/testsuite/src/test/java/org/hibernate/test/generated/TimestampGeneratedValuesWithCachingTest.java @@ -5,6 +5,10 @@ import junit.framework.Test; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseAnywhereDialect; +import org.hibernate.dialect.SybaseASE15Dialect; +import org.hibernate.dialect.SQLServerDialect; import org.hibernate.junit.functional.FunctionalTestClassTestSuite; /** @@ -25,7 +29,9 @@ public class TimestampGeneratedValuesWithCachingTest extends AbstractGeneratedPr public boolean appliesTo(Dialect dialect) { // this test is specific to Sybase/SQLServer as it is testing support // for their TIMESTAMP datatype... - return ( dialect instanceof SybaseDialect ); + return ( dialect instanceof SybaseDialect || dialect instanceof Sybase11Dialect || + dialect instanceof SybaseAnywhereDialect || dialect instanceof SybaseASE15Dialect || + dialect instanceof SQLServerDialect); } public static Test suite() { diff --git a/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java b/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java index 16883df564..5cd95d58e5 100644 --- a/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java +++ b/testsuite/src/test/java/org/hibernate/test/hql/ASTParserLoadingTest.java @@ -31,6 +31,9 @@ import org.hibernate.dialect.Oracle9Dialect; import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SybaseDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; +import org.hibernate.dialect.SybaseAnywhereDialect; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.hql.ast.ASTQueryTranslatorFactory; import org.hibernate.junit.functional.FunctionalTestCase; @@ -1221,7 +1224,7 @@ public class ASTParserLoadingTest extends FunctionalTestCase { if ( getDialect() instanceof DB2Dialect ) { assertTrue( str.startsWith("1.234") ); } - else if ( getDialect() instanceof SybaseDialect ) { + else if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect || getDialect() instanceof SQLServerDialect ) { // str(val) on sybase assumes a default of 10 characters with no decimal point or decimal values // str(val) on sybase result is right-justified assertEquals( str.length(), 10 ); @@ -1233,7 +1236,7 @@ public class ASTParserLoadingTest extends FunctionalTestCase { else { assertTrue( str.startsWith("123.4") ); } - if ( ! ( getDialect() instanceof SybaseDialect ) ) { + if ( ! ( getDialect() instanceof SybaseDialect ) && ! ( getDialect() instanceof Sybase11Dialect ) && ! ( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SybaseAnywhereDialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) { // In TransactSQL (the variant spoken by Sybase and SQLServer), the str() function // is explicitly intended for numeric values only... String dateStr1 = (String) session.createQuery("select str(current_date) from Animal").uniqueResult(); diff --git a/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java b/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java index 70d749e472..316cb88852 100644 --- a/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java +++ b/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java @@ -20,7 +20,11 @@ import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.Oracle9Dialect; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.dialect.SybaseAnywhereDialect; import org.hibernate.dialect.SybaseDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.dialect.function.SQLFunction; import org.hibernate.engine.SessionFactoryImplementor; @@ -219,11 +223,14 @@ public class HQLTest extends QueryTranslatorTestCase { assertTranslation("from Animal a where abs(:param - a.bodyWeight) < 2.0"); assertTranslation("from Animal where abs(:x - :y) < 2.0"); assertTranslation("from Animal where lower(upper(:foo)) like 'f%'"); - if ( ! ( getDialect() instanceof SybaseDialect ) ) { - // SybaseDialect maps the length function -> len; classic translator does not consider that *when nested* + if ( ! ( getDialect() instanceof SybaseDialect ) && ! ( getDialect() instanceof Sybase11Dialect ) && ! ( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) { + // Transact-SQL dialects (except SybaseAnywhereDialect) map the length function -> len; + // classic translator does not consider that *when nested*; + // SybaseAnywhereDialect supports the length function + assertTranslation("from Animal a where abs(abs(a.bodyWeight - 1.0 + :param) * abs(length('ffobar')-3)) = 3.0"); } - if ( !( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect ) ) { + if ( !( getDialect() instanceof MySQLDialect ) && ! ( getDialect() instanceof SybaseDialect ) && ! ( getDialect() instanceof Sybase11Dialect ) && !( getDialect() instanceof SybaseASE15Dialect ) && ! ( getDialect() instanceof SybaseAnywhereDialect ) && ! ( getDialect() instanceof SQLServerDialect ) ) { assertTranslation("from Animal where lower(upper('foo') || upper(:bar)) like 'f%'"); } if ( getDialect() instanceof PostgreSQLDialect ) { @@ -594,7 +601,8 @@ public class HQLTest extends QueryTranslatorTestCase { } public void testConcatenation() { - if ( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect ) { + if ( getDialect() instanceof MySQLDialect || getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect || getDialect() instanceof SQLServerDialect ) { + // SybaseASE15Dialect and SybaseAnywhereDialect support '||' // MySQL uses concat(x, y, z) // SQL Server replaces '||' with '+' // diff --git a/testsuite/src/test/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java b/testsuite/src/test/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java index e9b2c59528..18dd1c310b 100755 --- a/testsuite/src/test/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java +++ b/testsuite/src/test/java/org/hibernate/test/interfaceproxy/InterfaceProxyTest.java @@ -46,7 +46,7 @@ public class InterfaceProxyTest extends FunctionalTestCase { SecureDocument d2 = new SecureDocumentImpl(); d2.setName("Secret"); d2.setContent( Hibernate.createBlob( "wxyz wxyz".getBytes() ) ); - // Sybase only allows 7-bits in a byte to be inserted into a tinyint + // SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint // column (0 <= val < 128) d2.setPermissionBits( (byte) 127 ); d2.setOwner("gavin"); diff --git a/testsuite/src/test/java/org/hibernate/test/legacy/FooBarTest.java b/testsuite/src/test/java/org/hibernate/test/legacy/FooBarTest.java index 6e12fcf7eb..bdbd942176 100644 --- a/testsuite/src/test/java/org/hibernate/test/legacy/FooBarTest.java +++ b/testsuite/src/test/java/org/hibernate/test/legacy/FooBarTest.java @@ -58,6 +58,8 @@ import org.hibernate.dialect.PostgreSQLDialect; import org.hibernate.dialect.SAPDBDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.SybaseDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; import org.hibernate.dialect.TimesTenDialect; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.junit.functional.FunctionalTestClassTestSuite; @@ -2136,7 +2138,8 @@ public class FooBarTest extends LegacyTestCase { s.find("select count(*) from Baz as baz where 1 in indices(baz.fooArray)"); s.find("select count(*) from Bar as bar where 'abc' in elements(bar.baz.fooArray)"); s.find("select count(*) from Bar as bar where 1 in indices(bar.baz.fooArray)"); - if ( !(getDialect() instanceof DB2Dialect) && !(getDialect() instanceof Oracle9Dialect) && !(getDialect() instanceof Oracle8iDialect ) && !( getDialect() instanceof SybaseDialect && !(getDialect() instanceof SQLServerDialect ) ) ) { + if ( !(getDialect() instanceof DB2Dialect) && !(getDialect() instanceof Oracle9Dialect) && !(getDialect() instanceof Oracle8iDialect ) && !( getDialect() instanceof SybaseDialect ) && !( getDialect() instanceof Sybase11Dialect ) && !( getDialect() instanceof SybaseASE15Dialect )) { + // SybaseAnywhereDialect supports implicit conversions from strings to ints s.find("select count(*) from Bar as bar, bar.component.glarch.proxyArray as g where g.id in indices(bar.baz.fooArray)"); s.find("select max( elements(bar.baz.fooArray) ) from Bar as bar, bar.component.glarch.proxyArray as g where g.id in indices(bar.baz.fooArray)"); } diff --git a/testsuite/src/test/java/org/hibernate/test/legacy/SQLFunctionsTest.java b/testsuite/src/test/java/org/hibernate/test/legacy/SQLFunctionsTest.java index a921f4f90d..7f70c25823 100644 --- a/testsuite/src/test/java/org/hibernate/test/legacy/SQLFunctionsTest.java +++ b/testsuite/src/test/java/org/hibernate/test/legacy/SQLFunctionsTest.java @@ -26,6 +26,9 @@ import org.hibernate.dialect.MySQLDialect; import org.hibernate.dialect.Oracle9Dialect; import org.hibernate.dialect.OracleDialect; import org.hibernate.dialect.SybaseDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; +import org.hibernate.dialect.SybaseAnywhereDialect; import org.hibernate.dialect.TimesTenDialect; import org.hibernate.dialect.SQLServerDialect; import org.hibernate.dialect.function.SQLFunction; @@ -370,7 +373,7 @@ public class SQLFunctionsTest extends LegacyTestCase { s.find("from Simple s where not( upper( s.name ) ='yada' or 1=2 or 'foo'='bar' or not('foo'='foo') or 'foo' like 'bar' )").size()==1 ); } - if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SybaseDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof InterbaseDialect) && !(getDialect() instanceof TimesTenDialect) ) { //My SQL has a funny concatenation operator + if ( !(getDialect() instanceof MySQLDialect) && !(getDialect() instanceof SybaseDialect) && !(getDialect() instanceof SQLServerDialect) && !(getDialect() instanceof MckoiDialect) && !(getDialect() instanceof InterbaseDialect) && !(getDialect() instanceof TimesTenDialect) ) { //My SQL has a funny concatenation operator assertTrue( s.find("from Simple s where lower( s.name || ' foo' ) ='simple 1 foo'").size()==1 ); @@ -500,8 +503,8 @@ public class SQLFunctionsTest extends LegacyTestCase { //assertTrue( b.getClob() instanceof ClobImpl ); s.flush(); - // Sybase ASE does not support ResultSet.getBlob(String) - if ( getDialect() instanceof SybaseDialect && ! ( getDialect() instanceof SQLServerDialect ) ) { + // Sybase does not support ResultSet.getBlob(String) + if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect ) { s.connection().rollback(); s.close(); return; diff --git a/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java b/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java index 3903cb8fb9..d54813eaf3 100644 --- a/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java +++ b/testsuite/src/test/java/org/hibernate/test/lob/SerializableTypeTest.java @@ -6,7 +6,9 @@ import junit.framework.Test; import org.hibernate.Session; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.SybaseDialect; -import org.hibernate.dialect.SQLServerDialect; +import org.hibernate.dialect.Sybase11Dialect; +import org.hibernate.dialect.SybaseASE15Dialect; +import org.hibernate.dialect.SybaseAnywhereDialect; import org.hibernate.junit.functional.FunctionalTestCase; import org.hibernate.junit.functional.FunctionalTestClassTestSuite; @@ -35,8 +37,8 @@ public class SerializableTypeTest extends FunctionalTestCase { } public void testNewSerializableType() { - // Sybase ASE does not support ResultSet.getBlob(String) - if ( getDialect() instanceof SybaseDialect && ! ( getDialect() instanceof SQLServerDialect ) ) { + // Sybase dialects do not support ResultSet.getBlob(String) + if ( getDialect() instanceof SybaseDialect || getDialect() instanceof Sybase11Dialect || getDialect() instanceof SybaseASE15Dialect || getDialect() instanceof SybaseAnywhereDialect ) { return; } diff --git a/testsuite/src/test/java/org/hibernate/test/mixed/MixedTest.java b/testsuite/src/test/java/org/hibernate/test/mixed/MixedTest.java index 65fb087b21..95c2f2bb7b 100755 --- a/testsuite/src/test/java/org/hibernate/test/mixed/MixedTest.java +++ b/testsuite/src/test/java/org/hibernate/test/mixed/MixedTest.java @@ -46,7 +46,7 @@ public class MixedTest extends FunctionalTestCase { SecureDocument d2 = new SecureDocument(); d2.setName( "Secret" ); d2.setContent( Hibernate.createBlob( "wxyz wxyz".getBytes() ) ); - // Sybase only allows 7-bits in a byte to be inserted into a tinyint + // SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint // column (0 <= val < 128) d2.setPermissionBits( (byte) 127 ); d2.setOwner( "gavin" ); @@ -96,7 +96,7 @@ public class MixedTest extends FunctionalTestCase { assertNotNull( d2.getContent() ); assertEquals( "max", d2.getOwner() ); assertEquals( "/", d2.getParent().getName() ); - // Sybase only allows 7-bits in a byte to be inserted into a tinyint + // SybaseASE15Dialect only allows 7-bits in a byte to be inserted into a tinyint // column (0 <= val < 128) assertEquals( (byte) 127, d2.getPermissionBits() ); assertNotNull( d2.getCreated() ); diff --git a/testsuite/src/test/java/org/hibernate/test/stats/StatsTest.java b/testsuite/src/test/java/org/hibernate/test/stats/StatsTest.java index 4c5195a984..4600cd79c5 100644 --- a/testsuite/src/test/java/org/hibernate/test/stats/StatsTest.java +++ b/testsuite/src/test/java/org/hibernate/test/stats/StatsTest.java @@ -165,7 +165,7 @@ public class StatsTest extends FunctionalTestCase { // same deal with scroll()... assertEquals( "unexpected execution count", 3, continentStats.getExecutionCount() ); assertEquals( "unexpected row count", results, continentStats.getExecutionRowCount() ); - // scroll through data because Sybase throws NullPointerException + // scroll through data because SybaseASE15Dialect throws NullPointerException // if data is not read before closing the ResultSet while ( scrollableResults.next() ) { // do nothing