[hibernate-commits] Hibernate SVN: r15293 - in core/branches/Branch_3_2: src/org/hibernate/hql/ast and 1 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Wed Oct 8 18:59:59 EDT 2008


Author: steve.ebersole at jboss.com
Date: 2008-10-08 18:59:59 -0400 (Wed, 08 Oct 2008)
New Revision: 15293

Modified:
   core/branches/Branch_3_2/src/org/hibernate/dialect/DB2Dialect.java
   core/branches/Branch_3_2/src/org/hibernate/dialect/Dialect.java
   core/branches/Branch_3_2/src/org/hibernate/hql/ast/HqlSqlWalker.java
   core/branches/Branch_3_2/test/org/hibernate/test/hql/BulkManipulationTest.java
Log:
HHH-3519 : params in select clause

Modified: core/branches/Branch_3_2/src/org/hibernate/dialect/DB2Dialect.java
===================================================================
--- core/branches/Branch_3_2/src/org/hibernate/dialect/DB2Dialect.java	2008-10-08 20:03:23 UTC (rev 15292)
+++ core/branches/Branch_3_2/src/org/hibernate/dialect/DB2Dialect.java	2008-10-08 22:59:59 UTC (rev 15293)
@@ -351,12 +351,28 @@
 		return false;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 * <p/>
+	 * DB2 is know to support parameters in the <tt>SELECT</tt> clause, but only in casted form
+	 * (see {@link #requiresCastingOfParametersInSelectClause()}).
+	 *
+	 * @return True.
+	 */
 	public boolean supportsParametersInInsertSelect() {
-		// DB2 known to not support parameters within the select
-		// clause of an SQL INSERT ... SELECT ... statement
-		return false;
+		return true;
 	}
 
+	/**
+	 * DB2 in fact does require that parameters appearing in the select clause be wrapped in cast() calls
+	 * to tell the DB parser the type of the select value.
+	 *
+	 * @return True.
+	 */
+	public boolean requiresCastingOfParametersInSelectClause() {
+		return true;
+	}
+
 	public boolean supportsResultSetPositionQueryMethodsOnForwardOnlyCursor() {
 		return false;
 	}

Modified: core/branches/Branch_3_2/src/org/hibernate/dialect/Dialect.java
===================================================================
--- core/branches/Branch_3_2/src/org/hibernate/dialect/Dialect.java	2008-10-08 20:03:23 UTC (rev 15292)
+++ core/branches/Branch_3_2/src/org/hibernate/dialect/Dialect.java	2008-10-08 22:59:59 UTC (rev 15293)
@@ -1595,14 +1595,14 @@
 	}
 
 	/**
-	 * Does this dialect support casted parameters within the select clause of
-	 * INSERT ... SELECT ... cast( ? as <type> ) statements?
+	 * Does this dialect require that parameters appearing in the <tt>SELECT</tt> clause be wrapped in <tt>cast()</tt>
+	 * calls to tell the db parser the expected type.
 	 *
-	 * @return True if this is supported; false otherwise.
+	 * @return True if select clause parameter must be cast()ed
 	 * @since 3.2
 	 */
-	public boolean supportsCastedParametersInInsertSelect() {
-		return true;
+	public boolean requiresCastingOfParametersInSelectClause() {
+		return false;
 	}
 
 	/**

Modified: core/branches/Branch_3_2/src/org/hibernate/hql/ast/HqlSqlWalker.java
===================================================================
--- core/branches/Branch_3_2/src/org/hibernate/hql/ast/HqlSqlWalker.java	2008-10-08 20:03:23 UTC (rev 15292)
+++ core/branches/Branch_3_2/src/org/hibernate/hql/ast/HqlSqlWalker.java	2008-10-08 22:59:59 UTC (rev 15293)
@@ -15,7 +15,6 @@
 import org.apache.commons.logging.LogFactory;
 import org.hibernate.QueryException;
 import org.hibernate.HibernateException;
-import org.hibernate.AssertionFailure;
 import org.hibernate.engine.JoinSequence;
 import org.hibernate.engine.ParameterBinder;
 import org.hibernate.engine.SessionFactoryImplementor;
@@ -662,39 +661,39 @@
 			AST versionValueNode = null;
 
 			if ( sessionFactoryHelper.getFactory().getDialect().supportsParametersInInsertSelect() ) {
-				versionValueNode = getASTFactory().create( HqlSqlTokenTypes.PARAM, "?" );
-				ParameterSpecification paramSpec = new VersionTypeSeedParameterSpecification( versionType );
-				( ( ParameterNode ) versionValueNode ).setHqlParameterSpecification( paramSpec );
-				parameters.add( 0, paramSpec );
-			}
-			else if ( sessionFactoryHelper.getFactory().getDialect().supportsCastedParametersInInsertSelect() ) {
 				int sqlTypes[] = versionType.sqlTypes( sessionFactoryHelper.getFactory() );
 				if ( sqlTypes == null || sqlTypes.length == 0 ) {
-					throw new AssertionFailure( versionType.getClass() + "sqlTypes() returns null or empty array" );
+					throw new IllegalStateException( versionType.getClass() + ".sqlTypes() returns null or empty array" );
 				}
 				if ( sqlTypes.length > 1 ) {
-					throw new UnsupportedOperationException( versionType.getClass() +
-							".sqlTypes() returns > 1 element; only single-valued versions are allowed." );
+					throw new IllegalStateException(
+							versionType.getClass() +
+									".sqlTypes() returns > 1 element; only single-valued versions are allowed."
+					);
 				}
-				MethodNode versionMethodNode = ( MethodNode ) getASTFactory().create( HqlSqlTokenTypes.METHOD_CALL, "(" );
-				AST methodIdentNode = getASTFactory().create( HqlSqlTokenTypes.IDENT, "cast" );
-				versionMethodNode.initializeMethodNode(methodIdentNode, true );
-				versionMethodNode.addChild( methodIdentNode );
-				AST castExprListNode = getASTFactory().create( HqlSqlTokenTypes.EXPR_LIST, "exprList" );
-				methodIdentNode.setNextSibling( castExprListNode );
-				AST paramNode = getASTFactory().create( HqlSqlTokenTypes.PARAM, "?" );
+				versionValueNode = getASTFactory().create( HqlSqlTokenTypes.PARAM, "?" );
 				ParameterSpecification paramSpec = new VersionTypeSeedParameterSpecification( versionType );
-				( ( ParameterNode ) paramNode ).setHqlParameterSpecification( paramSpec );
-				castExprListNode.addChild( paramNode );
-				paramNode.setNextSibling(
-						getASTFactory().create(
-								HqlSqlTokenTypes.IDENT,
-								sessionFactoryHelper.getFactory().getDialect().getTypeName( sqlTypes[0] ) )
-				);
-				processFunction( versionMethodNode, true );
-				versionValueNode = versionMethodNode;
+				( ( ParameterNode ) versionValueNode ).setHqlParameterSpecification( paramSpec );
 				parameters.add( 0, paramSpec );
+
+				if ( sessionFactoryHelper.getFactory().getDialect().requiresCastingOfParametersInSelectClause() ) {
+					// we need to wrtap the param in a cast()
+					MethodNode versionMethodNode = ( MethodNode ) getASTFactory().create( HqlSqlTokenTypes.METHOD_CALL, "(" );
+					AST methodIdentNode = getASTFactory().create( HqlSqlTokenTypes.IDENT, "cast" );
+					versionMethodNode.addChild( methodIdentNode );
+					versionMethodNode.initializeMethodNode(methodIdentNode, true );
+					AST castExprListNode = getASTFactory().create( HqlSqlTokenTypes.EXPR_LIST, "exprList" );
+					methodIdentNode.setNextSibling( castExprListNode );
+					castExprListNode.addChild( versionValueNode );
+					versionValueNode.setNextSibling(
+							getASTFactory().create(
+									HqlSqlTokenTypes.IDENT,
+									sessionFactoryHelper.getFactory().getDialect().getTypeName( sqlTypes[0] ) )
+					);
+					processFunction( versionMethodNode, true );
+					versionValueNode = versionMethodNode;
 				}
+			}
 			else {
 				if ( isIntegral( versionType ) ) {
 					try {

Modified: core/branches/Branch_3_2/test/org/hibernate/test/hql/BulkManipulationTest.java
===================================================================
--- core/branches/Branch_3_2/test/org/hibernate/test/hql/BulkManipulationTest.java	2008-10-08 20:03:23 UTC (rev 15292)
+++ core/branches/Branch_3_2/test/org/hibernate/test/hql/BulkManipulationTest.java	2008-10-08 22:59:59 UTC (rev 15293)
@@ -419,8 +419,7 @@
 		// dialects which do not allow a parameter in the select portion of an INSERT ... SELECT statement
 		// will also be problematic for this test because the timestamp here is vm-based as opposed to
 		// db-based.
-		if ( !getDialect().supportsParametersInInsertSelect() &&
-				!getDialect().supportsCastedParametersInInsertSelect() ) {
+		if ( ! getDialect().supportsParametersInInsertSelect() ) {
 			reportSkip( "dialect does not support parameter in INSERT ... SELECT",
 				"test bulk inserts with generated id and generated timestamp");
 			return;




More information about the hibernate-commits mailing list