On Mon, Oct 13, 2008 at 11:53:34AM -0000, Greg Sabino Mullane wrote:
> 
> > So { '1' => 'integer' } sure looks like a bug.
> 
> >> However, bind_param currently saves the value to an internal form, without
> >> saving how it got there, which makes the key of that inner hash ('pg_type')
> >> difficult to show. Because the value, SQL_INTEGER, is really a constant, 
> >> it's
> >> equally difficult to know to output 'SQL_INTEGER' - we'd really have to 
> >> output
> >> the number it maps to.
> 
> > Yes. Outputting the _string_ "SQL_INTEGER" would be wrong as it wouldn't
> > work for the code above.
> 
> Thanks for the clarification Tim, that all makes sense. I've changed DBD::Pg 
> to
> do the right thing for ParamTypes. Specifically, it outputs a hash with 
> placeholder
> numbers or names as keys, as before, and with a hashref for the values that
> contains a single key (always "pg_type") and the internal type number as the 
> value.
> 
> { 1 => { pg_type => 23 }, 2 => { pg_type => 1024 } }
> 
> and
> 
> { ':foo' => { pg_type => 23 }, ':foo2' => { pg_type => 1024 } }

Umm, looking at that it strikes me that if someone calls

    bind_param( 1, $value, SQL_INTEGER ); # or { TYPE=>SQL_INTEGER }

and the drivers translates that into *just* it's oen private type
then valuable information has been lost.

Generic code wouldn't know how to interpret pg_type values.

Ideally the ParamTypes value should be a compatible superset of the
bind_param attributes, with not information lost.

Tim.

Reply via email to