[ 
https://issues.apache.org/jira/browse/OPENJPA-564?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12587222#action_12587222
 ] 

Jason Zheng commented on OPENJPA-564:
-------------------------------------

The patch is against openjpa version:
OpenJPA 1.1.0-SNAPSHOT
version id: openjpa-1.1.0-SNAPSHOT-r420667:634150M
Apache svn revision: 420667:634150M

> Set correct DBDictionary properties for MySQL based on MySQL version
> --------------------------------------------------------------------
>
>                 Key: OPENJPA-564
>                 URL: https://issues.apache.org/jira/browse/OPENJPA-564
>             Project: OpenJPA
>          Issue Type: Improvement
>          Components: jdbc
>         Environment: Microsoft Windows XP SP2, Java version = 1.5.0 with 
> MySQL 5.x Database.
>            Reporter: Jason Zheng
>            Priority: Minor
>             Fix For: 1.1.0
>
>         Attachments: openjpa-1.1.0-634377.patch
>
>
> MySQL has many improvements since version 4.1. We should update default 
> values of MySQLDictionary properties to reflect these changes. Ideally we 
> should be able to set these properties correctly based on MySQL version, so 
> the users don't need override "openjpa.jdbc.DBDictionary" property in 
> persistence.xml.
> These properties include:
> 1) DriverDeserializesBlobs (current default value: true) 
> We added this flag to MySQLDictionary in Kodo4.1 since most MySQL drivers 
> then automatically deserialized BLOBs on calls to ResultSet.getObject. This 
> is actually a bug in MySQL, and that bug(#25328 in MySQL bug database) is 
> already fixed in 5.x driver. Please see 
> http://dev.mysql.com/doc/refman/5.1/en/cj-news-5-0-6.html for details.
> 2) SupportSubselect (current default value: false)
> MySQL supports sub-select since version 4.1. 
> 3) AllowsAliasInBulkClause (current default value: false)
> This property is only used in DBDictionary.toBulkOperation():
> line 1874:
>         // if there is only a single table in the select, then we can
>         // just issue a single DELETE FROM TABLE WHERE <conditions>
>         // statement; otherwise, since SQL doesn't allow deleting
>         // from one of a multi-table select, we need to issue a subselect
>         // like DELETE FROM TABLE WHERE EXISTS
>         // (SELECT 1 FROM TABLE t0 WHERE t0.ID = TABLE.ID); also, some
>         // databases do not allow aliases in delete statements, which
>         // also causes us to use a subselect
>         if (sel.getTableAliases().size() == 1 && supportsSubselect
>             && allowsAliasInBulkClause) {
>             SQLBuffer from;
>             if (sel.getFromSelect() != null)
>                 from = getFromSelect(sel, false);
>             else
>                 from = getFrom(sel, false);
>             sql.append(from);
>             appendUpdates(sel, store, sql, params, updateParams,
>                 allowsAliasInBulkClause);
>             SQLBuffer where = sel.getWhere();
>             if (where != null && !where.isEmpty()) {
>                 sql.append(" WHERE ");
>                 sql.append(where);
>             }
>             return sql;
>         }  
> It confuses me why we need this property (and supportsSubselect) as 
> conditions for single table update/delete. I believe we can set this property 
> to true if we use MySQL version 4.1 or later. Otherwise If we set  
> supportSubselect to true, we will run into problems described in
> http://issues.apache.org/jira/browse/OPENJPA-459. Note Patrick had a comment 
> for that issue:
> "I believe that the first query (which only involves one table) is due to a 
> fairly trivial-to-resolve limitation of DBDIctionary: currently, if 
> SupportsSubselect is true and AllowsAliasInBulkClause is false, OpenJPA 
> always uses a subselect, even when it would be valid to just omit the 
> aliases."

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to