[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-2697) Can't use := for variable assignment within a SQL-Statement

Greg Woolsey (JIRA) noreply at atlassian.com
Sat Aug 8 11:54:13 EDT 2009


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-2697?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=33732#action_33732 ] 

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.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list