1 package DBIx::Class::Storage::DBI::AutoCast;
6 use base qw/DBIx::Class::Storage::DBI/;
9 __PACKAGE__->mk_group_accessors('simple' => 'auto_cast' );
13 DBIx::Class::Storage::DBI::AutoCast - Storage component for RDBMS requiring explicit placeholder typing
17 $schema->storage->auto_cast(1);
21 In some combinations of RDBMS and DBD drivers (e.g. FreeTDS and Sybase)
22 statements with values bound to columns or conditions that are not strings will
23 throw implicit type conversion errors.
25 As long as a column L<data_type|DBIx::Class::ResultSource/add_columns> is
26 defined and resolves to a base RDBMS native type via L</_native_data_type> as
27 defined in your Storage driver, the placeholder for this column will be
30 CAST(? as $mapped_type)
32 This option can also be enabled in
33 L<connect_info|DBIx::Class::Storage::DBI/connect_info> as:
35 on_connect_call => ['set_auto_cast']
39 sub _prep_for_execute {
42 my ($sql, $bind) = $self->next::method (@_);
44 # If we're using ::NoBindVars, there are no binds by this point so this code
46 if ($self->auto_cast && @$bind) {
48 my @sql_part = split /\?/, $sql, scalar @$bind + 1;
50 my $cast_type = $self->_native_data_type($_->[0]{sqlt_datatype});
51 $new_sql .= shift(@sql_part) . ($cast_type ? "CAST(? AS $cast_type)" : '?');
53 $sql = $new_sql . shift @sql_part;
59 =head2 connect_call_set_auto_cast
63 $schema->storage->auto_cast(1);
69 on_connect_call => ['set_auto_cast']
71 in L<connect_info|DBIx::Class::Storage::DBI/connect_info>.
75 sub connect_call_set_auto_cast {
82 See L<DBIx::Class/CONTRIBUTORS>
86 You may distribute this code under the same terms as Perl itself.