Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[DBD::Pg 2/2] Fix enum value ordering on Postgres servers 9.1 and greater

0 views
Skip to first unread message

dbdpg-...@bucardo.org

unread,
Mar 1, 2015, 12:00:02 PM3/1/15
to dbd-pg-...@perl.org
Committed by =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilm...@ilmari.org>

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, gr...@turnstep.com

+ - 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

dbdpg-...@bucardo.org

unread,
Mar 1, 2015, 12:00:02 PM3/1/15
to dbd-pg-...@perl.org
Committed by =?UTF-8?q?Dagfinn=20Ilmari=20Manns=C3=A5ker?= <ilm...@ilmari.org>

Subject: [DBD::Pg 1/2] Use %col_map instead of literal indexes in column_info

---
Pg.pm | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/Pg.pm b/Pg.pm
index efe151a..63e2820 100644
--- a/Pg.pm
+++ b/Pg.pm
@@ -540,18 +540,18 @@ use 5.008001;
qq{conrelid = $aid AND conkey = '{$attnum}'};
my $info = $dbh->selectall_arrayref($SQL);
if (@$info) {
- $row->[19] = $info->[0][0];
+ $row->[$col_map{pg_constraint}] = $info->[0][0];
}
else {
- $row->[19] = undef;
+ $row->[$col_map{pg_constraint}] = undef;
}

if ( $typtype eq 'e' ) {
$SQL = "SELECT enumlabel FROM pg_catalog.pg_enum WHERE enumtypid = $typoid ORDER BY oid";
- $row->[23] = $dbh->selectcol_arrayref($SQL);
+ $row->[$col_map{pg_enum_values}] = $dbh->selectcol_arrayref($SQL);
}
else {
- $row->[23] = undef;
+ $row->[$col_map{pg_enum_values}] = undef;
}
}

--
1.8.4

0 new messages