[DBD::Pg 2/2] Fix enum value ordering on Postgres servers 9.1 and greater
dbdpg-commits-gENoVmVU/[email protected] Sun, 1 Mar 2015 16:46:27 +0000
| Newsgroups | gmane.comp.db.postgresql.dbdpg.cvs |
|---|---|
| Message-ID | <[email protected]> |
Committed by =3D?UTF-8?q?Dagfinn=3D20Ilmari=3D20Manns=3DC3=3DA5ker?=3D <i= [email protected]> Subject: [DBD::Pg 2/2] Fix enum value ordering on Postgres servers 9.1 an= d greater ALTER TYPE can add values anywhere in the sequence, so we need to sort by the enumsortorder field, not the OID. --- Changes | 2 ++ Pg.pm | 4 +++- t/03dbmethod.t | 7 ++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Changes b/Changes index d14abd9..be7a2cd 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,7 @@ 'GSM' is Greg Sabino Mullane, greg-738XdyZ4GzZWk0Htik3J/[email protected] =20 + - Fix enum value ordering on Postgres servers 9.1 and greater + [Dagfinn Ilmari Manns=C3=A5ker] =20 Version 3.5.1 Released February 17, 2015 (git commit 6c3457ee20c19ae492= d29c490af6800e7e6a0774) =20 diff --git a/Pg.pm b/Pg.pm index 63e2820..235f44b 100644 --- a/Pg.pm +++ b/Pg.pm @@ -547,7 +547,9 @@ use 5.008001; } =20 if ( $typtype eq 'e' ) { - $SQL =3D "SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid =3D= $typoid ORDER BY oid"; + my $order_column =3D $dbh->{private_dbdpg}{version} >=3D 90100 + ? 'enumsortorder' : 'oid'; + $SQL =3D "SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid =3D= $typoid ORDER BY $order_column"; $row->[$col_map{pg_enum_values}] =3D $dbh->selectcol_arrayref($SQL); } else { diff --git a/t/03dbmethod.t b/t/03dbmethod.t index 764256b..ac565ba 100644 --- a/t/03dbmethod.t +++ b/t/03dbmethod.t @@ -675,11 +675,16 @@ SKIP: { skip ('DB handle method column_info attribute "pg_enum_values" require= s at least Postgres 8.3', 2); } =20 + my @enumvalues =3D qw( foo bar baz buz ); { local $dbh->{Warn} =3D 0; =20 $dbh->do( q{CREATE TYPE dbd_pg_enumerated AS ENUM ('foo', 'bar',= 'baz', 'buz')} ); $dbh->do( q{CREATE TEMP TABLE dbd_pg_enum_test ( is_enum dbd_pg_= enumerated NOT NULL )} ); + if ($pgversion >=3D 90100) { + $dbh->do( q{ALTER TYPE dbd_pg_enumerated ADD VALUE 'first' B= EFORE 'foo'} ); + unshift @enumvalues, 'first'; + } } =20 $t=3D'DB handle method "column_info" returns proper pg_type'; @@ -688,7 +693,7 @@ SKIP: { is ($result->{pg_type}, 'dbd_pg_enumerated', $t); =20 $t=3D'DB handle method "column_info" returns proper pg_enum_values'; - is_deeply ($result->{pg_enum_values}, [ qw( foo bar baz buz ) ], $t)= ; + is_deeply ($result->{pg_enum_values}, \@enumvalues, $t); =20 $dbh->do('DROP TABLE dbd_pg_enum_test'); $dbh->do('DROP TYPE dbd_pg_enumerated'); --=20 1.8.4