Salut,
Bon je m'occupe du merge tout de suite et je vous l'envoi. Juste pour
info, il y avait �a sur la mailing liste, il y a pas tr�s longtemps.
C'est maintenant merg� dans Castor. On peut aussi le r�cup�rer
facilement si �a nous int�resse avec le diff en fin de ce mail.
Florian.
PS: le coup des 28 premiers caracteres, c'est bon ?
Matthew Baird a �crit :
>
> Hi, I reported a bug a while ago that affected Oracle users when their table
> lengths got close to 30 (limit in oracle). The buildTableAlias routine in
> parsetreewalker would append an underscore and a number (dependant on how
> many tables in your query). This had a chance of making your table alias
> name longer than 30 characters which would cause failures in Oracle.
>
> I played around with making this an 'if-oracle do this' type patch, but no
> luck. Maybe in the future. For now, this patch does the following:
>
> - check the name + the _ + the index is not longer than 30
> - if so, truncate the tableName by the approprite number of characters
> - add the _ and the number to the end of the truncated table name.
>
> this should work in all cases, and only has the side effect that if you have
> a set of long table names that only differ in the characters AFTER the ~28
> characters, you will lose that data (only affects read-ability of query,
> query will still execute correctly).
>
> We've been using this patch in production (with both SQL Server and Oracle
> and 300+ tables.) for 2 months with no problems.
>
> following is the diff -u just the way Thomas likes it.
>
> thanks,
> Matthew
>
> --- ParseTreeWalker.java.orig Mon Dec 10 06:16:00 2001
> +++ ParseTreeWalker.java Mon Dec 10 06:16:00 2001
> @@ -101,6 +101,7 @@
> public static final int DEPENDANT_OBJECT_VALUE = 5;
> public static final int DEPENDANT_VALUE = 6;
>
> + public static final int MAX_TABLE_LENGTH = 30;
>
> /**
> * Creates a new parse tree walker. Which checks the tree for errors,
> and
> @@ -873,6 +874,20 @@
> } else {
> index = i.intValue();
> }
> + // fix for oracle support. If we have a 30 character table name,
> adding
> + // anything to it (_#) will cause it to be too long and will make
> oracle
> + // barf. the length we are trying to evaluate is:
> + // length of the table name + the length of the index number we
> are using
> + // + the _ character.
> + String stringIndex = String.valueOf(index);
> + if(tableAlias.length() + stringIndex.length() + 1 >
> MAX_TABLE_LENGTH) {
> + // use a substring of the original table name, rather than
> the table alias
> + // because if we truncate the table alias it could become
> "ununique"
> + // (by truncating the _# we add) by truncating the table name
> + // beforehand we are guaranteed uniqueness as long as the
> index is
> + // not reused.
> + tableAlias = tableAlias.substring(MAX_TABLE_LENGTH -
> (stringIndex.length() + 1));
> + }
> // If table name contains '.', it should be replaced, since such
> names aren't allowed for aliases
> tableAlias = tableAlias.replace('.', '_') + "_" + index;
> }
> @@ -941,7 +956,7 @@
> if ( i > 1 ) {
> manyTableAlias = buildTableAlias( manyTableAlias, path,
> i - 1 );
> sourceTableAlias = buildTableAlias( sourceTableAlias,
> path, i - 1 );
> - }
> + }
>
> _queryExpr.addInnerJoin( sourceClass.getTableName(),
> identity.getSQLName(),
>
> --
>
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
> unsubscribe castor-dev
-----------------------------------------------------------
If you wish to unsubscribe from this mailing, send mail to
[EMAIL PROTECTED] with a subject of:
unsubscribe castor-dev