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

Reply via email to