Author: steve.ebersole(a)jboss.com
Date: 2009-10-28 12:54:00 -0400 (Wed, 28 Oct 2009)
New Revision: 17869
Modified:
core/trunk/core/src/main/java/org/hibernate/dialect/Dialect.java
core/trunk/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java
core/trunk/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java
core/trunk/core/src/main/java/org/hibernate/dialect/TimesTenDialect.java
core/trunk/core/src/main/java/org/hibernate/hql/ast/SqlGenerator.java
core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java
Log:
HHH-1480 - JOIN precendence rules per SQL-99
Modified: core/trunk/core/src/main/java/org/hibernate/dialect/Dialect.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/dialect/Dialect.java 2009-10-28 16:05:29
UTC (rev 17868)
+++ core/trunk/core/src/main/java/org/hibernate/dialect/Dialect.java 2009-10-28 16:54:00
UTC (rev 17869)
@@ -1578,7 +1578,20 @@
return "";
}
+ /**
+ * Get the separator to use for definining cross joins when translating HQL queries.
+ * <p/>
+ * Typically this will be either [<tt> cross join </tt>] or [<tt>,
</tt>]
+ * <p/>
+ * Note that the spaces are important!
+ *
+ * @return
+ */
+ public String getCrossJoinSeparator() {
+ return " cross join ";
+ }
+
// Informational metadata ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
Modified: core/trunk/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java 2009-10-28
16:05:29 UTC (rev 17868)
+++ core/trunk/core/src/main/java/org/hibernate/dialect/Oracle8iDialect.java 2009-10-28
16:54:00 UTC (rev 17869)
@@ -211,6 +211,13 @@
}
/**
+ * {@inheritDoc}
+ */
+ public String getCrossJoinSeparator() {
+ return ", ";
+ }
+
+ /**
* Map case support to the Oracle DECODE function. Oracle did not
* add support for CASE until 9i.
*
Modified: core/trunk/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java 2009-10-28
16:05:29 UTC (rev 17868)
+++ core/trunk/core/src/main/java/org/hibernate/dialect/Sybase11Dialect.java 2009-10-28
16:54:00 UTC (rev 17869)
@@ -40,4 +40,7 @@
return new Sybase11JoinFragment();
}
+ public String getCrossJoinSeparator() {
+ return ", ";
+ }
}
Modified: core/trunk/core/src/main/java/org/hibernate/dialect/TimesTenDialect.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/dialect/TimesTenDialect.java 2009-10-28
16:05:29 UTC (rev 17868)
+++ core/trunk/core/src/main/java/org/hibernate/dialect/TimesTenDialect.java 2009-10-28
16:54:00 UTC (rev 17869)
@@ -139,6 +139,10 @@
return new OracleJoinFragment();
}
+ public String getCrossJoinSeparator() {
+ return ", ";
+ }
+
// new methods in dialect3
/*public boolean supportsForUpdateNowait() {
return false;
Modified: core/trunk/core/src/main/java/org/hibernate/hql/ast/SqlGenerator.java
===================================================================
--- core/trunk/core/src/main/java/org/hibernate/hql/ast/SqlGenerator.java 2009-10-28
16:05:29 UTC (rev 17868)
+++ core/trunk/core/src/main/java/org/hibernate/hql/ast/SqlGenerator.java 2009-10-28
16:54:00 UTC (rev 17869)
@@ -58,6 +58,8 @@
public class SqlGenerator extends SqlGeneratorBase implements ErrorReporter {
private static final Logger log = LoggerFactory.getLogger( SqlGenerator.class );
+ public static boolean REGRESSION_STYLE_CROSS_JOINS = false;
+
/**
* all append invocations on the buf should go through this Output instance variable.
* The value of this variable may be temporarily substitued by sql function processing
code
@@ -301,7 +303,7 @@
// right represents a joins originating from left; or
// both right and left reprersent joins originating from the same FromElement
if ( right.getJoinSequence() != null && right.getJoinSequence().isThetaStyle()
) {
- out( ", " );
+ writeCrossJoinSeparator();
}
else {
out( " " );
@@ -309,8 +311,17 @@
}
else {
// these are just two unrelated table references
+ writeCrossJoinSeparator();
+ }
+ }
+
+ private void writeCrossJoinSeparator() {
+ if ( REGRESSION_STYLE_CROSS_JOINS ) {
out( ", " );
}
+ else {
+ out( sessionFactory.getDialect().getCrossJoinSeparator() );
+ }
}
protected void nestedFromFragment(AST d, AST parent) {
Modified: core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java
===================================================================
--- core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java 2009-10-28
16:05:29 UTC (rev 17868)
+++ core/trunk/testsuite/src/test/java/org/hibernate/test/hql/HQLTest.java 2009-10-28
16:54:00 UTC (rev 17869)
@@ -34,6 +34,7 @@
import org.hibernate.hql.ast.DetailedSemanticException;
import org.hibernate.hql.ast.QuerySyntaxException;
import org.hibernate.hql.ast.QueryTranslatorImpl;
+import org.hibernate.hql.ast.SqlGenerator;
import org.hibernate.hql.ast.tree.ConstructorNode;
import org.hibernate.hql.ast.tree.DotNode;
import org.hibernate.hql.ast.tree.FromReferenceNode;
@@ -73,12 +74,14 @@
throw new QueryException( "illegal syntax near collection: " + propertyName
);
}
};
+ SqlGenerator.REGRESSION_STYLE_CROSS_JOINS = true;
}
protected void cleanupTest() throws Exception {
SelectClause.VERSION2_SQL = false;
DotNode.REGRESSION_STYLE_JOIN_SUPPRESSION = false;
DotNode.ILLEGAL_COLL_DEREF_EXCP_BUILDER = DotNode.DEF_ILLEGAL_COLL_DEREF_EXCP_BUILDER;
+ SqlGenerator.REGRESSION_STYLE_CROSS_JOINS = false;
super.cleanupTest();
}
Show replies by thread