Java Mailing List Archive

http://www.gg3721.com/

Home » Hibernate Commits List »

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

hibernate-commits

2008-10-08


Author LoginPost Reply
Author: steve.ebersole@(protected)
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)
@@(protected) @@
   return false;
 }

+  /**
+   * {@(protected)}
+   * <p/>
+   * DB2 is know to support parameters in the <tt>SELECT</tt> clause, but only in casted form
+   * (see {@(protected)()}).
+   *
+   * @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)
@@(protected) @@
 }

 /**
-   * 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)
@@(protected) @@
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;
@@(protected) @@
     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)
@@(protected) @@
   // 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;

_______________________________________________
hibernate-commits mailing list
hibernate-commits@(protected)
https://lists.jboss.org/mailman/listinfo/hibernate-commits
©2008 gg3721.com - Jax Systems, LLC, U.S.A.