[Dbix-class] Announcing 0.08099_07 (0.08100_RC1)

Ash Berlin ash_cpan at firemirror.com
Sat Feb 28 09:39:36 GMT 2009


On 28 Feb 2009, at 04:15, Rob Kinyon wrote:

> On Fri, Feb 27, 2009 at 22:37, Guillermo Roditi <groditi at gmail.com>  
> wrote:
>> ->table(\ 'otherschema.table');
>>
>> no longer works. This is kind of odd, but I have started to track  
>> it down.
>> The first issue is an unless(ref $table)
>>  in &DBIx::Class::ResoultSourceProxy::Table::table (line 78).  
>> Changing it to
>> test for blessed instead of ref started looking like it was going  
>> to work,
>> but unfortunately ->from was spitting a ref, which made the tests  
>> puke
>> during populate as "0x88BEEF" became interpolated into the queries.  
>> A quick
>> dive through Storage::DBI and DBIC::SQLA seems to indicate that the  
>> table is
>> passed as a ref to SQLA, and further digging seems to indicate that  
>> the ref
>> is not being accurately decoded by _table which handles the case  
>> fine in
>> SQLA. So this leaves DBIC::SQLA as the guilty party. I am at a loss  
>> for what
>> the fuck to do now though. I found where the bug is, I can't figure  
>> out how
>> to fix it.
>>
>> It looks like it could be as simple as adding a new case to the if/ 
>> else in
>> _table, or we could just call SUPER instead of returning $from but  
>> I'm not
>> really sure. it gets too hairy form me here
>
> groditi and I discussed this in channel tonight. I think there's
> actually two bugs here. The first is the ->table(\'artist') one
> described above. I think this is easily solved by changing the
> else-clause in _table() from "else { return $from }" to "else { return
> $self->_make_as( $from ); }". But, I think _make_as() is incorrect
> when it handles ->table({ foo => \'other_schema.bar' }). But,
> apparently, we don't have tests for these cases. So, I think the first
> step is to add the following test cases:
>    1) ->table(\'foo')
>    2) ->table( [ \'foo', 'bar' ] )
>    3) ->table( [ 'foo', \'bar' ] )
>    4) ->table( { bar => \'schema.table' } )
>    5) ->table( { bar => 'schema.table' } )
> Assuming, of course, that I got the hashref usecase done right. These
> cases could be something as simple as converting existing tests to use
> the \'' form vs. the '' form.
>
> We also had a bit of a discussion wrt why the \'' form is used in
> ->table. The three cases he described were:
>    1) Views
>    2) Subqueries
>    3) Multiple Schemas
> Cases #1 and #2 are being addressed in 08100, so that's good. However,
> case #3 isn't handled by DBIC at all. So, I'd like to propose the
> following changes for 08200:

#1 and #2 are being addressed, but there's always back compatibility  
to maintain.

What's your definition of schema here? What mysql calls a database,  
and Pg calls a schema?

If so at work we use ->table("schema.foo") just fine with 0.0801x on Pg.


>
>    1) We add a ->schema() method.
>    2) ->schema() would default to the schema connected to in the DSN.
>    3) We always add the schema to the tablename. So, it would always
> be "FROM <schema>.<table> <alias>" instead of "FROM <table> <alias>".
> (Subject, of course, to RDBMS vagaries and quoting.)
>    4) Unrelated to above, but we should also always add the table
> alias to the columns in the various clauses. Since this is generated
> SQL, I don't see the harm.

We already do, dont we: "SELECT me.id ....";

>
> The explicit schema and table names are practices that the DBAs I've
> respected have all done, no exceptions. I think that DBIC should also
> do the same.
>
> A somewhat related question: Is there a reason why quoting isn't on  
> by default?
>
> Rob




More information about the DBIx-Class mailing list