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 [EMAIL PROTECTED] $
 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@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/hibernate-dev

Reply via email to