[hibernate-dev] Dialect support for SQL comments.

Daniel Bell daniel.bell at nec.com.au
Mon Jul 7 21:50:28 EDT 2008


Emmanuel,

I've added this to the JIRA as requested. It is HHH--3379. I've also 
linked it to other issues that may be fixed by this patch.

Thanks,
Daniel.

Emmanuel Bernard wrote:
> Hi Daniel
> Can you attach that patch to JIRA si that it will not be lost.
> http://opensource.atlassian.com/projects/hibernate/secure/Dashboard.jspa
>
> thanks
>
> -- 
> Emmanuel Bernard
> http://in.relation.to/Bloggers/Emmanuel | 
> http://blog.emmanuelbernard.com | http://twitter.com/emmanuelbernard
> Hibernate Search in Action (http://is.gd/Dl1)
>
> On Jul 6, 2008, at 18:41, Daniel Bell wrote:
>
>> Hi,
>>
>> I have recently tried turning on SQL comments in hibernate 3.2.6.ga.
>> However, I found that our database (informix 7.31) did not support SQL
>> where the comment was at the start of the comment. Instead, the comment
>> needed to be after the SQL. For example:
>>
>> /* not accepted by informix 7.31*/ select * from systables;
>>
>> select * from systables /* accepted by informix 7.31*/
>>
>> Because of this, I have added a method to the Dialect for adding 
>> comments:
>>
>> /**
>> * Add a comment to the SQL string.
>> *
>> * @param sql StringBuffer holding the SQL.
>> * @param comment Comment to add to the SQL. May be null.
>> */
>> public void addCommentToSql(StringBuffer sql, String comment) {
>> if (StringHelper.isNotEmpty(comment))
>> sql.insert(0, "/* " + comment + " */ ");
>> }
>>
>> Thus, the default implementation provides the same functionality as
>> before. However, derived Dialects may override this method to add the
>> comment in a different location.
>>
>> It is also possible to add additional comments in the derived Dialect.
>> In our case, we also add the Java thread ID.
>>
>> I have included a complete patch for this change for hibernate 3.2.6.GA.
>> Please consider its inclusion in Hibernate.
>>
>> Thanks,
>> Daniel.
>>
>>
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/dialect/Dialect.java 
>> hibernate-3.2.6.patch/src/org/hibernate/dialect/Dialect.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/dialect/Dialect.java 
>> 2007-06-08 11:48:54.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/dialect/Dialect.java 
>> 2008-07-03 18:30:41.000000000 +1000
>> @@ -1762,4 +1762,15 @@
>> public boolean supportsBindAsCallableArgument() {
>> return true;
>> }
>> +
>> + /**
>> + * Add a comment to the SQL string.
>> + *
>> + * @param sql StringBuffer holding the SQL.
>> + * @param comment Comment to add to the SQL. May be null.
>> + */
>> + public void addCommentToSql(StringBuffer sql, String comment) {
>> + if (StringHelper.isNotEmpty(comment))
>> + sql.insert(0, "/* " + comment + " */ ");
>> + }
>> }
>> diff -ur 
>> hibernate-3.2.6.ga/src/org/hibernate/hql/ast/exec/MultiTableDeleteExecutor.java 
>> hibernate-3.2.6.patch/src/org/hibernate/hql/ast/exec/MultiTableDeleteExecutor.java 
>>
>> --- 
>> hibernate-3.2.6.ga/src/org/hibernate/hql/ast/exec/MultiTableDeleteExecutor.java 
>> 2007-03-15 22:38:25.000000000 +1100
>> +++ 
>> hibernate-3.2.6.patch/src/org/hibernate/hql/ast/exec/MultiTableDeleteExecutor.java 
>> 2008-07-03 11:09:57.000000000 +1000
>> @@ -57,7 +57,7 @@
>> // the difficulty is the ordering of the tables here vs the cascade 
>> attributes on the persisters ->
>> // the table info gotten here should really be self-contained (i.e., 
>> a class representation
>> // defining all the needed attributes), then we could then get an 
>> array of those
>> - final Delete delete = new Delete()
>> + final Delete delete = new 
>> Delete(walker.getSessionFactoryHelper().getFactory().getDialect())
>> .setTableName( tableNames[i] )
>> .setWhere( "(" + StringHelper.join( ", ", columnNames[i] ) + ") IN (" 
>> + idSubselect + ")" );
>> if ( getFactory().getSettings().isCommentsEnabled() ) {
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/loader/Loader.java 
>> hibernate-3.2.6.patch/src/org/hibernate/loader/Loader.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/loader/Loader.java 
>> 2007-10-17 07:04:41.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/loader/Loader.java 
>> 2008-07-04 11:08:43.000000000 +1000
>> @@ -201,22 +201,15 @@
>> sql = applyLocks( sql, parameters.getLockModes(), dialect );
>>
>> return getFactory().getSettings().isCommentsEnabled() ?
>> - prependComment( sql, parameters ) : sql;
>> + prependComment( sql, parameters, dialect ) : sql;
>> }
>>
>> - private String prependComment(String sql, QueryParameters 
>> parameters) {
>> + private String prependComment(String sql, QueryParameters 
>> parameters, Dialect dialect) {
>> String comment = parameters.getComment();
>> - if ( comment == null ) {
>> - return sql;
>> - }
>> - else {
>> - return new StringBuffer( comment.length() + sql.length() + 5 )
>> - .append( "/* " )
>> - .append( comment )
>> - .append( " */ " )
>> - .append( sql )
>> - .toString();
>> - }
>> + final StringBuffer sb = new StringBuffer((comment == null ? 0 : 
>> comment.length()) + sql.length() + 7);
>> + sb.append(sql);
>> + dialect.addCommentToSql(sb, comment);
>> + return sb.toString();
>> }
>>
>> /**
>> diff -ur 
>> hibernate-3.2.6.ga/src/org/hibernate/persister/collection/BasicCollectionPersister.java 
>> hibernate-3.2.6.patch/src/org/hibernate/persister/collection/BasicCollectionPersister.java 
>>
>> --- 
>> hibernate-3.2.6.ga/src/org/hibernate/persister/collection/BasicCollectionPersister.java 
>> 2006-06-23 05:51:43.000000000 +1000
>> +++ 
>> hibernate-3.2.6.patch/src/org/hibernate/persister/collection/BasicCollectionPersister.java 
>> 2008-07-03 11:10:26.000000000 +1000
>> @@ -55,7 +55,7 @@
>> */
>> protected String generateDeleteString() {
>>
>> - Delete delete = new Delete()
>> + Delete delete = new Delete(getDialect())
>> .setTableName( qualifiedTableName )
>> .setPrimaryKeyColumnNames( keyColumnNames );
>>
>> @@ -128,7 +128,7 @@
>> */
>> protected String generateDeleteRowString() {
>>
>> - Delete delete = new Delete()
>> + Delete delete = new Delete(getDialect())
>> .setTableName( qualifiedTableName );
>>
>> if ( hasIdentifier ) {
>> diff -ur 
>> hibernate-3.2.6.ga/src/org/hibernate/persister/entity/AbstractEntityPersister.java 
>> hibernate-3.2.6.patch/src/org/hibernate/persister/entity/AbstractEntityPersister.java 
>>
>> --- 
>> hibernate-3.2.6.ga/src/org/hibernate/persister/entity/AbstractEntityPersister.java 
>> 2007-10-19 08:28:23.000000000 +1000
>> +++ 
>> hibernate-3.2.6.patch/src/org/hibernate/persister/entity/AbstractEntityPersister.java 
>> 2008-07-03 11:15:55.000000000 +1000
>> @@ -1956,7 +1956,7 @@
>> * Generate the SQL that deletes a row by id (and version)
>> */
>> protected String generateDeleteString(int j) {
>> - Delete delete = new Delete()
>> + Delete delete = new Delete(getFactory().getDialect())
>> .setTableName( getTableName( j ) )
>> .setPrimaryKeyColumnNames( getKeyColumns( j ) );
>> if ( j == 0 ) {
>> @@ -2708,7 +2708,7 @@
>> int span = getTableSpan();
>> String[] deleteStrings = new String[span];
>> for ( int j = span - 1; j >= 0; j-- ) {
>> - Delete delete = new Delete()
>> + Delete delete = new Delete(getFactory().getDialect())
>> .setTableName( getTableName( j ) )
>> .setPrimaryKeyColumnNames( getKeyColumns( j ) );
>> if ( getFactory().getSettings().isCommentsEnabled() ) {
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/Delete.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/Delete.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/Delete.java 2006-08-05 
>> 14:28:22.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/Delete.java 
>> 2008-07-03 17:32:39.000000000 +1000
>> @@ -1,6 +1,7 @@
>> //$Id: Delete.java 10227 2006-08-05 04:28:22Z steve.ebersole at jboss.com $
>> package org.hibernate.sql;
>>
>> +import org.hibernate.dialect.Dialect;
>> import org.hibernate.util.StringHelper;
>>
>> /**
>> @@ -16,6 +17,13 @@
>> private String where;
>>
>> private String comment;
>> +
>> + private final Dialect dialect;
>> +
>> + public Delete(Dialect dialect) {
>> + this.dialect = dialect;
>> + }
>> +
>> public Delete setComment(String comment) {
>> this.comment = comment;
>> return this;
>> @@ -28,9 +36,6 @@
>>
>> public String toStatementString() {
>> StringBuffer buf = new StringBuffer( tableName.length() + 10 );
>> - if ( comment!=null ) {
>> - buf.append( "/* " ).append(comment).append( " */ " );
>> - }
>> buf.append( "delete from " ).append(tableName);
>> if ( where != null || primaryKeyColumnNames != null || 
>> versionColumnName != null ) {
>> buf.append( " where " );
>> @@ -53,6 +58,9 @@
>> }
>> buf.append( versionColumnName ).append( "=?" );
>> }
>> +
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return buf.toString();
>> }
>>
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/Insert.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/Insert.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/Insert.java 2006-03-25 
>> 05:10:04.000000000 +1100
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/Insert.java 
>> 2008-07-03 17:32:53.000000000 +1000
>> @@ -76,9 +76,6 @@
>>
>> public String toStatementString() {
>> StringBuffer buf = new StringBuffer( columns.size()*15 + 
>> tableName.length() + 10 );
>> - if ( comment != null ) {
>> - buf.append( "/* " ).append( comment ).append( " */ " );
>> - }
>> buf.append("insert into ")
>> .append(tableName);
>> if ( columns.size()==0 ) {
>> @@ -103,6 +100,9 @@
>> }
>> buf.append(')');
>> }
>> +
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return buf.toString();
>> }
>> }
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/InsertSelect.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/InsertSelect.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/InsertSelect.java 
>> 2005-06-08 06:06:10.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/InsertSelect.java 
>> 2008-07-03 17:33:07.000000000 +1000
>> @@ -57,9 +57,6 @@
>> if ( select == null ) throw new HibernateException( "no select 
>> defined for insert-select" );
>>
>> StringBuffer buf = new StringBuffer( (columnNames.size() * 15) + 
>> tableName.length() + 10 );
>> - if ( comment!=null ) {
>> - buf.append( "/* " ).append( comment ).append( " */ " );
>> - }
>> buf.append( "insert into " ).append( tableName );
>> if ( !columnNames.isEmpty() ) {
>> buf.append( " (" );
>> @@ -73,6 +70,9 @@
>> buf.append( ")" );
>> }
>> buf.append( ' ' ).append( select.toStatementString() );
>> +
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return buf.toString();
>> }
>> }
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/QuerySelect.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/QuerySelect.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/QuerySelect.java 
>> 2005-06-03 12:04:13.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/QuerySelect.java 
>> 2008-07-03 17:33:17.000000000 +1000
>> @@ -112,7 +112,6 @@
>>
>> public String toQueryString() {
>> StringBuffer buf = new StringBuffer(50);
>> - if (comment!=null) buf.append("/* ").append(comment).append(" */ ");
>> buf.append("select ");
>> if (distinct) buf.append("distinct ");
>> String from = joins.toFromFragmentString();
>> @@ -151,6 +150,8 @@
>> if ( having.length() > 0 ) buf.append(" having ").append( 
>> having.toString() );
>> if ( orderBy.length() > 0 ) buf.append(" order by ").append( 
>> orderBy.toString() );
>>
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return dialect.transformSelectString( buf.toString() );
>> }
>>
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/Select.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/Select.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/Select.java 2005-06-15 
>> 12:57:03.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/Select.java 
>> 2008-07-03 17:33:40.000000000 +1000
>> @@ -34,9 +34,6 @@
>> */
>> public String toStatementString() {
>> StringBuffer buf = new StringBuffer(guesstimatedBufferSize);
>> - if ( StringHelper.isNotEmpty(comment) ) {
>> - buf.append("/* ").append(comment).append(" */ ");
>> - }
>>
>> buf.append("select ").append(selectClause)
>> .append(" from ").append(fromClause);
>> @@ -72,6 +69,8 @@
>> buf.append( dialect.getForUpdateString(lockMode) );
>> }
>>
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return dialect.transformSelectString( buf.toString() );
>> }
>>
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/SimpleSelect.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/SimpleSelect.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/SimpleSelect.java 
>> 2005-07-24 16:53:06.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/SimpleSelect.java 
>> 2008-07-03 17:33:51.000000000 +1000
>> @@ -126,10 +126,6 @@
>> 10
>> );
>>
>> - if ( comment!=null ) {
>> - buf.append("/* ").append(comment).append(" */ ");
>> - }
>> -
>> buf.append("select ");
>> Set uniqueColumns = new HashSet();
>> Iterator iter = columns.iterator();
>> @@ -161,6 +157,8 @@
>> if (lockMode!=null) {
>> buf.append( dialect.getForUpdateString(lockMode) );
>> }
>> +
>> + dialect.addCommentToSql(buf, comment);
>>
>> return dialect.transformSelectString( buf.toString() );
>> }
>> diff -ur hibernate-3.2.6.ga/src/org/hibernate/sql/Update.java 
>> hibernate-3.2.6.patch/src/org/hibernate/sql/Update.java
>> --- hibernate-3.2.6.ga/src/org/hibernate/sql/Update.java 2005-08-11 
>> 06:23:55.000000000 +1000
>> +++ hibernate-3.2.6.patch/src/org/hibernate/sql/Update.java 
>> 2008-07-03 17:34:02.000000000 +1000
>> @@ -132,9 +132,6 @@
>>
>> public String toStatementString() {
>> StringBuffer buf = new StringBuffer( (columns.size() * 15) + 
>> tableName.length() + 10 );
>> - if ( comment!=null ) {
>> - buf.append( "/* " ).append( comment ).append( " */ " );
>> - }
>> buf.append( "update " ).append( tableName ).append( " set " );
>> boolean assignmentsAppended = false;
>> Iterator iter = columns.entrySet().iterator();
>> @@ -184,6 +181,8 @@
>> buf.append( versionColumnName ).append( "=?" );
>> }
>>
>> + dialect.addCommentToSql(buf, comment);
>> +
>> return buf.toString();
>> }
>> }
>>
>> _______________________________________________
>> hibernate-dev mailing list
>> hibernate-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>
>




More information about the hibernate-dev mailing list