Committed by =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <[email protected]>

Subject: [DBD::Pg 2/2] Fix enum value ordering on Postgres servers 9.1 and
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, [email protected]
 
+  - Fix enum value ordering on Postgres servers 9.1 and greater
+    [Dagfinn Ilmari Mannsåker]
 
 Version 3.5.1  Released February 17, 2015 (git commit 
6c3457ee20c19ae492d29c490af6800e7e6a0774)
 
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;
                        }
 
                        if ( $typtype eq 'e' ) {
-                               $SQL = "SELECT enumlabel FROM 
pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY oid";
+                               my $order_column = 
$dbh->{private_dbdpg}{version} >= 90100
+                                       ? 'enumsortorder' : 'oid';
+                               $SQL = "SELECT enumlabel FROM 
pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY $order_column";
                                $row->[$col_map{pg_enum_values}] = 
$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" 
requires at least Postgres 8.3', 2);
        }
 
+    my @enumvalues = qw( foo bar baz buz );
     {
         local $dbh->{Warn} = 0;
 
         $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 >= 90100) {
+            $dbh->do( q{ALTER TYPE dbd_pg_enumerated ADD VALUE 'first' BEFORE 
'foo'} );
+            unshift @enumvalues, 'first';
+        }
     }
 
        $t='DB handle method "column_info" returns proper pg_type';
@@ -688,7 +693,7 @@ SKIP: {
     is ($result->{pg_type}, 'dbd_pg_enumerated', $t);
 
        $t='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);
 
        $dbh->do('DROP TABLE dbd_pg_enum_test');
        $dbh->do('DROP TYPE dbd_pg_enumerated');
-- 
1.8.4

Reply via email to