[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2697?page=c...
]
Greg Woolsey commented on HHH-2697:
-----------------------------------
I understand the need for a solution that doesn't allow invalid constructs in SQL for
other databases than MySQL, but there does need to be some fix - not only does this break
for valid MySQL queries, any query for any database with a text string with a
":=" or some other character in the array of "space" characters after
a colon will get the same exception, even if the query is indeed valid. Unfortunately
that makes this a much harder problem to fix, and will make the parser much more complex -
perhaps needing to track open quotes, skip any colon inside an open quote, and delegate to
the current SQL grammar for allowed language constructs with colons.
Perhaps a simpler option would be to make colon a default variable prefix, and allow users
to set a different one on SQLQuery creation. This would leave it to the developer to pick
a value that is unique to variable references in the query in special cases where colon
would otherwise cause problems.
Can't use := for variable assignment within a SQL-Statement
-----------------------------------------------------------
Key: HHH-2697
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2697
Project: Hibernate Core
Issue Type: Bug
Affects Versions: 3.2.4.sp1
Environment: MySQL Datasource, Hibernate 3.2.4.sp1
Reporter: Benjamin Gniza
Priority: Minor
Attachments: allowvariableassignment.patch
i found a kind of bug in org.hibernate.engine.query.ParameterParser.java:
I have an exotic mysql-statement where I want to use mysql variables.
VERY SIMPLE example:
SET @pos=0;
SELECT @pos:=@pos+1 FROM TABLE;
Steps to reproduce:
Session s = sessionFactory.openSession();
s.createSQLQuery("SET @pos=0").executeUpdate();
SQLQuery qry = s.createSQLQuery("select @pos:=@pos from SomeTable");
List lst = qry.list();
Exception:
org.hibernate.QueryException: Space is not allowed after parameter prefix ':'
'SELECT @pos:=@pos+1 FROM TABLE'
at org.hibernate.engine.query.ParameterParser.parse(ParameterParser.java:68)
...
...
Suggested fix:
ParameterParser Lines 62 to 73:
if (c == ':' && (indx + 1 >= stringLength || sqlString.charAt(indx
+ 1) != '=')) {
// named parameter
int right = StringHelper.firstIndexOfChar( sqlString, ParserHelper.HQL_SEPARATORS,
indx + 1 );
int chopLocation = right < 0 ? sqlString.length() : right;
String param = sqlString.substring( indx + 1, chopLocation );
if ( StringHelper.isEmpty( param ) ) {
throw new QueryException("Space is not allowed after parameter prefix
':' '"
+ sqlString + "'");
}
recognizer.namedParameter( param, indx );
indx = chopLocation - 1;
}
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira