[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