Fix segfault in t/storage/quote_names.t
[dbsrgits/DBIx-Class.git] / t / storage / quote_names.t
1 use strict;
2 use warnings;
3 use Test::More;
4 use Test::Exception;
5 use Data::Dumper::Concise;
6 use Try::Tiny;
7 use lib qw(t/lib);
8 use DBICTest;
9
10 my %expected = (
11   'DBIx::Class::Storage::DBI'                    =>
12       # no default quote_char
13     {                             name_sep => '.' },
14
15   'DBIx::Class::Storage::DBI::MSSQL'             =>
16     { quote_char => [ '[', ']' ], name_sep => '.' },
17
18   'DBIx::Class::Storage::DBI::DB2'               =>
19     { quote_char => '"',          name_sep => '.' },
20
21   'DBIx::Class::Storage::DBI::Informix'          =>
22     { quote_char => '"',          name_sep => '.' },
23
24   'DBIx::Class::Storage::DBI::InterBase'         =>
25     { quote_char => '"',          name_sep => '.' },
26
27   'DBIx::Class::Storage::DBI::mysql'             =>
28     { quote_char => '`',          name_sep => '.' },
29
30   'DBIx::Class::Storage::DBI::Pg'             =>
31     { quote_char => '"',          name_sep => '.' },
32
33   'DBIx::Class::Storage::DBI::ODBC::ACCESS'      =>
34     { quote_char => [ '[', ']' ], name_sep => '.' },
35
36 # Not testing this one, it's a pain.
37 #  'DBIx::Class::Storage::DBI::ODBC::DB2_400_SQL' =>
38 #    { quote_char => '"',          name_sep => qr/must be connected/ },
39
40   'DBIx::Class::Storage::DBI::Oracle::Generic'   =>
41     { quote_char => '"',          name_sep => '.' },
42
43   'DBIx::Class::Storage::DBI::SQLAnywhere'       =>
44     { quote_char => '"',          name_sep => '.' },
45
46   'DBIx::Class::Storage::DBI::SQLite'            =>
47     { quote_char => '"',          name_sep => '.' },
48
49   'DBIx::Class::Storage::DBI::Sybase::ASE'       =>
50     { quote_char => [ '[', ']' ], name_sep => '.' },
51 );
52
53 for my $class (keys %expected) { SKIP: {
54   eval "require ${class}"
55     or skip "Skipping test of quotes for $class due to missing dependencies", 1;
56
57   my $mapping = $expected{$class};
58   my ($quote_char, $name_sep) = @$mapping{qw/quote_char name_sep/};
59   my $instance = $class->new;
60
61   my $quote_char_text = dumper($quote_char);
62
63   if (exists $mapping->{quote_char}) {
64     is_deeply $instance->sql_quote_char, $quote_char,
65       "sql_quote_char for $class is $quote_char_text";
66   }
67
68   is $instance->sql_name_sep, $name_sep,
69     "sql_name_sep for $class is '$name_sep'";
70 }}
71
72 # Try quote_names with available DBs.
73
74 # Env var to base class mapping, these are the DBs I actually have.
75 # the SQLITE is a fake memory dsn
76 local $ENV{DBICTEST_SQLITE_DSN} = 'dbi:SQLite::memory:';
77 my %dbs = (
78   SQLITE           => 'DBIx::Class::Storage::DBI::SQLite',
79   ORA              => 'DBIx::Class::Storage::DBI::Oracle::Generic',
80   PG               => 'DBIx::Class::Storage::DBI::Pg',
81   MYSQL            => 'DBIx::Class::Storage::DBI::mysql',
82   DB2              => 'DBIx::Class::Storage::DBI::DB2',
83   SYBASE           => 'DBIx::Class::Storage::DBI::Sybase::ASE',
84   SQLANYWHERE      => 'DBIx::Class::Storage::DBI::SQLAnywhere',
85   SQLANYWHERE_ODBC => 'DBIx::Class::Storage::DBI::SQLAnywhere',
86   FIREBIRD         => 'DBIx::Class::Storage::DBI::InterBase',
87   FIREBIRD_ODBC    => 'DBIx::Class::Storage::DBI::InterBase',
88   INFORMIX         => 'DBIx::Class::Storage::DBI::Informix',
89   MSSQL_ODBC       => 'DBIx::Class::Storage::DBI::MSSQL',
90 );
91
92 # Make sure oracle is tried last - some clients (e.g. 10.2) have symbol
93 # clashes with libssl, and will segfault everything coming after them
94 for my $db (sort {
95     $a eq 'ORA' ? 1
96   : $b eq 'ORA' ? -1
97   : $a cmp $b
98 } keys %dbs) {
99   my ($dsn, $user, $pass) = map $ENV{"DBICTEST_${db}_$_"}, qw/DSN USER PASS/;
100
101   next unless $dsn;
102
103   my $schema;
104
105   try {
106     $schema = DBICTest::Schema->connect($dsn, $user, $pass, {
107       quote_names => 1
108     });
109     $schema->storage->ensure_connected;
110     1;
111   } || next;
112
113   my ($exp_quote_char, $exp_name_sep) =
114     @{$expected{$dbs{$db}}}{qw/quote_char name_sep/};
115
116   my ($quote_char_text, $name_sep_text) = map { dumper($_) }
117     ($exp_quote_char, $exp_name_sep);
118
119   is_deeply $schema->storage->sql_maker->quote_char,
120     $exp_quote_char,
121     "$db quote_char with quote_names => 1 is $quote_char_text";
122
123
124   is $schema->storage->sql_maker->name_sep,
125     $exp_name_sep,
126     "$db name_sep with quote_names => 1 is $name_sep_text";
127 }
128
129 done_testing;
130
131 sub dumper {
132   my $val = shift;
133
134   my $dd = DumperObject;
135   $dd->Indent(0);
136   return $dd->Values([ $val ])->Dump;
137 }
138
139 1;